u-space-mcp 0.0.15 → 0.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,12 +1,12 @@
1
1
  # u-space-mcp
2
2
 
3
- Model Context Protocol server for the `u-space` documentation, including the experimental `u-space/worker` OffscreenCanvas runtime, the core `InstanceObject` protocol, the public `src/batches` APIs (`ModelInstancedLayer` and `EditableGeometryBatchLayer`), core object defaults, and u-manager APIs/examples such as `UManagerLoader`, scene/facility instancing, opt-in `setEditableBatching()` static Geometry merging, semantic groups/floors/facilities, and semantic elevator/vent shafts. The index also covers atmosphere and fire WebGPU effects.
3
+ Model Context Protocol server for the `u-space` documentation, including the experimental `u-space/worker` OffscreenCanvas runtime, nested static-model decoding through `ModelLoaderManager.setDecodeWorker()` and `u-space/worker/model-decoder`, the core `InstanceObject` protocol, the public `src/batches` APIs (`ModelInstancedLayer` and `EditableGeometryBatchLayer`), core object defaults, and u-manager APIs/examples such as `UManagerLoader`, scene/facility instancing, opt-in `setEditableBatching()` static Geometry merging, semantic groups/floors/facilities, and semantic elevator/vent shafts. The index also covers atmosphere and fire WebGPU effects.
4
4
 
5
5
  The bundled docs index contains the canonical core `InstanceObject` API from `docs/api-objects.md`: identity fields and updates, local/world bounds, fallback render-object access, ownership-aware materializer/materialize protocol, style/highlight controls, dirty callbacks, automatic transform-to-batch sync, and the `isInstanceObject()` type guard. `docs/api-batches.md` covers the one-shot source/build lifecycle, duplicate-instance rejection, isolated per-layer transforms, unsupported reasons and per-instance negative-scale fallback, immediate CPU dirty/world-matrix sync, cross-layer old-copy hiding, independent materialized materials, typed events, materialized-hit filtering, safe disposal, statistics, and lazy-BVH source remapping.
6
6
 
7
7
  The u-manager coverage from `docs/api-plugin-u-manager.md` focuses on `SceneInstanceObject`, `FacilityInstanceObject`, semantic floor proxies, loaders, examples, scene/facility layer selection, and editable static batching through `setEditableBatching()` / `SceneEditableBatchLayer`. Retrieval distinguishes default `SceneInstancedLayer` path/model instancing from the editable primary layer and its sibling `SceneEditableBatchFallback`. `SceneEditableBatchLayer` is documented as a thin adapter over core `EditableGeometryBatchLayer<SceneInstanceObject>`; URL loading and fallback policy remain in `SceneLoader`, while Geometry merging, `batchObjectIndex` TSL state, materialize events, lazy BVH and disposal are core behavior. The index also includes `FireEffect` emitter setup, simulation/grid options, volumetric pass bounds, dynamic lights, and RenderPipeline output-effect integration.
8
8
 
9
- The Worker coverage from `docs/api-viewer.md` and `docs/examples-guide.md` explains the complete `OffscreenViewerHost` options/methods/events surface, main-thread canvas/input ownership, Worker-side Viewer creation, the `host.init()` / `initialized` renderer boundary versus the one-shot application `ready` boundary, structured-clone command boundaries, deduplicated ArrayBuffer transfer, built-in stats/viewpoint/render commands, rolling frame statistics, pre-ready fatal cleanup, canvas-transfer/post failures, initialization/disposal races, suppression of late business messages after disposal, browser and DOM-overlay limitations, and how `examples/offscreen/test_umanager2_offscreen.html` combines OffscreenCanvas with `setEditableBatching()`, `compileAsync()`, standard transparent composition, native Three.js static-scene matrix updates, rolling frame-pacing statistics, and a hidden-by-default semantic analysis overlay that preserves the architectural shell materials. It also documents explicit `InstanceObject.updateWorldMatrix(true, false)` and parent-group `updateWorldMatrix(true, true)` commits under a frozen root scene, including instanced-buffer dirty propagation and editable-batch materialization.
9
+ The Worker coverage from `docs/api-viewer.md` and `docs/examples-guide.md` explains the complete `OffscreenViewerHost` options/methods/events surface, main-thread canvas/input ownership, Worker-side Viewer creation, the `host.init()` / `initialized` renderer boundary versus the one-shot application `ready` boundary, structured-clone command boundaries, deduplicated ArrayBuffer transfer, built-in stats/viewpoint/render commands, rolling frame statistics, pre-ready fatal cleanup, canvas-transfer/post failures, initialization/disposal races, suppression of late business messages after disposal, browser and DOM-overlay limitations, and automatic aspect-preserving first-decode downscaling when ordinary images exceed the portable WebGPU `8192` texture limit. It also covers the nested model decoder Worker: static glTF/GLB/SBMX support and regular-loader/fatal-worker fallback, transferable buffers/bitmaps, serial ACK backpressure, bounded content-identity bitmap reuse, LoadingManager URL/lifecycle round-trips, same-origin credential isolation, safe node-graph validation, full-path cancellation, and identity-bound Worker disposal. `examples/offscreen/test_umanager2_offscreen.html` combines that decoder with OffscreenCanvas, `setEditableBatching()`, `compileAsync()`, standard transparent composition, native Three.js static-scene matrix updates, rolling frame-pacing statistics, and a visible-by-default semantic analysis overlay whose device selection, flight, highlight, and clear commands do not hide other objects. Explicit `InstanceObject.updateWorldMatrix(true, false)` and parent-group `updateWorldMatrix(true, true)` commits under a frozen root scene include instanced-buffer dirty propagation and editable-batch materialization.
10
10
 
11
11
  ## Usage
12
12
 
@@ -1385,6 +1385,14 @@ export const docsIndex = [
1385
1385
  "level": 2,
1386
1386
  "text": "OffscreenCanvas Worker(实验性)"
1387
1387
  },
1388
+ {
1389
+ "level": 3,
1390
+ "text": "Worker 超大贴图保护"
1391
+ },
1392
+ {
1393
+ "level": 3,
1394
+ "text": "独立模型 Decode Worker"
1395
+ },
1388
1396
  {
1389
1397
  "level": 3,
1390
1398
  "text": "OffscreenViewerHost"
@@ -1398,13 +1406,13 @@ export const docsIndex = [
1398
1406
  "text": "事件"
1399
1407
  }
1400
1408
  ],
1401
- "content": "# Viewer API\n\n`Viewer` 是 `u-space` 的核心类,它将 WebGPU 渲染器、场景、相机、控制器以及各种管理器封装为一个易用的接口。\n\n## 构造函数\n\n```typescript\nnew Viewer(options: ViewerOptions)\n```\n\n### `ViewerOptions`\n\n| 属性 | 类型 | 必填 | 说明 |\n| :---------------- | :------------------------- | :--- | :------------------------------------------------------------------------------------------------------------- |\n| `el` | `HTMLElement` | 是 | WebGPURenderer 的 canvas 将被注入到此 DOM 元素中。 |\n| `rendererOptions` | `WebGPURendererParameters` | 否 | 直接传递给底层 `WebGPURenderer` 的选项。默认使用 WebGPU 的高性能配置。 |\n| `pixelRatio` | `number` | 否 | Drawing buffer 像素比;默认 `Math.min(window.devicePixelRatio, 1.5)`。在 Retina 屏幕上使用 SSR、SSGI 或 TRAA 等重型全屏效果时,可设为 `1` 以降低 GPU 开销。 |\n\n`pixelRatio` 应为有限正数,并会直接传给 Three.js。数值越高,画面越清晰,但完整 drawing buffer 以及依赖它的全屏后处理成本也会提高。\n\n`Viewer` 默认启用 `reversedDepthBuffer`。`RenderPipeline` 内置 SSGI 和 SSR 均兼容该深度模式;只有业务明确需要标准深度时,才需要传入 `rendererOptions: { reversedDepthBuffer: false }`。\n\n```typescript\nconst viewer = new Viewer({\n el: document.getElementById('app')!,\n pixelRatio: 1,\n});\n```\n\n## 属性\n\n`Viewer` 实例暴露了若干核心 Three.js 和 `u-space` 组件。\n\n| 属性 | 类型 | 说明 |\n| :------------------- | :------------------------------------------ | :---------------------------------------------------------------------------------------------------------------- |\n| `el` | `HTMLElement` | 容器元素。 |\n| `renderer` | `WebGPURenderer` | 底层 WebGPU 渲染器实例。 |\n| `scene` | `Scene` | 主 Three.js 场景,背景默认为 `0x000000`。 |\n| `camera` | `PerspectiveCamera` \\| `OrthographicCamera` | 当前激活的相机。 |\n| `controls` | `CameraControls` | 相机控制器(基于 `camera-controls` 库)。 |\n| `renderPipeline` | `RenderPipeline` | 管理后处理通道和最终渲染调用。 |\n| `timer` | `Timer` | Three.js `Timer` 实例,用于每帧精确的 delta time 跟踪。 |\n| `roomEnvironment` | `RoomEnvironment` | 为场景提供默认的类室内 IBL 环境贴图。 |\n| `info` | `Info` | 以叠加层的形式渲染渲染器诊断信息(绘制调用次数、三角面数量等)。 |\n| `viewerHelper` | `ViewerHelper` | 提供实用辅助工具(如坐标轴、网格显示),用于开发/调试。 |\n| `interactionManager` | `InteractionManager` | 管理对象的指针事件和射线检测。 |\n| `objectManager` | `ObjectManager` | 用于按 ID 或名称注册和检索对象的工具。 |\n| `frameloop` | `'always'` \\| `'demand'` | 设置渲染模式。默认为 `'demand'`(仅在需要时渲染)。设置为 `'always'` 可开启持续渲染。 |\n| `cssRenderer` | `CSSRenderer` | CSS 渲染器,支持在 3D 场景中叠加 HTML 元素(CSS2D / CSS2.5D / CSS3D)。 |\n| `frameCount` | `number` | 待渲染帧的内部计数器;同一刷新周期内的请求会合并,避免多个动画产生帧积压。 |\n\n## 方法\n\n### `init()`\n\n异步初始化渲染器。如果需要确保渲染器(如环境设置或插件)完全就绪,必须调用此方法。\n\n```typescript\nawait viewer.init();\n```\n\n### `render(frame?: number)`\n\n请求渲染一帧。在 `'demand'` 模式下,每当场景发生视觉变化时必须调用此方法来更新画布。`frame` 指定渲染的帧数(默认 `1`)。返回一个在帧渲染完成后 resolve 的 `Promise<void>`。\n\n```typescript\nviewer.render();\n\n// 等待帧渲染完成\nawait viewer.render();\n```\n\n### `invalidate(frame?: number)`\n\n请求渲染但不创建 Promise。动画循环、插件更新等不需要等待渲染完成的高频路径应优先使用此方法,避免每帧分配 Promise 和一次性事件监听器。`frame` 指定至少保留的待渲染帧数(默认 `1`);同一刷新周期内多次调用会合并,不会累加成渲染积压。\n\n```typescript\nviewer.invalidate();\n```\n\n### `setCamera(camera: PerspectiveCamera | OrthographicCamera)`\n\n为查看器设置自定义相机,并自动更新控制器和交互管理器以使用该相机。\n\n```typescript\nconst customCamera = new PerspectiveCamera(75, width / height, 0.1, 1000);\nviewer.setCamera(customCamera);\n```\n\n### `setCameraByType(type: 'perspective' | 'orthographic')`\n\n便捷方法,在保持查看器上下文的同时切换相机类型。\n\n```typescript\nviewer.setCameraByType('orthographic');\n```\n\n### `createScene()`\n\n创建并返回一个黑色背景的新 `Scene`。由构造函数内部调用,也可用于重置/替换场景。\n\n```typescript\nviewer.scene = viewer.createScene();\n```\n\n### `createPerspectiveCamera()`\n\n使用合理的默认值创建 `PerspectiveCamera`(视角 50°,近裁 `0.1`,远裁 `1e5`,位置在 `(5, 5, 5)`)。\n\n```typescript\nconst camera = viewer.createPerspectiveCamera();\nviewer.setCamera(camera);\n```\n\n### `createOrthographicCamera()`\n\n创建与容器元素等大的 `OrthographicCamera`,近裁 `0.1`,远裁 `1e5`,位置在 `(5, 5, 5)`。\n\n```typescript\nconst camera = viewer.createOrthographicCamera();\nviewer.setCamera(camera);\n```\n\n### `resize(width?, height?)`\n\n手动触发容器尺寸更新。可选传入指定宽高。\n\n```typescript\n// 手动触发 resize(如容器尺寸变化后)\nviewer.resize();\n\n// 指定新尺寸\nviewer.resize(800, 600);\n```\n\n### `screenshot(options?)`\n\n捕获当前渲染画面并返回 Data URL。\n\n```typescript\nconst dataUrl = await viewer.screenshot();\n\n// 指定格式和分辨率\nconst dataUrl = await viewer.screenshot({\n width: 1920,\n height: 1080,\n type: 'image/png',\n quality: 1.0,\n});\n```\n\n#### `ScreenshotOptions`\n\n| 属性 | 类型 | 默认值 | 说明 |\n| :-------- | :---------------------------------------------- | :------------ | :--------------------- |\n| `width` | `number` | 容器宽度 | 截图宽度。 |\n| `height` | `number` | 容器高度 | 截图高度。 |\n| `type` | `'image/png'` \\| `'image/jpeg'` \\| `'image/webp'` | `'image/png'` | 图片格式。 |\n| `quality` | `number` | `1.0` | 图片质量(0-1)。 |\n\n### `setBackground(background)`\n\n设置场景背景颜色、纹理或清除背景。\n\n```typescript\nviewer.setBackground(0x333333); // 颜色\nviewer.setBackground('#87ceeb'); // CSS 颜色字符串\nviewer.setBackground(hdrTexture); // 纹理\nviewer.setBackground(null); // 清除背景\n```\n\n### `setEnvironment(envMap)`\n\n设置场景环境贴图(用于反射/IBL)。\n\n```typescript\nviewer.setEnvironment(hdrTexture);\nviewer.setEnvironment(null); // 清除\n```\n\n### `enableShadow()` / `disableShadow()`\n\n开启或关闭阴影渲染。\n\n```typescript\nviewer.enableShadow();\nviewer.disableShadow();\n```\n\n### `enableFog(options?)` / `enableFogExp2(options?)` / `disableFog()`\n\n开启线性雾、指数雾或关闭雾效。\n\n```typescript\n// 线性雾\nviewer.enableFog({ color: 0xcccccc, near: 10, far: 100 });\n\n// 指数雾\nviewer.enableFogExp2({ color: 0xcccccc, density: 0.01 });\n\n// 关闭雾效\nviewer.disableFog();\n```\n\n#### `FogOptions`\n\n| 属性 | 类型 | 默认值 | 说明 |\n| :------ | :-------------------- | :---------- | :------------- |\n| `color` | `ColorRepresentation` | `0xcccccc` | 雾的颜色。 |\n| `near` | `number` | `10` | 雾的起始距离。 |\n| `far` | `number` | `100` | 雾的结束距离。 |\n\n#### `FogExp2Options`\n\n| 属性 | 类型 | 默认值 | 说明 |\n| :-------- | :-------------------- | :---------- | :------------- |\n| `color` | `ColorRepresentation` | `0xcccccc` | 雾的颜色。 |\n| `density` | `number` | `0.01` | 雾的密度。 |\n\n## 调试工具\n\n### Info\n\n`viewer.info` 是一个轻量的渲染统计叠加层,显示当前帧的 GPU 诊断数据,适合开发调试阶段使用。\n\n```typescript\nviewer.info.enable(); // 在画面左下角显示统计信息\nviewer.info.disable(); // 隐藏统计信息\n```\n\n启用后将在 `viewer.el` 左下角叠加以下数据:\n\n| 指标 | 说明 |\n| :------------- | :---------------------------- |\n| `draw calls` | 当前帧的绘制调用次数 |\n| `frame calls` | 当前帧的帧调用次数 |\n| `triangles` | 当前帧渲染的三角面数量 |\n| `points` | 当前帧渲染的点数量 |\n| `lines` | 当前帧渲染的线段数量 |\n| `timestamp` | GPU 渲染耗时(ms,WebGPU 专属)|\n\n> `timestamp` 指标仅在 WebGPU 后端可用,WebGL 回退模式下显示 `0`。\n\n### ViewerHelper\n\n`viewer.viewerHelper` 是一个方向指示器 gizmo(基于 Three.js `ViewHelper`),显示当前相机朝向的 XYZ 轴,渲染为画面角落的叠加层。\n\n```typescript\nviewer.viewerHelper.enable(); // 显示方向 gizmo\nviewer.viewerHelper.disable(); // 隐藏方向 gizmo\n```\n\n**属性:**\n\n| 属性 | 类型 | 说明 |\n| :------------- | :---------- | :---------------------------------------- |\n| `location` | `object` | gizmo 在画面中的位置,支持 `top`、`bottom`、`left`、`right` 偏移(像素)。默认右下角。 |\n\n```typescript\n// 调整位置到左下角\nviewer.viewerHelper.location.left = 12;\nviewer.viewerHelper.location.bottom = 12;\nviewer.viewerHelper.location.right = null;\n```\n\n### `dispose()`\n\n清理查看器,从 DOM 中移除 canvas,移除事件监听,并释放渲染器和环境贴图,以防止内存泄漏。\n\n```typescript\nviewer.dispose();\n```\n\n## OffscreenCanvas Worker(实验性)\n\n`u-space/worker` 提供一个独立入口,可将 `Viewer`、Three.js 场景、模型解析、相机控制和 WebGPU 渲染全部放入 dedicated Worker。主线程只负责持有可见 canvas、转发输入事件与尺寸,并接收状态或渲染统计。\n\nWorker runtime 入口仅提供 ESM,需使用 `{ type: 'module' }` 创建 Worker。构建工具也必须保留 ES module 输出;Vite 项目需配置 `worker: { format: 'es' }`,否则 IIFE Worker 无法编译 top-level await。\n\n主线程:\n\n```typescript\nimport { OffscreenViewerHost } from 'u-space/worker';\n\nconst worker = new Worker(new URL('./scene.worker.ts', import.meta.url), {\n type: 'module',\n});\n\nconst host = new OffscreenViewerHost({\n el: document.getElementById('app')!,\n worker,\n});\n\nhost.addEventListener('ready', (event) => {\n console.log('scene ready', (event as CustomEvent).detail);\n});\n\nhost.addEventListener('stats', (event) => {\n console.log((event as CustomEvent).detail);\n});\n\nawait host.init();\n```\n\n`await host.init()` 只等待 Worker 创建 `Viewer`、完成 `await viewer.init()` 并发送 `initialized`,此时 WebGPU renderer 和内置 command 已可用,但 HDR、业务模型、editable batch、pipeline 预热和业务首帧可能仍在继续。`initialized` 事件与 `host.init()` resolve 表示同一个边界;`ready` 是业务层边界,只会在 Worker 代码显式调用一次 `worker.ready(detail)` 后触发。因此应在 `host.init()` 之前注册 `ready` / `status` / `stats` 等监听,业务 command 则通常在 `ready` 后调用。\n\n### `OffscreenViewerHost`\n\n构造选项:\n\n| 选项 | 类型 | 必需 | 说明 |\n| :--- | :--- | :--- | :--- |\n| `el` | `HTMLElement` | 是 | 主线程容器;默认创建的 canvas 会挂载到这里。 |\n| `worker` | `Worker` | 是 | 使用 `{ type: 'module' }` 创建的 dedicated Worker。 |\n| `canvas` | `HTMLCanvasElement` | 否 | 自定义可见 canvas;省略时自动创建。 |\n| `pixelRatio` | `number` | 否 | 发送给 Worker renderer 的 drawing-buffer pixel ratio;省略时使用 `Math.min(window.devicePixelRatio, 1.5)`。 |\n| `terminateWorkerOnDispose` | `boolean` | 否 | `dispose()` 完成后是否终止 Worker,默认 `true`。 |\n\n公开方法:\n\n| 方法 | 说明 |\n| :--- | :--- |\n| `OffscreenViewerHost.isSupported()` | 检查当前环境是否具备 Worker、OffscreenCanvas 和 `transferControlToOffscreen()`。Worker 内是否暴露 WebGPU 仍会在初始化时检查。 |\n| `init(): Promise<void>` | 绑定输入/resize,转移 canvas 并等待 Worker 的 `initialized` 消息;重复调用返回同一个 Promise。 |\n| `request<T>(command, payload?)` | 调用 Worker 已注册或内置的 command。必须在 `init()` resolve 后调用;业务 command 通常还应等待 `ready`。 |\n| `dispose(): void` | 停止事件与尺寸转发、reject 未完成的 Promise、移除 canvas,并通知 Worker 逆序释放业务资源和 `Viewer`。 |\n\nHost 事件:\n\n| 事件 | `detail` | 说明 |\n| :--- | :--- | :--- |\n| `initialized` | 无 | 与 `host.init()` resolve 相同的 Viewer 初始化边界。 |\n| `ready` | `unknown` | Worker 调用一次 `worker.ready(detail)` 后的业务就绪边界。 |\n| `status` | `string` | Worker 通过 `worker.status(message)` 上报的加载状态。 |\n| `stats` | `WorkerRendererStats` | renderer 计数和滚动帧间隔统计。 |\n| 自定义事件 | `unknown` | Worker 通过 `worker.emit(type, detail)` 上报;事件名为传入的 `type`。 |\n| `error` | `Error` | Worker 初始化、未捕获异常或资源清理错误。 |\n| `disposed` | 无 | Worker 已完成清理并关闭。 |\n\n`WorkerRendererStats` 包含 `drawCalls`、`frameCalls`、`triangles`、`points`、`lines`、作为滚动平均帧间隔的 `frameTime`,以及 `frameTiming.samples` / `fps` / `average` / `p95` / `max` / `missedFramePercent`。其中 `missedFramePercent` 表示滚动窗口内超过 25ms 的样本占比;demand 模式的静止空闲间隔不会被作为渲染帧计入。\n\nWorker(runtime 使用独立入口和 top-level await,避免主线程打包 Viewer/Three.js):\n\n```typescript\nimport { createWorkerViewer } from 'u-space/worker/runtime';\n\nconst worker = await createWorkerViewer();\nconst { viewer } = worker;\n\nworker.status('loading scene');\nconst scene = await loadScene(viewer);\nviewer.scene.add(scene);\nawait viewer.render();\n\nworker.registerCommand('getObjectCount', () => viewer.scene.children.length);\nworker.onDispose(() => disposeScene(scene));\nworker.ready({ objects: viewer.scene.children.length });\n```\n\n`createWorkerViewer()` 必须在 module Worker 顶层立即调用。函数会先同步注册 host 消息监听,再返回一个等待 OffscreenCanvas 传入和 `viewer.init()` 完成的 Promise,因此可以安全使用 top-level await,不会丢失 `init` 消息。\n\n返回的 `WorkerViewerRuntime` 提供:\n\n| 属性 / 方法 | 说明 |\n| :---------- | :--- |\n| `viewer` / `canvas` | Worker 内的完整 `Viewer` 和已转移的 `OffscreenCanvas`。 |\n| `status(message)` | 向主线程发送加载状态。 |\n| `emit(type, detail?)` | 向主线程派发自定义事件;detail 必须可 structured clone。 |\n| `registerCommand(name, handler)` | 注册 `host.request()` 可调用的业务命令,返回注销函数;重复命令名会抛错。 |\n| `onDispose(handler)` | 注册 Worker 销毁回调,返回注销函数;多个回调按注册的逆序执行。 |\n| `ready(detail?)` | 场景准备完成后发送一次 `ready` 事件;重复调用会抛错。 |\n\n主线程应等待 `ready` 事件后,再用 `await host.request('getObjectCount')` 调用业务命令。runtime 还内置 `getStats`、`getViewpoint`、`setViewpoint` 和 `render` 命令,这些命令在 `host.init()` resolve 后即可调用。命令参数和返回值必须可被 structured clone;返回值中重复引用或嵌套在对象、数组、Map、Set、TypedArray / DataView 中的 `ArrayBuffer` 会去重后零拷贝转移,并从 Worker 端 detach。`Viewer`、`Object3D`、材质和 Geometry 等 Three.js 对象始终留在 Worker 内。\n\n`ready()` 前发生的顶层未捕获错误或 Promise rejection 会先发送主线程 `error` 事件,再按逆序执行 `onDispose()`、释放 `Viewer`、发送 `disposed` 并关闭 Worker,避免失败的场景加载继续占用动画循环和 GPU 资源。Host 在初始化完成前被销毁,canvas 转移或初始 `postMessage()` 抛错,或收到 Worker 主动发送的 `disposed` 时,会 reject 尚未完成的 `init()` 和 `request()`,同时解除 DOM/resize 监听、清空待发送 pointer move、移除 canvas,并按 `terminateWorkerOnDispose` 完成 Worker 收尾。Host 一旦进入 disposed 状态,会忽略队列中迟到的 `initialized` / `ready` / `status` / `stats` / 自定义事件和 response,只保留清理阶段的 `error` / `disposed` 通知。\n\n### UManager 与 editable batching\n\n完整示例 `examples/offscreen/test_umanager2_offscreen.html` 会在 Worker 中加载 HDR、建筑语义模型和场景模型,并将 `SceneLoader.setEditableBatching()` 与 OffscreenCanvas 组合:\n\n```typescript\nimport { SceneLoader } from 'u-space/plugins/u-manager';\nimport { createWorkerViewer } from 'u-space/worker/runtime';\n\nconst worker = await createWorkerViewer();\nconst { viewer } = worker;\n// 在初始静态层级和相机定位完成后冻结每帧场景矩阵遍历。\nviewer.scene.updateMatrixWorld(true);\nviewer.scene.matrixWorldAutoUpdate = false;\nconst sceneLoader = new SceneLoader(viewer);\nworker.onDispose(() => sceneLoader.dispose());\nsceneLoader.setPath(SCENE_PATH);\nsceneLoader.setKey(SCENE_KEY);\nsceneLoader.setEditableBatching({\n maxVerticesPerBatch: 1_500_000,\n maxIndicesPerBatch: 4_500_000,\n freezeAnimations: true,\n});\n\nconst scene = await sceneLoader.loadAsync();\nconst controlsEnabled = viewer.controls.enabled;\nviewer.controls.enabled = false;\ntry {\n viewer.scene.add(scene);\n scene.updateWorldMatrix(true, true);\n viewer.invalidate();\n await viewer.renderer.compileAsync(viewer.scene, viewer.camera);\n} finally {\n viewer.controls.enabled = controlsEnabled;\n}\nawait viewer.render();\n\nworker.ready({\n editableBatch: scene.userData.editableBatch,\n semanticOverlayHidden: false,\n});\n```\n\nGeometry clone、矩阵烘焙、`mergeGeometries()`、TSL batch material 创建和 WebGPU 渲染提交都会在 Worker 中完成,不阻塞主线程 UI。`ready` 事件中的 `detail.editableBatch` 是普通统计对象,可以安全传回主线程;示例 HUD 同时显示 `drawCalls`、`frameTiming.fps`、1 秒滚动窗口的 `average` / `p95` / `max`、超过 25ms 的 `missedFramePercent`,以及 `sourceMeshes` / `batches` / `drawCallsSaved` / `unsupportedInstances` 和 `static scene matrices` 状态。`frameTime` 保留为滚动平均值;demand 模式长时间静止产生的空闲间隔不会纳入统计。\n\n目标场景的压平语义楼层是半透明分析叠加层,并会有意覆盖建筑表面。示例保持 `SemanticGroup.visible = true`,并调用 `showAllFloors().showAllFacilities()`,让楼层、墙体、空间、门窗和设备等全部语义对象默认参与渲染。设备选择、飞向、高亮和清除命令均不改变语义对象显隐,“清除调试”只撤销高亮。业务项目可以按自身展示策略切换语义层,并继续通过跨楼层语义合批或 LOD 降低提交成本。示例保留标准 RenderPipeline scene pass,以维持源模型透明对象的正确离屏合成,不修改 drawing-buffer pixel ratio。\n\n目标场景主要由静态普通 Mesh 组成,因此相机定位完成后先调用 Three.js 原生 `viewer.scene.updateMatrixWorld(true)` 提交当前层级,再设置 `viewer.scene.matrixWorldAutoUpdate = false`,移除每个渲染帧的整树更新;加载完场景模型后只调用 `scene.updateWorldMatrix(true, true)` 提交新增子树。后续 Worker command 修改单个普通 Mesh 或 `InstanceObject` 时调用 `object.updateWorldMatrix(true, false)`,修改 Group 时调用 `group.updateWorldMatrix(true, true)`,随后调用 `viewer.invalidate()` 请求渲染。`InstanceObject` 覆盖了 Three.js 原生 `updateWorldMatrix()`,会在显式提交后检测世界矩阵/祖先显隐变化并触发 dirty callback;`ModelInstancedLayer` 因而能同步 instance buffer,editable batch 中与烘焙矩阵不同的 `SceneInstanceObject` 也会按现有规则 materialize。对 Group 使用 `updateChildren: true` 时,其后代 `InstanceObject` 同样会执行该检测。相机矩阵不受此模式影响。\n\nOffscreenCanvas 不会自动减少 draw calls;`setEditableBatching()` 也不会把主线程 UI 搬入 Worker。组合使用时,两者分别处理主线程 CPU 压力和 draw submission 压力。需要按 ID 显隐、变色、移动或 `materialize()` 时,应使用 `worker.registerCommand()` 注册业务 command,再由主线程调用 `host.request()`,不要尝试跨线程传输 `SceneInstanceObject`。\n\n通过以下命令启动:\n\n```bash\npnpm example:offscreen\n```\n\n当前边界:\n\n- 需要同时支持 `transferControlToOffscreen()` 和 Worker WebGPU(`WorkerNavigator.gpu`);目前应以最新版 Chromium 为主要目标,并保留普通 `Viewer` 回退路径。\n- CSS2D/CSS3D、`Info` 等真实 DOM 叠加层不能放进 Worker,应在主线程用 Worker 状态/统计消息重建 UI。\n- Worker 能移走场景解析、矩阵更新和渲染提交等主线程 CPU 工作,但不会减少 draw calls、三角形数量或 GPU 时间;GPU 瓶颈仍需用 instancing、LOD、遮挡/视锥裁剪等方式处理。\n- `setEditableBatching()` 与 Worker 兼容,但它会展开重复 Geometry,仍需根据 `vertices` / `indices` 统计评估 GPU 内存;透明、蒙皮、morph 和自定义 shader 子集继续走安全 fallback。\n- WebGPU OffscreenCanvas 截图尚未作为 Worker 内置命令开放;需要截图时应实现独立的 render-target readback 流程。\n\n## 事件\n\nViewer 继承自 `EventDispatcher`,会触发以下事件:\n\n- `beforeControlsUpdate`:在 `CameraControls` 更新之前触发,提供 `{ time: number; delta: number }`。\n- `afterControlsUpdate`:在 `CameraControls` 更新之后触发,提供 `{ time: number; delta: number }`。\n- `beforeRender`:在 `renderer.render` 调用之前立即触发,提供 `{ time: number; delta: number }`。\n- `afterRender`:在 `renderer.render` 完成之后立即触发,提供 `{ time: number; delta: number }`。\n- `cameraChange`:调用 `setCamera` 时触发,提供 `{ camera: Camera }`。\n\n其中 `delta` 为上一帧到当前帧的时间间隔(秒),可用于动画更新等场景。\n"
1409
+ "content": "# Viewer API\n\n`Viewer` 是 `u-space` 的核心类,它将 WebGPU 渲染器、场景、相机、控制器以及各种管理器封装为一个易用的接口。\n\n## 构造函数\n\n```typescript\nnew Viewer(options: ViewerOptions)\n```\n\n### `ViewerOptions`\n\n| 属性 | 类型 | 必填 | 说明 |\n| :---------------- | :------------------------- | :--- | :------------------------------------------------------------------------------------------------------------- |\n| `el` | `HTMLElement` | 是 | WebGPURenderer 的 canvas 将被注入到此 DOM 元素中。 |\n| `rendererOptions` | `WebGPURendererParameters` | 否 | 直接传递给底层 `WebGPURenderer` 的选项。默认使用 WebGPU 的高性能配置。 |\n| `pixelRatio` | `number` | 否 | Drawing buffer 像素比;默认 `Math.min(window.devicePixelRatio, 1.5)`。在 Retina 屏幕上使用 SSR、SSGI 或 TRAA 等重型全屏效果时,可设为 `1` 以降低 GPU 开销。 |\n\n`pixelRatio` 应为有限正数,并会直接传给 Three.js。数值越高,画面越清晰,但完整 drawing buffer 以及依赖它的全屏后处理成本也会提高。\n\n`Viewer` 默认启用 `reversedDepthBuffer`。`RenderPipeline` 内置 SSGI 和 SSR 均兼容该深度模式;只有业务明确需要标准深度时,才需要传入 `rendererOptions: { reversedDepthBuffer: false }`。\n\n```typescript\nconst viewer = new Viewer({\n el: document.getElementById('app')!,\n pixelRatio: 1,\n});\n```\n\n## 属性\n\n`Viewer` 实例暴露了若干核心 Three.js 和 `u-space` 组件。\n\n| 属性 | 类型 | 说明 |\n| :------------------- | :------------------------------------------ | :---------------------------------------------------------------------------------------------------------------- |\n| `el` | `HTMLElement` | 容器元素。 |\n| `renderer` | `WebGPURenderer` | 底层 WebGPU 渲染器实例。 |\n| `scene` | `Scene` | 主 Three.js 场景,背景默认为 `0x000000`。 |\n| `camera` | `PerspectiveCamera` \\| `OrthographicCamera` | 当前激活的相机。 |\n| `controls` | `CameraControls` | 相机控制器(基于 `camera-controls` 库)。 |\n| `renderPipeline` | `RenderPipeline` | 管理后处理通道和最终渲染调用。 |\n| `timer` | `Timer` | Three.js `Timer` 实例,用于每帧精确的 delta time 跟踪。 |\n| `roomEnvironment` | `RoomEnvironment` | 为场景提供默认的类室内 IBL 环境贴图。 |\n| `info` | `Info` | 以叠加层的形式渲染渲染器诊断信息(绘制调用次数、三角面数量等)。 |\n| `viewerHelper` | `ViewerHelper` | 提供实用辅助工具(如坐标轴、网格显示),用于开发/调试。 |\n| `interactionManager` | `InteractionManager` | 管理对象的指针事件和射线检测。 |\n| `objectManager` | `ObjectManager` | 用于按 ID 或名称注册和检索对象的工具。 |\n| `frameloop` | `'always'` \\| `'demand'` | 设置渲染模式。默认为 `'demand'`(仅在需要时渲染)。设置为 `'always'` 可开启持续渲染。 |\n| `cssRenderer` | `CSSRenderer` | CSS 渲染器,支持在 3D 场景中叠加 HTML 元素(CSS2D / CSS2.5D / CSS3D)。 |\n| `frameCount` | `number` | 待渲染帧的内部计数器;同一刷新周期内的请求会合并,避免多个动画产生帧积压。 |\n\n## 方法\n\n### `init()`\n\n异步初始化渲染器。如果需要确保渲染器(如环境设置或插件)完全就绪,必须调用此方法。\n\n```typescript\nawait viewer.init();\n```\n\n### `render(frame?: number)`\n\n请求渲染一帧。在 `'demand'` 模式下,每当场景发生视觉变化时必须调用此方法来更新画布。`frame` 指定渲染的帧数(默认 `1`)。返回一个在帧渲染完成后 resolve 的 `Promise<void>`。\n\n```typescript\nviewer.render();\n\n// 等待帧渲染完成\nawait viewer.render();\n```\n\n### `invalidate(frame?: number)`\n\n请求渲染但不创建 Promise。动画循环、插件更新等不需要等待渲染完成的高频路径应优先使用此方法,避免每帧分配 Promise 和一次性事件监听器。`frame` 指定至少保留的待渲染帧数(默认 `1`);同一刷新周期内多次调用会合并,不会累加成渲染积压。\n\n```typescript\nviewer.invalidate();\n```\n\n### `setCamera(camera: PerspectiveCamera | OrthographicCamera)`\n\n为查看器设置自定义相机,并自动更新控制器和交互管理器以使用该相机。\n\n```typescript\nconst customCamera = new PerspectiveCamera(75, width / height, 0.1, 1000);\nviewer.setCamera(customCamera);\n```\n\n### `setCameraByType(type: 'perspective' | 'orthographic')`\n\n便捷方法,在保持查看器上下文的同时切换相机类型。\n\n```typescript\nviewer.setCameraByType('orthographic');\n```\n\n### `createScene()`\n\n创建并返回一个黑色背景的新 `Scene`。由构造函数内部调用,也可用于重置/替换场景。\n\n```typescript\nviewer.scene = viewer.createScene();\n```\n\n### `createPerspectiveCamera()`\n\n使用合理的默认值创建 `PerspectiveCamera`(视角 50°,近裁 `0.1`,远裁 `1e5`,位置在 `(5, 5, 5)`)。\n\n```typescript\nconst camera = viewer.createPerspectiveCamera();\nviewer.setCamera(camera);\n```\n\n### `createOrthographicCamera()`\n\n创建与容器元素等大的 `OrthographicCamera`,近裁 `0.1`,远裁 `1e5`,位置在 `(5, 5, 5)`。\n\n```typescript\nconst camera = viewer.createOrthographicCamera();\nviewer.setCamera(camera);\n```\n\n### `resize(width?, height?)`\n\n手动触发容器尺寸更新。可选传入指定宽高。\n\n```typescript\n// 手动触发 resize(如容器尺寸变化后)\nviewer.resize();\n\n// 指定新尺寸\nviewer.resize(800, 600);\n```\n\n### `screenshot(options?)`\n\n捕获当前渲染画面并返回 Data URL。\n\n```typescript\nconst dataUrl = await viewer.screenshot();\n\n// 指定格式和分辨率\nconst dataUrl = await viewer.screenshot({\n width: 1920,\n height: 1080,\n type: 'image/png',\n quality: 1.0,\n});\n```\n\n#### `ScreenshotOptions`\n\n| 属性 | 类型 | 默认值 | 说明 |\n| :-------- | :---------------------------------------------- | :------------ | :--------------------- |\n| `width` | `number` | 容器宽度 | 截图宽度。 |\n| `height` | `number` | 容器高度 | 截图高度。 |\n| `type` | `'image/png'` \\| `'image/jpeg'` \\| `'image/webp'` | `'image/png'` | 图片格式。 |\n| `quality` | `number` | `1.0` | 图片质量(0-1)。 |\n\n### `setBackground(background)`\n\n设置场景背景颜色、纹理或清除背景。\n\n```typescript\nviewer.setBackground(0x333333); // 颜色\nviewer.setBackground('#87ceeb'); // CSS 颜色字符串\nviewer.setBackground(hdrTexture); // 纹理\nviewer.setBackground(null); // 清除背景\n```\n\n### `setEnvironment(envMap)`\n\n设置场景环境贴图(用于反射/IBL)。\n\n```typescript\nviewer.setEnvironment(hdrTexture);\nviewer.setEnvironment(null); // 清除\n```\n\n### `enableShadow()` / `disableShadow()`\n\n开启或关闭阴影渲染。\n\n```typescript\nviewer.enableShadow();\nviewer.disableShadow();\n```\n\n### `enableFog(options?)` / `enableFogExp2(options?)` / `disableFog()`\n\n开启线性雾、指数雾或关闭雾效。\n\n```typescript\n// 线性雾\nviewer.enableFog({ color: 0xcccccc, near: 10, far: 100 });\n\n// 指数雾\nviewer.enableFogExp2({ color: 0xcccccc, density: 0.01 });\n\n// 关闭雾效\nviewer.disableFog();\n```\n\n#### `FogOptions`\n\n| 属性 | 类型 | 默认值 | 说明 |\n| :------ | :-------------------- | :---------- | :------------- |\n| `color` | `ColorRepresentation` | `0xcccccc` | 雾的颜色。 |\n| `near` | `number` | `10` | 雾的起始距离。 |\n| `far` | `number` | `100` | 雾的结束距离。 |\n\n#### `FogExp2Options`\n\n| 属性 | 类型 | 默认值 | 说明 |\n| :-------- | :-------------------- | :---------- | :------------- |\n| `color` | `ColorRepresentation` | `0xcccccc` | 雾的颜色。 |\n| `density` | `number` | `0.01` | 雾的密度。 |\n\n## 调试工具\n\n### Info\n\n`viewer.info` 是一个轻量的渲染统计叠加层,显示当前帧的 GPU 诊断数据,适合开发调试阶段使用。\n\n```typescript\nviewer.info.enable(); // 在画面左下角显示统计信息\nviewer.info.disable(); // 隐藏统计信息\n```\n\n启用后将在 `viewer.el` 左下角叠加以下数据:\n\n| 指标 | 说明 |\n| :------------- | :---------------------------- |\n| `draw calls` | 当前帧的绘制调用次数 |\n| `frame calls` | 当前帧的帧调用次数 |\n| `triangles` | 当前帧渲染的三角面数量 |\n| `points` | 当前帧渲染的点数量 |\n| `lines` | 当前帧渲染的线段数量 |\n| `timestamp` | GPU 渲染耗时(ms,WebGPU 专属)|\n\n> `timestamp` 指标仅在 WebGPU 后端可用,WebGL 回退模式下显示 `0`。\n\n### ViewerHelper\n\n`viewer.viewerHelper` 是一个方向指示器 gizmo(基于 Three.js `ViewHelper`),显示当前相机朝向的 XYZ 轴,渲染为画面角落的叠加层。\n\n```typescript\nviewer.viewerHelper.enable(); // 显示方向 gizmo\nviewer.viewerHelper.disable(); // 隐藏方向 gizmo\n```\n\n**属性:**\n\n| 属性 | 类型 | 说明 |\n| :------------- | :---------- | :---------------------------------------- |\n| `location` | `object` | gizmo 在画面中的位置,支持 `top`、`bottom`、`left`、`right` 偏移(像素)。默认右下角。 |\n\n```typescript\n// 调整位置到左下角\nviewer.viewerHelper.location.left = 12;\nviewer.viewerHelper.location.bottom = 12;\nviewer.viewerHelper.location.right = null;\n```\n\n### `dispose()`\n\n清理查看器,从 DOM 中移除 canvas,移除事件监听,并释放渲染器和环境贴图,以防止内存泄漏。\n\n```typescript\nviewer.dispose();\n```\n\n## OffscreenCanvas Worker(实验性)\n\n`u-space/worker` 提供一个独立入口,可将 `Viewer`、Three.js 场景、相机控制和 WebGPU 渲染全部放入 dedicated render Worker。主线程只负责持有可见 canvas、转发输入事件与尺寸,并接收状态或渲染统计。模型默认仍在 render Worker 内加载;大型静态 glTF/SBMX 场景还可以 opt-in 第二个 decode Worker,让网络读取、SBMX 字节还原、JSON/base64 解析和图片解码不阻塞相机与已有场景的渲染。\n\nWorker runtime 入口仅提供 ESM,需使用 `{ type: 'module' }` 创建 Worker。构建工具也必须保留 ES module 输出;Vite 项目需配置 `worker: { format: 'es' }`,否则 IIFE Worker 无法编译 top-level await。\n\n主线程:\n\n```typescript\nimport { OffscreenViewerHost } from 'u-space/worker';\n\nconst worker = new Worker(new URL('./scene.worker.ts', import.meta.url), {\n type: 'module',\n});\n\nconst host = new OffscreenViewerHost({\n el: document.getElementById('app')!,\n worker,\n});\n\nhost.addEventListener('ready', (event) => {\n console.log('scene ready', (event as CustomEvent).detail);\n});\n\nhost.addEventListener('stats', (event) => {\n console.log((event as CustomEvent).detail);\n});\n\nawait host.init();\n```\n\n`await host.init()` 只等待 Worker 创建 `Viewer`、完成 `await viewer.init()` 并发送 `initialized`,此时 WebGPU renderer 和内置 command 已可用,但 HDR、业务模型、editable batch、pipeline 预热和业务首帧可能仍在继续。`initialized` 事件与 `host.init()` resolve 表示同一个边界;`ready` 是业务层边界,只会在 Worker 代码显式调用一次 `worker.ready(detail)` 后触发。因此应在 `host.init()` 之前注册 `ready` / `status` / `stats` 等监听,业务 command 则通常在 `ready` 后调用。\n\n### Worker 超大贴图保护\n\n`createWorkerViewer()` 会在创建 `Viewer` 前安装 Worker 图片加载兼容层,同时覆盖 Three.js `ImageLoader` 和 glTF 常用的 `ImageBitmapLoader`。JPEG、PNG、GIF、WebP 在解码前读取编码尺寸;任一边超过 WebGPU 默认可移植上限 `8192` 时,会在第一次 `createImageBitmap()` 解码时按原宽高比缩小。无法预读尺寸的格式会在首次解码后检查,超限时生成缩放后的 bitmap,并立即 `close()` 临时原图。\n\n该处理保留 `ImageBitmapLoader.setOptions()`、Three.js Cache、request headers、credentials 和 Loader/LoadingManager abort 语义,也不会修改磁盘或服务端源贴图。它避免在默认 `maxTextureDimension2D = 8192` 的 WebGPU device 上触发 `Texture size`,以及随后连续出现的 `Invalid TextureView`、`Invalid BindGroup` 和 `Invalid CommandBuffer`。即使 adapter 支持 `16384`,runtime 也不会强制申请更高 limit,以保持不同 GPU 的可移植性并限制超大贴图的显存占用。\n\n自动缩放只覆盖经 `ImageLoader` / `ImageBitmapLoader` 加载的普通图片;KTX2 等压缩纹理由各自 loader 处理,业务仍应在资产管线中确保其尺寸不超过目标设备 limit。\n\n### 独立模型 Decode Worker\n\n在拥有 Three.js/WebGPU 的 render Worker 中,把一个专用 Worker 交给 `ModelLoaderManager`:\n\n```typescript\nimport { ModelLoaderManager } from 'u-space';\nimport { createWorkerViewer } from 'u-space/worker/runtime';\n\nconst worker = await createWorkerViewer();\nconst modelDecodeWorker = new Worker(\n new URL('./model.decode.worker.ts', import.meta.url),\n { type: 'module' },\n);\n\nconst disposeModelDecodeWorker = ModelLoaderManager.setDecodeWorker(modelDecodeWorker);\nworker.onDispose(disposeModelDecodeWorker);\n```\n\n专用 decode Worker 入口不创建 `Viewer`,只安装解码协议:\n\n```typescript\nimport { installModelDecodeWorker } from 'u-space/worker/model-decoder';\n\ninstallModelDecodeWorker();\n```\n\n启用后,`ModelLoaderManager.loadAsync()` 会把受支持的静态 `.gltf`、`.glb` 和 `.sbmx` 请求排入 decode Worker。decode Worker 负责 fetch/Cache Storage、SBMX nibble swap、glTF JSON/base64/buffer 解析、普通图片解码和超大图片等比缩放;完成后以 transferable `ArrayBuffer` / `ImageBitmap` 把纯数据包发送给 render Worker。render Worker 才创建 `BufferGeometry`、`MeshStandardMaterial`、`Texture` 和 `Object3D`,因此 Three.js 对象和 GPU 资源仍只有一个 owner。\n\n协议采用串行队列和 ACK backpressure:render Worker 重建完当前模型后才允许发送下一个大数据包,避免消息队列同时堆积多个模型副本。相同图片会按 SHA-256 内容身份复用已转移的 `ImageBitmap`,保持与 Three.js loader cache 一致的材质签名和 editable batching 数量;身份索引使用有界 LRU,不会随不同贴图持续增长。传输层直接使用浏览器 structured clone/transferable,没有额外二进制序列化依赖。\n\n外部 buffer/贴图 URL 会回到 render Worker 经 `LoadingManager.resolveURL()` 处理,并完整触发 `itemStart` / `itemEnd` / `itemError`。模型请求的 headers 与 credentials 只会传给同源依赖;URL modifier 把依赖改写到其他 origin 时会自动去掉敏感 headers 并使用 `credentials: 'omit'`,避免授权信息泄漏给资产文件中声明的第三方地址。\n\n当前快速路径只接受无 animation、skin、morph target、camera、sparse accessor、glTF extension/压缩扩展且 primitive mode 为 triangles 的 glTF 2 静态模型;节点图还必须满足无重复 child、无多父节点、无环及安全深度限制。其他受支持但不适合快速路径的模型会自动回退现有 `GLTFLoader` / `SBMXLoader`,不会降级功能;decode Worker 致命错误也会摘除失效 client 并回退当前请求。`ModelLoaderManager` 拥有传入的 Worker;再次调用 `setDecodeWorker()` 或传入 `null` 会 dispose 并 terminate 旧 Worker。`setDecodeWorker(worker)` 返回与该实例绑定的 disposer,建议交给 render runtime 的 `onDispose()`,避免旧清理回调误终止后来替换的 Worker。AbortSignal 同时覆盖 decode Worker 快速路径、普通 loader 顶层 fetch 和 glTF/SBMX 外部资源加载。\n\n这个能力也可以在主线程的普通 `Viewer` 中启用,但它的主要收益是在 Offscreen render Worker 中把模型解码进一步拆开,使场景已可交互时仍能继续流式装载。它不减少网络体积、最终 GPU 内存或 draw calls;这些仍由资源压缩、instancing、editable batching、LOD 和裁剪解决。\n\n### `OffscreenViewerHost`\n\n构造选项:\n\n| 选项 | 类型 | 必需 | 说明 |\n| :--- | :--- | :--- | :--- |\n| `el` | `HTMLElement` | 是 | 主线程容器;默认创建的 canvas 会挂载到这里。 |\n| `worker` | `Worker` | 是 | 使用 `{ type: 'module' }` 创建的 dedicated Worker。 |\n| `canvas` | `HTMLCanvasElement` | 否 | 自定义可见 canvas;省略时自动创建。 |\n| `pixelRatio` | `number` | 否 | 发送给 Worker renderer 的 drawing-buffer pixel ratio;省略时使用 `Math.min(window.devicePixelRatio, 1.5)`。 |\n| `terminateWorkerOnDispose` | `boolean` | 否 | `dispose()` 完成后是否终止 Worker,默认 `true`。 |\n\n公开方法:\n\n| 方法 | 说明 |\n| :--- | :--- |\n| `OffscreenViewerHost.isSupported()` | 检查当前环境是否具备 Worker、OffscreenCanvas 和 `transferControlToOffscreen()`。Worker 内是否暴露 WebGPU 仍会在初始化时检查。 |\n| `init(): Promise<void>` | 绑定输入/resize,转移 canvas 并等待 Worker 的 `initialized` 消息;重复调用返回同一个 Promise。 |\n| `request<T>(command, payload?)` | 调用 Worker 已注册或内置的 command。必须在 `init()` resolve 后调用;业务 command 通常还应等待 `ready`。 |\n| `dispose(): void` | 停止事件与尺寸转发、reject 未完成的 Promise、移除 canvas,并通知 Worker 逆序释放业务资源和 `Viewer`。 |\n\nHost 事件:\n\n| 事件 | `detail` | 说明 |\n| :--- | :--- | :--- |\n| `initialized` | 无 | 与 `host.init()` resolve 相同的 Viewer 初始化边界。 |\n| `ready` | `unknown` | Worker 调用一次 `worker.ready(detail)` 后的业务就绪边界。 |\n| `status` | `string` | Worker 通过 `worker.status(message)` 上报的加载状态。 |\n| `stats` | `WorkerRendererStats` | renderer 计数和滚动帧间隔统计。 |\n| 自定义事件 | `unknown` | Worker 通过 `worker.emit(type, detail)` 上报;事件名为传入的 `type`。 |\n| `error` | `Error` | Worker 初始化、未捕获异常或资源清理错误。 |\n| `disposed` | 无 | Worker 已完成清理并关闭。 |\n\n`WorkerRendererStats` 包含 `drawCalls`、`frameCalls`、`triangles`、`points`、`lines`、作为滚动平均帧间隔的 `frameTime`,以及 `frameTiming.samples` / `fps` / `average` / `p95` / `max` / `missedFramePercent`。其中 `missedFramePercent` 表示滚动窗口内超过 25ms 的样本占比;demand 模式的静止空闲间隔不会被作为渲染帧计入。\n\nWorker(runtime 使用独立入口和 top-level await,避免主线程打包 Viewer/Three.js):\n\n```typescript\nimport { createWorkerViewer } from 'u-space/worker/runtime';\n\nconst worker = await createWorkerViewer();\nconst { viewer } = worker;\n\nworker.status('loading scene');\nconst scene = await loadScene(viewer);\nviewer.scene.add(scene);\nawait viewer.render();\n\nworker.registerCommand('getObjectCount', () => viewer.scene.children.length);\nworker.onDispose(() => disposeScene(scene));\nworker.ready({ objects: viewer.scene.children.length });\n```\n\n`createWorkerViewer()` 必须在 module Worker 顶层立即调用。函数会先同步注册 host 消息监听,再返回一个等待 OffscreenCanvas 传入和 `viewer.init()` 完成的 Promise,因此可以安全使用 top-level await,不会丢失 `init` 消息。\n\n返回的 `WorkerViewerRuntime` 提供:\n\n| 属性 / 方法 | 说明 |\n| :---------- | :--- |\n| `viewer` / `canvas` | Worker 内的完整 `Viewer` 和已转移的 `OffscreenCanvas`。 |\n| `status(message)` | 向主线程发送加载状态。 |\n| `emit(type, detail?)` | 向主线程派发自定义事件;detail 必须可 structured clone。 |\n| `registerCommand(name, handler)` | 注册 `host.request()` 可调用的业务命令,返回注销函数;重复命令名会抛错。 |\n| `onDispose(handler)` | 注册 Worker 销毁回调,返回注销函数;多个回调按注册的逆序执行。 |\n| `ready(detail?)` | 场景准备完成后发送一次 `ready` 事件;重复调用会抛错。 |\n\n主线程应等待 `ready` 事件后,再用 `await host.request('getObjectCount')` 调用业务命令。runtime 还内置 `getStats`、`getViewpoint`、`setViewpoint` 和 `render` 命令,这些命令在 `host.init()` resolve 后即可调用。命令参数和返回值必须可被 structured clone;返回值中重复引用或嵌套在对象、数组、Map、Set、TypedArray / DataView 中的 `ArrayBuffer` 会去重后零拷贝转移,并从 Worker 端 detach。`Viewer`、`Object3D`、材质和 Geometry 等 Three.js 对象始终留在 Worker 内。\n\n`ready()` 前发生的顶层未捕获错误或 Promise rejection 会先发送主线程 `error` 事件,再按逆序执行 `onDispose()`、释放 `Viewer`、发送 `disposed` 并关闭 Worker,避免失败的场景加载继续占用动画循环和 GPU 资源。Host 在初始化完成前被销毁,canvas 转移或初始 `postMessage()` 抛错,或收到 Worker 主动发送的 `disposed` 时,会 reject 尚未完成的 `init()` 和 `request()`,同时解除 DOM/resize 监听、清空待发送 pointer move、移除 canvas,并按 `terminateWorkerOnDispose` 完成 Worker 收尾。Host 一旦进入 disposed 状态,会忽略队列中迟到的 `initialized` / `ready` / `status` / `stats` / 自定义事件和 response,只保留清理阶段的 `error` / `disposed` 通知。\n\n### UManager 与 editable batching\n\n完整示例 `examples/offscreen/test_umanager2_offscreen.html` 会在 Worker 中加载 HDR、建筑语义模型和场景模型,并将 `SceneLoader.setEditableBatching()` 与 OffscreenCanvas 组合:\n\n```typescript\nimport { SceneLoader } from 'u-space/plugins/u-manager';\nimport { createWorkerViewer } from 'u-space/worker/runtime';\n\nconst worker = await createWorkerViewer();\nconst { viewer } = worker;\n// 在初始静态层级和相机定位完成后冻结每帧场景矩阵遍历。\nviewer.scene.updateMatrixWorld(true);\nviewer.scene.matrixWorldAutoUpdate = false;\nconst sceneLoader = new SceneLoader(viewer);\nworker.onDispose(() => sceneLoader.dispose());\nsceneLoader.setPath(SCENE_PATH);\nsceneLoader.setKey(SCENE_KEY);\nsceneLoader.setEditableBatching({\n maxVerticesPerBatch: 1_500_000,\n maxIndicesPerBatch: 4_500_000,\n freezeAnimations: true,\n});\n\nconst scene = await sceneLoader.loadAsync();\nconst controlsEnabled = viewer.controls.enabled;\nviewer.controls.enabled = false;\ntry {\n viewer.scene.add(scene);\n scene.updateWorldMatrix(true, true);\n viewer.invalidate();\n await viewer.renderer.compileAsync(viewer.scene, viewer.camera);\n} finally {\n viewer.controls.enabled = controlsEnabled;\n}\nawait viewer.render();\n\nworker.ready({\n editableBatch: scene.userData.editableBatch,\n semanticOverlayHidden: false,\n});\n```\n\nGeometry clone、矩阵烘焙、`mergeGeometries()`、TSL batch material 创建和 WebGPU 渲染提交都会在 Worker 中完成,不阻塞主线程 UI。`ready` 事件中的 `detail.editableBatch` 是普通统计对象,可以安全传回主线程;示例 HUD 同时显示 `drawCalls`、`frameTiming.fps`、1 秒滚动窗口的 `average` / `p95` / `max`、超过 25ms 的 `missedFramePercent`,以及 `sourceMeshes` / `batches` / `drawCallsSaved` / `unsupportedInstances` 和 `static scene matrices` 状态。`frameTime` 保留为滚动平均值;demand 模式长时间静止产生的空闲间隔不会纳入统计。\n\n目标场景的压平语义楼层是半透明分析叠加层,并会有意覆盖建筑表面。示例保持 `SemanticGroup.visible = true`,并调用 `showAllFloors().showAllFacilities()`,让楼层、墙体、空间、门窗和设备等全部语义对象默认参与渲染。设备选择、飞向、高亮和清除命令均不改变语义对象显隐,“清除调试”只撤销高亮。业务项目可以按自身展示策略切换语义层,并继续通过跨楼层语义合批或 LOD 降低提交成本。示例保留标准 RenderPipeline scene pass,以维持源模型透明对象的正确离屏合成,不修改 drawing-buffer pixel ratio。\n\n目标场景主要由静态普通 Mesh 组成,因此相机定位完成后先调用 Three.js 原生 `viewer.scene.updateMatrixWorld(true)` 提交当前层级,再设置 `viewer.scene.matrixWorldAutoUpdate = false`,移除每个渲染帧的整树更新;加载完场景模型后只调用 `scene.updateWorldMatrix(true, true)` 提交新增子树。后续 Worker command 修改单个普通 Mesh 或 `InstanceObject` 时调用 `object.updateWorldMatrix(true, false)`,修改 Group 时调用 `group.updateWorldMatrix(true, true)`,随后调用 `viewer.invalidate()` 请求渲染。`InstanceObject` 覆盖了 Three.js 原生 `updateWorldMatrix()`,会在显式提交后检测世界矩阵/祖先显隐变化并触发 dirty callback;`ModelInstancedLayer` 因而能同步 instance buffer,editable batch 中与烘焙矩阵不同的 `SceneInstanceObject` 也会按现有规则 materialize。对 Group 使用 `updateChildren: true` 时,其后代 `InstanceObject` 同样会执行该检测。相机矩阵不受此模式影响。\n\nOffscreenCanvas 不会自动减少 draw calls;`setEditableBatching()` 也不会把主线程 UI 搬入 Worker。组合使用时,两者分别处理主线程 CPU 压力和 draw submission 压力。需要按 ID 显隐、变色、移动或 `materialize()` 时,应使用 `worker.registerCommand()` 注册业务 command,再由主线程调用 `host.request()`,不要尝试跨线程传输 `SceneInstanceObject`。\n\n通过以下命令启动:\n\n```bash\npnpm example:offscreen\n```\n\n当前边界:\n\n- 需要同时支持 `transferControlToOffscreen()` 和 Worker WebGPU(`WorkerNavigator.gpu`);目前应以最新版 Chromium 为主要目标,并保留普通 `Viewer` 回退路径。\n- CSS2D/CSS3D、`Info` 等真实 DOM 叠加层不能放进 Worker,应在主线程用 Worker 状态/统计消息重建 UI。\n- Worker 能移走场景解析、矩阵更新和渲染提交等主线程 CPU 工作,但不会减少 draw calls、三角形数量或 GPU 时间;GPU 瓶颈仍需用 instancing、LOD、遮挡/视锥裁剪等方式处理。\n- `setEditableBatching()` 与 Worker 兼容,但它会展开重复 Geometry,仍需根据 `vertices` / `indices` 统计评估 GPU 内存;透明、蒙皮、morph 和自定义 shader 子集继续走安全 fallback。\n- WebGPU OffscreenCanvas 截图尚未作为 Worker 内置命令开放;需要截图时应实现独立的 render-target readback 流程。\n\n## 事件\n\nViewer 继承自 `EventDispatcher`,会触发以下事件:\n\n- `beforeControlsUpdate`:在 `CameraControls` 更新之前触发,提供 `{ time: number; delta: number }`。\n- `afterControlsUpdate`:在 `CameraControls` 更新之后触发,提供 `{ time: number; delta: number }`。\n- `beforeRender`:在 `renderer.render` 调用之前立即触发,提供 `{ time: number; delta: number }`。\n- `afterRender`:在 `renderer.render` 完成之后立即触发,提供 `{ time: number; delta: number }`。\n- `cameraChange`:调用 `setCamera` 时触发,提供 `{ camera: Camera }`。\n\n其中 `delta` 为上一帧到当前帧的时间间隔(秒),可用于动画更新等场景。\n"
1402
1410
  },
1403
1411
  {
1404
1412
  "id": "changelog",
1405
1413
  "path": "changelog.md",
1406
1414
  "title": "更新日志",
1407
- "summary": "- **AO 示例** — 新增 `examples/test_ao.html`,通过 SSGI `giIntensity: 0` 默认开启纯 AO,并提供遮蔽强度、半径和厚度实时调节。 - **RenderPipeline SSR** 新增 `enableSSR()`、`updateSSR()` `disableSSR()`,封装 Stochastic SSR、Temporal Reproject、Recurrent Denoisevelocity 以及双向历史反馈;提供完整 SSR 与降噪参数配置。 - **Viewer** 新增可选 `pixelRatio` 构造参数,省略时继续使用 `Math.min(window.devicePixelRatio, 1.5)`。",
1415
+ "summary": "- **嵌套模型 Decode Worker** — 新增 `u-space/worker/model-decoder` `ModelLoaderManager.setDecodeWorker()`;静态 glTF/GLB/SBMX 可在 render Worker 之外完成 fetch/cache、SBMX 还原、JSON/base64/buffer 与图片解码,再以 transferable `ArrayBuffer` / `ImageBitmap` 交回 Three.js owner。协议使用单包 ACK backpressureAbortSignal 和贴图内容身份复用,复杂 glTF 特性自动回退原 loader;Offscreen UManager 示例默认启用,并支持 `?modelDecodeWorker=off` A/B。 - **Offscreen 在线示例** ",
1408
1416
  "headings": [
1409
1417
  {
1410
1418
  "level": 1,
@@ -1414,6 +1422,22 @@ export const docsIndex = [
1414
1422
  "level": 2,
1415
1423
  "text": "未发布"
1416
1424
  },
1425
+ {
1426
+ "level": 2,
1427
+ "text": "0.0.31"
1428
+ },
1429
+ {
1430
+ "level": 3,
1431
+ "text": "新增"
1432
+ },
1433
+ {
1434
+ "level": 3,
1435
+ "text": "修复与优化"
1436
+ },
1437
+ {
1438
+ "level": 2,
1439
+ "text": "0.0.30"
1440
+ },
1417
1441
  {
1418
1442
  "level": 3,
1419
1443
  "text": "新增"
@@ -1631,13 +1655,13 @@ export const docsIndex = [
1631
1655
  "text": "新增"
1632
1656
  }
1633
1657
  ],
1634
- "content": "# 更新日志\n\n## 未发布\n\n### 新增\n\n- **AO 示例** — 新增 `examples/test_ao.html`,通过 SSGI 的 `giIntensity: 0` 默认开启纯 AO,并提供遮蔽强度、半径和厚度实时调节。\n- **RenderPipeline SSR** — 新增 `enableSSR()`、`updateSSR()` 和 `disableSSR()`,封装 Stochastic SSR、Temporal Reproject、Recurrent Denoise、velocity 以及双向历史反馈;提供完整 SSR 与降噪参数配置。\n- **Viewer** — 新增可选 `pixelRatio` 构造参数,省略时继续使用 `Math.min(window.devicePixelRatio, 1.5)`。\n- **Offscreen UManager 示例** — `examples/offscreen/test_umanager2_offscreen.html` 现在在 Worker 内启用 `SceneLoader.setEditableBatching()`、预热 WebGPU batch pipeline,并将渲染与 editable batch 统计传回主线程 HUD。\n- **u-manager editable batching** — `SceneLoader.setEditableBatching()` 可把大型、主要静态的普通 Mesh 场景按材质和 Geometry 布局烘焙合并到 `SceneEditableBatchLayer`,同时保留 `SceneInstanceObject` 的显隐、颜色、高亮、bounds 和 raycast 映射;transform 或半透明修改会只 materialize 当前对象,透明/蒙皮/morph/自定义材质等不支持子集保持安全 fallback。\n- **核心 Batches API** — 新增公共 `src/batches` 模块和 `EditableGeometryBatchLayer<T extends InstanceObject>`,提供通用 source/build/unsupported 结果、TSL dirty 状态、typed materialize 事件、lazy BVH hit remap、统计与资源释放;`ModelInstancedLayer` 同步归入该模块,顶层 `u-space` 导入方式保持不变。\n\n### 变更\n\n- **Offscreen Worker breaking** — 移除 callback 风格的 `defineWorkerViewer()`、`WorkerViewerSetup`、`WorkerViewerSetupResult` 和 `WorkerViewerContext`;改为在 module Worker 顶层 `await createWorkerViewer()`,并通过返回的 `WorkerViewerRuntime` 顺序调用 `status()`、`registerCommand()`、`onDispose()` 和 `ready()`。\n- **InstanceObject materialize** — 将 `SceneInstanceObject` 私有的 materializer delegate 提升为核心 `InstanceObject.setInstanceMaterializer()` / `clearInstanceMaterializer()` / `materialize()` 协议;`SceneEditableBatchLayer` 改为核心 `EditableGeometryBatchLayer` 的 scene-specific 薄适配层,fallback 移除改用 typed `materialize` 事件。\n\n### 修复与优化\n\n- **Offscreen UManager 帧率与楼壳显示** — 示例保留语义数据用于相机定位,但默认隐藏会半透明覆盖楼壳的高 draw-call 分析层;同时通过 Three.js 原生 `Scene.matrixWorldAutoUpdate` / `Object3D.updateWorldMatrix()` 关闭静态场景每帧整树矩阵遍历,并保留标准 RenderPipeline scene pass 以确保源模型透明对象正确合成。在不调整 pixel ratio 的情况下,目标场景持续拖拽可维持约 59–60 FPS。\n- **Editable Geometry Batch 不透明材质** — 不透明 batch 不再复用动态 opacity 节点同时驱动 alpha 输出和 `maskNode`;源材质 opacity 路径保持不变,对象显隐改用独立布尔遮罩,修复建筑楼壳被错误显示为半透明的问题。\n- **InstanceObject 静态矩阵更新** — 覆盖 Three.js 原生 `updateWorldMatrix()`,与 `updateMatrixWorld()` 共享世界矩阵/祖先显隐 dirty 检测;根 Scene 冻结自动矩阵更新后,显式更新单个实例或父 Group 仍会同步 instanced buffer,并让 editable batch 的变换差异正确触发 materialize。\n- **Editable Geometry Batch 拾取** — 公共 `EditableGeometryBatchLayer` 继承 `BaseGroup`,内部未导出的 `EditableGeometryBatchMesh` 继承 `BaseMesh` 并在自定义 BVH raycast 前保留不可见短路;隐藏整个 editable layer 或单个 merged batch 后不会继续命中逻辑对象。\n- **Editable Geometry Batch 生命周期** — 修复多个 layer 共用 inverse matrix、dirty transform 因旧 bounds 先被视锥裁剪、冻结根 Scene 下新挂载模型错过当帧世界矩阵、跨 layer materialize 后旧副本仍显示、materialize 对象共享模板材质、旧烘焙位置残留 BVH 命中、负缩放实例错误进入 merged/instanced path、重复实例生成幽灵几何、重复 build 累积资源、旧 layer dispose 清除新 materializer,以及 build 期间已 materialize 对象重复进入透明 fallback;`EditableGeometryBatchLayer` 现在是 one-shot builder。\n- **Offscreen HUD** — renderer stats 改为 1 秒滚动窗口的 FPS、平均/p95/最大帧间隔、超过 25ms 的占比和样本数,并排除 demand 模式从静止恢复时的空闲间隔。\n- **Offscreen Worker lifecycle** — 修复初始化期间销毁导致 `host.init()` 永久 pending、canvas 转移/初始 `postMessage()` 失败后未完成本地清理、dispose 后迟到的业务消息仍被派发、待发送 pointer move rAF 未取消、`ready()` 前加载失败未释放 Worker/GPU 资源,以及重复 `ArrayBuffer` transfer list 抛出 `DataCloneError`。\n- **RenderPipeline SSGI** — 修正 AO/GI 合成,改为 `scene × AO + diffuse × GI`,确保 `aoIntensity` 与 `giIntensity` 分别作用于遮蔽和间接漫反射;同时兼容 Viewer 默认的 reversed depth 背景判断,并在与 SSR 同时启用时复用 diffuse MRT 附件。\n- **RenderPipeline SSR** — 兼容 Viewer 默认的 `reversedDepthBuffer`:三个内部全屏 pass 会正确跳过 clear-depth 背景,同时保留 raw reversed depth 用于位置重建、ray marching 和 temporal history。\n- **SSR 示例** — 新增 `examples/test_ssr.html`,并使用 1× drawing buffer、`maxDistance: 0.4`、静态 2048² 阴影和关闭默认性能面板的配置降低 GPU 开销。\n\n### 文档\n\n- **docs/mcp** — 将核心 `InstanceObject` 的完整 API 归入 Objects 文档,并同步 u-manager 子类引用、LLM 摘要和 MCP 检索索引;运行时 API 未发生变化。\n- **u-manager editable batching** — 补充 `setEditableBatching()` 配置、合并键、TSL 状态纹理、materialize/fallback 边界、统计字段、显存权衡、`test_umanager2.html` 示例和 MCP 检索范围。\n- **OffscreenCanvas Worker** — 补充 `OffscreenViewerHost` 构造选项、方法、事件和统计字段,明确 `host.init()` / `initialized` 与一次性业务 `ready` 的边界,以及 `examples/offscreen/test_umanager2_offscreen.html` 的 editable batching、`compileAsync()` 预热、HUD 统计、静态根节点下 `InstanceObject` 显式矩阵提交、structured-clone/command 边界和 MCP 检索入口。\n- **SSR** — 补充完整 RenderPipeline SSR API、时域/降噪配置、reversed-depth 兼容说明、性能建议与在线示例入口。\n\n## 0.0.29\n\n### 变更\n\n- **u-manager breaking** — 通用实例基类和模型合批层从 `plugins/u-manager/instances` 移入核心;`InstanceObject` 位于 `src/instances`,`ModelInstancedLayer` / `InstanceCullingOptions` 位于 `src/batches`,均继续通过顶层 `u-space` 导出;旧 `SemanticInstanceObject` / `SemanticModelInstancedLayer` 命名不再保留。\n- **u-manager breaking** — `ModelInstancedLayer` 移除旧的 `addSemanticBatch()` 公开入口,改为 `reserveBatch()`、`addInstance()` / `addInstances()`、`getInstanceById()`、`removeInstance()` / `removeInstances()`、`removeBatch()` 和 `clearBatches()`,支持运行时实例新增/删除、按 URL batch 的 capacity 预分配与扩容;`removeInstances()` 支持直接传单个字符串 `instanceId`,并且 layer 内部不再从 `instance.userData` 扫描 ID。\n- **u-manager breaking** — `InstanceObject` 使用独立身份字段 `instanceId`、`instanceKind`、`instanceName` 和 `setInstanceIdentity()`;Scene / Facility instancing 的查询、删除和 raycast remap 都使用这些字段,`userData` 只保留原始业务元数据。\n- **u-manager breaking** — `SemanticGroup`、`BuildingGroup` 和 `FloorMesh` 的 building/floor/facility 索引统一读取语义对象 ID、实例对象 `instanceId` 或显式传入的别名,不再把 `userData.id`、`userData.semanticId`、`userData.facilityId` 自动注册成查询 ID;`ModelInstancedLayer` 会拒绝重复 `instanceId` 的新增实例,并在身份字段变化后按需刷新 id 索引。\n- **u-manager** — `InstanceObject` 新增对象级 `boundingBox`、`boundingSphere`、`computeBoundingBox()` 和 `computeBoundingSphere()`,`SceneInstanceObject`、`FacilityInstanceObject` 以及楼层语义代理可直接传给 `viewer.controls.flyToObject()`。\n- **u-manager** — `ModelInstancedLayer` 的内部实例矩阵同步改为 WebGPU storage instanced buffer 路径,运行时新增或移动实例后会在下一帧立即同步 matrix;外部仍通过修改 `InstanceObject` transform 和 dirty sync 使用,不需要直接写内部 `InstancedMesh.instanceMatrix`。\n- **u-manager** — `SemanticGroup` 新增 `getDefaultFacilityLayer()`,`SceneLoader.loadAsync()` 返回的 `SceneGroup` 新增 `sceneLayer` / `getDefaultSceneLayer()`,外部可直接获取默认 Facilities 和场景模型合批层。\n- **docs/mcp** — 更新 u-manager 文档、Examples Guide、LLM 索引和 MCP 检索说明,推荐通过 `viewer.controls.flyToObject()` 飞向实例;`getInstanceBoundingBox(target, true)` 保留给手动合并或调整世界包围盒的场景。\n\n### 示例与文档\n\n- **在线示例** — `examples/importmap.js` 的 CDN fallback 版本更新为 `0.0.29`,Vercel 部署会继续按 `package.json` 注入当前版本。\n\n## 0.0.28\n\n### 新增\n\n- **u-manager** — 新增 `UManagerLoader` 一体化入口,可同时加载 `SemanticLoader` 和 `SceneLoader`,返回带 `semanticGroup` / `sceneGroup` 直接属性的 `UManagerSceneGroup`,并复用 semantic id 去重避免重复建筑/设备。\n- **examples/docs/mcp** — 新增 `examples/test_umanager_loader.html`,演示 `UManagerLoader` 一次加载语义楼层、Facilities 和非语义场景树,并补充 Examples Guide 与 MCP 检索入口。\n\n### 变更\n\n- **u-manager breaking** — `SceneInstanceObject`、`FacilityInstanceObject` 和楼层多边形语义统一到 `InstanceObject` API:使用 `setInstanceVisible()`、`setInstanceColor()`、`setInstanceOpacity()`、`getInstanceBoundingBox()` 等方法,不再使用 scene/facility 专属实例方法。\n- **u-manager** — 新增共享 `ModelInstancedLayer`,`SceneInstancedLayer` 和 `FacilityInstancedLayer` 共用同一套模型模板 instancing、material groups、多材质、dirty sync、raycast remap 和 fallback wrapper 逻辑。\n- **ObjectManager / MaterialEffects** — 对语义实例的显隐、透明度和高亮控制统一识别 `InstanceObject`,不再维护 SceneInstance/FacilityInstance 两套特殊分支。\n- **u-manager loader** — `SceneLoader` 不再解析场景树里的 `AREA`、`FLOOR`、`ROOM` 语义面;楼层、区域和房间统一由 `SemanticLoader` / `SemanticGroup` 处理,避免同一语义对象在组合加载时重复出现。\n\n### 示例与文档\n\n- **在线示例** — `examples/importmap.js` 的 CDN fallback 版本更新为 `0.0.28`,Vercel 部署会继续按 `package.json` 注入当前版本。\n\n## 0.0.27\n\n### 变更\n\n- **u-manager semantics** — `FacilityInstancedLayer` 的相机逐实例裁剪改为显式开启:默认不再按当前相机视锥或 `minScreenRadius` 压缩 active instances,避免相机距离影响设备显隐;需要性能压缩时可通过 `setInstanceCulling({ enabled: true })` 开启。\n- **u-manager semantics** — `FacilityInstancedLayer` 使用动态 `Group` 包裹 Facilities `InstancedMesh` batch,避免 Three.js WebGPU render bundle 缓存跳过子 mesh 的渲染前同步;`hideAllFacilities()` 后再 `showAllFacilities()` 不会复用过期 active instance 状态。\n- **u-manager semantics** — `FacilityInstancedLayer` 支持合法 `material[]` + `geometry.groups` 的设备模板进入 instancing;只有 groups 缺失或材质索引非法的多材质 Mesh 才回退为普通 `Model`。\n- **u-manager semantics** — Facilities instancing 会在相机矩阵、投影矩阵或 viewport 高度变化时重新压缩当前帧实例;设备显隐、颜色、透明度和 `planish('Facilities')` / `unplanish('Facilities')` 改变 transform 时刷新 instance data。\n- **u-manager semantics** — 全部设备隐藏或透明度为 0 时,`FacilityInstancedLayer` 会关闭空的内部 `InstancedMesh`;通过 `showAllFacilities()` 或单设备 API 恢复时会重新加入渲染同步。\n- **fire 插件** — 新增 `FireEffect`,封装 Three.js 官方 `webgpu_volume_fire` 体积火焰示例,支持 WebGPU 3D 流体模拟、烟雾散射、动态光照、体积阴影、output effect 叠加和 `cameraChange` 相机切换同步。\n- **u-manager loader** — `SceneLoader` 默认读取同路径 `db/semantic_model.json` 并按语义 `ID` 跳过重复场景树节点,支持与 `SemanticLoader` 同时加载。\n- **u-manager loader** — `SceneLoader` 默认按模型 `path` 合并重复静态 3D 节点,通过 `SceneInstancedLayer` 批量渲染,同时保留 `SceneInstanceObject` 逻辑对象用于单模型 ID 检索、显隐、颜色、透明度、包围盒和事件派发。\n- **docs/mcp** — 补充 `SceneInstanceObject` 和 `FacilityInstanceObject` 通过 `objectManager.getById()` + `getInstanceBoundingBox()` + `controls.flyToBox()` 飞向单个实例的示例与 MCP 检索说明。\n- **ObjectManager / MaterialEffects** — `setOpacity()`、`show()` / `hide()`、`isolate()`、`showAll()` 以及 `highlightColor()` / `removeHighlightColor()` 支持 `SceneInstanceObject` 的 per-instance 控制。\n- **u-manager loader** — `SceneLoader` 创建的根组、`GROUP` 和 `STUB` 节点改为 `BaseGroup`,隐藏后可通过对象自身 `raycast()` 返回值阻止子级继续参与递归射线检测。\n- **Viewer** — 默认使用 Three.js `reversedDepthBuffer` 替代 `logarithmicDepthBuffer`,减少 WebGPU 顶视角多层透明场景的 fragment 压力,同时保留远距离深度精度。\n\n### 示例与文档\n\n- **在线示例** — `examples/importmap.js` 的 CDN fallback 版本更新为 `0.0.27`,Vercel 部署会继续按 `package.json` 注入当前版本。\n\n## 0.0.26\n\n### 修复\n\n- **u-manager semantics** — `FloorMesh.planish()` 会在压平后的语义实例和 Facilities 上加入稳定的轻微 Y 偏移,减少门、墙等重叠薄片之间的共面闪烁。\n- **u-manager semantics** — `FloorMesh` 会按实例透明度把合并语义网格拆分到不透明和透明材质通道,避免墙、柱、门等完全不透明实例也走透明渲染队列,降低近距离压平场景的 overdraw 成本。\n- **u-manager semantics** — `BuildingGroup` 新增 `getFloorById()`、`getElevatorById()` 和 `getVentById()`,内部通过 `Map` 维护楼层、电梯井和通风井语义 ID 索引。\n- **u-manager semantics** — `FacilityInstancedLayer` 只在实例矩阵、颜色或透明度变化时上传对应 instance buffer,静态 Facilities 不再每帧重复提交全部实例数据;渲染前会按每个 Facility 实例的世界包围盒和当前相机视锥压缩本帧 active instance count,不再通过相机距离阈值裁剪设备。\n- **u-manager semantics** — 修复 Facilities 视锥裁剪在视角切换后可能沿用上一帧 active subset 的 `visible` / `boundingSphere` 状态,导致某些视角下设备整批隐藏的问题;instanced batch 会保留完整包围球,同时用 `count` 控制本帧 active 实例。\n- **u-manager semantics** — Instanced Facilities 的 batch 材质默认保持不透明,只有源材质本身透明或当前渲染实例存在半透明 opacity 时才切到透明队列,减少完全不透明设备在近距离视角下的 overdraw。\n- **MaterialEffects** — 高亮、呼吸色、线框和淡入淡出效果支持材质数组,确保多材质 Mesh 和 `FloorMesh` 双材质通道都能正确应用并恢复材质状态。\n- **docs/mcp** — 补充 Facilities auto instancing 的动态材质透明度、包围盒视锥裁剪、`controls.flyToBox()` 飞向设备,以及多材质 fallback 对颜色/透明度 override 的支持说明。\n\n### 示例与文档\n\n- **在线示例** — `examples/importmap.js` 的 CDN fallback 版本更新为 `0.0.26`,Vercel 部署会继续按 `package.json` 注入当前版本。\n\n## 0.0.25\n\n### 新增\n\n- **u-manager semantics** — 新增 `SemanticGroup`,作为单次 `SemanticParser` 解析结果的顶层容器;`SemanticLoader.loadAsync()` / `SemanticParser.parseAsync()` 直接返回完整语义场景。\n- **u-manager semantics** — `SemanticGroup` 新增 `getBuildingById(id)`,支持按语义数据里的 `Building.ID` 获取建筑。\n- **u-manager semantics** — `SemanticGroup` 和 `BuildingGroup` 的建筑/设备 ID 查询改为内部 `Map` 索引,并通过楼层设备索引版本自动同步,避免每次查询扫描数组。\n- **u-manager semantics** — `FloorMesh.planish()` / `unplanish()`、`BuildingGroup.planishFloors()` / `unplanishFloors()` 和 `SemanticGroup.planishFloors()` / `unplanishFloors()` 会把所有合并语义实例和 Facilities 都按包围盒贴到楼层平面,而不是围绕实例自身基点压缩。\n- **u-manager semantics** — 新增 scene-level Facilities auto instancing:同模型 URL 的静态设备会合并到 `SemanticGroup.facilityLayer` 的 `InstancedMesh` batch,同时保留楼层下的设备引用用于检索、显隐、颜色和透明度控制;带动画、骨骼、morph target 或多材质 Mesh 的设备自动回退为普通 `Model`。\n- **u-manager semantics** — `SemanticGroup`、`BuildingGroup` 和 `FloorMesh` 新增 `getFacilityById()` 设备检索,返回的 `FacilityInstanceObject` 可通过统一 `setInstanceVisible()`、`setInstanceColor()`、`resetInstanceColor()` 和 `setInstanceOpacity()` 控制普通设备模型或 scene-level instanced 设备引用。\n- **docs/mcp** — 补充 Facilities auto instancing 的材质透明度行为、`resetInstanceColor()` 语义,以及多材质 fallback 对颜色/透明度 override 的限制说明。\n\n### 修复\n\n- **u-manager semantics** — 修复 scene-level instanced Facilities 的点击和指针事件派发:射线命中会映射回楼层下的 `FacilityInstanceObject`,并继续冒泡到所属 `FloorMesh`、`BuildingGroup` 和 `SemanticGroup`。\n- **u-manager semantics** — `FacilityInstancedLayer` 继承 `BaseGroup`,避免 `facilityLayer.visible = false` 后内部 `InstancedMesh` 仍参与射线检测并触发隐藏设备点击事件。\n- **u-manager semantics** — 移除语义设备解析里的 `sid` 检索和注册逻辑;Facilities 只按 `Facility.ID` 以及显式传入的别名进入楼层索引和 `viewer.objectManager`。\n\n### 示例与文档\n\n- **在线示例** — `examples/importmap.js` 的 CDN fallback 版本更新为 `0.0.25`,Vercel 部署会继续按 `package.json` 注入当前版本。\n\n## 0.0.23\n\n### 新增\n\n- **u-manager semantics** — `BuildingGroup` 新增 `isolateFloors(floors)`,支持按多个 `FloorMesh` 或楼层下标同时隔离显示多个楼层;`isolateFloor()` 继续兼容单楼层调用,并可接收数组作为便捷写法。\n- **u-manager semantics** — `SemanticLoader` 新增 `Facilities` 解析:从 `Stories[].Facilities` 索引读取顶层设备语义,用 `Facility.ID` 匹配解密后的 `tree_models` 设备节点,沿父级累乘本地矩阵得到设备世界矩阵,加载 3D 设备模型并转换为楼层局部矩阵后挂载到对应 `FloorMesh`。\n- **u-manager semantics** — `FloorMesh` 新增楼层设备检索与统一语义实体 API:`getFacilityById()`、`getFacilityAt()`、`getFacilities()`、`removeFacility()`、`showAllFacilities()`、`hideAllFacilities()`、`getSemanticById()`、`getSemantics()` 和 `getSemanticsByKind('Facilities')`;`BuildingGroup.showAllFacilities()/hideAllFacilities()` 支持批量显示或隐藏整栋建筑内的楼层设备。\n- **u-space MCP** — 文档索引同步楼层 `Facilities` 解析和检索 API,MCP 客户端可检索设备按楼层挂载、`tree_models` 解密匹配、本地矩阵父级累乘和世界坐标转换规则。\n\n### 示例与文档\n\n- **在线示例** — `examples/importmap.js` 的 CDN fallback 版本更新为 `0.0.23`,部署流程仍会优先按 `package.json` 注入当前版本。\n\n## 0.0.21\n\n### 新增\n\n- **u-manager semantics** — `SemanticLoader` 支持解析建筑级 `Elevators` 和 `Vents`,以 `Polygon.shape` 作为底面轮廓、`Elevation` 作为底面高度、`TotalHeight` 作为拉伸高度生成 `ExtrudeMesh`,并通过 `BuildingGroup.elevatorMeshes`、`BuildingGroup.ventMeshes` 及 add/get/remove 方法管理。\n\n### 修复\n\n- **透明语义体块渲染** — 电梯井/通风井在渲染阶段沿法线轻微内收,`Spaces` 实例使用稳定 per-instance 渲染偏移抖动,缓解与墙体或完全重叠空间共面时的 z-fighting。\n- **atmosphere 插件** — 后处理链移除 aerial perspective 节点,保留 lens flare、tone mapping、temporal antialias 和 dithering;`scene.backgroundNode` 使用 `skyBackground()`,`scene.environmentNode` 使用 `skyEnvironment()`,并继续在关闭插件时恢复启用前的背景和环境节点。\n\n### 示例与文档\n\n- **在线示例** — `examples/importmap.js` 的 CDN fallback 版本更新为 `0.0.21`,部署流程仍会优先按 `package.json` 注入当前版本。\n\n## 0.0.18\n\n### 变更\n\n- **版本发布** — 同步发布包含新版大气插件实现、RenderPipeline output effects 和一键 MCP 发布脚本的 npm 包。\n\n## 0.0.17\n\n### 新增\n\n- **atmosphere 插件** — `Atmosphere.enable(options)` 从占位实现升级为可用的大气渲染:支持 WGS84 经纬高定位、太阳/月亮方向、天空背景、天空环境、aerial perspective、lens flare、tone mapping、temporal antialias、dithering 和 `AtmosphereLight` 阴影。\n- **RenderPipeline** — 新增 `addOutputEffect()` / `removeOutputEffect()` 与 `addMRTChannel()` / `removeMRTChannel()`,插件可追加输出后处理和独立 MRT 通道,不再占用业务侧 `setOutputComposer()`。\n\n### 变更\n\n- **大气状态更新** — 大气插件在 `beforeRender` 中刷新相机 ECEF 位置、太阳/月亮方向和阴影 target,相机控制器驱动的移动也能逐帧更新大气状态。\n- **MCP 发布** — 根目录 MCP 发布入口合并为 `pnpm publish:mcp`,命令会先递增 `u-space-mcp` 的 patch 版本,再构建文档索引并发布 npm 包。\n\n## 0.0.16\n\n### 新增\n\n- **u-manager semantics** — `FloorMesh.planish(kind?)`、`FloorMesh.unplanish(kind?)`、`BuildingGroup.planishFloors(kind?)` 和 `BuildingGroup.unplanishFloors(kind?)` 支持按 `Walls`、`Columns`、`Spaces`、`Doors`、`Windows` 语义类型压平或恢复;`setScaleYAt(index, y)` 可只调整单个语义实例的 Y 轴缩放。\n- **BaseMesh** — 默认开启 `castShadow` 与 `receiveShadow`,基础网格和继承自 `BaseMesh` 的对象会直接参与阴影投射与接收。\n\n### 变更\n\n- **语义类型命名** — `SemanticKind` 统一为数据源字段风格:`Walls`、`Columns`、`Spaces`、`Doors`、`Windows`。\n- **示例与依赖** — 更新 `load_tiles.html` 示例依赖,新增 `@takram/three-atmosphere`、`postprocessing` peer dependency,并将 Vite 外部依赖边界扩展到所有 `@takram/*` 包。\n\n## 0.0.12\n\n### 新增\n\n- **u-manager semantics** — 新增 `SemanticLoader`、`BuildingGroup`、`FloorMesh` 语义楼层 API,支持楼层隔离、实例级颜色/透明度/显隐/matrix/scale 控制,以及实例包围盒/包围球查询。\n- **u-space MCP** — 内置文档索引同步语义楼层 API,MCP 客户端可检索 `SemanticLoader`、`BuildingGroup` 和 `FloorMesh` 用法。\n\n## 0.0.8\n\n### 新增\n\n- **Viewer** — `resize()`、`screenshot()`、`setBackground()`、`setEnvironment()`、`enableShadow()`/`disableShadow()`、`enableFog()`/`enableFogExp2()`/`disableFog()`\n- **CameraControls** — `flyTo()`、`getCameraViewpoint()`、`lock()`/`unlock()`、`setViewMode('2d' | '3d')`\n- **ObjectManager** — `show()`/`hide()`、`isolate()`、`showAll()`、`setOpacity()`、`getBoundingBox()`、`forEach()`、`filter()`\n- **InteractionManager** — `enable()`/`disable()`、`setInteractable()`、`addIgnore()`/`removeIgnore()`\n- **Selection** — 新增框选(rubber-band)和单选/多选/切换模块,支持 `select`/`deselect`/`change` 事件\n- **MaterialEffects** — `wireframe()`/`removeWireframe()`、`transparent()`/`removeTransparent()`、`xray()`/`removeXray()`、`fadeIn()`/`fadeOut()`\n- **Model** — `getBoundingBox()`、`getCenter()`、`setMaterial()`\n- **SceneManager** — 新模块,多场景创建、注册、切换与序列化\n- **LightManager** — 新模块,灯光便捷创建、4 种预设(indoor/outdoor/studio/warehouse)、Helper 可视化\n- **MeasureTool** — 新工具,距离/面积/角度测量,结果可视化渲染到场景\n- **ClippingTool** — 新工具,基于 WebGPU `ClippingGroup` 的剖切面与剖切盒\n- **AnnotationManager** — 新工具,3D 引线标注 + HTML 浮动标签\n- **示例** — 新增 8 个交互式示例页面\n\n### 修复\n\n- **Selection** — 框选覆盖层改为挂载到容器元素(而非 canvas),修复框选矩形不可见的问题\n- **ClippingTool** — 从 `renderer.clippingPlanes`(WebGL API)重写为 `ClippingGroup`(WebGPU API),修复剖切无效的问题\n- **MaterialEffects** — fade 动画在对象移除场景后自动停止,避免内存泄漏\n- **InteractionManager** — `dispose()` 中清除 `clickTimer`,避免定时器泄漏\n- **LightManager** — 修复 `removeAll()`/`hideAllHelpers()` 中遍历 Map 同时删除的问题\n- **ObjectManager** — `setOpacity()` 先检查 `isMesh` 再类型转换\n- **ClippingTool** — `PlaneHelper` 颜色使用 `new Color(color).getHex()` 替代直接 `as number`\n- **MeasureTool** — 移除 WebGPU 不支持的 `linewidth` 属性\n\n---\n\n## 0.0.7\n\n### 变更\n\n- 文档拆分:将插件文档拆分为独立文件\n- 新增 CameraControls 独立文档页\n- 修复 getting-started 中的死链\n- 修复 sbmx loader 示例使用新的 MaterialEffects API\n\n---\n\n## 0.0.6\n\n### 新增\n\n- **MaterialEffects** — 可组合的材质特效系统,支持安全共享材质和 remove API\n- **RenderPipeline** — 内置 Bloom、SSGI、TRAA 后处理及 OutputComposer API\n- **CSSRenderer** — CSS2D / CSS2.5D / CSS3D 叠加渲染 HTML 元素\n- 从 `package.json` 导出 `version`,统一示例 importmap\n\n---\n\n## 0.0.5\n\n### 变更\n\n- 版本发布(无重大功能变更)\n\n---\n\n## 0.0.4\n\n### 新增\n\n- **Model** — 动画播放支持(`playAnimation`、`stopAnimation`、`updateAnimation`)\n- **ViewerEventMap** — 事件回调新增 `delta` 时间参数\n\n---\n\n## 0.0.3\n\n### 新增\n\n- **ObjectControls** 插件 — 交互式移动、旋转、缩放 3D 对象\n- **TopologyDrawer** 插件 — 在场景任意表面交互式绘制拓扑路径图\n- **Topology** — `exportData()` / `importData()` 数据序列化\n\n### 变更\n\n- **Interactions** — `contextmenu` 事件替换为 `rightclick`\n- **Poi** — 优化渲染性能,新增 `scaleFactor` 参数\n- 文档全面完善:本地搜索、侧边栏优化、各插件文档页\n\n---\n\n## 0.0.0\n\n### 新增\n\n- 项目初始化:Viewer 核心、WebGPU 渲染器、场景/相机/控制器\n- 模型加载系统:双层缓存(内存 + 持久化)、Draco/KTX2/Meshopt 支持\n- 交互系统:射线检测、事件冒泡、自定义 3D 对象事件\n- 对象系统:Model、Poi、Topology、基础网格(Sphere/Plane/Circle/Tube/Extrude/Shape)\n- ObjectManager 集中式对象注册\n- 补间动画系统\n- u-manager 插件:场景加载、动画、属性、视点管理\n- tiles 插件:ArcGIS 3D 瓦片 / GIS 地球渲染\n- minimap 插件:2D 小地图\n- keyboard-controls 插件:WASD 键盘控制\n- tracking-controls 插件:相机跟随\n- atmosphere 插件:天空/大气渲染\n- curve-movement 插件:曲线路径动画\n"
1658
+ "content": "# 更新日志\n\n## 未发布\n\n## 0.0.31\n\n### 新增\n\n- **嵌套模型 Decode Worker** — 新增 `u-space/worker/model-decoder` 和 `ModelLoaderManager.setDecodeWorker()`;静态 glTF/GLB/SBMX 可在 render Worker 之外完成 fetch/cache、SBMX 还原、JSON/base64/buffer 与图片解码,再以 transferable `ArrayBuffer` / `ImageBitmap` 交回 Three.js owner。协议使用单包 ACK backpressure、AbortSignal 和贴图内容身份复用,复杂 glTF 特性自动回退原 loader;Offscreen UManager 示例默认启用,并支持 `?modelDecodeWorker=off` A/B。\n\n### 修复与优化\n\n- **Offscreen 在线示例** — Vercel 发布现在通过专用 Vite 配置构建 `examples/offscreen/test_umanager2_offscreen.html`,输出可直接运行的主线程 JavaScript、ES module Worker 和 Draco/Basis WASM 资源,不再让生产页面直接加载 TypeScript;Worker 的 HDR URL 同时兼容本地 `/textures/` 与线上 `/examples/textures/` 路径。\n- **Offscreen Worker 超大贴图** — Worker runtime 同时覆盖 Three.js `ImageLoader` 与 `ImageBitmapLoader`;JPEG/PNG/GIF/WebP 任一边超过 WebGPU 默认 `8192` 上限时,在首次 `createImageBitmap()` 解码时等比缩小并保留 loader options/cache/abort 语义,避免 `Texture size` 继续级联为 `Invalid TextureView`、`Invalid BindGroup` 和 `Invalid CommandBuffer`。未知格式在解码后缩放并释放临时原图,源资产不会被修改。\n- **Offscreen UManager 设备调试** — 增加上一个/下一个设备、飞向、高亮和清除命令;语义楼层、墙体、空间、门窗和设备默认全部显示,设备切换、飞向和清除不再改变其他对象显隐。\n- **模型 Decode Worker 稳定性与安全性** — 外部 buffer/贴图恢复 `LoadingManager.resolveURL()` 和完整 item 生命周期,跨域依赖不再继承模型请求的授权 headers/credentials;增加 glTF 节点图规模、深度、环、多父节点与重复 child 校验,并把贴图内容身份缓存改为有界 LRU。decode Worker 崩溃会自动摘除并回退当前请求,`setDecodeWorker()` 返回实例绑定 disposer,AbortSignal 也覆盖普通 loader 路径;失败的 `Model` 内存缓存 Promise 会被清除以允许重试。\n\n## 0.0.30\n\n### 新增\n\n- **AO 示例** — 新增 `examples/test_ao.html`,通过 SSGI 的 `giIntensity: 0` 默认开启纯 AO,并提供遮蔽强度、半径和厚度实时调节。\n- **RenderPipeline SSR** — 新增 `enableSSR()`、`updateSSR()` 和 `disableSSR()`,封装 Stochastic SSR、Temporal Reproject、Recurrent Denoise、velocity 以及双向历史反馈;提供完整 SSR 与降噪参数配置。\n- **Viewer** — 新增可选 `pixelRatio` 构造参数,省略时继续使用 `Math.min(window.devicePixelRatio, 1.5)`。\n- **Offscreen UManager 示例** — `examples/offscreen/test_umanager2_offscreen.html` 现在在 Worker 内启用 `SceneLoader.setEditableBatching()`、预热 WebGPU batch pipeline,并将渲染与 editable batch 统计传回主线程 HUD。\n- **u-manager editable batching** — `SceneLoader.setEditableBatching()` 可把大型、主要静态的普通 Mesh 场景按材质和 Geometry 布局烘焙合并到 `SceneEditableBatchLayer`,同时保留 `SceneInstanceObject` 的显隐、颜色、高亮、bounds 和 raycast 映射;transform 或半透明修改会只 materialize 当前对象,透明/蒙皮/morph/自定义材质等不支持子集保持安全 fallback。\n- **核心 Batches API** — 新增公共 `src/batches` 模块和 `EditableGeometryBatchLayer<T extends InstanceObject>`,提供通用 source/build/unsupported 结果、TSL dirty 状态、typed materialize 事件、lazy BVH hit remap、统计与资源释放;`ModelInstancedLayer` 同步归入该模块,顶层 `u-space` 导入方式保持不变。\n\n### 变更\n\n- **Offscreen Worker breaking** — 移除 callback 风格的 `defineWorkerViewer()`、`WorkerViewerSetup`、`WorkerViewerSetupResult` 和 `WorkerViewerContext`;改为在 module Worker 顶层 `await createWorkerViewer()`,并通过返回的 `WorkerViewerRuntime` 顺序调用 `status()`、`registerCommand()`、`onDispose()` 和 `ready()`。\n- **InstanceObject materialize** — 将 `SceneInstanceObject` 私有的 materializer delegate 提升为核心 `InstanceObject.setInstanceMaterializer()` / `clearInstanceMaterializer()` / `materialize()` 协议;`SceneEditableBatchLayer` 改为核心 `EditableGeometryBatchLayer` 的 scene-specific 薄适配层,fallback 移除改用 typed `materialize` 事件。\n\n### 修复与优化\n\n- **Offscreen UManager 帧率与楼壳显示** — 示例保留语义数据用于相机定位,但默认隐藏会半透明覆盖楼壳的高 draw-call 分析层;同时通过 Three.js 原生 `Scene.matrixWorldAutoUpdate` / `Object3D.updateWorldMatrix()` 关闭静态场景每帧整树矩阵遍历,并保留标准 RenderPipeline scene pass 以确保源模型透明对象正确合成。在不调整 pixel ratio 的情况下,目标场景持续拖拽可维持约 59–60 FPS。\n- **Editable Geometry Batch 不透明材质** — 不透明 batch 不再复用动态 opacity 节点同时驱动 alpha 输出和 `maskNode`;源材质 opacity 路径保持不变,对象显隐改用独立布尔遮罩,修复建筑楼壳被错误显示为半透明的问题。\n- **InstanceObject 静态矩阵更新** — 覆盖 Three.js 原生 `updateWorldMatrix()`,与 `updateMatrixWorld()` 共享世界矩阵/祖先显隐 dirty 检测;根 Scene 冻结自动矩阵更新后,显式更新单个实例或父 Group 仍会同步 instanced buffer,并让 editable batch 的变换差异正确触发 materialize。\n- **Editable Geometry Batch 拾取** — 公共 `EditableGeometryBatchLayer` 继承 `BaseGroup`,内部未导出的 `EditableGeometryBatchMesh` 继承 `BaseMesh` 并在自定义 BVH raycast 前保留不可见短路;隐藏整个 editable layer 或单个 merged batch 后不会继续命中逻辑对象。\n- **Editable Geometry Batch 生命周期** — 修复多个 layer 共用 inverse matrix、dirty transform 因旧 bounds 先被视锥裁剪、冻结根 Scene 下新挂载模型错过当帧世界矩阵、跨 layer materialize 后旧副本仍显示、materialize 对象共享模板材质、旧烘焙位置残留 BVH 命中、负缩放实例错误进入 merged/instanced path、重复实例生成幽灵几何、重复 build 累积资源、旧 layer dispose 清除新 materializer,以及 build 期间已 materialize 对象重复进入透明 fallback;`EditableGeometryBatchLayer` 现在是 one-shot builder。\n- **Offscreen HUD** — renderer stats 改为 1 秒滚动窗口的 FPS、平均/p95/最大帧间隔、超过 25ms 的占比和样本数,并排除 demand 模式从静止恢复时的空闲间隔。\n- **Offscreen Worker lifecycle** — 修复初始化期间销毁导致 `host.init()` 永久 pending、canvas 转移/初始 `postMessage()` 失败后未完成本地清理、dispose 后迟到的业务消息仍被派发、待发送 pointer move rAF 未取消、`ready()` 前加载失败未释放 Worker/GPU 资源,以及重复 `ArrayBuffer` transfer list 抛出 `DataCloneError`。\n- **RenderPipeline SSGI** — 修正 AO/GI 合成,改为 `scene × AO + diffuse × GI`,确保 `aoIntensity` 与 `giIntensity` 分别作用于遮蔽和间接漫反射;同时兼容 Viewer 默认的 reversed depth 背景判断,并在与 SSR 同时启用时复用 diffuse MRT 附件。\n- **RenderPipeline SSR** — 兼容 Viewer 默认的 `reversedDepthBuffer`:三个内部全屏 pass 会正确跳过 clear-depth 背景,同时保留 raw reversed depth 用于位置重建、ray marching 和 temporal history。\n- **SSR 示例** — 新增 `examples/test_ssr.html`,并使用 1× drawing buffer、`maxDistance: 0.4`、静态 2048² 阴影和关闭默认性能面板的配置降低 GPU 开销。\n\n### 文档\n\n- **docs/mcp** — 将核心 `InstanceObject` 的完整 API 归入 Objects 文档,并同步 u-manager 子类引用、LLM 摘要和 MCP 检索索引;运行时 API 未发生变化。\n- **u-manager editable batching** — 补充 `setEditableBatching()` 配置、合并键、TSL 状态纹理、materialize/fallback 边界、统计字段、显存权衡、`test_umanager2.html` 示例和 MCP 检索范围。\n- **OffscreenCanvas Worker** — 补充 `OffscreenViewerHost` 构造选项、方法、事件和统计字段,明确 `host.init()` / `initialized` 与一次性业务 `ready` 的边界,以及 `examples/offscreen/test_umanager2_offscreen.html` 的 editable batching、`compileAsync()` 预热、HUD 统计、静态根节点下 `InstanceObject` 显式矩阵提交、structured-clone/command 边界和 MCP 检索入口。\n- **SSR** — 补充完整 RenderPipeline SSR API、时域/降噪配置、reversed-depth 兼容说明、性能建议与在线示例入口。\n\n## 0.0.29\n\n### 变更\n\n- **u-manager breaking** — 通用实例基类和模型合批层从 `plugins/u-manager/instances` 移入核心;`InstanceObject` 位于 `src/instances`,`ModelInstancedLayer` / `InstanceCullingOptions` 位于 `src/batches`,均继续通过顶层 `u-space` 导出;旧 `SemanticInstanceObject` / `SemanticModelInstancedLayer` 命名不再保留。\n- **u-manager breaking** — `ModelInstancedLayer` 移除旧的 `addSemanticBatch()` 公开入口,改为 `reserveBatch()`、`addInstance()` / `addInstances()`、`getInstanceById()`、`removeInstance()` / `removeInstances()`、`removeBatch()` 和 `clearBatches()`,支持运行时实例新增/删除、按 URL batch 的 capacity 预分配与扩容;`removeInstances()` 支持直接传单个字符串 `instanceId`,并且 layer 内部不再从 `instance.userData` 扫描 ID。\n- **u-manager breaking** — `InstanceObject` 使用独立身份字段 `instanceId`、`instanceKind`、`instanceName` 和 `setInstanceIdentity()`;Scene / Facility instancing 的查询、删除和 raycast remap 都使用这些字段,`userData` 只保留原始业务元数据。\n- **u-manager breaking** — `SemanticGroup`、`BuildingGroup` 和 `FloorMesh` 的 building/floor/facility 索引统一读取语义对象 ID、实例对象 `instanceId` 或显式传入的别名,不再把 `userData.id`、`userData.semanticId`、`userData.facilityId` 自动注册成查询 ID;`ModelInstancedLayer` 会拒绝重复 `instanceId` 的新增实例,并在身份字段变化后按需刷新 id 索引。\n- **u-manager** — `InstanceObject` 新增对象级 `boundingBox`、`boundingSphere`、`computeBoundingBox()` 和 `computeBoundingSphere()`,`SceneInstanceObject`、`FacilityInstanceObject` 以及楼层语义代理可直接传给 `viewer.controls.flyToObject()`。\n- **u-manager** — `ModelInstancedLayer` 的内部实例矩阵同步改为 WebGPU storage instanced buffer 路径,运行时新增或移动实例后会在下一帧立即同步 matrix;外部仍通过修改 `InstanceObject` transform 和 dirty sync 使用,不需要直接写内部 `InstancedMesh.instanceMatrix`。\n- **u-manager** — `SemanticGroup` 新增 `getDefaultFacilityLayer()`,`SceneLoader.loadAsync()` 返回的 `SceneGroup` 新增 `sceneLayer` / `getDefaultSceneLayer()`,外部可直接获取默认 Facilities 和场景模型合批层。\n- **docs/mcp** — 更新 u-manager 文档、Examples Guide、LLM 索引和 MCP 检索说明,推荐通过 `viewer.controls.flyToObject()` 飞向实例;`getInstanceBoundingBox(target, true)` 保留给手动合并或调整世界包围盒的场景。\n\n### 示例与文档\n\n- **在线示例** — `examples/importmap.js` 的 CDN fallback 版本更新为 `0.0.29`,Vercel 部署会继续按 `package.json` 注入当前版本。\n\n## 0.0.28\n\n### 新增\n\n- **u-manager** — 新增 `UManagerLoader` 一体化入口,可同时加载 `SemanticLoader` 和 `SceneLoader`,返回带 `semanticGroup` / `sceneGroup` 直接属性的 `UManagerSceneGroup`,并复用 semantic id 去重避免重复建筑/设备。\n- **examples/docs/mcp** — 新增 `examples/test_umanager_loader.html`,演示 `UManagerLoader` 一次加载语义楼层、Facilities 和非语义场景树,并补充 Examples Guide 与 MCP 检索入口。\n\n### 变更\n\n- **u-manager breaking** — `SceneInstanceObject`、`FacilityInstanceObject` 和楼层多边形语义统一到 `InstanceObject` API:使用 `setInstanceVisible()`、`setInstanceColor()`、`setInstanceOpacity()`、`getInstanceBoundingBox()` 等方法,不再使用 scene/facility 专属实例方法。\n- **u-manager** — 新增共享 `ModelInstancedLayer`,`SceneInstancedLayer` 和 `FacilityInstancedLayer` 共用同一套模型模板 instancing、material groups、多材质、dirty sync、raycast remap 和 fallback wrapper 逻辑。\n- **ObjectManager / MaterialEffects** — 对语义实例的显隐、透明度和高亮控制统一识别 `InstanceObject`,不再维护 SceneInstance/FacilityInstance 两套特殊分支。\n- **u-manager loader** — `SceneLoader` 不再解析场景树里的 `AREA`、`FLOOR`、`ROOM` 语义面;楼层、区域和房间统一由 `SemanticLoader` / `SemanticGroup` 处理,避免同一语义对象在组合加载时重复出现。\n\n### 示例与文档\n\n- **在线示例** — `examples/importmap.js` 的 CDN fallback 版本更新为 `0.0.28`,Vercel 部署会继续按 `package.json` 注入当前版本。\n\n## 0.0.27\n\n### 变更\n\n- **u-manager semantics** — `FacilityInstancedLayer` 的相机逐实例裁剪改为显式开启:默认不再按当前相机视锥或 `minScreenRadius` 压缩 active instances,避免相机距离影响设备显隐;需要性能压缩时可通过 `setInstanceCulling({ enabled: true })` 开启。\n- **u-manager semantics** — `FacilityInstancedLayer` 使用动态 `Group` 包裹 Facilities `InstancedMesh` batch,避免 Three.js WebGPU render bundle 缓存跳过子 mesh 的渲染前同步;`hideAllFacilities()` 后再 `showAllFacilities()` 不会复用过期 active instance 状态。\n- **u-manager semantics** — `FacilityInstancedLayer` 支持合法 `material[]` + `geometry.groups` 的设备模板进入 instancing;只有 groups 缺失或材质索引非法的多材质 Mesh 才回退为普通 `Model`。\n- **u-manager semantics** — Facilities instancing 会在相机矩阵、投影矩阵或 viewport 高度变化时重新压缩当前帧实例;设备显隐、颜色、透明度和 `planish('Facilities')` / `unplanish('Facilities')` 改变 transform 时刷新 instance data。\n- **u-manager semantics** — 全部设备隐藏或透明度为 0 时,`FacilityInstancedLayer` 会关闭空的内部 `InstancedMesh`;通过 `showAllFacilities()` 或单设备 API 恢复时会重新加入渲染同步。\n- **fire 插件** — 新增 `FireEffect`,封装 Three.js 官方 `webgpu_volume_fire` 体积火焰示例,支持 WebGPU 3D 流体模拟、烟雾散射、动态光照、体积阴影、output effect 叠加和 `cameraChange` 相机切换同步。\n- **u-manager loader** — `SceneLoader` 默认读取同路径 `db/semantic_model.json` 并按语义 `ID` 跳过重复场景树节点,支持与 `SemanticLoader` 同时加载。\n- **u-manager loader** — `SceneLoader` 默认按模型 `path` 合并重复静态 3D 节点,通过 `SceneInstancedLayer` 批量渲染,同时保留 `SceneInstanceObject` 逻辑对象用于单模型 ID 检索、显隐、颜色、透明度、包围盒和事件派发。\n- **docs/mcp** — 补充 `SceneInstanceObject` 和 `FacilityInstanceObject` 通过 `objectManager.getById()` + `getInstanceBoundingBox()` + `controls.flyToBox()` 飞向单个实例的示例与 MCP 检索说明。\n- **ObjectManager / MaterialEffects** — `setOpacity()`、`show()` / `hide()`、`isolate()`、`showAll()` 以及 `highlightColor()` / `removeHighlightColor()` 支持 `SceneInstanceObject` 的 per-instance 控制。\n- **u-manager loader** — `SceneLoader` 创建的根组、`GROUP` 和 `STUB` 节点改为 `BaseGroup`,隐藏后可通过对象自身 `raycast()` 返回值阻止子级继续参与递归射线检测。\n- **Viewer** — 默认使用 Three.js `reversedDepthBuffer` 替代 `logarithmicDepthBuffer`,减少 WebGPU 顶视角多层透明场景的 fragment 压力,同时保留远距离深度精度。\n\n### 示例与文档\n\n- **在线示例** — `examples/importmap.js` 的 CDN fallback 版本更新为 `0.0.27`,Vercel 部署会继续按 `package.json` 注入当前版本。\n\n## 0.0.26\n\n### 修复\n\n- **u-manager semantics** — `FloorMesh.planish()` 会在压平后的语义实例和 Facilities 上加入稳定的轻微 Y 偏移,减少门、墙等重叠薄片之间的共面闪烁。\n- **u-manager semantics** — `FloorMesh` 会按实例透明度把合并语义网格拆分到不透明和透明材质通道,避免墙、柱、门等完全不透明实例也走透明渲染队列,降低近距离压平场景的 overdraw 成本。\n- **u-manager semantics** — `BuildingGroup` 新增 `getFloorById()`、`getElevatorById()` 和 `getVentById()`,内部通过 `Map` 维护楼层、电梯井和通风井语义 ID 索引。\n- **u-manager semantics** — `FacilityInstancedLayer` 只在实例矩阵、颜色或透明度变化时上传对应 instance buffer,静态 Facilities 不再每帧重复提交全部实例数据;渲染前会按每个 Facility 实例的世界包围盒和当前相机视锥压缩本帧 active instance count,不再通过相机距离阈值裁剪设备。\n- **u-manager semantics** — 修复 Facilities 视锥裁剪在视角切换后可能沿用上一帧 active subset 的 `visible` / `boundingSphere` 状态,导致某些视角下设备整批隐藏的问题;instanced batch 会保留完整包围球,同时用 `count` 控制本帧 active 实例。\n- **u-manager semantics** — Instanced Facilities 的 batch 材质默认保持不透明,只有源材质本身透明或当前渲染实例存在半透明 opacity 时才切到透明队列,减少完全不透明设备在近距离视角下的 overdraw。\n- **MaterialEffects** — 高亮、呼吸色、线框和淡入淡出效果支持材质数组,确保多材质 Mesh 和 `FloorMesh` 双材质通道都能正确应用并恢复材质状态。\n- **docs/mcp** — 补充 Facilities auto instancing 的动态材质透明度、包围盒视锥裁剪、`controls.flyToBox()` 飞向设备,以及多材质 fallback 对颜色/透明度 override 的支持说明。\n\n### 示例与文档\n\n- **在线示例** — `examples/importmap.js` 的 CDN fallback 版本更新为 `0.0.26`,Vercel 部署会继续按 `package.json` 注入当前版本。\n\n## 0.0.25\n\n### 新增\n\n- **u-manager semantics** — 新增 `SemanticGroup`,作为单次 `SemanticParser` 解析结果的顶层容器;`SemanticLoader.loadAsync()` / `SemanticParser.parseAsync()` 直接返回完整语义场景。\n- **u-manager semantics** — `SemanticGroup` 新增 `getBuildingById(id)`,支持按语义数据里的 `Building.ID` 获取建筑。\n- **u-manager semantics** — `SemanticGroup` 和 `BuildingGroup` 的建筑/设备 ID 查询改为内部 `Map` 索引,并通过楼层设备索引版本自动同步,避免每次查询扫描数组。\n- **u-manager semantics** — `FloorMesh.planish()` / `unplanish()`、`BuildingGroup.planishFloors()` / `unplanishFloors()` 和 `SemanticGroup.planishFloors()` / `unplanishFloors()` 会把所有合并语义实例和 Facilities 都按包围盒贴到楼层平面,而不是围绕实例自身基点压缩。\n- **u-manager semantics** — 新增 scene-level Facilities auto instancing:同模型 URL 的静态设备会合并到 `SemanticGroup.facilityLayer` 的 `InstancedMesh` batch,同时保留楼层下的设备引用用于检索、显隐、颜色和透明度控制;带动画、骨骼、morph target 或多材质 Mesh 的设备自动回退为普通 `Model`。\n- **u-manager semantics** — `SemanticGroup`、`BuildingGroup` 和 `FloorMesh` 新增 `getFacilityById()` 设备检索,返回的 `FacilityInstanceObject` 可通过统一 `setInstanceVisible()`、`setInstanceColor()`、`resetInstanceColor()` 和 `setInstanceOpacity()` 控制普通设备模型或 scene-level instanced 设备引用。\n- **docs/mcp** — 补充 Facilities auto instancing 的材质透明度行为、`resetInstanceColor()` 语义,以及多材质 fallback 对颜色/透明度 override 的限制说明。\n\n### 修复\n\n- **u-manager semantics** — 修复 scene-level instanced Facilities 的点击和指针事件派发:射线命中会映射回楼层下的 `FacilityInstanceObject`,并继续冒泡到所属 `FloorMesh`、`BuildingGroup` 和 `SemanticGroup`。\n- **u-manager semantics** — `FacilityInstancedLayer` 继承 `BaseGroup`,避免 `facilityLayer.visible = false` 后内部 `InstancedMesh` 仍参与射线检测并触发隐藏设备点击事件。\n- **u-manager semantics** — 移除语义设备解析里的 `sid` 检索和注册逻辑;Facilities 只按 `Facility.ID` 以及显式传入的别名进入楼层索引和 `viewer.objectManager`。\n\n### 示例与文档\n\n- **在线示例** — `examples/importmap.js` 的 CDN fallback 版本更新为 `0.0.25`,Vercel 部署会继续按 `package.json` 注入当前版本。\n\n## 0.0.23\n\n### 新增\n\n- **u-manager semantics** — `BuildingGroup` 新增 `isolateFloors(floors)`,支持按多个 `FloorMesh` 或楼层下标同时隔离显示多个楼层;`isolateFloor()` 继续兼容单楼层调用,并可接收数组作为便捷写法。\n- **u-manager semantics** — `SemanticLoader` 新增 `Facilities` 解析:从 `Stories[].Facilities` 索引读取顶层设备语义,用 `Facility.ID` 匹配解密后的 `tree_models` 设备节点,沿父级累乘本地矩阵得到设备世界矩阵,加载 3D 设备模型并转换为楼层局部矩阵后挂载到对应 `FloorMesh`。\n- **u-manager semantics** — `FloorMesh` 新增楼层设备检索与统一语义实体 API:`getFacilityById()`、`getFacilityAt()`、`getFacilities()`、`removeFacility()`、`showAllFacilities()`、`hideAllFacilities()`、`getSemanticById()`、`getSemantics()` 和 `getSemanticsByKind('Facilities')`;`BuildingGroup.showAllFacilities()/hideAllFacilities()` 支持批量显示或隐藏整栋建筑内的楼层设备。\n- **u-space MCP** — 文档索引同步楼层 `Facilities` 解析和检索 API,MCP 客户端可检索设备按楼层挂载、`tree_models` 解密匹配、本地矩阵父级累乘和世界坐标转换规则。\n\n### 示例与文档\n\n- **在线示例** — `examples/importmap.js` 的 CDN fallback 版本更新为 `0.0.23`,部署流程仍会优先按 `package.json` 注入当前版本。\n\n## 0.0.21\n\n### 新增\n\n- **u-manager semantics** — `SemanticLoader` 支持解析建筑级 `Elevators` 和 `Vents`,以 `Polygon.shape` 作为底面轮廓、`Elevation` 作为底面高度、`TotalHeight` 作为拉伸高度生成 `ExtrudeMesh`,并通过 `BuildingGroup.elevatorMeshes`、`BuildingGroup.ventMeshes` 及 add/get/remove 方法管理。\n\n### 修复\n\n- **透明语义体块渲染** — 电梯井/通风井在渲染阶段沿法线轻微内收,`Spaces` 实例使用稳定 per-instance 渲染偏移抖动,缓解与墙体或完全重叠空间共面时的 z-fighting。\n- **atmosphere 插件** — 后处理链移除 aerial perspective 节点,保留 lens flare、tone mapping、temporal antialias 和 dithering;`scene.backgroundNode` 使用 `skyBackground()`,`scene.environmentNode` 使用 `skyEnvironment()`,并继续在关闭插件时恢复启用前的背景和环境节点。\n\n### 示例与文档\n\n- **在线示例** — `examples/importmap.js` 的 CDN fallback 版本更新为 `0.0.21`,部署流程仍会优先按 `package.json` 注入当前版本。\n\n## 0.0.18\n\n### 变更\n\n- **版本发布** — 同步发布包含新版大气插件实现、RenderPipeline output effects 和一键 MCP 发布脚本的 npm 包。\n\n## 0.0.17\n\n### 新增\n\n- **atmosphere 插件** — `Atmosphere.enable(options)` 从占位实现升级为可用的大气渲染:支持 WGS84 经纬高定位、太阳/月亮方向、天空背景、天空环境、aerial perspective、lens flare、tone mapping、temporal antialias、dithering 和 `AtmosphereLight` 阴影。\n- **RenderPipeline** — 新增 `addOutputEffect()` / `removeOutputEffect()` 与 `addMRTChannel()` / `removeMRTChannel()`,插件可追加输出后处理和独立 MRT 通道,不再占用业务侧 `setOutputComposer()`。\n\n### 变更\n\n- **大气状态更新** — 大气插件在 `beforeRender` 中刷新相机 ECEF 位置、太阳/月亮方向和阴影 target,相机控制器驱动的移动也能逐帧更新大气状态。\n- **MCP 发布** — 根目录 MCP 发布入口合并为 `pnpm publish:mcp`,命令会先递增 `u-space-mcp` 的 patch 版本,再构建文档索引并发布 npm 包。\n\n## 0.0.16\n\n### 新增\n\n- **u-manager semantics** — `FloorMesh.planish(kind?)`、`FloorMesh.unplanish(kind?)`、`BuildingGroup.planishFloors(kind?)` 和 `BuildingGroup.unplanishFloors(kind?)` 支持按 `Walls`、`Columns`、`Spaces`、`Doors`、`Windows` 语义类型压平或恢复;`setScaleYAt(index, y)` 可只调整单个语义实例的 Y 轴缩放。\n- **BaseMesh** — 默认开启 `castShadow` 与 `receiveShadow`,基础网格和继承自 `BaseMesh` 的对象会直接参与阴影投射与接收。\n\n### 变更\n\n- **语义类型命名** — `SemanticKind` 统一为数据源字段风格:`Walls`、`Columns`、`Spaces`、`Doors`、`Windows`。\n- **示例与依赖** — 更新 `load_tiles.html` 示例依赖,新增 `@takram/three-atmosphere`、`postprocessing` peer dependency,并将 Vite 外部依赖边界扩展到所有 `@takram/*` 包。\n\n## 0.0.12\n\n### 新增\n\n- **u-manager semantics** — 新增 `SemanticLoader`、`BuildingGroup`、`FloorMesh` 语义楼层 API,支持楼层隔离、实例级颜色/透明度/显隐/matrix/scale 控制,以及实例包围盒/包围球查询。\n- **u-space MCP** — 内置文档索引同步语义楼层 API,MCP 客户端可检索 `SemanticLoader`、`BuildingGroup` 和 `FloorMesh` 用法。\n\n## 0.0.8\n\n### 新增\n\n- **Viewer** — `resize()`、`screenshot()`、`setBackground()`、`setEnvironment()`、`enableShadow()`/`disableShadow()`、`enableFog()`/`enableFogExp2()`/`disableFog()`\n- **CameraControls** — `flyTo()`、`getCameraViewpoint()`、`lock()`/`unlock()`、`setViewMode('2d' | '3d')`\n- **ObjectManager** — `show()`/`hide()`、`isolate()`、`showAll()`、`setOpacity()`、`getBoundingBox()`、`forEach()`、`filter()`\n- **InteractionManager** — `enable()`/`disable()`、`setInteractable()`、`addIgnore()`/`removeIgnore()`\n- **Selection** — 新增框选(rubber-band)和单选/多选/切换模块,支持 `select`/`deselect`/`change` 事件\n- **MaterialEffects** — `wireframe()`/`removeWireframe()`、`transparent()`/`removeTransparent()`、`xray()`/`removeXray()`、`fadeIn()`/`fadeOut()`\n- **Model** — `getBoundingBox()`、`getCenter()`、`setMaterial()`\n- **SceneManager** — 新模块,多场景创建、注册、切换与序列化\n- **LightManager** — 新模块,灯光便捷创建、4 种预设(indoor/outdoor/studio/warehouse)、Helper 可视化\n- **MeasureTool** — 新工具,距离/面积/角度测量,结果可视化渲染到场景\n- **ClippingTool** — 新工具,基于 WebGPU `ClippingGroup` 的剖切面与剖切盒\n- **AnnotationManager** — 新工具,3D 引线标注 + HTML 浮动标签\n- **示例** — 新增 8 个交互式示例页面\n\n### 修复\n\n- **Selection** — 框选覆盖层改为挂载到容器元素(而非 canvas),修复框选矩形不可见的问题\n- **ClippingTool** — 从 `renderer.clippingPlanes`(WebGL API)重写为 `ClippingGroup`(WebGPU API),修复剖切无效的问题\n- **MaterialEffects** — fade 动画在对象移除场景后自动停止,避免内存泄漏\n- **InteractionManager** — `dispose()` 中清除 `clickTimer`,避免定时器泄漏\n- **LightManager** — 修复 `removeAll()`/`hideAllHelpers()` 中遍历 Map 同时删除的问题\n- **ObjectManager** — `setOpacity()` 先检查 `isMesh` 再类型转换\n- **ClippingTool** — `PlaneHelper` 颜色使用 `new Color(color).getHex()` 替代直接 `as number`\n- **MeasureTool** — 移除 WebGPU 不支持的 `linewidth` 属性\n\n---\n\n## 0.0.7\n\n### 变更\n\n- 文档拆分:将插件文档拆分为独立文件\n- 新增 CameraControls 独立文档页\n- 修复 getting-started 中的死链\n- 修复 sbmx loader 示例使用新的 MaterialEffects API\n\n---\n\n## 0.0.6\n\n### 新增\n\n- **MaterialEffects** — 可组合的材质特效系统,支持安全共享材质和 remove API\n- **RenderPipeline** — 内置 Bloom、SSGI、TRAA 后处理及 OutputComposer API\n- **CSSRenderer** — CSS2D / CSS2.5D / CSS3D 叠加渲染 HTML 元素\n- 从 `package.json` 导出 `version`,统一示例 importmap\n\n---\n\n## 0.0.5\n\n### 变更\n\n- 版本发布(无重大功能变更)\n\n---\n\n## 0.0.4\n\n### 新增\n\n- **Model** — 动画播放支持(`playAnimation`、`stopAnimation`、`updateAnimation`)\n- **ViewerEventMap** — 事件回调新增 `delta` 时间参数\n\n---\n\n## 0.0.3\n\n### 新增\n\n- **ObjectControls** 插件 — 交互式移动、旋转、缩放 3D 对象\n- **TopologyDrawer** 插件 — 在场景任意表面交互式绘制拓扑路径图\n- **Topology** — `exportData()` / `importData()` 数据序列化\n\n### 变更\n\n- **Interactions** — `contextmenu` 事件替换为 `rightclick`\n- **Poi** — 优化渲染性能,新增 `scaleFactor` 参数\n- 文档全面完善:本地搜索、侧边栏优化、各插件文档页\n\n---\n\n## 0.0.0\n\n### 新增\n\n- 项目初始化:Viewer 核心、WebGPU 渲染器、场景/相机/控制器\n- 模型加载系统:双层缓存(内存 + 持久化)、Draco/KTX2/Meshopt 支持\n- 交互系统:射线检测、事件冒泡、自定义 3D 对象事件\n- 对象系统:Model、Poi、Topology、基础网格(Sphere/Plane/Circle/Tube/Extrude/Shape)\n- ObjectManager 集中式对象注册\n- 补间动画系统\n- u-manager 插件:场景加载、动画、属性、视点管理\n- tiles 插件:ArcGIS 3D 瓦片 / GIS 地球渲染\n- minimap 插件:2D 小地图\n- keyboard-controls 插件:WASD 键盘控制\n- tracking-controls 插件:相机跟随\n- atmosphere 插件:天空/大气渲染\n- curve-movement 插件:曲线路径动画\n"
1635
1659
  },
1636
1660
  {
1637
1661
  "id": "examples-guide",
1638
1662
  "path": "examples-guide.md",
1639
1663
  "title": "示例指南",
1640
- "summary": "`u-space` 的 `examples/` 目录中包含了大量演示引擎功能的示例。以下是几个关键示例及其所展示的系统特性。 示例统一通过 `examples/importmap.js` 注入 Import Map。本地通过 `localhost`、`127.0.0.1`、`0.0.0.0` 或 `192.168.x.x` 访问时会加载仓库里的 `../dist/` 构建产物;在线部署或非本地域名访问时会从 jsDelivr 加载当前发布版本 `u-space@0.0.30`。Vercel 文档部署会继续把 `__VERSION__` 占位符替换为 `package.json` 中的版本号,源码里的 `0.0.30` 作为直接托管 `examples/` 时的 fallback。 插件示例可以在页面加载 `importmap.js` 前通过 `window.__IMPORTS__` 声明额",
1664
+ "summary": "`u-space` 的 `examples/` 目录中包含了大量演示引擎功能的示例。以下是几个关键示例及其所展示的系统特性。 示例统一通过 `examples/importmap.js` 注入 Import Map。本地通过 `localhost`、`127.0.0.1`、`0.0.0.0` 或 `192.168.x.x` 访问时会加载仓库里的 `../dist/` 构建产物;在线部署或非本地域名访问时会从 jsDelivr 加载当前发布版本 `u-space@0.0.31`。Vercel 文档部署会继续把 `__VERSION__` 占位符替换为 `package.json` 中的版本号,源码里的 `0.0.31` 作为直接托管 `examples/` 时的 fallback。 插件示例可以在页面加载 `importmap.js` 前通过 `window.__IMPORTS__` 声明额",
1641
1665
  "headings": [
1642
1666
  {
1643
1667
  "level": 1,
@@ -1832,7 +1856,7 @@ export const docsIndex = [
1832
1856
  "text": "核心要点:"
1833
1857
  }
1834
1858
  ],
1835
- "content": "# 示例指南\n\n`u-space` 的 `examples/` 目录中包含了大量演示引擎功能的示例。以下是几个关键示例及其所展示的系统特性。\n\n## 运行方式与版本\n\n示例统一通过 `examples/importmap.js` 注入 Import Map。本地通过 `localhost`、`127.0.0.1`、`0.0.0.0` 或 `192.168.x.x` 访问时会加载仓库里的 `../dist/` 构建产物;在线部署或非本地域名访问时会从 jsDelivr 加载当前发布版本 `u-space@0.0.30`。Vercel 文档部署会继续把 `__VERSION__` 占位符替换为 `package.json` 中的版本号,源码里的 `0.0.30` 作为直接托管 `examples/` 时的 fallback。\n\n插件示例可以在页面加载 `importmap.js` 前通过 `window.__IMPORTS__` 声明额外依赖。将 `u-space/plugins/<name>` 的值设为 `true` 时,`importmap.js` 会自动在本地和 CDN 路径之间切换。\n\n## 1. `demo01.html`:基础配置与交互\n\n该示例演示了通过 WebGPU 渲染 3D 场景所需的最少配置,与 [快速上手](./getting-started.md) 指南中的内容一致。\n\n### 核心要点:\n\n- 将 `Viewer` 注入 DOM 元素。\n- 使用 WebGPU `Color` 设置场景背景。\n- 添加基础几何体(如 `BoxGeometry`)。\n- 通过 `viewer.interactionManager.pointerMoveEventsEnabled` 启用全局交互。\n- 像操作 DOM 元素一样,为 3D 网格原生绑定事件监听(`click`、`pointerenter`、`pointerleave`)。\n\n## 2. `test_loader.html`:模型缓存机制\n\n该示例深入解析了 `u-space` 的模型加载管线,阐明运行时缓存与浏览器持久化缓存之间的区别。\n\n### 核心要点:\n\n- 使用全局 `Model` 类通过 `Model.prototype.loadAsync()` 异步加载 `.glb` 文件。\n- 理解 `cache: true`(将模型节点保留在内存中,可实现即时克隆/实例化)。\n- 理解 `persistent: true`(使用 Service Worker / Cache Storage API 对实际网络请求数据进行持久化缓存)。\n- 演示如何将这些异步加载的资源安全地注册到 `viewer.objectManager`。\n- 提供通过 `Model.clearMemoryCache()` 和 `Model.clearPersistentCache()` 手动清除缓存的示例。\n\n## 3. `load_tiles.html`:GIS 与地球渲染\n\n该示例使用外部对等依赖 `3d-tiles-renderer`,通过 `u-space` 插件安全封装后,渲染大规模 LOD GIS 地球。\n\n### 核心要点:\n\n- 动态实例化复杂插件(`ArcgisTilesRenderer`),并传入核心 viewer 引用。\n- 由于瓦片是异步流式加载并持续更新视口的,需使用 `viewer.frameloop = 'always'`。\n- 通过插件的 `invalidate(lon, lat, alt)` 方法定位到指定的经纬高位置。\n- 使用 `lonLatHeightToPosition()` / `positionToLonLatHeight()` 在 WGS84 经纬高和场景世界坐标之间互转。\n\n## 4. `test_umanager.html`:场景组合与解析器\n\n该综合示例融合了多种工具,展示如何构建完整的应用程序,而不仅仅是放置单个模型。\n\n### 核心要点:\n\n- 同时初始化多个插件(minimap、tracking、keyboard-controls),并通过 `.enable()` / `.disable()` 切换其状态。\n- 流式传输结构化场景布局,解析场景描述(`SceneLoader`、`TopologiesLoader`)。\n- 使用相机动画(`VisionsLoader` 和 `VisionsParser`)在场景中编排预定义的飞行路径。\n- 获取复杂的节点材质,并自定义 WebGPU 专属的 TSL(Three Shading Language)节点,如 `TSLEffects.fluid()`。\n\n## 5. `test_umanager_loader.html`:UManagerLoader 一体化加载\n\n[在线演示](https://u-space-phi.vercel.app/examples/test_umanager_loader.html)\n\n该示例演示通过 `UManagerLoader` 在同一个路径下同时加载语义楼层、Facilities 和非语义场景树内容。加载结果会返回一个 `UManagerSceneGroup`,其中 `semanticGroup` 指向 `SemanticGroup`,`sceneGroup` 指向非语义场景组。\n\n### 核心要点:\n\n- 使用 `UManagerLoader.setPath()` 配置场景根目录,并通过一次 `loadAsync()` 完成 `SemanticLoader` + `SceneLoader` 组合加载。\n- `SceneLoader` 会自动跳过语义文件中已存在的 `id`,避免建筑、楼层或设备重复加载。\n- 通过 `root.semanticGroup.getDefaultFacilityLayer()` 和 `root.sceneGroup.getDefaultSceneLayer()` 直接获取默认设备合批层和场景模型合批层。\n- 通过 `viewer.objectManager` 获取 `SceneInstanceObject` 和 `FacilityInstanceObject`,再直接使用 `viewer.controls.flyToObject()` 飞向单个实例。\n- 使用 `setInstanceHighlight()`、`setInstanceVisible()`、`setInstanceOpacity()` 等统一 API 控制实例,不需要关心底层是合并几何、`InstancedMesh` 还是 fallback `Model`。\n- 示例把 `viewer`、`loader`、`root`、`semanticGroup`、`sceneGroup`、`facilityLayer`、`sceneLayer`、`sceneInstances` 和 `facilities` 暴露到 `window.uManagerExample`,方便在控制台调试。\n\n## 6. `test_umanager_dynamic_instances.html`:运行时动态实例\n\n[在线演示](https://u-space-phi.vercel.app/examples/test_umanager_dynamic_instances.html)\n\n该示例把运行时实例新增、删除、恢复和按 ID 查询拆到独立场景中,避免和 `UManagerLoader` 的一体化加载流程混在一起。\n\n### 核心要点:\n\n- 创建 `SceneInstancedLayer` 并调用 `reserveBatch(url, template, capacity)` 预分配容量。\n- 通过 `SceneInstanceObject.setInstanceIdentity({ id, kind, name })` 设置实例独立身份字段,不依赖 `userData` 参与 layer 内部索引。\n- 同一个 layer 内 `instanceId` 必须唯一;重复 ID 的新增会返回 `false`,加入后修改身份字段会在下一次按 ID 查询时刷新索引。\n- 使用 `addInstances()` 批量新增实例,使用 `removeInstance(id)` / `removeInstances(id)` 按完整 `instanceId` 删除实例。\n- 使用 `getInstanceById(id)` 快速获取实例,返回对象可直接用于 `setInstanceHighlight()` 和 `viewer.controls.flyToObject()`。\n- 示例把 `viewer`、`layer`、`template`、`allInstances` 和 `removedInstances` 暴露到 `window.dynamicInstanceExample`。\n\n## 7. `test_umanager2.html`:大型场景可编辑静态合批\n\n该性能目标场景同时加载语义对象和完整场景树,并通过 `SceneLoader.setEditableBatching()` 把兼容的普通 Mesh 烘焙合并到 `SceneEditableBatchLayer`。它适合 draw calls 和可渲染 Mesh 数量成为主要 CPU/GPU 提交瓶颈、但业务仍需要按对象 ID 显隐、高亮或偶尔移动对象的场景。\n\n### 核心要点:\n\n- 使用 `setEditableBatching({ maxVerticesPerBatch, maxIndicesPerBatch, freezeAnimations })` 显式开启;默认 `SceneLoader` 行为不变。\n- 兼容的不透明 Mesh 按材质、Geometry attribute 布局、阴影状态和 `renderOrder` 合并;透明、蒙皮、morph、自定义 shader 和不兼容 Geometry 保留 fallback。\n- 合批对象仍保留 `SceneInstanceObject`,显隐、颜色和不透明高亮通过 TSL 状态纹理更新;transform 或半透明修改只 materialize 当前对象。\n- 页面使用 `pixelRatio: 1` 控制高 DPI drawing buffer 成本,并关闭不需要的交互 raycast。\n- 首帧前通过 `renderer.compileAsync()` 预热 WebGPU material pipeline,避免把编译中的中间画面展示给用户。\n- 使用 `?editableBatching=false` 可关闭该路径,与默认 path-based `SceneInstancedLayer`/普通模型加载结果做性能和画面对比。\n- `sceneGroup.userData.editableBatch` 提供 `sourceMeshes`、`batches`、`drawCallsSaved`、`vertices`、`indices` 和 fallback 原因统计。\n\n该模式通过展开重复顶点换取更少 draw calls;高重复、大 Geometry 的同模板对象可能仍更适合 `SceneInstancedLayer`。详见 [u-manager `setEditableBatching()` API](./api-plugin-u-manager.md#可编辑静态合批seteditablebatching)。\n\n## 8. `test_umanager2_offscreen.html`:OffscreenCanvas Worker + editable batching\n\n该示例是 `test_umanager2.html` 的 Worker 版本。完整 `Viewer`、模型解析、editable batch 构建、相机控制和 WebGPU 渲染运行在 dedicated Worker;主线程只持有可见 canvas、转发输入/resize,并显示 Worker 返回的状态与统计。\n\n通过专用 Vite 配置启动:\n\n```bash\npnpm example:offscreen\n```\n\n然后访问 `http://127.0.0.1:5510/offscreen/test_umanager2_offscreen.html`。该示例的 HTML、主线程入口、Worker 入口和专用 Vite 配置集中在 `examples/offscreen/` 目录。\n\n### 核心要点:\n\n- 主线程使用 `OffscreenViewerHost` 调用 `transferControlToOffscreen()`,以 structured-clone 消息转发 pointer、wheel、resize 和业务 command。\n- Worker 在模块顶层通过 `const worker = await createWorkerViewer()` 创建真正的 `Viewer`,随后以顺序式代码加载 HDR、`SemanticLoader` 和 `SceneLoader`,无需把整个入口包进 setup callback。\n- `await host.init()` / `initialized` 只表示 Worker 内 `viewer.init()` 完成;HDR、模型、editable batch、pipeline 预热和业务首帧完成后,Worker 才显式调用一次 `worker.ready(detail)`。主线程应先注册 `ready` 监听,再执行 `host.init()`,并在 `ready` 后调用业务 command。\n- `SceneLoader.setEditableBatching()` 在 Worker 中完成 Geometry 克隆、变换烘焙、合并和 TSL 状态纹理创建;透明、蒙皮、morph、自定义 shader 等不支持子集保持 fallback。\n- 首帧前关闭 controls invalidation 并等待 `renderer.compileAsync()`,预热 WebGPU 合批管线后再显示完整画面。\n- HUD 显示实际 `drawCalls`、三角形、`static scene matrices` 状态,以及 1 秒滚动窗口的 FPS、平均/p95/最大帧间隔、超过 25ms 的占比和样本数;demand 模式恢复时的空闲间隔不会被误算成渲染帧。\n- 示例调用 `semanticGroup.showAllFloors().showAllFacilities()` 并保持 `SemanticGroup.visible = true`,楼层、墙体、空间、门窗和设备等所有语义对象均保留且默认显示。HUD 的设备调试区通过 Worker command 选择、飞向、高亮或清除当前 Facility;这些操作都不修改任何语义对象或建筑场景的显隐状态,“清除调试”只撤销高亮。\n- `SemanticLoader` 的压平语义 Geometry 属于分析叠加层,本示例按调试需求默认显示完整语义模型,因此其半透明颜色会与建筑楼壳叠加;业务项目可以按自身展示策略单独控制该层。\n- 标准 RenderPipeline scene pass 保持启用,editable batch 只接收源模型中的不透明 Mesh;透明子 Mesh 保留标准 fallback,以兼顾透明合成正确性和不降低 pixel ratio 的运镜帧率。\n- 相机拖拽继续由主线程事件桥接到 Worker;业务对象不能跨线程传输,按 ID 显隐、变色、transform 或 `materialize()` 应包装成 Worker command,通过 `host.request()` 调用。\n- 相机定位后先调用 Three.js 原生 `viewer.scene.updateMatrixWorld(true)`,再设置 `viewer.scene.matrixWorldAutoUpdate = false` 跳过每帧整树矩阵遍历;新增场景层级后用 `scene.updateWorldMatrix(true, true)` 只提交新增子树。Worker command 修改单个普通 Mesh 或 `InstanceObject` 时调用 `object.updateWorldMatrix(true, false)`,修改 Group 时调用 `group.updateWorldMatrix(true, true)`,最后调用 `viewer.invalidate()`。`InstanceObject` 的原生方法覆盖会继续触发 instance buffer dirty 或 editable-batch materialize。\n- `ready()` 前的加载或管线预编译异常会触发 error、逆序资源清理和 Worker 关闭;初始化期间销毁 Host、canvas 转移/初始消息失败或 Worker 主动关闭会 reject 尚未完成的 `host.init()` / `request()` 并清理 DOM、resize 和待发送 pointer move。Host dispose 后会忽略队列中迟到的业务事件与 response。\n- Offscreen 负责释放主线程,editable batching 负责减少 draw submission;两者都不会自动减少三角形或透明 overdraw。\n\n浏览器必须同时支持 `transferControlToOffscreen()` 和 Worker WebGPU。CSS2D/CSS3D、`Info` 等真实 DOM 叠加层仍应保留在主线程。完整接口和边界见 [Viewer OffscreenCanvas Worker API](./api-viewer.md#offscreencanvas-worker实验性)。\n\n## 9. `test_model_animation.html`:模型内置动画\n\n[在线演示](https://u-space-phi.vercel.app/examples/test_model_animation.html)\n\n该示例演示了如何加载含内置动画的 glTF 模型,并通过 `Model` 类的动画 API 控制播放。\n\n### 核心要点:\n\n- 使用 `Model.loadAsync()` 加载带动画的 `.glb` 文件,动画片段自动初始化。\n- 使用 `viewer.frameloop = 'always'` 开启持续渲染以驱动动画。\n- 监听 `beforeRender` 事件,通过 `model.updateAnimation(e.delta)` 推进动画时间。\n- 使用 `model.playAnimation(name)` 按名称播放单个动画,`model.playAllAnimations()` 播放全部。\n- 使用 `model.stopAnimation()` 停止动画播放。\n\n## 10. `test_css_renderer.html`:CSS2D / CSS2.5D / CSS3D 渲染器\n\n该示例演示了如何在 3D 场景中叠加渲染 HTML 元素,展示三种 CSS 渲染模式的效果差异。\n\n### 核心要点:\n\n- 使用 `viewer.cssRenderer.createCSS2DObject()` 创建始终面向相机、固定屏幕尺寸的 2D 标签。\n- 使用 `viewer.cssRenderer.createCSS25DObject()` 创建面向相机但随距离缩放的 2.5D 精灵。\n- 使用 `viewer.cssRenderer.createCSS3DObject()` 创建具有完整 3D 变换的面板。\n- CSS2.5D 和 CSS3D 对象需要设置 `scale`(通常 `0.01`),因为 HTML 元素的像素尺寸远大于 3D 世界单位。\n- 渲染器采用懒加载,仅在首次创建对应类型对象时初始化。\n\n## 11. `test_postprocessing.html`:后处理效果\n\n该示例演示了 `RenderPipeline` 的内置后处理功能,包括 Bloom、SSGI、TRAA 以及自定义后处理组合器。\n\n### 核心要点:\n\n- 使用 `viewer.renderPipeline.enableBloom()` / `disableBloom()` 运行时切换 Bloom 效果。\n- 使用 `viewer.renderPipeline.updateBloom()` 实时调整 strength、radius、threshold 参数。\n- 使用 `viewer.renderPipeline.enableSSGI()` / `disableSSGI()` 切换屏幕空间全局光照。\n- 使用 `viewer.renderPipeline.updateSSGI()` 实时调整 SSGI 参数(直接修改 uniform,无需重建节点图)。\n- 使用 `viewer.renderPipeline.enableTRAA()` / `disableTRAA()` 切换时间抗锯齿。\n- 使用 `viewer.renderPipeline.setOutputComposer()` 自定义后处理链(示例中实现了灰度滤镜)。\n- 使用 `setOutputComposer(null)` 恢复默认渲染管线。\n\n## 12. `test_viewer_utils.html`:Viewer 工具方法\n\n该示例演示了 `Viewer` 新增的便捷方法:截图导出、背景切换、雾效控制和阴影开关。\n\n### 核心要点:\n\n- 使用 `viewer.screenshot()` 导出当前渲染画面为 PNG 文件。\n- 使用 `viewer.setBackground(color)` 快速切换场景背景颜色。\n- 使用 `viewer.enableFog()` / `viewer.disableFog()` 控制雾效。\n- 使用 `viewer.enableShadow()` / `viewer.disableShadow()` 控制阴影渲染。\n- 使用 `viewer.resize(width, height)` 手动触发尺寸更新。\n\n## 13. `test_camera_controls.html`:CameraControls 增强方法\n\n该示例演示了 `CameraControls` 的飞行定位、视角存取、锁定和二三维切换功能。\n\n### 核心要点:\n\n- 使用 `viewer.controls.flyTo(position, target)` 将相机飞行到指定坐标。\n- 使用 `viewer.controls.getCameraViewpoint()` 获取当前视角数据。\n- 使用 `viewer.controls.setCameraViewpoint(data)` 恢复保存的视角。\n- 使用 `viewer.controls.lock()` / `unlock()` 锁定或解锁相机控制。\n- 使用 `viewer.controls.setViewMode('2d')` / `setViewMode('3d')` 在二三维视图间切换。\n\n## 14. `test_object_manager.html`:ObjectManager 增强方法\n\n该示例演示了 `ObjectManager` 的显隐控制、孤立显示、透明度设置、包围盒查询和过滤功能。\n\n### 核心要点:\n\n- 使用 `viewer.objectManager.show(id)` / `hide(id)` 控制对象可见性。\n- 使用 `viewer.objectManager.isolate(ids)` 孤立显示指定对象。\n- 使用 `viewer.objectManager.setOpacity(id, value)` 设置材质透明度。\n- 使用 `viewer.objectManager.getBoundingBox()` 查询所有对象的包围盒。\n- 使用 `viewer.objectManager.filter(predicate)` 按条件过滤对象。\n\n## 15. `test_material_effects.html`:MaterialEffects 增强效果\n\n该示例演示了材质效果系统的线框、半透明、X 光和淡入淡出功能。\n\n### 核心要点:\n\n- 使用 `MaterialEffects.wireframe(object)` 开启线框渲染模式。\n- 使用 `MaterialEffects.highlightColor(object, { opacity })` 设置半透明效果。\n- 使用 `MaterialEffects.highlightColor(object, { color, opacity, overwrite: true, depthWrite: false })` 实现 X 光透视效果。\n- 使用 `MaterialEffects.fadeOut(object)` / `fadeIn(object)` 执行淡入淡出动画。\n- 使用 `MaterialEffects.removeHighlightColor(object)` 恢复原始材质状态。\n\n## 16. `test_selection.html`:Selection 选择系统\n\n该示例演示了对象选择系统的单选和框选功能。\n\n### 核心要点:\n\n- 创建 `Selection` 实例并监听 `select`、`deselect`、`change` 事件。\n- 使用 `selection.select()` / `deselect()` / `toggle()` / `clear()` 进行程序化选择操作。\n- 使用 `selection.enableBoxSelection()` 开启鼠标框选模式。\n- 框选模式下可配合 `viewer.controls.lock()` 避免框选与相机旋转冲突。\n\n## 17. `test_measure.html`:MeasureTool 测量工具\n\n该示例演示了 3D 场景中的距离、面积和角度测量。\n\n### 核心要点:\n\n- 使用 `measureTool.measureDistance(pointA, pointB)` 测量两点距离。\n- 使用 `measureTool.measureArea(points)` 测量多边形面积。\n- 使用 `measureTool.measureAngle(pointA, vertex, pointC)` 测量夹角。\n- 测量结果以可视化线条渲染到场景中,返回的 `MeasureResult` 包含数值和单位。\n\n## 18. `test_annotation.html`:AnnotationManager 标注管理\n\n该示例演示了 3D 标注的创建、更新和管理,配合 `CSSRenderer` 实现 HTML 浮动标签。\n\n### 核心要点:\n\n- 创建 `AnnotationManager` 实例并通过 `setCSSObjectFactory()` 绑定 `CSSRenderer`。\n- 使用 `annotationManager.add(id, options)` 添加带引线和自定义样式的标注。\n- 使用 `annotationManager.addText(text, position)` 快捷添加纯文本标注。\n- 使用 `updateContent()` 动态更新标注内容,`updatePosition()` 移动标注位置。\n- 使用 `hideAll()` / `showAll()` 批量控制标注显隐。\n\n## 19. `test_clipping.html`:ClippingTool 剖切工具\n\n该示例演示了剖切面的创建和实时调整。\n\n### 核心要点:\n\n- 创建 `ClippingTool` 实例并调用 `attach()` 将场景物体移入 ClippingGroup。\n- 使用 `clippingTool.addPlane(id, options)` 添加剖切面。\n- 使用滑块通过 `clippingTool.setPlaneConstant()` 实时调整剖切位置。\n- 使用 `showHelper()` / `hideHelper()` 切换剖切面可视化辅助。\n\n## 20. `test_lights.html`:LightManager 灯光管理\n\n该示例演示了灯光管理器的灯光预设和 Helper 可视化功能。\n\n### 核心要点:\n\n- 创建 `LightManager` 实例并使用 `applyPreset()` 一键应用灯光预设。\n- 支持 4 种预设:`indoor`(室内)、`outdoor`(室外)、`studio`(摄影棚)、`warehouse`(仓库)。\n- 使用 `showAllHelpers()` / `hideAllHelpers()` 显示或隐藏灯光辅助可视化。\n- 每种预设会自动清除旧灯光并创建新的灯光组合。\n\n## 21. `test_fire.html`:WebGPU 体积火焰\n\n该示例演示了 `u-space/plugins/fire` 的 `FireEffect` 插件,封装 Three.js 官方体积火焰示例,在独立 volumetric pass 中模拟火焰和烟雾后叠加到主场景。\n\n### 核心要点:\n\n- 使用 `FireEffect` 创建 WebGPU 体积火焰、烟雾、扰动、动态点光源和体积阴影。\n- 通过 `position` 和 `size` 设置体积盒底部中心和烟雾扩散约束范围。\n- 默认使用 `TeapotGeometry(0.8, 28)` 作为 emitter;也可以传入业务 `Object3D` 和自定义 `emitterGeometry`。\n- 通过 `fire.update()` 实时调整 `fireIntensity`、`smokeLifespan`、`emitterRadius` 等参数。\n- 插件使用 RenderPipeline output effect 接入,不占用业务侧的 `setOutputComposer()`。\n\n## 22. `test_ssr.html`:SSR 时空降噪\n\n[在线演示](https://u-space-phi.vercel.app/examples/test_ssr.html)\n\n该示例使用程序化室内场景演示完整的屏幕空间反射链路:Stochastic SSR、Temporal Reproject 和 Recurrent Denoise。\n\n### 核心要点:\n\n- 使用 `viewer.renderPipeline.enableSSR()` / `disableSSR()` 开关完整 SSR 后处理链。\n- 使用 `viewer.renderPipeline.updateSSR()` 实时调整 ray marching、历史帧数和降噪参数。\n- SSR 自动写入打包的法线/粗糙度、漫反射/金属度及 velocity MRT 通道。\n- 默认 `Viewer` 的 reversed depth 可直接使用;RenderPipeline 会在三个内部 pass 中正确跳过背景,同时保持原始深度用于位置与历史重建。\n- 使用 `viewer.frameloop = 'always'` 为时域重投影和循环降噪提供连续帧。\n- 场景包含移动发光球体,可直接观察运动向量重投影与残影收敛效果。\n- 示例通过 `pixelRatio: 1` 使用 1× drawing buffer,避免 Retina 屏幕把 Temporal Reproject 和 Recurrent Denoise 放大到 2.25 倍像素量。\n- `maxDistance` 从默认值 `0.4` 开始,保留滑块用于观察追踪距离对质量和性能的影响。\n- 移动物体继续生成 velocity,但不投射动态阴影;2048² 方向光阴影只更新一次。\n\n## 23. `test_ao.html`:环境光遮蔽\n\n[在线演示](https://u-space-phi.vercel.app/examples/test_ao.html)\n\n该示例使用程序化墙角与紧密摆放的几何体,独立展示 RenderPipeline 的 SSGI AO 分量。页面默认开启 AO,并固定 `giIntensity: 0`,因此画面只保留 `scene.rgb × AO` 遮蔽效果。\n\n### 核心要点:\n\n- 使用 `viewer.renderPipeline.enableSSGI()` 开启 AO,并通过 `giIntensity: 0` 关闭间接漫反射。\n- 使用 `disableSSGI()` 对比无 AO 画面,再使用当前参数重新开启。\n- 使用 `updateSSGI()` 实时调整 `aoIntensity`、`radius` 和 `thickness`。\n- 使用 `pixelRatio: 1` 控制全屏 SSGI 在高 DPI 屏幕上的成本。\n- 场景不加载外部资源,墙角、堆叠物体和窄缝可以直接观察接触遮蔽。\n"
1859
+ "content": "# 示例指南\n\n`u-space` 的 `examples/` 目录中包含了大量演示引擎功能的示例。以下是几个关键示例及其所展示的系统特性。\n\n## 运行方式与版本\n\n示例统一通过 `examples/importmap.js` 注入 Import Map。本地通过 `localhost`、`127.0.0.1`、`0.0.0.0` 或 `192.168.x.x` 访问时会加载仓库里的 `../dist/` 构建产物;在线部署或非本地域名访问时会从 jsDelivr 加载当前发布版本 `u-space@0.0.31`。Vercel 文档部署会继续把 `__VERSION__` 占位符替换为 `package.json` 中的版本号,源码里的 `0.0.31` 作为直接托管 `examples/` 时的 fallback。\n\n插件示例可以在页面加载 `importmap.js` 前通过 `window.__IMPORTS__` 声明额外依赖。将 `u-space/plugins/<name>` 的值设为 `true` 时,`importmap.js` 会自动在本地和 CDN 路径之间切换。\n\n## 1. `demo01.html`:基础配置与交互\n\n该示例演示了通过 WebGPU 渲染 3D 场景所需的最少配置,与 [快速上手](./getting-started.md) 指南中的内容一致。\n\n### 核心要点:\n\n- 将 `Viewer` 注入 DOM 元素。\n- 使用 WebGPU `Color` 设置场景背景。\n- 添加基础几何体(如 `BoxGeometry`)。\n- 通过 `viewer.interactionManager.pointerMoveEventsEnabled` 启用全局交互。\n- 像操作 DOM 元素一样,为 3D 网格原生绑定事件监听(`click`、`pointerenter`、`pointerleave`)。\n\n## 2. `test_loader.html`:模型缓存机制\n\n该示例深入解析了 `u-space` 的模型加载管线,阐明运行时缓存与浏览器持久化缓存之间的区别。\n\n### 核心要点:\n\n- 使用全局 `Model` 类通过 `Model.prototype.loadAsync()` 异步加载 `.glb` 文件。\n- 理解 `cache: true`(将模型节点保留在内存中,可实现即时克隆/实例化)。\n- 理解 `persistent: true`(使用 Service Worker / Cache Storage API 对实际网络请求数据进行持久化缓存)。\n- 演示如何将这些异步加载的资源安全地注册到 `viewer.objectManager`。\n- 提供通过 `Model.clearMemoryCache()` 和 `Model.clearPersistentCache()` 手动清除缓存的示例。\n\n## 3. `load_tiles.html`:GIS 与地球渲染\n\n该示例使用外部对等依赖 `3d-tiles-renderer`,通过 `u-space` 插件安全封装后,渲染大规模 LOD GIS 地球。\n\n### 核心要点:\n\n- 动态实例化复杂插件(`ArcgisTilesRenderer`),并传入核心 viewer 引用。\n- 由于瓦片是异步流式加载并持续更新视口的,需使用 `viewer.frameloop = 'always'`。\n- 通过插件的 `invalidate(lon, lat, alt)` 方法定位到指定的经纬高位置。\n- 使用 `lonLatHeightToPosition()` / `positionToLonLatHeight()` 在 WGS84 经纬高和场景世界坐标之间互转。\n\n## 4. `test_umanager.html`:场景组合与解析器\n\n该综合示例融合了多种工具,展示如何构建完整的应用程序,而不仅仅是放置单个模型。\n\n### 核心要点:\n\n- 同时初始化多个插件(minimap、tracking、keyboard-controls),并通过 `.enable()` / `.disable()` 切换其状态。\n- 流式传输结构化场景布局,解析场景描述(`SceneLoader`、`TopologiesLoader`)。\n- 使用相机动画(`VisionsLoader` 和 `VisionsParser`)在场景中编排预定义的飞行路径。\n- 获取复杂的节点材质,并自定义 WebGPU 专属的 TSL(Three Shading Language)节点,如 `TSLEffects.fluid()`。\n\n## 5. `test_umanager_loader.html`:UManagerLoader 一体化加载\n\n[在线演示](https://u-space-phi.vercel.app/examples/test_umanager_loader.html)\n\n该示例演示通过 `UManagerLoader` 在同一个路径下同时加载语义楼层、Facilities 和非语义场景树内容。加载结果会返回一个 `UManagerSceneGroup`,其中 `semanticGroup` 指向 `SemanticGroup`,`sceneGroup` 指向非语义场景组。\n\n### 核心要点:\n\n- 使用 `UManagerLoader.setPath()` 配置场景根目录,并通过一次 `loadAsync()` 完成 `SemanticLoader` + `SceneLoader` 组合加载。\n- `SceneLoader` 会自动跳过语义文件中已存在的 `id`,避免建筑、楼层或设备重复加载。\n- 通过 `root.semanticGroup.getDefaultFacilityLayer()` 和 `root.sceneGroup.getDefaultSceneLayer()` 直接获取默认设备合批层和场景模型合批层。\n- 通过 `viewer.objectManager` 获取 `SceneInstanceObject` 和 `FacilityInstanceObject`,再直接使用 `viewer.controls.flyToObject()` 飞向单个实例。\n- 使用 `setInstanceHighlight()`、`setInstanceVisible()`、`setInstanceOpacity()` 等统一 API 控制实例,不需要关心底层是合并几何、`InstancedMesh` 还是 fallback `Model`。\n- 示例把 `viewer`、`loader`、`root`、`semanticGroup`、`sceneGroup`、`facilityLayer`、`sceneLayer`、`sceneInstances` 和 `facilities` 暴露到 `window.uManagerExample`,方便在控制台调试。\n\n## 6. `test_umanager_dynamic_instances.html`:运行时动态实例\n\n[在线演示](https://u-space-phi.vercel.app/examples/test_umanager_dynamic_instances.html)\n\n该示例把运行时实例新增、删除、恢复和按 ID 查询拆到独立场景中,避免和 `UManagerLoader` 的一体化加载流程混在一起。\n\n### 核心要点:\n\n- 创建 `SceneInstancedLayer` 并调用 `reserveBatch(url, template, capacity)` 预分配容量。\n- 通过 `SceneInstanceObject.setInstanceIdentity({ id, kind, name })` 设置实例独立身份字段,不依赖 `userData` 参与 layer 内部索引。\n- 同一个 layer 内 `instanceId` 必须唯一;重复 ID 的新增会返回 `false`,加入后修改身份字段会在下一次按 ID 查询时刷新索引。\n- 使用 `addInstances()` 批量新增实例,使用 `removeInstance(id)` / `removeInstances(id)` 按完整 `instanceId` 删除实例。\n- 使用 `getInstanceById(id)` 快速获取实例,返回对象可直接用于 `setInstanceHighlight()` 和 `viewer.controls.flyToObject()`。\n- 示例把 `viewer`、`layer`、`template`、`allInstances` 和 `removedInstances` 暴露到 `window.dynamicInstanceExample`。\n\n## 7. `test_umanager2.html`:大型场景可编辑静态合批\n\n该性能目标场景同时加载语义对象和完整场景树,并通过 `SceneLoader.setEditableBatching()` 把兼容的普通 Mesh 烘焙合并到 `SceneEditableBatchLayer`。它适合 draw calls 和可渲染 Mesh 数量成为主要 CPU/GPU 提交瓶颈、但业务仍需要按对象 ID 显隐、高亮或偶尔移动对象的场景。\n\n### 核心要点:\n\n- 使用 `setEditableBatching({ maxVerticesPerBatch, maxIndicesPerBatch, freezeAnimations })` 显式开启;默认 `SceneLoader` 行为不变。\n- 兼容的不透明 Mesh 按材质、Geometry attribute 布局、阴影状态和 `renderOrder` 合并;透明、蒙皮、morph、自定义 shader 和不兼容 Geometry 保留 fallback。\n- 合批对象仍保留 `SceneInstanceObject`,显隐、颜色和不透明高亮通过 TSL 状态纹理更新;transform 或半透明修改只 materialize 当前对象。\n- 页面使用 `pixelRatio: 1` 控制高 DPI drawing buffer 成本,并关闭不需要的交互 raycast。\n- 首帧前通过 `renderer.compileAsync()` 预热 WebGPU material pipeline,避免把编译中的中间画面展示给用户。\n- 使用 `?editableBatching=false` 可关闭该路径,与默认 path-based `SceneInstancedLayer`/普通模型加载结果做性能和画面对比。\n- `sceneGroup.userData.editableBatch` 提供 `sourceMeshes`、`batches`、`drawCallsSaved`、`vertices`、`indices` 和 fallback 原因统计。\n\n该模式通过展开重复顶点换取更少 draw calls;高重复、大 Geometry 的同模板对象可能仍更适合 `SceneInstancedLayer`。详见 [u-manager `setEditableBatching()` API](./api-plugin-u-manager.md#可编辑静态合批seteditablebatching)。\n\n## 8. `test_umanager2_offscreen.html`:OffscreenCanvas Worker + editable batching\n\n该示例是 `test_umanager2.html` 的 Worker 版本。完整 `Viewer`、Three.js 对象重建、editable batch 构建、相机控制和 WebGPU 渲染运行在 dedicated render Worker;主线程只持有可见 canvas、转发输入/resize,并显示 Worker 返回的状态与统计。静态 SBMX/glTF 的 fetch、字节/JSON/base64 解析和图片解码继续拆到 render Worker 创建的第二个 decode Worker,因此加载新模型时已有 3D 场景仍可响应输入。\n\n通过专用 Vite 配置启动:\n\n```bash\npnpm example:offscreen\n```\n\n然后访问 `http://127.0.0.1:5510/offscreen/test_umanager2_offscreen.html`。该示例的 HTML、主线程入口、Worker 入口和专用 Vite 配置集中在 `examples/offscreen/` 目录。可用 `pnpm build:example:offscreen` 验证生产构建。\n\n[在线演示](https://u-space-phi.vercel.app/examples/offscreen/test_umanager2_offscreen.html)由一键发布流程单独打包:HTML 加载生成的 JavaScript,Worker 保持 ES module 格式,Draco/Basis WASM 等资源写入 `/examples/assets/`。线上页面不直接执行源码 `.ts`,HDR 则复用 `/examples/textures/puresky_1k.hdr`。\n\n### 核心要点:\n\n- 主线程使用 `OffscreenViewerHost` 调用 `transferControlToOffscreen()`,以 structured-clone 消息转发 pointer、wheel、resize 和业务 command。\n- Worker 在模块顶层通过 `const worker = await createWorkerViewer()` 创建真正的 `Viewer`,随后以顺序式代码加载 HDR、`SemanticLoader` 和 `SceneLoader`,无需把整个入口包进 setup callback。\n- render Worker 通过 `ModelLoaderManager.setDecodeWorker()` 启用 `test_umanager2_offscreen.decode.worker.ts`,并把返回的实例绑定 disposer 注册到 runtime 清理;decode Worker 从 `u-space/worker/model-decoder` 调用 `installModelDecodeWorker()`,以 transferable `ArrayBuffer` / `ImageBitmap` 返回静态 glTF 数据,Three.js/GPU 对象仍只在 render Worker 创建。外部 buffer/贴图继续经过 render Worker 的 LoadingManager URL modifier 与加载统计,跨域依赖不会继承模型请求的敏感 headers/credentials。\n- 解码队列一次只允许一个待确认数据包;render Worker 重建后发送 ACK 再取下一项,防止 1GB 级场景同时堆积多个模型副本。相同图片通过有界 LRU 内容指纹复用 bitmap 身份,避免把原本 25 个 editable material batches 拆成大量重复批次,同时不永久持有所有历史贴图。\n- animation、skin、morph、camera、sparse accessor、glTF extension/压缩扩展和非 triangle primitive 不进入快速路径,会自动使用现有 loader。访问 `?modelDecodeWorker=off` 可关闭嵌套 Worker,与原始 loader 做画面、批次和加载响应 A/B 对比;默认开启。\n- Worker runtime 同时接管 Three.js `ImageLoader` 与 `ImageBitmapLoader`:JPEG/PNG/GIF/WebP 任一边超过 WebGPU 默认 `8192` 上限时,会在第一次 `createImageBitmap()` 解码时等比缩小,保留 loader options/cache/abort 语义且不修改源文件,避免 `Texture size` 引发的 WebGPU validation 级联错误。\n- `await host.init()` / `initialized` 只表示 Worker 内 `viewer.init()` 完成;HDR、模型、editable batch、pipeline 预热和业务首帧完成后,Worker 才显式调用一次 `worker.ready(detail)`。主线程应先注册 `ready` 监听,再执行 `host.init()`,并在 `ready` 后调用业务 command。\n- `SceneLoader.setEditableBatching()` 在 Worker 中完成 Geometry 克隆、变换烘焙、合并和 TSL 状态纹理创建;透明、蒙皮、morph、自定义 shader 等不支持子集保持 fallback。\n- 首帧前关闭 controls invalidation 并等待 `renderer.compileAsync()`,预热 WebGPU 合批管线后再显示完整画面。\n- HUD 显示实际 `drawCalls`、三角形、`static scene matrices` 状态,以及 1 秒滚动窗口的 FPS、平均/p95/最大帧间隔、超过 25ms 的占比和样本数;demand 模式恢复时的空闲间隔不会被误算成渲染帧。\n- 示例调用 `semanticGroup.showAllFloors().showAllFacilities()` 并保持 `SemanticGroup.visible = true`,楼层、墙体、空间、门窗和设备等所有语义对象均保留且默认显示。HUD 的设备调试区通过 Worker command 选择、飞向、高亮或清除当前 Facility;这些操作都不修改任何语义对象或建筑场景的显隐状态,“清除调试”只撤销高亮。\n- `SemanticLoader` 的压平语义 Geometry 属于分析叠加层,本示例按调试需求默认显示完整语义模型,因此其半透明颜色会与建筑楼壳叠加;业务项目可以按自身展示策略单独控制该层。\n- 标准 RenderPipeline scene pass 保持启用,editable batch 只接收源模型中的不透明 Mesh;透明子 Mesh 保留标准 fallback,以兼顾透明合成正确性和不降低 pixel ratio 的运镜帧率。\n- 相机拖拽继续由主线程事件桥接到 Worker;业务对象不能跨线程传输,按 ID 显隐、变色、transform 或 `materialize()` 应包装成 Worker command,通过 `host.request()` 调用。\n- 相机定位后先调用 Three.js 原生 `viewer.scene.updateMatrixWorld(true)`,再设置 `viewer.scene.matrixWorldAutoUpdate = false` 跳过每帧整树矩阵遍历;新增场景层级后用 `scene.updateWorldMatrix(true, true)` 只提交新增子树。Worker command 修改单个普通 Mesh 或 `InstanceObject` 时调用 `object.updateWorldMatrix(true, false)`,修改 Group 时调用 `group.updateWorldMatrix(true, true)`,最后调用 `viewer.invalidate()`。`InstanceObject` 的原生方法覆盖会继续触发 instance buffer dirty 或 editable-batch materialize。\n- `ready()` 前的加载或管线预编译异常会触发 error、逆序资源清理和 Worker 关闭;初始化期间销毁 Host、canvas 转移/初始消息失败或 Worker 主动关闭会 reject 尚未完成的 `host.init()` / `request()` 并清理 DOM、resize 和待发送 pointer move。Host dispose 后会忽略队列中迟到的业务事件与 response。\n- Offscreen 负责释放主线程,editable batching 负责减少 draw submission;两者都不会自动减少三角形或透明 overdraw。\n\n浏览器必须同时支持 `transferControlToOffscreen()` 和 Worker WebGPU。CSS2D/CSS3D、`Info` 等真实 DOM 叠加层仍应保留在主线程。完整接口和边界见 [Viewer OffscreenCanvas Worker API](./api-viewer.md#offscreencanvas-worker实验性)。\n\n## 9. `test_model_animation.html`:模型内置动画\n\n[在线演示](https://u-space-phi.vercel.app/examples/test_model_animation.html)\n\n该示例演示了如何加载含内置动画的 glTF 模型,并通过 `Model` 类的动画 API 控制播放。\n\n### 核心要点:\n\n- 使用 `Model.loadAsync()` 加载带动画的 `.glb` 文件,动画片段自动初始化。\n- 使用 `viewer.frameloop = 'always'` 开启持续渲染以驱动动画。\n- 监听 `beforeRender` 事件,通过 `model.updateAnimation(e.delta)` 推进动画时间。\n- 使用 `model.playAnimation(name)` 按名称播放单个动画,`model.playAllAnimations()` 播放全部。\n- 使用 `model.stopAnimation()` 停止动画播放。\n\n## 10. `test_css_renderer.html`:CSS2D / CSS2.5D / CSS3D 渲染器\n\n该示例演示了如何在 3D 场景中叠加渲染 HTML 元素,展示三种 CSS 渲染模式的效果差异。\n\n### 核心要点:\n\n- 使用 `viewer.cssRenderer.createCSS2DObject()` 创建始终面向相机、固定屏幕尺寸的 2D 标签。\n- 使用 `viewer.cssRenderer.createCSS25DObject()` 创建面向相机但随距离缩放的 2.5D 精灵。\n- 使用 `viewer.cssRenderer.createCSS3DObject()` 创建具有完整 3D 变换的面板。\n- CSS2.5D 和 CSS3D 对象需要设置 `scale`(通常 `0.01`),因为 HTML 元素的像素尺寸远大于 3D 世界单位。\n- 渲染器采用懒加载,仅在首次创建对应类型对象时初始化。\n\n## 11. `test_postprocessing.html`:后处理效果\n\n该示例演示了 `RenderPipeline` 的内置后处理功能,包括 Bloom、SSGI、TRAA 以及自定义后处理组合器。\n\n### 核心要点:\n\n- 使用 `viewer.renderPipeline.enableBloom()` / `disableBloom()` 运行时切换 Bloom 效果。\n- 使用 `viewer.renderPipeline.updateBloom()` 实时调整 strength、radius、threshold 参数。\n- 使用 `viewer.renderPipeline.enableSSGI()` / `disableSSGI()` 切换屏幕空间全局光照。\n- 使用 `viewer.renderPipeline.updateSSGI()` 实时调整 SSGI 参数(直接修改 uniform,无需重建节点图)。\n- 使用 `viewer.renderPipeline.enableTRAA()` / `disableTRAA()` 切换时间抗锯齿。\n- 使用 `viewer.renderPipeline.setOutputComposer()` 自定义后处理链(示例中实现了灰度滤镜)。\n- 使用 `setOutputComposer(null)` 恢复默认渲染管线。\n\n## 12. `test_viewer_utils.html`:Viewer 工具方法\n\n该示例演示了 `Viewer` 新增的便捷方法:截图导出、背景切换、雾效控制和阴影开关。\n\n### 核心要点:\n\n- 使用 `viewer.screenshot()` 导出当前渲染画面为 PNG 文件。\n- 使用 `viewer.setBackground(color)` 快速切换场景背景颜色。\n- 使用 `viewer.enableFog()` / `viewer.disableFog()` 控制雾效。\n- 使用 `viewer.enableShadow()` / `viewer.disableShadow()` 控制阴影渲染。\n- 使用 `viewer.resize(width, height)` 手动触发尺寸更新。\n\n## 13. `test_camera_controls.html`:CameraControls 增强方法\n\n该示例演示了 `CameraControls` 的飞行定位、视角存取、锁定和二三维切换功能。\n\n### 核心要点:\n\n- 使用 `viewer.controls.flyTo(position, target)` 将相机飞行到指定坐标。\n- 使用 `viewer.controls.getCameraViewpoint()` 获取当前视角数据。\n- 使用 `viewer.controls.setCameraViewpoint(data)` 恢复保存的视角。\n- 使用 `viewer.controls.lock()` / `unlock()` 锁定或解锁相机控制。\n- 使用 `viewer.controls.setViewMode('2d')` / `setViewMode('3d')` 在二三维视图间切换。\n\n## 14. `test_object_manager.html`:ObjectManager 增强方法\n\n该示例演示了 `ObjectManager` 的显隐控制、孤立显示、透明度设置、包围盒查询和过滤功能。\n\n### 核心要点:\n\n- 使用 `viewer.objectManager.show(id)` / `hide(id)` 控制对象可见性。\n- 使用 `viewer.objectManager.isolate(ids)` 孤立显示指定对象。\n- 使用 `viewer.objectManager.setOpacity(id, value)` 设置材质透明度。\n- 使用 `viewer.objectManager.getBoundingBox()` 查询所有对象的包围盒。\n- 使用 `viewer.objectManager.filter(predicate)` 按条件过滤对象。\n\n## 15. `test_material_effects.html`:MaterialEffects 增强效果\n\n该示例演示了材质效果系统的线框、半透明、X 光和淡入淡出功能。\n\n### 核心要点:\n\n- 使用 `MaterialEffects.wireframe(object)` 开启线框渲染模式。\n- 使用 `MaterialEffects.highlightColor(object, { opacity })` 设置半透明效果。\n- 使用 `MaterialEffects.highlightColor(object, { color, opacity, overwrite: true, depthWrite: false })` 实现 X 光透视效果。\n- 使用 `MaterialEffects.fadeOut(object)` / `fadeIn(object)` 执行淡入淡出动画。\n- 使用 `MaterialEffects.removeHighlightColor(object)` 恢复原始材质状态。\n\n## 16. `test_selection.html`:Selection 选择系统\n\n该示例演示了对象选择系统的单选和框选功能。\n\n### 核心要点:\n\n- 创建 `Selection` 实例并监听 `select`、`deselect`、`change` 事件。\n- 使用 `selection.select()` / `deselect()` / `toggle()` / `clear()` 进行程序化选择操作。\n- 使用 `selection.enableBoxSelection()` 开启鼠标框选模式。\n- 框选模式下可配合 `viewer.controls.lock()` 避免框选与相机旋转冲突。\n\n## 17. `test_measure.html`:MeasureTool 测量工具\n\n该示例演示了 3D 场景中的距离、面积和角度测量。\n\n### 核心要点:\n\n- 使用 `measureTool.measureDistance(pointA, pointB)` 测量两点距离。\n- 使用 `measureTool.measureArea(points)` 测量多边形面积。\n- 使用 `measureTool.measureAngle(pointA, vertex, pointC)` 测量夹角。\n- 测量结果以可视化线条渲染到场景中,返回的 `MeasureResult` 包含数值和单位。\n\n## 18. `test_annotation.html`:AnnotationManager 标注管理\n\n该示例演示了 3D 标注的创建、更新和管理,配合 `CSSRenderer` 实现 HTML 浮动标签。\n\n### 核心要点:\n\n- 创建 `AnnotationManager` 实例并通过 `setCSSObjectFactory()` 绑定 `CSSRenderer`。\n- 使用 `annotationManager.add(id, options)` 添加带引线和自定义样式的标注。\n- 使用 `annotationManager.addText(text, position)` 快捷添加纯文本标注。\n- 使用 `updateContent()` 动态更新标注内容,`updatePosition()` 移动标注位置。\n- 使用 `hideAll()` / `showAll()` 批量控制标注显隐。\n\n## 19. `test_clipping.html`:ClippingTool 剖切工具\n\n该示例演示了剖切面的创建和实时调整。\n\n### 核心要点:\n\n- 创建 `ClippingTool` 实例并调用 `attach()` 将场景物体移入 ClippingGroup。\n- 使用 `clippingTool.addPlane(id, options)` 添加剖切面。\n- 使用滑块通过 `clippingTool.setPlaneConstant()` 实时调整剖切位置。\n- 使用 `showHelper()` / `hideHelper()` 切换剖切面可视化辅助。\n\n## 20. `test_lights.html`:LightManager 灯光管理\n\n该示例演示了灯光管理器的灯光预设和 Helper 可视化功能。\n\n### 核心要点:\n\n- 创建 `LightManager` 实例并使用 `applyPreset()` 一键应用灯光预设。\n- 支持 4 种预设:`indoor`(室内)、`outdoor`(室外)、`studio`(摄影棚)、`warehouse`(仓库)。\n- 使用 `showAllHelpers()` / `hideAllHelpers()` 显示或隐藏灯光辅助可视化。\n- 每种预设会自动清除旧灯光并创建新的灯光组合。\n\n## 21. `test_fire.html`:WebGPU 体积火焰\n\n该示例演示了 `u-space/plugins/fire` 的 `FireEffect` 插件,封装 Three.js 官方体积火焰示例,在独立 volumetric pass 中模拟火焰和烟雾后叠加到主场景。\n\n### 核心要点:\n\n- 使用 `FireEffect` 创建 WebGPU 体积火焰、烟雾、扰动、动态点光源和体积阴影。\n- 通过 `position` 和 `size` 设置体积盒底部中心和烟雾扩散约束范围。\n- 默认使用 `TeapotGeometry(0.8, 28)` 作为 emitter;也可以传入业务 `Object3D` 和自定义 `emitterGeometry`。\n- 通过 `fire.update()` 实时调整 `fireIntensity`、`smokeLifespan`、`emitterRadius` 等参数。\n- 插件使用 RenderPipeline output effect 接入,不占用业务侧的 `setOutputComposer()`。\n\n## 22. `test_ssr.html`:SSR 时空降噪\n\n[在线演示](https://u-space-phi.vercel.app/examples/test_ssr.html)\n\n该示例使用程序化室内场景演示完整的屏幕空间反射链路:Stochastic SSR、Temporal Reproject 和 Recurrent Denoise。\n\n### 核心要点:\n\n- 使用 `viewer.renderPipeline.enableSSR()` / `disableSSR()` 开关完整 SSR 后处理链。\n- 使用 `viewer.renderPipeline.updateSSR()` 实时调整 ray marching、历史帧数和降噪参数。\n- SSR 自动写入打包的法线/粗糙度、漫反射/金属度及 velocity MRT 通道。\n- 默认 `Viewer` 的 reversed depth 可直接使用;RenderPipeline 会在三个内部 pass 中正确跳过背景,同时保持原始深度用于位置与历史重建。\n- 使用 `viewer.frameloop = 'always'` 为时域重投影和循环降噪提供连续帧。\n- 场景包含移动发光球体,可直接观察运动向量重投影与残影收敛效果。\n- 示例通过 `pixelRatio: 1` 使用 1× drawing buffer,避免 Retina 屏幕把 Temporal Reproject 和 Recurrent Denoise 放大到 2.25 倍像素量。\n- `maxDistance` 从默认值 `0.4` 开始,保留滑块用于观察追踪距离对质量和性能的影响。\n- 移动物体继续生成 velocity,但不投射动态阴影;2048² 方向光阴影只更新一次。\n\n## 23. `test_ao.html`:环境光遮蔽\n\n[在线演示](https://u-space-phi.vercel.app/examples/test_ao.html)\n\n该示例使用程序化墙角与紧密摆放的几何体,独立展示 RenderPipeline 的 SSGI AO 分量。页面默认开启 AO,并固定 `giIntensity: 0`,因此画面只保留 `scene.rgb × AO` 遮蔽效果。\n\n### 核心要点:\n\n- 使用 `viewer.renderPipeline.enableSSGI()` 开启 AO,并通过 `giIntensity: 0` 关闭间接漫反射。\n- 使用 `disableSSGI()` 对比无 AO 画面,再使用当前参数重新开启。\n- 使用 `updateSSGI()` 实时调整 `aoIntensity`、`radius` 和 `thickness`。\n- 使用 `pixelRatio: 1` 控制全屏 SSGI 在高 DPI 屏幕上的成本。\n- 场景不加载外部资源,墙角、堆叠物体和窄缝可以直接观察接触遮蔽。\n"
1836
1860
  },
1837
1861
  {
1838
1862
  "id": "getting-started",
@@ -1877,7 +1901,7 @@ export const docsIndex = [
1877
1901
  "text": "下一步"
1878
1902
  }
1879
1903
  ],
1880
- "content": "# 快速上手 `u-space`\n\n`u-space` 是一个基于 Three.js 的 WebGPU 3D 引擎。本指南将向你展示如何搭建一个基础的 `u-space` 应用。\n\n## 安装\n\n确保已将 `@types/three` 和 `three` 安装为对等依赖。如果你计划使用交互功能,还需要安装 `camera-controls`。\n\n```bash\npnpm install three camera-controls\n```\n\n## 基础配置\n\n以下是一个最小示例,展示如何初始化 `u-space` 的 `Viewer` 并向场景中添加一个可交互对象。\n\n### 1. HTML 结构\n\n创建一个容纳 3D 查看器的元素。\n\n```html\n<!DOCTYPE html>\n<html lang=\"zh\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>u-space App</title>\n </head>\n <body style=\"margin: 0\">\n <div id=\"app\" style=\"width: 100vw; height: 100vh\"></div>\n <!-- 脚本放这里 -->\n </body>\n</html>\n```\n\n### 2. Import Maps\n\n由于 `u-space` 依赖 Three.js 的 WebGPU 特性,建议配置 Import Map 以解析 Three.js 的 WebGPU 构建版本。\n\n```html\n<script type=\"importmap\">\n {\n \"imports\": {\n \"three\": \"/node_modules/three/build/three.webgpu.js\",\n \"three/webgpu\": \"/node_modules/three/build/three.webgpu.js\",\n \"three/addons/\": \"/node_modules/three/examples/jsm/\",\n \"camera-controls\": \"/node_modules/camera-controls/dist/camera-controls.module.js\",\n \"u-space\": \"path/to/u-space/dist/index.js\"\n }\n }\n</script>\n```\n\n### 3. 初始化 Viewer 并添加对象\n\n初始化 `Viewer` 并向场景中添加一个基础 Three.js 对象。\n\n```html\n<script type=\"module\">\n import { Color, GridHelper, Mesh, BoxGeometry, MeshBasicMaterial } from 'three/webgpu';\n import { Viewer } from 'u-space';\n\n const app = document.getElementById('app');\n\n // 初始化查看器\n const viewer = new Viewer({\n el: app,\n rendererOptions: { forceWebGL: false }, // 优先使用 WebGPU\n });\n await viewer.init();\n\n // 设置背景颜色\n viewer.scene.background = new Color(0x666666);\n\n // 添加网格辅助线\n const gridHelper = new GridHelper(10, 10);\n viewer.scene.add(gridHelper);\n\n // 添加一个立方体\n const geometry = new BoxGeometry(1, 1, 1);\n const material = new MeshBasicMaterial({ color: 0xff0000 });\n const box = new Mesh(geometry, material);\n box.position.set(0, 0.5, 0);\n viewer.scene.add(box);\n\n // 渲染场景\n viewer.render();\n</script>\n```\n\n### 4. 启用交互\n\n`u-space` 内置了 `InteractionManager`,可以轻松为 3D 对象添加事件监听。\n\n```javascript\n// 启用指针移动事件(pointerenter / pointerleave 需要此开关)\nviewer.interactionManager.pointerMoveEventsEnabled = true;\n\n// 添加点击事件\nbox.addEventListener('click', (e) => {\n console.log('点击位置:', e.event.intersect.point);\n material.color.set(Math.random() * 0xffffff);\n viewer.render(); // 请求新一帧渲染\n});\n\n// 添加悬停事件\nbox.addEventListener('pointerenter', (e) => {\n document.body.style.cursor = 'pointer';\n material.color.set(0x00ff00);\n viewer.render();\n});\n\nbox.addEventListener('pointerleave', (e) => {\n document.body.style.cursor = 'default';\n material.color.set(0xff0000);\n viewer.render();\n});\n```\n\n这样就完成了!你现在拥有一个基础的 `u-space` 应用。\n\n## 版本信息\n\n`u-space` 导出了 `version` 常量,同时在 `window.__USPACE__` 上挂载了版本信息,方便调试和版本检查。\n\n```typescript\nimport { version } from 'u-space';\nconsole.log(version); // e.g. '0.0.30'\n\n// 也可以通过全局变量访问\nconsole.log(window.__USPACE__.version);\n```\n\n## 下一步\n\n- 深入了解 [Viewer API](./api-viewer.md)\n- 探索如何 [加载模型与使用对象](./api-objects.md)\n- 理解 [交互系统](./api-interactions.md)\n- 使用 [Managers API](./api-managers.md) 注册和检索对象\n- 通过插件添加 [瓦片地图](./api-plugin-tiles.md)、[小地图](./api-plugin-minimap.md)、[键盘控制](./api-plugin-keyboard-controls.md) 等功能\n- 使用 [Animations API](./api-animations.md) 为属性添加动画\n- 使用 [Effects API](./api-effects.md) 应用视觉特效\n- 浏览 [示例指南](./examples-guide.md)\n"
1904
+ "content": "# 快速上手 `u-space`\n\n`u-space` 是一个基于 Three.js 的 WebGPU 3D 引擎。本指南将向你展示如何搭建一个基础的 `u-space` 应用。\n\n## 安装\n\n确保已将 `@types/three` 和 `three` 安装为对等依赖。如果你计划使用交互功能,还需要安装 `camera-controls`。\n\n```bash\npnpm install three camera-controls\n```\n\n## 基础配置\n\n以下是一个最小示例,展示如何初始化 `u-space` 的 `Viewer` 并向场景中添加一个可交互对象。\n\n### 1. HTML 结构\n\n创建一个容纳 3D 查看器的元素。\n\n```html\n<!DOCTYPE html>\n<html lang=\"zh\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>u-space App</title>\n </head>\n <body style=\"margin: 0\">\n <div id=\"app\" style=\"width: 100vw; height: 100vh\"></div>\n <!-- 脚本放这里 -->\n </body>\n</html>\n```\n\n### 2. Import Maps\n\n由于 `u-space` 依赖 Three.js 的 WebGPU 特性,建议配置 Import Map 以解析 Three.js 的 WebGPU 构建版本。\n\n```html\n<script type=\"importmap\">\n {\n \"imports\": {\n \"three\": \"/node_modules/three/build/three.webgpu.js\",\n \"three/webgpu\": \"/node_modules/three/build/three.webgpu.js\",\n \"three/addons/\": \"/node_modules/three/examples/jsm/\",\n \"camera-controls\": \"/node_modules/camera-controls/dist/camera-controls.module.js\",\n \"u-space\": \"path/to/u-space/dist/index.js\"\n }\n }\n</script>\n```\n\n### 3. 初始化 Viewer 并添加对象\n\n初始化 `Viewer` 并向场景中添加一个基础 Three.js 对象。\n\n```html\n<script type=\"module\">\n import { Color, GridHelper, Mesh, BoxGeometry, MeshBasicMaterial } from 'three/webgpu';\n import { Viewer } from 'u-space';\n\n const app = document.getElementById('app');\n\n // 初始化查看器\n const viewer = new Viewer({\n el: app,\n rendererOptions: { forceWebGL: false }, // 优先使用 WebGPU\n });\n await viewer.init();\n\n // 设置背景颜色\n viewer.scene.background = new Color(0x666666);\n\n // 添加网格辅助线\n const gridHelper = new GridHelper(10, 10);\n viewer.scene.add(gridHelper);\n\n // 添加一个立方体\n const geometry = new BoxGeometry(1, 1, 1);\n const material = new MeshBasicMaterial({ color: 0xff0000 });\n const box = new Mesh(geometry, material);\n box.position.set(0, 0.5, 0);\n viewer.scene.add(box);\n\n // 渲染场景\n viewer.render();\n</script>\n```\n\n### 4. 启用交互\n\n`u-space` 内置了 `InteractionManager`,可以轻松为 3D 对象添加事件监听。\n\n```javascript\n// 启用指针移动事件(pointerenter / pointerleave 需要此开关)\nviewer.interactionManager.pointerMoveEventsEnabled = true;\n\n// 添加点击事件\nbox.addEventListener('click', (e) => {\n console.log('点击位置:', e.event.intersect.point);\n material.color.set(Math.random() * 0xffffff);\n viewer.render(); // 请求新一帧渲染\n});\n\n// 添加悬停事件\nbox.addEventListener('pointerenter', (e) => {\n document.body.style.cursor = 'pointer';\n material.color.set(0x00ff00);\n viewer.render();\n});\n\nbox.addEventListener('pointerleave', (e) => {\n document.body.style.cursor = 'default';\n material.color.set(0xff0000);\n viewer.render();\n});\n```\n\n这样就完成了!你现在拥有一个基础的 `u-space` 应用。\n\n## 版本信息\n\n`u-space` 导出了 `version` 常量,同时在 `window.__USPACE__` 上挂载了版本信息,方便调试和版本检查。\n\n```typescript\nimport { version } from 'u-space';\nconsole.log(version); // e.g. '0.0.31'\n\n// 也可以通过全局变量访问\nconsole.log(window.__USPACE__.version);\n```\n\n## 下一步\n\n- 深入了解 [Viewer API](./api-viewer.md)\n- 探索如何 [加载模型与使用对象](./api-objects.md)\n- 理解 [交互系统](./api-interactions.md)\n- 使用 [Managers API](./api-managers.md) 注册和检索对象\n- 通过插件添加 [瓦片地图](./api-plugin-tiles.md)、[小地图](./api-plugin-minimap.md)、[键盘控制](./api-plugin-keyboard-controls.md) 等功能\n- 使用 [Animations API](./api-animations.md) 为属性添加动画\n- 使用 [Effects API](./api-effects.md) 应用视觉特效\n- 浏览 [示例指南](./examples-guide.md)\n"
1881
1905
  },
1882
1906
  {
1883
1907
  "id": "index",
@@ -1906,13 +1930,13 @@ export const docsIndex = [
1906
1930
  "text": "维护"
1907
1931
  }
1908
1932
  ],
1909
- "content": "---\nlayout: home\n\nhero:\n name: u-space\n text: WebGPU-ready 3D Engine\n tagline: 基于 Three.js 的插件化 3D 可视化库,支持 GIS 瓦片、动画、场景管理与交互系统。\n actions:\n - theme: brand\n text: 快速上手\n link: /getting-started\n - theme: alt\n text: API 文档\n link: /api-viewer\n - theme: alt\n text: 在线示例\n link: /examples/\n target: _self\n\nfeatures:\n - title: WebGPU 优先\n details: 基于 Three.js WebGPU 渲染器,支持 TSL(Three Shading Language)着色器节点,同时保持 WebGL 兼容回退。\n - title: 插件化架构\n details: 核心轻量,通过独立插件按需扩展:GIS 瓦片、小地图、键盘控制、场景管理、曲线动画等。\n - title: 交互系统\n details: 内置射线检测与事件冒泡,像操作 DOM 元素一样为 3D 对象添加 click、pointerenter 等事件。\n---\n\n## 文档目录\n\n### 核心 API\n\n| 文档 | 说明 |\n| :--- | :--- |\n| [Viewer](./api-viewer) | 核心类:渲染器、场景、相机、控制器、事件,以及实验性 OffscreenCanvas Worker runtime |\n| [CameraControls](./api-camera-controls) | 相机控制:飞行、视角切换、视点过渡 |\n| [CSSRenderer](./api-css-renderer) | CSS 渲染器:CSS2D / CSS2.5D / CSS3D 叠加 HTML 元素 |\n| [RenderPipeline](./api-render-pipeline) | 后处理管线:Bloom、SSGI、SSR 时空降噪、TRAA、自定义后处理 |\n| [Objects](./api-objects) | 3D 对象:统一 `InstanceObject` API、模型加载、基础网格、Poi、Topology |\n| [Batches](./api-batches) | 公共批处理:`ModelInstancedLayer`、`EditableGeometryBatchLayer`、fallback、materialize 与 raycast remap |\n| [Interactions](./api-interactions) | 交互管理:射线检测、鼠标/触摸事件、框选 |\n| [Managers](./api-managers) | 对象管理、场景管理、灯光管理 |\n| [Animations](./api-animations) | 补间动画:`tweenAnimation`、`Tween`、缓动模式 |\n| [Effects](./api-effects) | 视觉特效:高亮、呼吸、线框、淡入淡出、流动、流体(TSL) |\n| [Tools](./api-tools) | 工具:测量(距离/面积/角度)、剖切(面/盒)、标注管理 |\n\n### 插件\n\n所有插件从 `u-space/plugins/<name>` 导入。\n\n| 插件 | 说明 |\n| :--- | :--- |\n| [keyboard-controls](./api-plugin-keyboard-controls) | WASD / 方向键控制相机移动与旋转 |\n| [minimap](./api-plugin-minimap) | 2D 小地图叠加层 |\n| [tiles](./api-plugin-tiles) | ArcGIS 3D 瓦片 / GIS 地球渲染 |\n| [u-manager](./api-plugin-u-manager) | 场景加载、可编辑静态 Geometry batching、模型 instancing、语义楼层/井道/设备、拓扑、动画、属性与视点管理 |\n| [curve-movement](./api-plugin-curve-movement) | 沿样条曲线移动相机或对象 |\n| [tracking-controls](./api-plugin-tracking-controls) | 相机跟随移动目标 |\n| [atmosphere](./api-plugin-atmosphere) | 天空背景、天空环境、太阳/月亮光照与阴影 |\n| [fire](./api-plugin-fire) | WebGPU 体积火焰、烟雾、湍流、动态光照与阴影 |\n| [object-controls](./api-plugin-object-controls) | 交互式移动、旋转、缩放 3D 对象 |\n| [topology-drawer](./api-plugin-topology-drawer) | 在场景任意表面交互式绘制拓扑路径图 |\n\n### MCP\n\n| 文档 | 说明 |\n| :--- | :--- |\n| [u-space MCP](./mcp) | 面向 Mastra、Claude Desktop、Cursor 等 MCP 客户端的只读文档检索服务器 |\n\n### 维护\n\n| 文档 | 说明 |\n| :--- | :--- |\n| [一键发布](./release) | 通过 GitHub Actions、npm Trusted Publishing 和 Vercel 发布 `u-space`、`u-space-mcp`、docs 与 examples |\n"
1933
+ "content": "---\nlayout: home\n\nhero:\n name: u-space\n text: WebGPU-ready 3D Engine\n tagline: 基于 Three.js 的插件化 3D 可视化库,支持 GIS 瓦片、动画、场景管理与交互系统。\n actions:\n - theme: brand\n text: 快速上手\n link: /getting-started\n - theme: alt\n text: API 文档\n link: /api-viewer\n - theme: alt\n text: 在线示例\n link: /examples/\n target: _self\n\nfeatures:\n - title: WebGPU 优先\n details: 基于 Three.js WebGPU 渲染器,支持 TSL(Three Shading Language)着色器节点,同时保持 WebGL 兼容回退。\n - title: 插件化架构\n details: 核心轻量,通过独立插件按需扩展:GIS 瓦片、小地图、键盘控制、场景管理、曲线动画等。\n - title: 交互系统\n details: 内置射线检测与事件冒泡,像操作 DOM 元素一样为 3D 对象添加 click、pointerenter 等事件。\n---\n\n## 文档目录\n\n### 核心 API\n\n| 文档 | 说明 |\n| :--- | :--- |\n| [Viewer](./api-viewer) | 核心类:渲染器、场景、相机、控制器、事件,以及带超大贴图保护的实验性 OffscreenCanvas Worker runtime |\n| [CameraControls](./api-camera-controls) | 相机控制:飞行、视角切换、视点过渡 |\n| [CSSRenderer](./api-css-renderer) | CSS 渲染器:CSS2D / CSS2.5D / CSS3D 叠加 HTML 元素 |\n| [RenderPipeline](./api-render-pipeline) | 后处理管线:Bloom、SSGI、SSR 时空降噪、TRAA、自定义后处理 |\n| [Objects](./api-objects) | 3D 对象:统一 `InstanceObject` API、模型加载、基础网格、Poi、Topology |\n| [Batches](./api-batches) | 公共批处理:`ModelInstancedLayer`、`EditableGeometryBatchLayer`、fallback、materialize 与 raycast remap |\n| [Interactions](./api-interactions) | 交互管理:射线检测、鼠标/触摸事件、框选 |\n| [Managers](./api-managers) | 对象管理、场景管理、灯光管理 |\n| [Animations](./api-animations) | 补间动画:`tweenAnimation`、`Tween`、缓动模式 |\n| [Effects](./api-effects) | 视觉特效:高亮、呼吸、线框、淡入淡出、流动、流体(TSL) |\n| [Tools](./api-tools) | 工具:测量(距离/面积/角度)、剖切(面/盒)、标注管理 |\n\n### 插件\n\n所有插件从 `u-space/plugins/<name>` 导入。\n\n| 插件 | 说明 |\n| :--- | :--- |\n| [keyboard-controls](./api-plugin-keyboard-controls) | WASD / 方向键控制相机移动与旋转 |\n| [minimap](./api-plugin-minimap) | 2D 小地图叠加层 |\n| [tiles](./api-plugin-tiles) | ArcGIS 3D 瓦片 / GIS 地球渲染 |\n| [u-manager](./api-plugin-u-manager) | 场景加载、可编辑静态 Geometry batching、模型 instancing、语义楼层/井道/设备、拓扑、动画、属性与视点管理 |\n| [curve-movement](./api-plugin-curve-movement) | 沿样条曲线移动相机或对象 |\n| [tracking-controls](./api-plugin-tracking-controls) | 相机跟随移动目标 |\n| [atmosphere](./api-plugin-atmosphere) | 天空背景、天空环境、太阳/月亮光照与阴影 |\n| [fire](./api-plugin-fire) | WebGPU 体积火焰、烟雾、湍流、动态光照与阴影 |\n| [object-controls](./api-plugin-object-controls) | 交互式移动、旋转、缩放 3D 对象 |\n| [topology-drawer](./api-plugin-topology-drawer) | 在场景任意表面交互式绘制拓扑路径图 |\n\n### MCP\n\n| 文档 | 说明 |\n| :--- | :--- |\n| [u-space MCP](./mcp) | 面向 Mastra、Claude Desktop、Cursor 等 MCP 客户端的只读文档检索服务器 |\n\n### 维护\n\n| 文档 | 说明 |\n| :--- | :--- |\n| [一键发布](./release) | 通过 GitHub Actions、npm Trusted Publishing 和 Vercel 发布 `u-space`、`u-space-mcp`、docs 与 examples |\n"
1910
1934
  },
1911
1935
  {
1912
1936
  "id": "mcp",
1913
1937
  "path": "mcp.md",
1914
1938
  "title": "u-space MCP",
1915
- "summary": "`u-space-mcp` 是面向 `u-space` 文档的 Model Context Protocol(MCP)服务器。它把当前文档打包成只读 MCP 工具,方便 Mastra、Claude Desktop、Cursor 等 MCP 客户端在回答 `u-space` API、插件和示例问题时直接检索官方文档,包括实验性 `u-space/worker` OffscreenCanvas runtime、`OffscreenViewerHost`、top-level await `createWorkerViewer()`、Worker command/事件桥接、Three.js 原生静态场景矩阵策略及其与 `setEditableBatching()` 的组合;核心 `src/batches` 导出的 `ModelInstancedLayer` 与 `EditableGeometryB",
1939
+ "summary": "`u-space-mcp` 是面向 `u-space` 文档的 Model Context Protocol(MCP)服务器。它把当前文档打包成只读 MCP 工具,方便 Mastra、Claude Desktop、Cursor 等 MCP 客户端在回答 `u-space` API、插件和示例问题时直接检索官方文档,包括实验性 `u-space/worker` OffscreenCanvas runtime、`OffscreenViewerHost`、top-level await `createWorkerViewer()`、Worker command/事件桥接、`ModelLoaderManager.setDecodeWorker()` + `u-space/worker/model-decoder` 嵌套静态模型解码、transferable/ACK backpressure、普通图",
1916
1940
  "headings": [
1917
1941
  {
1918
1942
  "level": 1,
@@ -1951,7 +1975,7 @@ export const docsIndex = [
1951
1975
  "text": "包结构"
1952
1976
  }
1953
1977
  ],
1954
- "content": "# u-space MCP\n\n`u-space-mcp` 是面向 `u-space` 文档的 Model Context Protocol(MCP)服务器。它把当前文档打包成只读 MCP 工具,方便 Mastra、Claude Desktop、Cursor 等 MCP 客户端在回答 `u-space` API、插件和示例问题时直接检索官方文档,包括实验性 `u-space/worker` OffscreenCanvas runtime、`OffscreenViewerHost`、top-level await `createWorkerViewer()`、Worker command/事件桥接、Three.js 原生静态场景矩阵策略及其与 `setEditableBatching()` 的组合;核心 `src/batches` 导出的 `ModelInstancedLayer` 与 `EditableGeometryBatchLayer`;`u-manager` 的 `UManagerLoader` 一体化加载入口、`SceneLoader` 语义去重、path-based model instancing 和 scene-specific editable batching adapter、Semantic/Facilities API,以及 atmosphere 和 fire 插件的 WebGPU 效果。\n\n## 安装与启动\n\n推荐通过 `npx` 使用已发布的 npm 包:\n\n```json\n{\n \"mcpServers\": {\n \"uSpace\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"u-space-mcp@latest\"]\n }\n }\n}\n```\n\n本地开发文档时,可以通过 `--docs` 指向仓库里的 docs 目录:\n\n```json\n{\n \"mcpServers\": {\n \"uSpace\": {\n \"command\": \"npx\",\n \"args\": [\n \"-y\",\n \"u-space-mcp@latest\",\n \"--docs\",\n \"/Users/jiangqi/Desktop/xunwei/SoonSpace/u-space/docs\"\n ]\n }\n }\n}\n```\n\n也可以使用环境变量:\n\n```bash\nU_SPACE_DOCS_PATH=/path/to/u-space/docs npx -y u-space-mcp@latest\n```\n\n## Mastra 接入\n\n在 Mastra 中通过 `MCPClient` 使用 stdio 形式接入:\n\n```typescript\nimport { MCPClient } from '@mastra/mcp';\n\nexport const uSpaceMcpClient = new MCPClient({\n id: 'u-space-mcp-client',\n servers: {\n uSpace: {\n command: 'npx',\n args: ['-y', 'u-space-mcp@latest'],\n stderr: 'pipe',\n },\n },\n});\n```\n\n然后把工具挂到 Agent 上:\n\n```typescript\nexport const codingAgent = new Agent({\n // ...\n tools: {\n ...(await uSpaceMcpClient.listTools()),\n },\n});\n```\n\n## 工具列表\n\n`u-space-mcp` 只提供只读工具:\n\n| 工具 | 说明 |\n| :--- | :--- |\n| `list_docs` | 列出可用文档页 |\n| `search_docs` | 按关键词、API 名、插件名或概念检索文档 |\n| `get_doc` | 按 path 或 id 读取单篇文档 |\n| `get_api_reference` | 面向 API / 类 / 方法 / 插件的检索 |\n| `find_examples` | 查找示例和用法相关文档 |\n| `get_changelog` | 读取更新日志 |\n\n## 示例检索\n\nMCP 文档索引包含 `examples/test_umanager_loader.html`、`examples/test_umanager_dynamic_instances.html`、`examples/test_umanager2.html` 和 `examples/offscreen/test_umanager2_offscreen.html` 的说明。检索 `UManagerLoader example`、`test_umanager_loader` 或 `UManagerLoader 用法` 可以找到一体化加载示例;检索 `dynamic instances`、`getInstanceById` 或 `test_umanager_dynamic_instances` 可以找到运行时实例编辑示例;检索 `setEditableBatching`、`SceneEditableBatchLayer`、`SceneEditableBatchFallback`、`editable batching`、`materialize` 或 `test_umanager2` 可以找到大型静态场景合批及其与 `SceneInstancedLayer` fallback 的关系;检索 `OffscreenCanvas`、`OffscreenViewerHost`、`host.init`、`initialized`、`ready`、`createWorkerViewer`、`top-level await`、`u-space/worker`、`Worker WebGPU` 或 `test_umanager2_offscreen` 可以找到 Worker 渲染、生命周期、事件/command 桥接、editable batching、pipeline 预热和主线程/GPU 性能边界。\n\n## OffscreenCanvas Worker 检索范围\n\n| 关键词 / API | 可检索内容 |\n| :----------- | :--------- |\n| `OffscreenViewerHost` | 主线程 canvas 所有权、完整构造选项/方法/事件、`transferControlToOffscreen()`、pointer/wheel/resize 转发、renderer 滚动统计和 `request()` command 调用;`host.init()` / `initialized` 只等待 `viewer.init()`,业务资源完成由一次性 `ready` 表示。还包括 init canvas transfer/post 失败或初始化期间 dispose 的 Promise rejection/资源清理,以及 dispose 后忽略迟到业务消息的语义。 |\n| `createWorkerViewer` | module Worker 顶层可直接 await 的命令式入口;同步安装 host 消息监听,完成 OffscreenCanvas/`viewer.init()` 后返回 `WorkerViewerRuntime`,提供状态、事件、command、逆序 dispose 和一次性业务 ready 生命周期、ready 前 fatal cleanup、去重 ArrayBuffer transfer,以及内置 `getStats` / `getViewpoint` / `setViewpoint` / `render` 命令。 |\n| `test_umanager2_offscreen` | UManager Worker 示例启动方式、HDR/语义/场景加载、`setEditableBatching()`、`compileAsync()` 首帧预热、滚动帧率 HUD、标准透明合成、静态场景矩阵冻结/显式提交,以及默认隐藏半透明语义分析叠加层以保持楼壳原始材质的策略。 |\n| `matrixWorldAutoUpdate` / `updateMatrixWorld` / `updateWorldMatrix` | 使用 Three.js 原生 API 冻结静态 Scene,按需提交单个对象或新增子树,并通过 `viewer.invalidate()` 请求新帧;单个 `InstanceObject.updateWorldMatrix(true, false)` 或父 Group 的 `updateWorldMatrix(true, true)` 仍会触发 dirty callback、instanced buffer 同步和 editable-batch materialize,相机矩阵继续独立更新。 |\n| `OffscreenCanvas` + `setEditableBatching` | Offscreen 移走主线程解析/合并/渲染提交,editable batching 减少 draw submission;Three.js 对象必须留在 Worker,业务对象操作通过 structured-clone command 调用。 |\n\n## InstanceObject 与 u-manager 检索范围\n\nMCP 文档索引会同步 `docs/api-objects.md` 中的核心 `InstanceObject` API,以及 `docs/api-plugin-u-manager.md` 中的 u-manager 子类、加载器和合批层 API。客户端可以直接检索以下关键词:\n\n| 关键词 / API | 可检索内容 |\n| :----------- | :--------- |\n| `UManagerLoader` | 同时加载 `SemanticLoader` 和 `SceneLoader`、自动复用 semantic id 去重、返回带 `semanticGroup` / `sceneGroup` 直接属性的 `UManagerSceneGroup`;可通过 `semanticGroup.getDefaultFacilityLayer()` 和 `sceneGroup.getDefaultSceneLayer()` 直接访问默认合批层。 |\n| `InstanceObject` | 核心 `u-space` 导出 `InstanceObject`、`InstanceStyle`、`InstanceObjectOptions`、`InstanceIdentity`、`InstanceMaterializer`、`INSTANCE_COLOR_MODE_*` 和 `isInstanceObject()` 类型守卫;包括身份、样式、bounds、dirty、fallback render object,以及公共 `setInstanceMaterializer()` / ownership-aware `clearInstanceMaterializer()` / `materialize()` 协议;默认自动矩阵遍历和冻结根 Scene 后显式 `updateWorldMatrix()` 都会同步 batching 状态。实例可直接用于 `controls.flyToObject()`。 |\n| `ModelInstancedLayer` | `SceneInstancedLayer` 与 `FacilityInstancedLayer` 的共享实现:模板 mesh 保持独立以保留透明排序和局部包围体,复杂静态几何在射线通过实例包围体后按需建立并复用 `three-mesh-bvh`;普通静态模型可对明确的热点 root 显式调用 `enableMeshBVHRaycast(root)`,不对整个大场景自动建树;同时提供合法 material groups、多材质 instancing、`getInstances()`、`getInstanceById()`、运行时实例新增/删除、capacity 预分配与扩容、重复 `instanceId` 拒绝加入、身份字段变化后按需刷新 id 索引、dirty-driven buffer sync、transform 变化后渲染前同步 instance matrix、raycast hit remap 和可选相机实例裁剪;内部索引使用实例独立字段,不依赖 `userData`。 |\n| `EditableGeometryBatchLayer` | 核心 `src/batches` one-shot 公共类,接收 `Model` 模板和不重复的 `InstanceObject[]` source,按材质/Geometry 布局/阴影/renderOrder 烘焙合并静态 Geometry;每个 layer 独立维护矩阵状态,使用 `batchObjectIndex` + Float `DataTexture` + TSL 立即同步 dirty CPU 状态,返回带 `reasons` 的 unsupported source,支持同帧世界矩阵提交、跨 layer 旧副本隐藏、独立材质 materialize、typed event、materialized BVH hit 过滤、按实例 negative-scale fallback、安全 ownership dispose 和统计。 |\n| `SceneLoader` | 场景树加载、语义 `ID` 去重、返回 `SceneGroup`、默认重复 3D 模型 path instancing,以及 opt-in `setEditableBatching({ maxVerticesPerBatch, maxIndicesPerBatch, freezeAnimations })` 静态 Geometry 合批;unsupported template/子 Mesh 安全 fallback,负缩放实例绕过 `InstancedMesh`,build 期间已 materialize 的实例不会重复进入透明 fallback。 |\n| `SceneGroup` | `SceneLoader.loadAsync()` 返回根组,保留原始场景树层级,并通过 `sceneLayer` / `getDefaultSceneLayer()` 暴露主渲染层:默认是 `SceneInstancedLayer`,opt-in editable batching 且存在 merged Mesh 时是与其没有继承关系的 `SceneEditableBatchLayer`;只有 fallback 而无 merged Mesh 时返回 `null`。editable batch 统计位于 `userData.editableBatch`。 |\n| `SceneInstanceObject` | `SceneLoader` 的单模型逻辑引用、`id` / `sid` 检索、`instanceKind = 'SceneInstances'`、统一显隐/颜色/透明度/高亮/bounds/dirty API,以及 editable batch 的 `materialize()`;世界 transform 或半透明变化时可只恢复当前普通 `Model`。 |\n| `SceneInstancedLayer` | `SceneLoader` 内部批量渲染层、共享 `ModelInstancedLayer`、dirty-driven instance buffer 同步、raycast hit remap。 |\n| `SceneEditableBatchLayer` | `EditableGeometryBatchLayer<SceneInstanceObject>` 的 u-manager 薄适配层,作为 opt-in 静态 Geometry 合并主层;通用 batching、materialize、内部 `BaseMesh`、不可见 raycast 短路和 lazy BVH 由核心层实现。`SceneLoader` 负责 URL source 与同级 `SceneEditableBatchFallback`(`SceneInstancedLayer`)/普通 `Model` fallback,并监听 typed `materialize` 事件移除对应 fallback instance。 |\n| `FacilityInstanceObject` | 楼层下的设备引用、`objectManager.getById()` 全局检索、对象级包围盒缓存 + `controls.flyToObject()` 飞向单设备、统一 `setInstance*` 控制、fallback `Model` wrapper 和事件目标。 |\n| `FacilityInstancedLayer` | `SemanticGroup.facilityLayer` / `SemanticGroup.getDefaultFacilityLayer()`、`getInstances()`、`getInstanceById()`、`reserveBatch()`、`addInstance()` / `addInstances()`、`removeInstance()` / `removeInstances()`(支持单个 `instanceId` 字符串)、`removeBatch()`、`clearBatches()`、batch 创建条件、`setInstanceCulling()`、动态 Facilities batch、可选按相机视锥压缩 active instances、可选 `minScreenRadius` 屏幕尺寸裁剪、dirty-driven instance buffer 同步和 raycast hit remap。 |\n| `Facilities` | `SemanticLoader` 解析、`FloorMesh.getFacilityById()`、`FacilityInstanceObject.setInstanceOpacity()`、普通 `Model` fallback wrapper 与 scene-level instancing 的一致 API;`SemanticGroup` / `BuildingGroup` / `FloorMesh` 查询使用对象语义 ID、实例 `instanceId` 或显式别名,不扫描 `userData` ID。 |\n\n## fire 检索范围\n\nMCP 文档索引会同步 `docs/api-plugin-fire.md` 中的 FireEffect API、参数和示例。客户端可以直接检索以下关键词:\n\n| 关键词 / API | 可检索内容 |\n| :----------- | :--------- |\n| `FireEffect` | 插件创建、`enable()`、`update()`、`setEmitter()`、`reset()`、`disable()` 和 `dispose()`。 |\n| `fire` / `volumetric fire` | WebGPU 体积火焰、烟雾散射、curl noise、buoyancy、Jacobi pressure projection 和 raymarch 输出。 |\n| `emitterGeometry` / `emitterRadius` | 默认 `TeapotGeometry(0.8, 28)`、自定义 emitter 几何、业务 `Object3D` matrix 驱动和移动扰动半径。 |\n| `size` / `gridSize` | 体积盒世界范围、烟雾扩散边界和 3D 模拟网格尺寸。 |\n| `addOutputEffect` | `FireEffect` 通过 RenderPipeline output effect 叠加体积 pass,不占用业务 `setOutputComposer()`。 |\n| `keyLight` / `pointLight` | 体积阴影 spot light、跟随火焰核心的动态点光源和可关闭的内置光源。 |\n\n## 包结构\n\n源码位于 `packages/u-space-mcp`。本地兼容发布入口会先递增 `u-space-mcp` 的 patch 版本,再从 `docs/*.md` 生成内置文档索引、编译并通过当前 npm 登录态发布,因此启用 npm 2FA 时仍会请求 OTP:\n\n```bash\npnpm publish:mcp\n```\n\n维护者发布完整版本时应使用 [`pnpm release:all`](./release)。该命令触发 GitHub Actions,通过 npm Trusted Publishing/OIDC 同时发布 `u-space` 与 `u-space-mcp`,不需要 `NPM_TOKEN` 或每次输入 OTP,并继续部署 docs 与 examples。\n\n发布后的包不依赖本机绝对路径;只有在传入 `--docs` 或设置 `U_SPACE_DOCS_PATH` 时,才会读取本地文档目录。\n"
1978
+ "content": "# u-space MCP\n\n`u-space-mcp` 是面向 `u-space` 文档的 Model Context Protocol(MCP)服务器。它把当前文档打包成只读 MCP 工具,方便 Mastra、Claude Desktop、Cursor 等 MCP 客户端在回答 `u-space` API、插件和示例问题时直接检索官方文档,包括实验性 `u-space/worker` OffscreenCanvas runtime、`OffscreenViewerHost`、top-level await `createWorkerViewer()`、Worker command/事件桥接、`ModelLoaderManager.setDecodeWorker()` + `u-space/worker/model-decoder` 嵌套静态模型解码、transferable/ACK backpressure、普通图片超过 WebGPU `8192` 上限时的解码前缩放、Three.js 原生静态场景矩阵策略及其与 `setEditableBatching()` 的组合;核心 `src/batches` 导出的 `ModelInstancedLayer` 与 `EditableGeometryBatchLayer`;`u-manager` 的 `UManagerLoader` 一体化加载入口、`SceneLoader` 语义去重、path-based model instancing 和 scene-specific editable batching adapter、Semantic/Facilities API,以及 atmosphere 和 fire 插件的 WebGPU 效果。\n\n## 安装与启动\n\n推荐通过 `npx` 使用已发布的 npm 包:\n\n```json\n{\n \"mcpServers\": {\n \"uSpace\": {\n \"command\": \"npx\",\n \"args\": [\"-y\", \"u-space-mcp@latest\"]\n }\n }\n}\n```\n\n本地开发文档时,可以通过 `--docs` 指向仓库里的 docs 目录:\n\n```json\n{\n \"mcpServers\": {\n \"uSpace\": {\n \"command\": \"npx\",\n \"args\": [\n \"-y\",\n \"u-space-mcp@latest\",\n \"--docs\",\n \"/Users/jiangqi/Desktop/xunwei/SoonSpace/u-space/docs\"\n ]\n }\n }\n}\n```\n\n也可以使用环境变量:\n\n```bash\nU_SPACE_DOCS_PATH=/path/to/u-space/docs npx -y u-space-mcp@latest\n```\n\n## Mastra 接入\n\n在 Mastra 中通过 `MCPClient` 使用 stdio 形式接入:\n\n```typescript\nimport { MCPClient } from '@mastra/mcp';\n\nexport const uSpaceMcpClient = new MCPClient({\n id: 'u-space-mcp-client',\n servers: {\n uSpace: {\n command: 'npx',\n args: ['-y', 'u-space-mcp@latest'],\n stderr: 'pipe',\n },\n },\n});\n```\n\n然后把工具挂到 Agent 上:\n\n```typescript\nexport const codingAgent = new Agent({\n // ...\n tools: {\n ...(await uSpaceMcpClient.listTools()),\n },\n});\n```\n\n## 工具列表\n\n`u-space-mcp` 只提供只读工具:\n\n| 工具 | 说明 |\n| :--- | :--- |\n| `list_docs` | 列出可用文档页 |\n| `search_docs` | 按关键词、API 名、插件名或概念检索文档 |\n| `get_doc` | 按 path 或 id 读取单篇文档 |\n| `get_api_reference` | 面向 API / 类 / 方法 / 插件的检索 |\n| `find_examples` | 查找示例和用法相关文档 |\n| `get_changelog` | 读取更新日志 |\n\n## 示例检索\n\nMCP 文档索引包含 `examples/test_umanager_loader.html`、`examples/test_umanager_dynamic_instances.html`、`examples/test_umanager2.html` 和 `examples/offscreen/test_umanager2_offscreen.html` 的说明。检索 `UManagerLoader example`、`test_umanager_loader` 或 `UManagerLoader 用法` 可以找到一体化加载示例;检索 `dynamic instances`、`getInstanceById` 或 `test_umanager_dynamic_instances` 可以找到运行时实例编辑示例;检索 `setEditableBatching`、`SceneEditableBatchLayer`、`SceneEditableBatchFallback`、`editable batching`、`materialize` 或 `test_umanager2` 可以找到大型静态场景合批及其与 `SceneInstancedLayer` fallback 的关系;检索 `OffscreenCanvas`、`OffscreenViewerHost`、`host.init`、`initialized`、`ready`、`createWorkerViewer`、`ModelLoaderManager.setDecodeWorker`、`model-decoder`、`decode Worker`、`transferable`、`ACK backpressure`、`ImageBitmapLoader`、`maxTextureDimension2D`、`oversized texture`、`top-level await`、`u-space/worker`、`Worker WebGPU` 或 `test_umanager2_offscreen` 可以找到 Worker 渲染、嵌套静态模型解码、生命周期、事件/command 桥接、超大贴图缩放、editable batching、pipeline 预热和主线程/GPU 性能边界。\n\n## OffscreenCanvas Worker 检索范围\n\n| 关键词 / API | 可检索内容 |\n| :----------- | :--------- |\n| `OffscreenViewerHost` | 主线程 canvas 所有权、完整构造选项/方法/事件、`transferControlToOffscreen()`、pointer/wheel/resize 转发、renderer 滚动统计和 `request()` command 调用;`host.init()` / `initialized` 只等待 `viewer.init()`,业务资源完成由一次性 `ready` 表示。还包括 init canvas transfer/post 失败或初始化期间 dispose 的 Promise rejection/资源清理,以及 dispose 后忽略迟到业务消息的语义。 |\n| `createWorkerViewer` | module Worker 顶层可直接 await 的命令式入口;同步安装 host 消息监听,完成 OffscreenCanvas/`viewer.init()` 后返回 `WorkerViewerRuntime`,提供状态、事件、command、逆序 dispose 和一次性业务 ready 生命周期、ready 前 fatal cleanup、去重 ArrayBuffer transfer,以及内置 `getStats` / `getViewpoint` / `setViewpoint` / `render` 命令。 |\n| `ModelLoaderManager.setDecodeWorker` / `u-space/worker/model-decoder` | render Worker 创建第二个模型 decode Worker 的接线方式;静态 glTF/GLB/SBMX 支持范围,fetch/cache/SBMX/JSON/base64/ImageBitmap 工作边界,transferable 数据包、串行 ACK backpressure、有界贴图内容身份复用、LoadingManager URL/item 生命周期、跨域凭据隔离、节点图安全校验、完整 AbortSignal、故障回退,以及实例绑定的 Worker disposer。 |\n| `test_umanager2_offscreen` | UManager Worker 示例启动方式、HDR/语义/场景加载、默认启用嵌套模型 decode Worker、`?modelDecodeWorker=off` A/B 开关、`setEditableBatching()`、`compileAsync()` 首帧预热、滚动帧率 HUD、标准透明合成、静态场景矩阵冻结/显式提交,以及默认显示全部语义对象且设备选择/飞向/高亮不改变其他对象显隐的调试策略。 |\n| `ImageLoader` / `ImageBitmapLoader` / `maxTextureDimension2D` | Worker 普通图片加载兼容层、JPEG/PNG/GIF/WebP 编码尺寸预读、超过默认 `8192` limit 时的首次解码等比缩放、未知格式 fallback、源 bitmap 释放,以及 loader options/cache/request headers/abort 语义。 |\n| `matrixWorldAutoUpdate` / `updateMatrixWorld` / `updateWorldMatrix` | 使用 Three.js 原生 API 冻结静态 Scene,按需提交单个对象或新增子树,并通过 `viewer.invalidate()` 请求新帧;单个 `InstanceObject.updateWorldMatrix(true, false)` 或父 Group 的 `updateWorldMatrix(true, true)` 仍会触发 dirty callback、instanced buffer 同步和 editable-batch materialize,相机矩阵继续独立更新。 |\n| `OffscreenCanvas` + `setEditableBatching` | Offscreen 移走主线程解析/合并/渲染提交,editable batching 减少 draw submission;Three.js 对象必须留在 Worker,业务对象操作通过 structured-clone command 调用。 |\n\n## InstanceObject 与 u-manager 检索范围\n\nMCP 文档索引会同步 `docs/api-objects.md` 中的核心 `InstanceObject` API,以及 `docs/api-plugin-u-manager.md` 中的 u-manager 子类、加载器和合批层 API。客户端可以直接检索以下关键词:\n\n| 关键词 / API | 可检索内容 |\n| :----------- | :--------- |\n| `UManagerLoader` | 同时加载 `SemanticLoader` 和 `SceneLoader`、自动复用 semantic id 去重、返回带 `semanticGroup` / `sceneGroup` 直接属性的 `UManagerSceneGroup`;可通过 `semanticGroup.getDefaultFacilityLayer()` 和 `sceneGroup.getDefaultSceneLayer()` 直接访问默认合批层。 |\n| `InstanceObject` | 核心 `u-space` 导出 `InstanceObject`、`InstanceStyle`、`InstanceObjectOptions`、`InstanceIdentity`、`InstanceMaterializer`、`INSTANCE_COLOR_MODE_*` 和 `isInstanceObject()` 类型守卫;包括身份、样式、bounds、dirty、fallback render object,以及公共 `setInstanceMaterializer()` / ownership-aware `clearInstanceMaterializer()` / `materialize()` 协议;默认自动矩阵遍历和冻结根 Scene 后显式 `updateWorldMatrix()` 都会同步 batching 状态。实例可直接用于 `controls.flyToObject()`。 |\n| `ModelInstancedLayer` | `SceneInstancedLayer` 与 `FacilityInstancedLayer` 的共享实现:模板 mesh 保持独立以保留透明排序和局部包围体,复杂静态几何在射线通过实例包围体后按需建立并复用 `three-mesh-bvh`;普通静态模型可对明确的热点 root 显式调用 `enableMeshBVHRaycast(root)`,不对整个大场景自动建树;同时提供合法 material groups、多材质 instancing、`getInstances()`、`getInstanceById()`、运行时实例新增/删除、capacity 预分配与扩容、重复 `instanceId` 拒绝加入、身份字段变化后按需刷新 id 索引、dirty-driven buffer sync、transform 变化后渲染前同步 instance matrix、raycast hit remap 和可选相机实例裁剪;内部索引使用实例独立字段,不依赖 `userData`。 |\n| `EditableGeometryBatchLayer` | 核心 `src/batches` one-shot 公共类,接收 `Model` 模板和不重复的 `InstanceObject[]` source,按材质/Geometry 布局/阴影/renderOrder 烘焙合并静态 Geometry;每个 layer 独立维护矩阵状态,使用 `batchObjectIndex` + Float `DataTexture` + TSL 立即同步 dirty CPU 状态,返回带 `reasons` 的 unsupported source,支持同帧世界矩阵提交、跨 layer 旧副本隐藏、独立材质 materialize、typed event、materialized BVH hit 过滤、按实例 negative-scale fallback、安全 ownership dispose 和统计。 |\n| `SceneLoader` | 场景树加载、语义 `ID` 去重、返回 `SceneGroup`、默认重复 3D 模型 path instancing,以及 opt-in `setEditableBatching({ maxVerticesPerBatch, maxIndicesPerBatch, freezeAnimations })` 静态 Geometry 合批;unsupported template/子 Mesh 安全 fallback,负缩放实例绕过 `InstancedMesh`,build 期间已 materialize 的实例不会重复进入透明 fallback。 |\n| `SceneGroup` | `SceneLoader.loadAsync()` 返回根组,保留原始场景树层级,并通过 `sceneLayer` / `getDefaultSceneLayer()` 暴露主渲染层:默认是 `SceneInstancedLayer`,opt-in editable batching 且存在 merged Mesh 时是与其没有继承关系的 `SceneEditableBatchLayer`;只有 fallback 而无 merged Mesh 时返回 `null`。editable batch 统计位于 `userData.editableBatch`。 |\n| `SceneInstanceObject` | `SceneLoader` 的单模型逻辑引用、`id` / `sid` 检索、`instanceKind = 'SceneInstances'`、统一显隐/颜色/透明度/高亮/bounds/dirty API,以及 editable batch 的 `materialize()`;世界 transform 或半透明变化时可只恢复当前普通 `Model`。 |\n| `SceneInstancedLayer` | `SceneLoader` 内部批量渲染层、共享 `ModelInstancedLayer`、dirty-driven instance buffer 同步、raycast hit remap。 |\n| `SceneEditableBatchLayer` | `EditableGeometryBatchLayer<SceneInstanceObject>` 的 u-manager 薄适配层,作为 opt-in 静态 Geometry 合并主层;通用 batching、materialize、内部 `BaseMesh`、不可见 raycast 短路和 lazy BVH 由核心层实现。`SceneLoader` 负责 URL source 与同级 `SceneEditableBatchFallback`(`SceneInstancedLayer`)/普通 `Model` fallback,并监听 typed `materialize` 事件移除对应 fallback instance。 |\n| `FacilityInstanceObject` | 楼层下的设备引用、`objectManager.getById()` 全局检索、对象级包围盒缓存 + `controls.flyToObject()` 飞向单设备、统一 `setInstance*` 控制、fallback `Model` wrapper 和事件目标。 |\n| `FacilityInstancedLayer` | `SemanticGroup.facilityLayer` / `SemanticGroup.getDefaultFacilityLayer()`、`getInstances()`、`getInstanceById()`、`reserveBatch()`、`addInstance()` / `addInstances()`、`removeInstance()` / `removeInstances()`(支持单个 `instanceId` 字符串)、`removeBatch()`、`clearBatches()`、batch 创建条件、`setInstanceCulling()`、动态 Facilities batch、可选按相机视锥压缩 active instances、可选 `minScreenRadius` 屏幕尺寸裁剪、dirty-driven instance buffer 同步和 raycast hit remap。 |\n| `Facilities` | `SemanticLoader` 解析、`FloorMesh.getFacilityById()`、`FacilityInstanceObject.setInstanceOpacity()`、普通 `Model` fallback wrapper 与 scene-level instancing 的一致 API;`SemanticGroup` / `BuildingGroup` / `FloorMesh` 查询使用对象语义 ID、实例 `instanceId` 或显式别名,不扫描 `userData` ID。 |\n\n## fire 检索范围\n\nMCP 文档索引会同步 `docs/api-plugin-fire.md` 中的 FireEffect API、参数和示例。客户端可以直接检索以下关键词:\n\n| 关键词 / API | 可检索内容 |\n| :----------- | :--------- |\n| `FireEffect` | 插件创建、`enable()`、`update()`、`setEmitter()`、`reset()`、`disable()` 和 `dispose()`。 |\n| `fire` / `volumetric fire` | WebGPU 体积火焰、烟雾散射、curl noise、buoyancy、Jacobi pressure projection 和 raymarch 输出。 |\n| `emitterGeometry` / `emitterRadius` | 默认 `TeapotGeometry(0.8, 28)`、自定义 emitter 几何、业务 `Object3D` matrix 驱动和移动扰动半径。 |\n| `size` / `gridSize` | 体积盒世界范围、烟雾扩散边界和 3D 模拟网格尺寸。 |\n| `addOutputEffect` | `FireEffect` 通过 RenderPipeline output effect 叠加体积 pass,不占用业务 `setOutputComposer()`。 |\n| `keyLight` / `pointLight` | 体积阴影 spot light、跟随火焰核心的动态点光源和可关闭的内置光源。 |\n\n## 包结构\n\n源码位于 `packages/u-space-mcp`。本地兼容发布入口会先递增 `u-space-mcp` 的 patch 版本,再从 `docs/*.md` 生成内置文档索引、编译并通过当前 npm 登录态发布,因此启用 npm 2FA 时仍会请求 OTP:\n\n```bash\npnpm publish:mcp\n```\n\n维护者发布完整版本时应使用 [`pnpm release:all`](./release)。该命令触发 GitHub Actions,通过 npm Trusted Publishing/OIDC 同时发布 `u-space` 与 `u-space-mcp`,不需要 `NPM_TOKEN` 或每次输入 OTP,并继续部署 docs 与 examples。\n\n发布后的包不依赖本机绝对路径;只有在传入 `--docs` 或设置 `U_SPACE_DOCS_PATH` 时,才会读取本地文档目录。\n"
1955
1979
  },
1956
1980
  {
1957
1981
  "id": "release",
@@ -1992,7 +2016,7 @@ export const docsIndex = [
1992
2016
  "text": "参考"
1993
2017
  }
1994
2018
  ],
1995
- "content": "# 一键发布\n\n仓库提供一个手动 GitHub Actions 工作流,一次发布四个交付面:\n\n1. `u-space` npm 包\n2. `u-space-mcp` npm 包\n3. VitePress 文档\n4. `/examples/` 在线示例\n\nnpm 发布使用 Trusted Publishing/OIDC,不保存 `NPM_TOKEN`,日常发布不再要求输入 OTP。docs 和 examples 使用同一个 Vercel production deployment;`scripts/build-vercel-docs.mjs` 会在文档构建完成后复制 `examples/`,并将发布中的 `u-space` 版本写入部署产物的 import map。\n\n## 一次性配置\n\n### 1. 配置两个 npm Trusted Publisher\n\n分别打开 npmjs.com 上 `u-space` 和 `u-space-mcp` 的 package settings,在 **Trusted Publisher** 中添加相同的 GitHub Actions 配置:\n\n| 字段 | 值 |\n| :--- | :--- |\n| Organization or user | `spatial-claw` |\n| Repository | `u-space` |\n| Workflow filename | `release.yml` |\n| Environment | 留空 |\n| Allowed actions | `npm publish` |\n\n两个包都必须单独配置一次。工作流运行在 GitHub-hosted runner,授予 `id-token: write`,使用 Node.js 24 和满足 Trusted Publishing 要求的 npm 11;package metadata 中的 repository URL 已统一为 `https://github.com/spatial-claw/u-space`。\n\n配置成功后不需要创建 `NPM_TOKEN`。npm 官方也建议在验证 Trusted Publisher 可用后,将传统 publishing access 调整为 “Require two-factor authentication and disallow tokens”。\n\n### 2. 配置 Vercel Token\n\n仓库已经提交 `.vercel/project.json`,因此 GitHub Actions 只需要一个 repository secret:\n\n```bash\ngh secret set VERCEL_TOKEN\n```\n\n输入有权部署 `u-space` Vercel 项目的 token。工作流会依次运行 `vercel pull`、`vercel build --prod` 和 `vercel deploy --prebuilt --prod`。\n\n工作流已经显式声明 `contents: write` 和 `id-token: write`。因此组织或仓库可以继续保持默认的只读 `GITHUB_TOKEN` 权限;GitHub 会按该 workflow 的最小权限声明授权。工作流需要把版本提交和 release tags 推回 `main`,如果 `main` 启用了 branch protection,还需要允许该 release workflow 写入,或为 `github-actions[bot]` 配置对应 bypass。\n\n## 发布\n\n默认递增两个 npm 包的 patch 版本,并等待 GitHub Actions 完成:\n\n```bash\npnpm release:all\n```\n\n也可以显式选择版本级别:\n\n```bash\npnpm release:all patch\npnpm release:all minor\npnpm release:all major\n```\n\n不想在本地等待时使用:\n\n```bash\npnpm release:all patch --no-wait\n```\n\n也可以打开 GitHub 仓库的 **Actions → Release all → Run workflow**,选择 `patch`、`minor` 或 `major` 后运行。\n\n## 发布顺序\n\n工作流按以下顺序执行:\n\n1. 递增 `u-space` 和 `u-space-mcp` 版本,同步 examples/docs 中的当前版本引用。\n2. 执行完整测试、库构建、MCP 文档索引构建和 VitePress 构建。\n3. 将版本元数据提交并推送到 `main`。\n4. 通过 npm OIDC 发布两个包;精确版本已经存在时自动跳过。\n5. 构建并部署 docs 和 examples 到 Vercel production。\n6. 推送 `vX.Y.Z` 和 `u-space-mcp-vX.Y.Z` 标签。\n\n`release-all` concurrency group 会阻止两次发布并发运行。\n\n## 失败重试\n\n版本提交已经推送,但 npm 或 Vercel 后续步骤失败时,不要再次选择 `patch`,否则会再递增一次版本。使用 `current` 重试当前提交版本:\n\n```bash\npnpm release:all current\n```\n\n工作流会跳过 registry 中已经存在的精确版本,只重试尚未完成的 npm 包、Vercel 部署和标签。\n\n本地旧命令 `pnpm release`、`pnpm publish:mcp` 和 `pnpm docs:deploy` 继续保留,但它们不使用 GitHub OIDC,可能请求 npm OTP 或本机 Vercel 登录。\n\n## 参考\n\n- [npm Trusted Publishing](https://docs.npmjs.com/trusted-publishers/)\n- [GitHub Actions OIDC](https://docs.github.com/en/actions/reference/security/oidc)\n- [Vercel GitHub Actions deployment](https://vercel.com/docs/git/vercel-for-github)\n"
2019
+ "content": "# 一键发布\n\n仓库提供一个手动 GitHub Actions 工作流,一次发布四个交付面:\n\n1. `u-space` npm 包\n2. `u-space-mcp` npm 包\n3. VitePress 文档\n4. `/examples/` 在线示例\n\nnpm 发布使用 Trusted Publishing/OIDC,不保存 `NPM_TOKEN`,日常发布不再要求输入 OTP。docs 和 examples 使用同一个 Vercel production deployment;`scripts/build-vercel-docs.mjs` 会在文档构建完成后复制 `examples/`,将发布中的 `u-space` 版本写入部署产物的 import map,并用独立 Vite 构建将 Offscreen 示例转换为浏览器可直接执行的主线程 JavaScript、module Worker 和 WASM 资源。\n\n## 一次性配置\n\n### 1. 配置两个 npm Trusted Publisher\n\n分别打开 npmjs.com 上 `u-space` 和 `u-space-mcp` 的 package settings,在 **Trusted Publisher** 中添加相同的 GitHub Actions 配置:\n\n| 字段 | 值 |\n| :--- | :--- |\n| Organization or user | `spatial-claw` |\n| Repository | `u-space` |\n| Workflow filename | `release.yml` |\n| Environment | 留空 |\n| Allowed actions | `npm publish` |\n\n两个包都必须单独配置一次。工作流运行在 GitHub-hosted runner,授予 `id-token: write`,使用 Node.js 24 和满足 Trusted Publishing 要求的 npm 11;package metadata 中的 repository URL 已统一为 `https://github.com/spatial-claw/u-space`。\n\n配置成功后不需要创建 `NPM_TOKEN`。npm 官方也建议在验证 Trusted Publisher 可用后,将传统 publishing access 调整为 “Require two-factor authentication and disallow tokens”。\n\n### 2. 配置 Vercel Token\n\n仓库已经提交 `.vercel/project.json`,因此 GitHub Actions 只需要一个 repository secret:\n\n```bash\ngh secret set VERCEL_TOKEN\n```\n\n输入有权部署 `u-space` Vercel 项目的 token。工作流会依次运行 `vercel pull`、`vercel build --prod` 和 `vercel deploy --prebuilt --prod`。\n\n工作流已经显式声明 `contents: write` 和 `id-token: write`。因此组织或仓库可以继续保持默认的只读 `GITHUB_TOKEN` 权限;GitHub 会按该 workflow 的最小权限声明授权。工作流需要把版本提交和 release tags 推回 `main`,如果 `main` 启用了 branch protection,还需要允许该 release workflow 写入,或为 `github-actions[bot]` 配置对应 bypass。\n\n## 发布\n\n默认递增两个 npm 包的 patch 版本,并等待 GitHub Actions 完成:\n\n```bash\npnpm release:all\n```\n\n也可以显式选择版本级别:\n\n```bash\npnpm release:all patch\npnpm release:all minor\npnpm release:all major\n```\n\n不想在本地等待时使用:\n\n```bash\npnpm release:all patch --no-wait\n```\n\n也可以打开 GitHub 仓库的 **Actions → Release all → Run workflow**,选择 `patch`、`minor` 或 `major` 后运行。\n\n## 发布顺序\n\n工作流按以下顺序执行:\n\n1. 递增 `u-space` 和 `u-space-mcp` 版本,同步 examples/docs 中的当前版本引用;将更新日志的“未发布”内容归档到新的 `X.Y.Z` 版本标题,并创建新的空“未发布”区。\n2. 执行完整测试、库构建、MCP 文档索引构建和 VitePress 构建。\n3. 将版本元数据提交并推送到 `main`。\n4. 通过 npm OIDC 发布两个包;精确版本已经存在时自动跳过。\n5. 构建并部署 docs 和 examples 到 Vercel production;Offscreen TypeScript 入口会通过 `examples/offscreen/vite.config.ts` 单独打包,不会以原始 `.ts` 作为线上运行入口。\n6. 推送 `vX.Y.Z` 和 `u-space-mcp-vX.Y.Z` 标签。\n\n`release-all` concurrency group 会阻止两次发布并发运行。\n\n## 失败重试\n\n版本提交已经推送,但 npm 或 Vercel 后续步骤失败时,不要再次选择 `patch`,否则会再递增一次版本。使用 `current` 重试当前提交版本:\n\n```bash\npnpm release:all current\n```\n\n工作流会跳过 registry 中已经存在的精确版本,只重试尚未完成的 npm 包、Vercel 部署和标签。\n\n`current` 不会再次修改更新日志,因此重试不会生成重复的版本标题。\n\n本地旧命令 `pnpm release`、`pnpm publish:mcp` 和 `pnpm docs:deploy` 继续保留,但它们不使用 GitHub OIDC,可能请求 npm OTP 或本机 Vercel 登录。\n\n## 参考\n\n- [npm Trusted Publishing](https://docs.npmjs.com/trusted-publishers/)\n- [GitHub Actions OIDC](https://docs.github.com/en/actions/reference/security/oidc)\n- [Vercel GitHub Actions deployment](https://vercel.com/docs/git/vercel-for-github)\n"
1996
2020
  }
1997
2021
  ];
1998
2022
  //# sourceMappingURL=docs-index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"docs-index.js","sourceRoot":"","sources":["../../src/generated/docs-index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"docs-index.js","sourceRoot":"","sources":["../../src/generated/docs-index.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,MAAM,SAAS,GAAe;IACnC;QACE,IAAI,EAAE,gBAAgB;QACtB,MAAM,EAAE,mBAAmB;QAC3B,OAAO,EAAE,gBAAgB;QACzB,SAAS,EAAE,4NAA4N;QACvO,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,gBAAgB;aACzB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,gBAAgB;aACzB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,kBAAkB;aAC3B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,mBAAmB;aAC5B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;SACF;QACD,SAAS,EAAE,szFAAszF;KACl0F;IACD;QACE,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,gBAAgB;QACxB,OAAO,EAAE,aAAa;QACtB,SAAS,EAAE,oOAAoO;QAC/O,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,aAAa;aACtB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,qBAAqB;aAC9B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,4BAA4B;aACrC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,mBAAmB;aAC5B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,aAAa;aACtB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,yBAAyB;aAClC;SACF;QACD,SAAS,EAAE,m/KAAm/K;KAC//K;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,MAAM,EAAE,wBAAwB;QAChC,OAAO,EAAE,oBAAoB;QAC7B,SAAS,EAAE,wPAAwP;QACnQ,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,oBAAoB;aAC7B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,yBAAyB;aAClC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,iBAAiB;aAC1B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,+BAA+B;aACxC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,kDAAkD;aAC3D;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,qBAAqB;aAC9B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,mCAAmC;aAC5C;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,sBAAsB;aAC/B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,mBAAmB;aAC5B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,sCAAsC;aAC/C;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,qBAAqB;aAC9B;SACF;QACD,SAAS,EAAE,42IAA42I;KACx3I;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,qBAAqB;QAC7B,OAAO,EAAE,iBAAiB;QAC1B,SAAS,EAAE,gLAAgL;QAC3L,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,iBAAiB;aAC1B;SACF;QACD,SAAS,EAAE,mkDAAmkD;KAC/kD;IACD;QACE,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,gBAAgB;QACxB,OAAO,EAAE,aAAa;QACtB,SAAS,EAAE,kZAAkZ;QAC7Z,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,aAAa;aACtB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,iBAAiB;aAC1B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,kDAAkD;aAC3D;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,uBAAuB;aAChC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,8CAA8C;aACvD;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,gDAAgD;aACzD;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,qBAAqB;aAC9B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,4CAA4C;aACrD;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,6CAA6C;aACtD;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,sFAAsF;aAC/F;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,aAAa;aACtB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,YAAY;aACrB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,8BAA8B;aACvC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,iCAAiC;aAC1C;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,+BAA+B;aACxC;SACF;QACD,SAAS,EAAE,w8NAAw8N;KACp9N;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,qBAAqB;QAC7B,OAAO,EAAE,kBAAkB;QAC3B,SAAS,EAAE,4XAA4X;QACvY,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,kBAAkB;aAC3B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,QAAQ;aACjB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,QAAQ;aACjB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,SAAS;aAClB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,kBAAkB;aAC3B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,mBAAmB;aAC5B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,wBAAwB;aACjC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,sBAAsB;aAC/B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,uCAAuC;aAChD;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,0CAA0C;aACnD;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,mBAAmB;aAC5B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,WAAW;aACpB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,WAAW;aACpB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,qBAAqB;aAC9B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,mBAAmB;aAC5B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,WAAW;aACpB;SACF;QACD,SAAS,EAAE,68MAA68M;KACz9M;IACD;QACE,IAAI,EAAE,cAAc;QACpB,MAAM,EAAE,iBAAiB;QACzB,OAAO,EAAE,cAAc;QACvB,SAAS,EAAE,uLAAuL;QAClM,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,cAAc;aACvB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,eAAe;aACxB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,qBAAqB;aAC9B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,yBAAyB;aAClC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,yBAAyB;aAClC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,gCAAgC;aACzC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,0BAA0B;aACnC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,wBAAwB;aACjC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,4BAA4B;aACrC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,4BAA4B;aACrC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,qCAAqC;aAC9C;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,wBAAwB;aACjC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,WAAW;aACpB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,yCAAyC;aAClD;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,6BAA6B;aACtC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,mBAAmB;aAC5B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,mBAAmB;aAC5B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,cAAc;aACvB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,uBAAuB;aAChC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,0CAA0C;aACnD;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,gBAAgB;aACzB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,yBAAyB;aAClC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,cAAc;aACvB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,YAAY;aACrB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,+BAA+B;aACxC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;SACF;QACD,SAAS,EAAE,+kMAA+kM;KAC3lM;IACD;QACE,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,gBAAgB;QACxB,OAAO,EAAE,aAAa;QACtB,SAAS,EAAE,kHAAkH;QAC7H,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,aAAa;aACtB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,KAAK;aACd;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,UAAU;aACnB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,WAAW;aACpB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,gBAAgB;aACzB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,eAAe;aACxB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,uBAAuB;aAChC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,kBAAkB;aAC3B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,QAAQ;aACjB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,8BAA8B;aACvC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,UAAU;aACnB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,eAAe;aACxB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,gBAAgB;aACzB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,0BAA0B;aACnC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,iBAAiB;aAC1B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,uCAAuC;aAChD;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,6BAA6B;aACtC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,6BAA6B;aACtC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,wBAAwB;aACjC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,kBAAkB;aAC3B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,aAAa;aACtB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,uBAAuB;aAChC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,YAAY;aACrB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,WAAW;aACpB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,YAAY;aACrB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,UAAU;aACnB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,WAAW;aACpB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,aAAa;aACtB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,KAAK;aACd;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,eAAe;aACxB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,0BAA0B;aACnC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,WAAW;aACpB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,UAAU;aACnB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,oBAAoB;aAC7B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,uBAAuB;aAChC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,gBAAgB;aACzB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,4CAA4C;aACrD;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,sCAAsC;aAC/C;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,4CAA4C;aACrD;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,eAAe;aACxB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,cAAc;aACvB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,sCAAsC;aAC/C;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,cAAc;aACvB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,mDAAmD;aAC5D;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,4BAA4B;aACrC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,gCAAgC;aACzC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,WAAW;aACpB;SACF;QACD,SAAS,EAAE,8ioBAA8ioB;KAC1joB;IACD;QACE,IAAI,EAAE,uBAAuB;QAC7B,MAAM,EAAE,0BAA0B;QAClC,OAAO,EAAE,YAAY;QACrB,SAAS,EAAE,oVAAoV;QAC/V,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,YAAY;aACrB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,KAAK;aACd;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,wBAAwB;aACjC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,kBAAkB;aAC3B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,kBAAkB;aAC3B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,2CAA2C;aACpD;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,eAAe;aACxB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,WAAW;aACpB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,WAAW;aACpB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,SAAS;aAClB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;SACF;QACD,SAAS,EAAE,49IAA49I;KACx+I;IACD;QACE,IAAI,EAAE,2BAA2B;QACjC,MAAM,EAAE,8BAA8B;QACtC,OAAO,EAAE,gBAAgB;QACzB,SAAS,EAAE,6JAA6J;QACxK,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,gBAAgB;aACzB;SACF;QACD,SAAS,EAAE,0wDAA0wD;KACtxD;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,oBAAoB;QAC5B,OAAO,EAAE,MAAM;QACf,SAAS,EAAE,sNAAsN;QACjO,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,KAAK;aACd;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,kCAAkC;aAC3C;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,kBAAkB;aAC3B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,kBAAkB;aAC3B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,uBAAuB;aAChC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,gCAAgC;aACzC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,SAAS;aAClB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,WAAW;aACpB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,WAAW;aACpB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,SAAS;aAClB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,SAAS;aAClB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,SAAS;aAClB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,sBAAsB;aAC/B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;SACF;QACD,SAAS,EAAE,2vMAA2vM;KACvwM;IACD;QACE,IAAI,EAAE,8BAA8B;QACpC,MAAM,EAAE,iCAAiC;QACzC,OAAO,EAAE,mBAAmB;QAC5B,SAAS,EAAE,wHAAwH;QACnI,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,mBAAmB;aAC5B;SACF;QACD,SAAS,EAAE,g5BAAg5B;KAC55B;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE,uBAAuB;QAC/B,OAAO,EAAE,SAAS;QAClB,SAAS,EAAE,oIAAoI;QAC/I,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,SAAS;aAClB;SACF;QACD,SAAS,EAAE,goCAAgoC;KAC5oC;IACD;QACE,IAAI,EAAE,4BAA4B;QAClC,MAAM,EAAE,+BAA+B;QACvC,OAAO,EAAE,iBAAiB;QAC1B,SAAS,EAAE,0KAA0K;QACrL,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,iBAAiB;aAC1B;SACF;QACD,SAAS,EAAE,g1FAAg1F;KAC51F;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,MAAM,EAAE,qBAAqB;QAC7B,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,oLAAoL;QAC/L,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;SACF;QACD,SAAS,EAAE,8hEAA8hE;KAC1iE;IACD;QACE,IAAI,EAAE,4BAA4B;QAClC,MAAM,EAAE,+BAA+B;QACvC,OAAO,EAAE,iBAAiB;QAC1B,SAAS,EAAE,kNAAkN;QAC7N,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,iBAAiB;aAC1B;SACF;QACD,SAAS,EAAE,qgEAAqgE;KACjhE;IACD;QACE,IAAI,EAAE,8BAA8B;QACpC,MAAM,EAAE,iCAAiC;QACzC,OAAO,EAAE,mBAAmB;QAC5B,SAAS,EAAE,+GAA+G;QAC1H,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,mBAAmB;aAC5B;SACF;QACD,SAAS,EAAE,g6BAAg6B;KAC56B;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,yBAAyB;QACjC,OAAO,EAAE,WAAW;QACpB,SAAS,EAAE,kZAAkZ;QAC7Z,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,WAAW;aACpB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,gBAAgB;aACzB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,gBAAgB;aACzB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,eAAe;aACxB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,eAAe;aACxB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,SAAS;aAClB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,wBAAwB;aACjC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,wBAAwB;aACjC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,qBAAqB;aAC9B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,WAAW;aACpB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,QAAQ;aACjB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,aAAa;aACtB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,+BAA+B;aACxC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,oBAAoB;aAC7B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,gBAAgB;aACzB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,aAAa;aACtB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,YAAY;aACrB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,qBAAqB;aAC9B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,qBAAqB;aAC9B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,yBAAyB;aAClC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,mCAAmC;aAC5C;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,+BAA+B;aACxC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,qCAAqC;aAC9C;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,kBAAkB;aAC3B;SACF;QACD,SAAS,EAAE,+jqCAA+jqC;KAC3kqC;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,MAAM,EAAE,wBAAwB;QAChC,OAAO,EAAE,2BAA2B;QACpC,SAAS,EAAE,qKAAqK;QAChL,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,2BAA2B;aACpC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,aAAa;aACtB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,gBAAgB;aACzB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,YAAY;aACrB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,aAAa;aACtB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,WAAW;aACpB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,4BAA4B;aACrC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,kBAAkB;aAC3B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,mBAAmB;aAC5B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,aAAa;aACtB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,wBAAwB;aACjC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,gBAAgB;aACzB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,gBAAgB;aACzB;SACF;QACD,SAAS,EAAE,uiOAAuiO;KACnjO;IACD;QACE,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,cAAc;QACtB,OAAO,EAAE,WAAW;QACpB,SAAS,EAAE,8FAA8F;QACzG,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,WAAW;aACpB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,aAAa;aACtB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,2CAA2C;aACpD;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,+BAA+B;aACxC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,gDAAgD;aACzD;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,eAAe;aACxB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,qBAAqB;aAC9B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,cAAc;aACvB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,qBAAqB;aAC9B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,wBAAwB;aACjC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,sBAAsB;aAC/B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,8EAA8E;aACvF;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,WAAW;aACpB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,mBAAmB;aAC5B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,8BAA8B;aACvC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,kBAAkB;aAC3B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,mBAAmB;aAC5B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,mCAAmC;aAC5C;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;SACF;QACD,SAAS,EAAE,ulNAAulN;KACnmN;IACD;QACE,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,eAAe;QACvB,OAAO,EAAE,YAAY;QACrB,SAAS,EAAE,sHAAsH;QACjI,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,YAAY;aACrB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,eAAe;aACxB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,QAAQ;aACjB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,wBAAwB;aACjC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,4BAA4B;aACrC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,2DAA2D;aACpE;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,uDAAuD;aAChE;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,eAAe;aACxB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,2BAA2B;aACpC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,4BAA4B;aACrC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,yBAAyB;aAClC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,sBAAsB;aAC/B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,mBAAmB;aAC5B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,2BAA2B;aACpC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,wBAAwB;aACjC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,kCAAkC;aAC3C;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,8DAA8D;aACvE;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,YAAY;aACrB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,gBAAgB;aACzB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,cAAc;aACvB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,WAAW;aACpB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,6BAA6B;aACtC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,eAAe;aACxB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,oBAAoB;aAC7B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,qBAAqB;aAC9B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,8BAA8B;aACvC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;SACF;QACD,SAAS,EAAE,g+qBAAg+qB;KAC5+qB;IACD;QACE,IAAI,EAAE,WAAW;QACjB,MAAM,EAAE,cAAc;QACtB,OAAO,EAAE,MAAM;QACf,SAAS,EAAE,kZAAkZ;QAC7Z,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,KAAK;aACd;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,QAAQ;aACjB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,QAAQ;aACjB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,QAAQ;aACjB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,QAAQ;aACjB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,QAAQ;aACjB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,QAAQ;aACjB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,QAAQ;aACjB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,QAAQ;aACjB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,QAAQ;aACjB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,QAAQ;aACjB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,QAAQ;aACjB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,QAAQ;aACjB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,QAAQ;aACjB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;SACF;QACD,SAAS,EAAE,y9nBAAy9nB;KACr+nB;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,MAAM,EAAE,mBAAmB;QAC3B,OAAO,EAAE,MAAM;QACf,SAAS,EAAE,kZAAkZ;QAC7Z,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,SAAS;aAClB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,wBAAwB;aACjC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,4BAA4B;aACrC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,8BAA8B;aACvC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,gCAAgC;aACzC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,mDAAmD;aAC5D;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,iDAAiD;aAC1D;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,oCAAoC;aAC7C;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,6EAA6E;aACtF;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,qCAAqC;aAC9C;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,wDAAwD;aACjE;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,oCAAoC;aAC7C;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,wCAAwC;aACjD;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,mDAAmD;aAC5D;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,iDAAiD;aAC1D;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,qDAAqD;aAC9D;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,wCAAwC;aACjD;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,wCAAwC;aACjD;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,iDAAiD;aAC1D;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,0CAA0C;aACnD;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,wCAAwC;aACjD;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,gCAAgC;aACzC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,4BAA4B;aACrC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,wBAAwB;aACjC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;SACF;QACD,SAAS,EAAE,i9eAAi9e;KAC79e;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,oBAAoB;QAC5B,OAAO,EAAE,cAAc;QACvB,SAAS,EAAE,4JAA4J;QACvK,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,cAAc;aACvB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,YAAY;aACrB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,gBAAgB;aACzB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,qBAAqB;aAC9B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,SAAS;aAClB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,KAAK;aACd;SACF;QACD,SAAS,EAAE,47GAA47G;KACx8G;IACD;QACE,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,SAAS;QAClB,SAAS,EAAE,oCAAoC;QAC/C,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,QAAQ;aACjB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,KAAK;aACd;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;SACF;QACD,SAAS,EAAE,mkFAAmkF;KAC/kF;IACD;QACE,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,aAAa;QACtB,SAAS,EAAE,kZAAkZ;QAC7Z,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,aAAa;aACtB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,WAAW;aACpB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,6BAA6B;aACtC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,iCAAiC;aAC1C;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,WAAW;aACpB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,KAAK;aACd;SACF;QACD,SAAS,EAAE,6gUAA6gU;KACzhU;IACD;QACE,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,YAAY;QACpB,OAAO,EAAE,MAAM;QACf,SAAS,EAAE,kFAAkF;QAC7F,UAAU,EAAE;YACV;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,OAAO;aAChB;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,+BAA+B;aACxC;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,oBAAoB;aAC7B;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,MAAM;aACf;YACD;gBACE,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,IAAI;aACb;SACF;QACD,SAAS,EAAE,igGAAigG;KAC7gG;CACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "u-space-mcp",
3
- "version": "0.0.15",
3
+ "version": "0.0.16",
4
4
  "description": "Model Context Protocol server for u-space documentation.",
5
5
  "type": "module",
6
6
  "bin": {