u-space 0.0.28 → 0.0.30
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 +9 -0
- package/dist/Viewer-BKNV67Jj.cjs +1 -0
- package/dist/Viewer-Cs_y7IiH.js +1256 -0
- package/dist/index.cjs +3 -3
- package/dist/index.js +1715 -1497
- package/dist/plugins/atmosphere/AgxToneMapping.d.ts +1 -1
- package/dist/plugins/atmosphere/index.cjs +1 -1
- package/dist/plugins/atmosphere/index.js +4 -4
- package/dist/plugins/curve-movement/index.cjs +1 -1
- package/dist/plugins/curve-movement/index.js +1 -1
- package/dist/plugins/fire/index.cjs +1 -1
- package/dist/plugins/fire/index.js +5 -5
- package/dist/plugins/object-controls/index.cjs +1 -1
- package/dist/plugins/object-controls/index.js +4 -4
- package/dist/plugins/tiles/index.cjs +1 -1
- package/dist/plugins/tiles/index.js +5 -5
- package/dist/plugins/u-manager/index.cjs +51 -51
- package/dist/plugins/u-manager/index.d.ts +1 -1
- package/dist/plugins/u-manager/index.js +8330 -8637
- package/dist/plugins/u-manager/loaders/SceneEditableBatchLayer.d.ts +17 -0
- package/dist/plugins/u-manager/loaders/SceneInstancedLayer.d.ts +3 -3
- package/dist/plugins/u-manager/loaders/SceneLoader.d.ts +20 -3
- package/dist/plugins/u-manager/loaders/UManagerLoader.d.ts +4 -4
- package/dist/plugins/u-manager/semantics/objects/BuildingGroup.d.ts +12 -5
- package/dist/plugins/u-manager/semantics/objects/FacilityInstancedLayer.d.ts +4 -4
- package/dist/plugins/u-manager/semantics/objects/FloorMesh.d.ts +28 -22
- package/dist/plugins/u-manager/semantics/objects/SemanticGroup.d.ts +6 -6
- package/dist/protocol-C-OMPz15.js +10 -0
- package/dist/protocol-IUAzx0lk.cjs +1 -0
- package/dist/src/batches/EditableGeometryBatchLayer.d.ts +50 -0
- package/dist/src/batches/ModelInstancedLayer.d.ts +42 -0
- package/dist/src/batches/index.d.ts +2 -0
- package/dist/src/effects/TSLEffects.d.ts +24 -1
- package/dist/src/index.d.ts +2 -0
- package/dist/src/instances/InstanceObject.d.ts +57 -0
- package/dist/src/instances/index.d.ts +1 -0
- package/dist/src/interactions/MeshBVHRaycast.d.ts +9 -0
- package/dist/src/interactions/index.d.ts +1 -0
- package/dist/src/viewers/RenderPipeline.d.ts +37 -0
- package/dist/src/viewers/ReversedDepthSSGICompat.d.ts +10 -0
- package/dist/src/viewers/ReversedDepthSSRCompat.d.ts +20 -0
- package/dist/src/viewers/Viewer.d.ts +3 -1
- package/dist/src/viewers/renderInvalidation.d.ts +2 -0
- package/dist/src/worker/FrameTimingWindow.d.ts +16 -0
- package/dist/src/worker/OffscreenViewerHost.d.ts +20 -0
- package/dist/src/worker/WorkerDomTarget.d.ts +44 -0
- package/dist/src/worker/createWorkerViewer.d.ts +18 -0
- package/dist/src/worker/index.d.ts +2 -0
- package/dist/src/worker/installWorkerImageLoader.d.ts +5 -0
- package/dist/src/worker/protocol.d.ts +102 -0
- package/dist/src/worker/runtime.d.ts +2 -0
- package/dist/worker/index.cjs +1 -0
- package/dist/worker/index.js +224 -0
- package/dist/worker/runtime.cjs +1 -0
- package/dist/worker/runtime.js +418 -0
- package/docs/api-batches.md +112 -0
- package/docs/api-effects.md +2 -2
- package/docs/api-interactions.md +8 -0
- package/docs/api-managers.md +1 -1
- package/docs/api-objects.md +207 -0
- package/docs/api-plugin-u-manager.md +245 -96
- package/docs/api-render-pipeline.md +103 -5
- package/docs/api-viewer.md +188 -1
- package/docs/changelog.md +69 -6
- package/docs/examples-guide.md +111 -17
- package/docs/getting-started.md +1 -1
- package/docs/index.md +11 -4
- package/docs/mcp.md +29 -14
- package/docs/release.md +95 -0
- package/package.json +27 -4
- package/dist/plugins/u-manager/instances/SemanticInstanceObject.d.ts +0 -37
- package/dist/plugins/u-manager/instances/SemanticModelInstancedLayer.d.ts +0 -33
- package/dist/plugins/u-manager/instances/index.d.ts +0 -2
package/docs/examples-guide.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
## 运行方式与版本
|
|
6
6
|
|
|
7
|
-
示例统一通过 `examples/importmap.js` 注入 Import Map。本地通过 `localhost`、`127.0.0.1`、`0.0.0.0` 或 `192.168.x.x` 访问时会加载仓库里的 `../dist/` 构建产物;在线部署或非本地域名访问时会从 jsDelivr 加载当前发布版本 `u-space@0.0.
|
|
7
|
+
示例统一通过 `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。
|
|
8
8
|
|
|
9
9
|
插件示例可以在页面加载 `importmap.js` 前通过 `window.__IMPORTS__` 声明额外依赖。将 `u-space/plugins/<name>` 的值设为 `true` 时,`importmap.js` 会自动在本地和 CDN 路径之间切换。
|
|
10
10
|
|
|
@@ -64,11 +64,73 @@
|
|
|
64
64
|
|
|
65
65
|
- 使用 `UManagerLoader.setPath()` 配置场景根目录,并通过一次 `loadAsync()` 完成 `SemanticLoader` + `SceneLoader` 组合加载。
|
|
66
66
|
- `SceneLoader` 会自动跳过语义文件中已存在的 `id`,避免建筑、楼层或设备重复加载。
|
|
67
|
-
- 通过 `
|
|
68
|
-
-
|
|
69
|
-
-
|
|
67
|
+
- 通过 `root.semanticGroup.getDefaultFacilityLayer()` 和 `root.sceneGroup.getDefaultSceneLayer()` 直接获取默认设备合批层和场景模型合批层。
|
|
68
|
+
- 通过 `viewer.objectManager` 获取 `SceneInstanceObject` 和 `FacilityInstanceObject`,再直接使用 `viewer.controls.flyToObject()` 飞向单个实例。
|
|
69
|
+
- 使用 `setInstanceHighlight()`、`setInstanceVisible()`、`setInstanceOpacity()` 等统一 API 控制实例,不需要关心底层是合并几何、`InstancedMesh` 还是 fallback `Model`。
|
|
70
|
+
- 示例把 `viewer`、`loader`、`root`、`semanticGroup`、`sceneGroup`、`facilityLayer`、`sceneLayer`、`sceneInstances` 和 `facilities` 暴露到 `window.uManagerExample`,方便在控制台调试。
|
|
70
71
|
|
|
71
|
-
## 6. `
|
|
72
|
+
## 6. `test_umanager_dynamic_instances.html`:运行时动态实例
|
|
73
|
+
|
|
74
|
+
[在线演示](https://u-space-phi.vercel.app/examples/test_umanager_dynamic_instances.html)
|
|
75
|
+
|
|
76
|
+
该示例把运行时实例新增、删除、恢复和按 ID 查询拆到独立场景中,避免和 `UManagerLoader` 的一体化加载流程混在一起。
|
|
77
|
+
|
|
78
|
+
### 核心要点:
|
|
79
|
+
|
|
80
|
+
- 创建 `SceneInstancedLayer` 并调用 `reserveBatch(url, template, capacity)` 预分配容量。
|
|
81
|
+
- 通过 `SceneInstanceObject.setInstanceIdentity({ id, kind, name })` 设置实例独立身份字段,不依赖 `userData` 参与 layer 内部索引。
|
|
82
|
+
- 同一个 layer 内 `instanceId` 必须唯一;重复 ID 的新增会返回 `false`,加入后修改身份字段会在下一次按 ID 查询时刷新索引。
|
|
83
|
+
- 使用 `addInstances()` 批量新增实例,使用 `removeInstance(id)` / `removeInstances(id)` 按完整 `instanceId` 删除实例。
|
|
84
|
+
- 使用 `getInstanceById(id)` 快速获取实例,返回对象可直接用于 `setInstanceHighlight()` 和 `viewer.controls.flyToObject()`。
|
|
85
|
+
- 示例把 `viewer`、`layer`、`template`、`allInstances` 和 `removedInstances` 暴露到 `window.dynamicInstanceExample`。
|
|
86
|
+
|
|
87
|
+
## 7. `test_umanager2.html`:大型场景可编辑静态合批
|
|
88
|
+
|
|
89
|
+
该性能目标场景同时加载语义对象和完整场景树,并通过 `SceneLoader.setEditableBatching()` 把兼容的普通 Mesh 烘焙合并到 `SceneEditableBatchLayer`。它适合 draw calls 和可渲染 Mesh 数量成为主要 CPU/GPU 提交瓶颈、但业务仍需要按对象 ID 显隐、高亮或偶尔移动对象的场景。
|
|
90
|
+
|
|
91
|
+
### 核心要点:
|
|
92
|
+
|
|
93
|
+
- 使用 `setEditableBatching({ maxVerticesPerBatch, maxIndicesPerBatch, freezeAnimations })` 显式开启;默认 `SceneLoader` 行为不变。
|
|
94
|
+
- 兼容的不透明 Mesh 按材质、Geometry attribute 布局、阴影状态和 `renderOrder` 合并;透明、蒙皮、morph、自定义 shader 和不兼容 Geometry 保留 fallback。
|
|
95
|
+
- 合批对象仍保留 `SceneInstanceObject`,显隐、颜色和不透明高亮通过 TSL 状态纹理更新;transform 或半透明修改只 materialize 当前对象。
|
|
96
|
+
- 页面使用 `pixelRatio: 1` 控制高 DPI drawing buffer 成本,并关闭不需要的交互 raycast。
|
|
97
|
+
- 首帧前通过 `renderer.compileAsync()` 预热 WebGPU material pipeline,避免把编译中的中间画面展示给用户。
|
|
98
|
+
- 使用 `?editableBatching=false` 可关闭该路径,与默认 path-based `SceneInstancedLayer`/普通模型加载结果做性能和画面对比。
|
|
99
|
+
- `sceneGroup.userData.editableBatch` 提供 `sourceMeshes`、`batches`、`drawCallsSaved`、`vertices`、`indices` 和 fallback 原因统计。
|
|
100
|
+
|
|
101
|
+
该模式通过展开重复顶点换取更少 draw calls;高重复、大 Geometry 的同模板对象可能仍更适合 `SceneInstancedLayer`。详见 [u-manager `setEditableBatching()` API](./api-plugin-u-manager.md#可编辑静态合批seteditablebatching)。
|
|
102
|
+
|
|
103
|
+
## 8. `test_umanager2_offscreen.html`:OffscreenCanvas Worker + editable batching
|
|
104
|
+
|
|
105
|
+
该示例是 `test_umanager2.html` 的 Worker 版本。完整 `Viewer`、模型解析、editable batch 构建、相机控制和 WebGPU 渲染运行在 dedicated Worker;主线程只持有可见 canvas、转发输入/resize,并显示 Worker 返回的状态与统计。
|
|
106
|
+
|
|
107
|
+
通过专用 Vite 配置启动:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
pnpm example:offscreen
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
然后访问 `http://127.0.0.1:5510/offscreen/test_umanager2_offscreen.html`。该示例的 HTML、主线程入口、Worker 入口和专用 Vite 配置集中在 `examples/offscreen/` 目录。
|
|
114
|
+
|
|
115
|
+
### 核心要点:
|
|
116
|
+
|
|
117
|
+
- 主线程使用 `OffscreenViewerHost` 调用 `transferControlToOffscreen()`,以 structured-clone 消息转发 pointer、wheel、resize 和业务 command。
|
|
118
|
+
- Worker 在模块顶层通过 `const worker = await createWorkerViewer()` 创建真正的 `Viewer`,随后以顺序式代码加载 HDR、`SemanticLoader` 和 `SceneLoader`,无需把整个入口包进 setup callback。
|
|
119
|
+
- `await host.init()` / `initialized` 只表示 Worker 内 `viewer.init()` 完成;HDR、模型、editable batch、pipeline 预热和业务首帧完成后,Worker 才显式调用一次 `worker.ready(detail)`。主线程应先注册 `ready` 监听,再执行 `host.init()`,并在 `ready` 后调用业务 command。
|
|
120
|
+
- `SceneLoader.setEditableBatching()` 在 Worker 中完成 Geometry 克隆、变换烘焙、合并和 TSL 状态纹理创建;透明、蒙皮、morph、自定义 shader 等不支持子集保持 fallback。
|
|
121
|
+
- 首帧前关闭 controls invalidation 并等待 `renderer.compileAsync()`,预热 WebGPU 合批管线后再显示完整画面。
|
|
122
|
+
- HUD 显示实际 `drawCalls`、三角形、`static scene matrices` 状态,以及 1 秒滚动窗口的 FPS、平均/p95/最大帧间隔、超过 25ms 的占比和样本数;demand 模式恢复时的空闲间隔不会被误算成渲染帧。
|
|
123
|
+
- 示例调用 `semanticGroup.showAllFloors().showAllFacilities()` 并保持 `SemanticGroup.visible = true`,楼层、墙体、空间、门窗和设备等所有语义对象均保留且默认显示。HUD 的设备调试区通过 Worker command 选择、飞向、高亮或清除当前 Facility;这些操作都不修改任何语义对象或建筑场景的显隐状态,“清除调试”只撤销高亮。
|
|
124
|
+
- `SemanticLoader` 的压平语义 Geometry 属于分析叠加层,本示例按调试需求默认显示完整语义模型,因此其半透明颜色会与建筑楼壳叠加;业务项目可以按自身展示策略单独控制该层。
|
|
125
|
+
- 标准 RenderPipeline scene pass 保持启用,editable batch 只接收源模型中的不透明 Mesh;透明子 Mesh 保留标准 fallback,以兼顾透明合成正确性和不降低 pixel ratio 的运镜帧率。
|
|
126
|
+
- 相机拖拽继续由主线程事件桥接到 Worker;业务对象不能跨线程传输,按 ID 显隐、变色、transform 或 `materialize()` 应包装成 Worker command,通过 `host.request()` 调用。
|
|
127
|
+
- 相机定位后先调用 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。
|
|
128
|
+
- `ready()` 前的加载或管线预编译异常会触发 error、逆序资源清理和 Worker 关闭;初始化期间销毁 Host、canvas 转移/初始消息失败或 Worker 主动关闭会 reject 尚未完成的 `host.init()` / `request()` 并清理 DOM、resize 和待发送 pointer move。Host dispose 后会忽略队列中迟到的业务事件与 response。
|
|
129
|
+
- Offscreen 负责释放主线程,editable batching 负责减少 draw submission;两者都不会自动减少三角形或透明 overdraw。
|
|
130
|
+
|
|
131
|
+
浏览器必须同时支持 `transferControlToOffscreen()` 和 Worker WebGPU。CSS2D/CSS3D、`Info` 等真实 DOM 叠加层仍应保留在主线程。完整接口和边界见 [Viewer OffscreenCanvas Worker API](./api-viewer.md#offscreencanvas-worker实验性)。
|
|
132
|
+
|
|
133
|
+
## 9. `test_model_animation.html`:模型内置动画
|
|
72
134
|
|
|
73
135
|
[在线演示](https://u-space-phi.vercel.app/examples/test_model_animation.html)
|
|
74
136
|
|
|
@@ -82,7 +144,7 @@
|
|
|
82
144
|
- 使用 `model.playAnimation(name)` 按名称播放单个动画,`model.playAllAnimations()` 播放全部。
|
|
83
145
|
- 使用 `model.stopAnimation()` 停止动画播放。
|
|
84
146
|
|
|
85
|
-
##
|
|
147
|
+
## 10. `test_css_renderer.html`:CSS2D / CSS2.5D / CSS3D 渲染器
|
|
86
148
|
|
|
87
149
|
该示例演示了如何在 3D 场景中叠加渲染 HTML 元素,展示三种 CSS 渲染模式的效果差异。
|
|
88
150
|
|
|
@@ -94,7 +156,7 @@
|
|
|
94
156
|
- CSS2.5D 和 CSS3D 对象需要设置 `scale`(通常 `0.01`),因为 HTML 元素的像素尺寸远大于 3D 世界单位。
|
|
95
157
|
- 渲染器采用懒加载,仅在首次创建对应类型对象时初始化。
|
|
96
158
|
|
|
97
|
-
##
|
|
159
|
+
## 11. `test_postprocessing.html`:后处理效果
|
|
98
160
|
|
|
99
161
|
该示例演示了 `RenderPipeline` 的内置后处理功能,包括 Bloom、SSGI、TRAA 以及自定义后处理组合器。
|
|
100
162
|
|
|
@@ -108,7 +170,7 @@
|
|
|
108
170
|
- 使用 `viewer.renderPipeline.setOutputComposer()` 自定义后处理链(示例中实现了灰度滤镜)。
|
|
109
171
|
- 使用 `setOutputComposer(null)` 恢复默认渲染管线。
|
|
110
172
|
|
|
111
|
-
##
|
|
173
|
+
## 12. `test_viewer_utils.html`:Viewer 工具方法
|
|
112
174
|
|
|
113
175
|
该示例演示了 `Viewer` 新增的便捷方法:截图导出、背景切换、雾效控制和阴影开关。
|
|
114
176
|
|
|
@@ -120,7 +182,7 @@
|
|
|
120
182
|
- 使用 `viewer.enableShadow()` / `viewer.disableShadow()` 控制阴影渲染。
|
|
121
183
|
- 使用 `viewer.resize(width, height)` 手动触发尺寸更新。
|
|
122
184
|
|
|
123
|
-
##
|
|
185
|
+
## 13. `test_camera_controls.html`:CameraControls 增强方法
|
|
124
186
|
|
|
125
187
|
该示例演示了 `CameraControls` 的飞行定位、视角存取、锁定和二三维切换功能。
|
|
126
188
|
|
|
@@ -132,7 +194,7 @@
|
|
|
132
194
|
- 使用 `viewer.controls.lock()` / `unlock()` 锁定或解锁相机控制。
|
|
133
195
|
- 使用 `viewer.controls.setViewMode('2d')` / `setViewMode('3d')` 在二三维视图间切换。
|
|
134
196
|
|
|
135
|
-
##
|
|
197
|
+
## 14. `test_object_manager.html`:ObjectManager 增强方法
|
|
136
198
|
|
|
137
199
|
该示例演示了 `ObjectManager` 的显隐控制、孤立显示、透明度设置、包围盒查询和过滤功能。
|
|
138
200
|
|
|
@@ -144,7 +206,7 @@
|
|
|
144
206
|
- 使用 `viewer.objectManager.getBoundingBox()` 查询所有对象的包围盒。
|
|
145
207
|
- 使用 `viewer.objectManager.filter(predicate)` 按条件过滤对象。
|
|
146
208
|
|
|
147
|
-
##
|
|
209
|
+
## 15. `test_material_effects.html`:MaterialEffects 增强效果
|
|
148
210
|
|
|
149
211
|
该示例演示了材质效果系统的线框、半透明、X 光和淡入淡出功能。
|
|
150
212
|
|
|
@@ -156,7 +218,7 @@
|
|
|
156
218
|
- 使用 `MaterialEffects.fadeOut(object)` / `fadeIn(object)` 执行淡入淡出动画。
|
|
157
219
|
- 使用 `MaterialEffects.removeHighlightColor(object)` 恢复原始材质状态。
|
|
158
220
|
|
|
159
|
-
##
|
|
221
|
+
## 16. `test_selection.html`:Selection 选择系统
|
|
160
222
|
|
|
161
223
|
该示例演示了对象选择系统的单选和框选功能。
|
|
162
224
|
|
|
@@ -167,7 +229,7 @@
|
|
|
167
229
|
- 使用 `selection.enableBoxSelection()` 开启鼠标框选模式。
|
|
168
230
|
- 框选模式下可配合 `viewer.controls.lock()` 避免框选与相机旋转冲突。
|
|
169
231
|
|
|
170
|
-
##
|
|
232
|
+
## 17. `test_measure.html`:MeasureTool 测量工具
|
|
171
233
|
|
|
172
234
|
该示例演示了 3D 场景中的距离、面积和角度测量。
|
|
173
235
|
|
|
@@ -178,7 +240,7 @@
|
|
|
178
240
|
- 使用 `measureTool.measureAngle(pointA, vertex, pointC)` 测量夹角。
|
|
179
241
|
- 测量结果以可视化线条渲染到场景中,返回的 `MeasureResult` 包含数值和单位。
|
|
180
242
|
|
|
181
|
-
##
|
|
243
|
+
## 18. `test_annotation.html`:AnnotationManager 标注管理
|
|
182
244
|
|
|
183
245
|
该示例演示了 3D 标注的创建、更新和管理,配合 `CSSRenderer` 实现 HTML 浮动标签。
|
|
184
246
|
|
|
@@ -190,7 +252,7 @@
|
|
|
190
252
|
- 使用 `updateContent()` 动态更新标注内容,`updatePosition()` 移动标注位置。
|
|
191
253
|
- 使用 `hideAll()` / `showAll()` 批量控制标注显隐。
|
|
192
254
|
|
|
193
|
-
##
|
|
255
|
+
## 19. `test_clipping.html`:ClippingTool 剖切工具
|
|
194
256
|
|
|
195
257
|
该示例演示了剖切面的创建和实时调整。
|
|
196
258
|
|
|
@@ -201,7 +263,7 @@
|
|
|
201
263
|
- 使用滑块通过 `clippingTool.setPlaneConstant()` 实时调整剖切位置。
|
|
202
264
|
- 使用 `showHelper()` / `hideHelper()` 切换剖切面可视化辅助。
|
|
203
265
|
|
|
204
|
-
##
|
|
266
|
+
## 20. `test_lights.html`:LightManager 灯光管理
|
|
205
267
|
|
|
206
268
|
该示例演示了灯光管理器的灯光预设和 Helper 可视化功能。
|
|
207
269
|
|
|
@@ -212,7 +274,7 @@
|
|
|
212
274
|
- 使用 `showAllHelpers()` / `hideAllHelpers()` 显示或隐藏灯光辅助可视化。
|
|
213
275
|
- 每种预设会自动清除旧灯光并创建新的灯光组合。
|
|
214
276
|
|
|
215
|
-
##
|
|
277
|
+
## 21. `test_fire.html`:WebGPU 体积火焰
|
|
216
278
|
|
|
217
279
|
该示例演示了 `u-space/plugins/fire` 的 `FireEffect` 插件,封装 Three.js 官方体积火焰示例,在独立 volumetric pass 中模拟火焰和烟雾后叠加到主场景。
|
|
218
280
|
|
|
@@ -223,3 +285,35 @@
|
|
|
223
285
|
- 默认使用 `TeapotGeometry(0.8, 28)` 作为 emitter;也可以传入业务 `Object3D` 和自定义 `emitterGeometry`。
|
|
224
286
|
- 通过 `fire.update()` 实时调整 `fireIntensity`、`smokeLifespan`、`emitterRadius` 等参数。
|
|
225
287
|
- 插件使用 RenderPipeline output effect 接入,不占用业务侧的 `setOutputComposer()`。
|
|
288
|
+
|
|
289
|
+
## 22. `test_ssr.html`:SSR 时空降噪
|
|
290
|
+
|
|
291
|
+
[在线演示](https://u-space-phi.vercel.app/examples/test_ssr.html)
|
|
292
|
+
|
|
293
|
+
该示例使用程序化室内场景演示完整的屏幕空间反射链路:Stochastic SSR、Temporal Reproject 和 Recurrent Denoise。
|
|
294
|
+
|
|
295
|
+
### 核心要点:
|
|
296
|
+
|
|
297
|
+
- 使用 `viewer.renderPipeline.enableSSR()` / `disableSSR()` 开关完整 SSR 后处理链。
|
|
298
|
+
- 使用 `viewer.renderPipeline.updateSSR()` 实时调整 ray marching、历史帧数和降噪参数。
|
|
299
|
+
- SSR 自动写入打包的法线/粗糙度、漫反射/金属度及 velocity MRT 通道。
|
|
300
|
+
- 默认 `Viewer` 的 reversed depth 可直接使用;RenderPipeline 会在三个内部 pass 中正确跳过背景,同时保持原始深度用于位置与历史重建。
|
|
301
|
+
- 使用 `viewer.frameloop = 'always'` 为时域重投影和循环降噪提供连续帧。
|
|
302
|
+
- 场景包含移动发光球体,可直接观察运动向量重投影与残影收敛效果。
|
|
303
|
+
- 示例通过 `pixelRatio: 1` 使用 1× drawing buffer,避免 Retina 屏幕把 Temporal Reproject 和 Recurrent Denoise 放大到 2.25 倍像素量。
|
|
304
|
+
- `maxDistance` 从默认值 `0.4` 开始,保留滑块用于观察追踪距离对质量和性能的影响。
|
|
305
|
+
- 移动物体继续生成 velocity,但不投射动态阴影;2048² 方向光阴影只更新一次。
|
|
306
|
+
|
|
307
|
+
## 23. `test_ao.html`:环境光遮蔽
|
|
308
|
+
|
|
309
|
+
[在线演示](https://u-space-phi.vercel.app/examples/test_ao.html)
|
|
310
|
+
|
|
311
|
+
该示例使用程序化墙角与紧密摆放的几何体,独立展示 RenderPipeline 的 SSGI AO 分量。页面默认开启 AO,并固定 `giIntensity: 0`,因此画面只保留 `scene.rgb × AO` 遮蔽效果。
|
|
312
|
+
|
|
313
|
+
### 核心要点:
|
|
314
|
+
|
|
315
|
+
- 使用 `viewer.renderPipeline.enableSSGI()` 开启 AO,并通过 `giIntensity: 0` 关闭间接漫反射。
|
|
316
|
+
- 使用 `disableSSGI()` 对比无 AO 画面,再使用当前参数重新开启。
|
|
317
|
+
- 使用 `updateSSGI()` 实时调整 `aoIntensity`、`radius` 和 `thickness`。
|
|
318
|
+
- 使用 `pixelRatio: 1` 控制全屏 SSGI 在高 DPI 屏幕上的成本。
|
|
319
|
+
- 场景不加载外部资源,墙角、堆叠物体和窄缝可以直接观察接触遮蔽。
|
package/docs/getting-started.md
CHANGED
|
@@ -125,7 +125,7 @@ box.addEventListener('pointerleave', (e) => {
|
|
|
125
125
|
|
|
126
126
|
```typescript
|
|
127
127
|
import { version } from 'u-space';
|
|
128
|
-
console.log(version); // e.g. '0.0.
|
|
128
|
+
console.log(version); // e.g. '0.0.30'
|
|
129
129
|
|
|
130
130
|
// 也可以通过全局变量访问
|
|
131
131
|
console.log(window.__USPACE__.version);
|
package/docs/index.md
CHANGED
|
@@ -32,11 +32,12 @@ features:
|
|
|
32
32
|
|
|
33
33
|
| 文档 | 说明 |
|
|
34
34
|
| :--- | :--- |
|
|
35
|
-
| [Viewer](./api-viewer) |
|
|
35
|
+
| [Viewer](./api-viewer) | 核心类:渲染器、场景、相机、控制器、事件,以及实验性 OffscreenCanvas Worker runtime |
|
|
36
36
|
| [CameraControls](./api-camera-controls) | 相机控制:飞行、视角切换、视点过渡 |
|
|
37
37
|
| [CSSRenderer](./api-css-renderer) | CSS 渲染器:CSS2D / CSS2.5D / CSS3D 叠加 HTML 元素 |
|
|
38
|
-
| [RenderPipeline](./api-render-pipeline) | 后处理管线:Bloom、SSGI、TRAA、自定义后处理 |
|
|
39
|
-
| [Objects](./api-objects) | 3D
|
|
38
|
+
| [RenderPipeline](./api-render-pipeline) | 后处理管线:Bloom、SSGI、SSR 时空降噪、TRAA、自定义后处理 |
|
|
39
|
+
| [Objects](./api-objects) | 3D 对象:统一 `InstanceObject` API、模型加载、基础网格、Poi、Topology |
|
|
40
|
+
| [Batches](./api-batches) | 公共批处理:`ModelInstancedLayer`、`EditableGeometryBatchLayer`、fallback、materialize 与 raycast remap |
|
|
40
41
|
| [Interactions](./api-interactions) | 交互管理:射线检测、鼠标/触摸事件、框选 |
|
|
41
42
|
| [Managers](./api-managers) | 对象管理、场景管理、灯光管理 |
|
|
42
43
|
| [Animations](./api-animations) | 补间动画:`tweenAnimation`、`Tween`、缓动模式 |
|
|
@@ -52,7 +53,7 @@ features:
|
|
|
52
53
|
| [keyboard-controls](./api-plugin-keyboard-controls) | WASD / 方向键控制相机移动与旋转 |
|
|
53
54
|
| [minimap](./api-plugin-minimap) | 2D 小地图叠加层 |
|
|
54
55
|
| [tiles](./api-plugin-tiles) | ArcGIS 3D 瓦片 / GIS 地球渲染 |
|
|
55
|
-
| [u-manager](./api-plugin-u-manager) |
|
|
56
|
+
| [u-manager](./api-plugin-u-manager) | 场景加载、可编辑静态 Geometry batching、模型 instancing、语义楼层/井道/设备、拓扑、动画、属性与视点管理 |
|
|
56
57
|
| [curve-movement](./api-plugin-curve-movement) | 沿样条曲线移动相机或对象 |
|
|
57
58
|
| [tracking-controls](./api-plugin-tracking-controls) | 相机跟随移动目标 |
|
|
58
59
|
| [atmosphere](./api-plugin-atmosphere) | 天空背景、天空环境、太阳/月亮光照与阴影 |
|
|
@@ -65,3 +66,9 @@ features:
|
|
|
65
66
|
| 文档 | 说明 |
|
|
66
67
|
| :--- | :--- |
|
|
67
68
|
| [u-space MCP](./mcp) | 面向 Mastra、Claude Desktop、Cursor 等 MCP 客户端的只读文档检索服务器 |
|
|
69
|
+
|
|
70
|
+
### 维护
|
|
71
|
+
|
|
72
|
+
| 文档 | 说明 |
|
|
73
|
+
| :--- | :--- |
|
|
74
|
+
| [一键发布](./release) | 通过 GitHub Actions、npm Trusted Publishing 和 Vercel 发布 `u-space`、`u-space-mcp`、docs 与 examples |
|
package/docs/mcp.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# u-space MCP
|
|
2
2
|
|
|
3
|
-
`u-space-mcp` 是面向 `u-space` 文档的 Model Context Protocol(MCP)服务器。它把当前文档打包成只读 MCP 工具,方便 Mastra、Claude Desktop、Cursor 等 MCP 客户端在回答 `u-space` API
|
|
3
|
+
`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 效果。
|
|
4
4
|
|
|
5
5
|
## 安装与启动
|
|
6
6
|
|
|
@@ -86,23 +86,36 @@ export const codingAgent = new Agent({
|
|
|
86
86
|
|
|
87
87
|
## 示例检索
|
|
88
88
|
|
|
89
|
-
MCP 文档索引包含 `examples/test_umanager_loader.html` 的说明。检索 `UManagerLoader example`、`test_umanager_loader` 或 `UManagerLoader 用法`
|
|
89
|
+
MCP 文档索引包含 `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 性能边界。
|
|
90
90
|
|
|
91
|
-
##
|
|
91
|
+
## OffscreenCanvas Worker 检索范围
|
|
92
92
|
|
|
93
|
-
|
|
93
|
+
| 关键词 / API | 可检索内容 |
|
|
94
|
+
| :----------- | :--------- |
|
|
95
|
+
| `OffscreenViewerHost` | 主线程 canvas 所有权、完整构造选项/方法/事件、`transferControlToOffscreen()`、pointer/wheel/resize 转发、renderer 滚动统计和 `request()` command 调用;`host.init()` / `initialized` 只等待 `viewer.init()`,业务资源完成由一次性 `ready` 表示。还包括 init canvas transfer/post 失败或初始化期间 dispose 的 Promise rejection/资源清理,以及 dispose 后忽略迟到业务消息的语义。 |
|
|
96
|
+
| `createWorkerViewer` | module Worker 顶层可直接 await 的命令式入口;同步安装 host 消息监听,完成 OffscreenCanvas/`viewer.init()` 后返回 `WorkerViewerRuntime`,提供状态、事件、command、逆序 dispose 和一次性业务 ready 生命周期、ready 前 fatal cleanup、去重 ArrayBuffer transfer,以及内置 `getStats` / `getViewpoint` / `setViewpoint` / `render` 命令。 |
|
|
97
|
+
| `test_umanager2_offscreen` | UManager Worker 示例启动方式、HDR/语义/场景加载、`setEditableBatching()`、`compileAsync()` 首帧预热、滚动帧率 HUD、标准透明合成、静态场景矩阵冻结/显式提交,以及默认隐藏半透明语义分析叠加层以保持楼壳原始材质的策略。 |
|
|
98
|
+
| `matrixWorldAutoUpdate` / `updateMatrixWorld` / `updateWorldMatrix` | 使用 Three.js 原生 API 冻结静态 Scene,按需提交单个对象或新增子树,并通过 `viewer.invalidate()` 请求新帧;单个 `InstanceObject.updateWorldMatrix(true, false)` 或父 Group 的 `updateWorldMatrix(true, true)` 仍会触发 dirty callback、instanced buffer 同步和 editable-batch materialize,相机矩阵继续独立更新。 |
|
|
99
|
+
| `OffscreenCanvas` + `setEditableBatching` | Offscreen 移走主线程解析/合并/渲染提交,editable batching 减少 draw submission;Three.js 对象必须留在 Worker,业务对象操作通过 structured-clone command 调用。 |
|
|
100
|
+
|
|
101
|
+
## InstanceObject 与 u-manager 检索范围
|
|
102
|
+
|
|
103
|
+
MCP 文档索引会同步 `docs/api-objects.md` 中的核心 `InstanceObject` API,以及 `docs/api-plugin-u-manager.md` 中的 u-manager 子类、加载器和合批层 API。客户端可以直接检索以下关键词:
|
|
94
104
|
|
|
95
105
|
| 关键词 / API | 可检索内容 |
|
|
96
106
|
| :----------- | :--------- |
|
|
97
|
-
| `UManagerLoader` | 同时加载 `SemanticLoader` 和 `SceneLoader`、自动复用 semantic id 去重、返回带 `semanticGroup` / `sceneGroup` 直接属性的 `UManagerSceneGroup
|
|
98
|
-
| `
|
|
99
|
-
| `
|
|
100
|
-
| `
|
|
101
|
-
| `
|
|
102
|
-
| `
|
|
103
|
-
| `
|
|
104
|
-
| `
|
|
105
|
-
| `
|
|
107
|
+
| `UManagerLoader` | 同时加载 `SemanticLoader` 和 `SceneLoader`、自动复用 semantic id 去重、返回带 `semanticGroup` / `sceneGroup` 直接属性的 `UManagerSceneGroup`;可通过 `semanticGroup.getDefaultFacilityLayer()` 和 `sceneGroup.getDefaultSceneLayer()` 直接访问默认合批层。 |
|
|
108
|
+
| `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()`。 |
|
|
109
|
+
| `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`。 |
|
|
110
|
+
| `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 和统计。 |
|
|
111
|
+
| `SceneLoader` | 场景树加载、语义 `ID` 去重、返回 `SceneGroup`、默认重复 3D 模型 path instancing,以及 opt-in `setEditableBatching({ maxVerticesPerBatch, maxIndicesPerBatch, freezeAnimations })` 静态 Geometry 合批;unsupported template/子 Mesh 安全 fallback,负缩放实例绕过 `InstancedMesh`,build 期间已 materialize 的实例不会重复进入透明 fallback。 |
|
|
112
|
+
| `SceneGroup` | `SceneLoader.loadAsync()` 返回根组,保留原始场景树层级,并通过 `sceneLayer` / `getDefaultSceneLayer()` 暴露主渲染层:默认是 `SceneInstancedLayer`,opt-in editable batching 且存在 merged Mesh 时是与其没有继承关系的 `SceneEditableBatchLayer`;只有 fallback 而无 merged Mesh 时返回 `null`。editable batch 统计位于 `userData.editableBatch`。 |
|
|
113
|
+
| `SceneInstanceObject` | `SceneLoader` 的单模型逻辑引用、`id` / `sid` 检索、`instanceKind = 'SceneInstances'`、统一显隐/颜色/透明度/高亮/bounds/dirty API,以及 editable batch 的 `materialize()`;世界 transform 或半透明变化时可只恢复当前普通 `Model`。 |
|
|
114
|
+
| `SceneInstancedLayer` | `SceneLoader` 内部批量渲染层、共享 `ModelInstancedLayer`、dirty-driven instance buffer 同步、raycast hit remap。 |
|
|
115
|
+
| `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。 |
|
|
116
|
+
| `FacilityInstanceObject` | 楼层下的设备引用、`objectManager.getById()` 全局检索、对象级包围盒缓存 + `controls.flyToObject()` 飞向单设备、统一 `setInstance*` 控制、fallback `Model` wrapper 和事件目标。 |
|
|
117
|
+
| `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。 |
|
|
118
|
+
| `Facilities` | `SemanticLoader` 解析、`FloorMesh.getFacilityById()`、`FacilityInstanceObject.setInstanceOpacity()`、普通 `Model` fallback wrapper 与 scene-level instancing 的一致 API;`SemanticGroup` / `BuildingGroup` / `FloorMesh` 查询使用对象语义 ID、实例 `instanceId` 或显式别名,不扫描 `userData` ID。 |
|
|
106
119
|
|
|
107
120
|
## fire 检索范围
|
|
108
121
|
|
|
@@ -119,10 +132,12 @@ MCP 文档索引会同步 `docs/api-plugin-fire.md` 中的 FireEffect API、参
|
|
|
119
132
|
|
|
120
133
|
## 包结构
|
|
121
134
|
|
|
122
|
-
源码位于 `packages/u-space-mcp
|
|
135
|
+
源码位于 `packages/u-space-mcp`。本地兼容发布入口会先递增 `u-space-mcp` 的 patch 版本,再从 `docs/*.md` 生成内置文档索引、编译并通过当前 npm 登录态发布,因此启用 npm 2FA 时仍会请求 OTP:
|
|
123
136
|
|
|
124
137
|
```bash
|
|
125
138
|
pnpm publish:mcp
|
|
126
139
|
```
|
|
127
140
|
|
|
141
|
+
维护者发布完整版本时应使用 [`pnpm release:all`](./release)。该命令触发 GitHub Actions,通过 npm Trusted Publishing/OIDC 同时发布 `u-space` 与 `u-space-mcp`,不需要 `NPM_TOKEN` 或每次输入 OTP,并继续部署 docs 与 examples。
|
|
142
|
+
|
|
128
143
|
发布后的包不依赖本机绝对路径;只有在传入 `--docs` 或设置 `U_SPACE_DOCS_PATH` 时,才会读取本地文档目录。
|
package/docs/release.md
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# 一键发布
|
|
2
|
+
|
|
3
|
+
仓库提供一个手动 GitHub Actions 工作流,一次发布四个交付面:
|
|
4
|
+
|
|
5
|
+
1. `u-space` npm 包
|
|
6
|
+
2. `u-space-mcp` npm 包
|
|
7
|
+
3. VitePress 文档
|
|
8
|
+
4. `/examples/` 在线示例
|
|
9
|
+
|
|
10
|
+
npm 发布使用 Trusted Publishing/OIDC,不保存 `NPM_TOKEN`,日常发布不再要求输入 OTP。docs 和 examples 使用同一个 Vercel production deployment;`scripts/build-vercel-docs.mjs` 会在文档构建完成后复制 `examples/`,并将发布中的 `u-space` 版本写入部署产物的 import map。
|
|
11
|
+
|
|
12
|
+
## 一次性配置
|
|
13
|
+
|
|
14
|
+
### 1. 配置两个 npm Trusted Publisher
|
|
15
|
+
|
|
16
|
+
分别打开 npmjs.com 上 `u-space` 和 `u-space-mcp` 的 package settings,在 **Trusted Publisher** 中添加相同的 GitHub Actions 配置:
|
|
17
|
+
|
|
18
|
+
| 字段 | 值 |
|
|
19
|
+
| :--- | :--- |
|
|
20
|
+
| Organization or user | `spatial-claw` |
|
|
21
|
+
| Repository | `u-space` |
|
|
22
|
+
| Workflow filename | `release.yml` |
|
|
23
|
+
| Environment | 留空 |
|
|
24
|
+
| Allowed actions | `npm publish` |
|
|
25
|
+
|
|
26
|
+
两个包都必须单独配置一次。工作流运行在 GitHub-hosted runner,授予 `id-token: write`,使用 Node.js 24 和满足 Trusted Publishing 要求的 npm 11;package metadata 中的 repository URL 已统一为 `https://github.com/spatial-claw/u-space`。
|
|
27
|
+
|
|
28
|
+
配置成功后不需要创建 `NPM_TOKEN`。npm 官方也建议在验证 Trusted Publisher 可用后,将传统 publishing access 调整为 “Require two-factor authentication and disallow tokens”。
|
|
29
|
+
|
|
30
|
+
### 2. 配置 Vercel Token
|
|
31
|
+
|
|
32
|
+
仓库已经提交 `.vercel/project.json`,因此 GitHub Actions 只需要一个 repository secret:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
gh secret set VERCEL_TOKEN
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
输入有权部署 `u-space` Vercel 项目的 token。工作流会依次运行 `vercel pull`、`vercel build --prod` 和 `vercel deploy --prebuilt --prod`。
|
|
39
|
+
|
|
40
|
+
工作流已经显式声明 `contents: write` 和 `id-token: write`。因此组织或仓库可以继续保持默认的只读 `GITHUB_TOKEN` 权限;GitHub 会按该 workflow 的最小权限声明授权。工作流需要把版本提交和 release tags 推回 `main`,如果 `main` 启用了 branch protection,还需要允许该 release workflow 写入,或为 `github-actions[bot]` 配置对应 bypass。
|
|
41
|
+
|
|
42
|
+
## 发布
|
|
43
|
+
|
|
44
|
+
默认递增两个 npm 包的 patch 版本,并等待 GitHub Actions 完成:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
pnpm release:all
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
也可以显式选择版本级别:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
pnpm release:all patch
|
|
54
|
+
pnpm release:all minor
|
|
55
|
+
pnpm release:all major
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
不想在本地等待时使用:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
pnpm release:all patch --no-wait
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
也可以打开 GitHub 仓库的 **Actions → Release all → Run workflow**,选择 `patch`、`minor` 或 `major` 后运行。
|
|
65
|
+
|
|
66
|
+
## 发布顺序
|
|
67
|
+
|
|
68
|
+
工作流按以下顺序执行:
|
|
69
|
+
|
|
70
|
+
1. 递增 `u-space` 和 `u-space-mcp` 版本,同步 examples/docs 中的当前版本引用。
|
|
71
|
+
2. 执行完整测试、库构建、MCP 文档索引构建和 VitePress 构建。
|
|
72
|
+
3. 将版本元数据提交并推送到 `main`。
|
|
73
|
+
4. 通过 npm OIDC 发布两个包;精确版本已经存在时自动跳过。
|
|
74
|
+
5. 构建并部署 docs 和 examples 到 Vercel production。
|
|
75
|
+
6. 推送 `vX.Y.Z` 和 `u-space-mcp-vX.Y.Z` 标签。
|
|
76
|
+
|
|
77
|
+
`release-all` concurrency group 会阻止两次发布并发运行。
|
|
78
|
+
|
|
79
|
+
## 失败重试
|
|
80
|
+
|
|
81
|
+
版本提交已经推送,但 npm 或 Vercel 后续步骤失败时,不要再次选择 `patch`,否则会再递增一次版本。使用 `current` 重试当前提交版本:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
pnpm release:all current
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
工作流会跳过 registry 中已经存在的精确版本,只重试尚未完成的 npm 包、Vercel 部署和标签。
|
|
88
|
+
|
|
89
|
+
本地旧命令 `pnpm release`、`pnpm publish:mcp` 和 `pnpm docs:deploy` 继续保留,但它们不使用 GitHub OIDC,可能请求 npm OTP 或本机 Vercel 登录。
|
|
90
|
+
|
|
91
|
+
## 参考
|
|
92
|
+
|
|
93
|
+
- [npm Trusted Publishing](https://docs.npmjs.com/trusted-publishers/)
|
|
94
|
+
- [GitHub Actions OIDC](https://docs.github.com/en/actions/reference/security/oidc)
|
|
95
|
+
- [Vercel GitHub Actions deployment](https://vercel.com/docs/git/vercel-for-github)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "u-space",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.30",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"types": "dist/src/index.d.ts",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -11,26 +11,44 @@
|
|
|
11
11
|
"import": "./dist/index.js",
|
|
12
12
|
"require": "./dist/index.cjs"
|
|
13
13
|
},
|
|
14
|
+
"./worker": {
|
|
15
|
+
"types": "./dist/src/worker/index.d.ts",
|
|
16
|
+
"import": "./dist/worker/index.js",
|
|
17
|
+
"require": "./dist/worker/index.cjs"
|
|
18
|
+
},
|
|
19
|
+
"./worker/runtime": {
|
|
20
|
+
"types": "./dist/src/worker/runtime.d.ts",
|
|
21
|
+
"import": "./dist/worker/runtime.js"
|
|
22
|
+
},
|
|
14
23
|
"./plugins/*": "./dist/plugins/*/index.js"
|
|
15
24
|
},
|
|
16
25
|
"typesVersions": {
|
|
17
26
|
"*": {
|
|
27
|
+
"worker": [
|
|
28
|
+
"./dist/src/worker/index.d.ts"
|
|
29
|
+
],
|
|
30
|
+
"worker/runtime": [
|
|
31
|
+
"./dist/src/worker/runtime.d.ts"
|
|
32
|
+
],
|
|
18
33
|
"plugins/*": [
|
|
19
34
|
"./dist/plugins/*/index.d.ts"
|
|
20
35
|
]
|
|
21
36
|
}
|
|
22
37
|
},
|
|
23
38
|
"scripts": {
|
|
39
|
+
"test": "node --test tests/*.test.mjs",
|
|
24
40
|
"build:dev": "vite build --mode development && tsc",
|
|
25
41
|
"build:u-space": "cross-env BUILD_TARGET=u-space vite build --mode development",
|
|
26
42
|
"build:plugins": "cross-env BUILD_TARGET=plugins vite build --mode development",
|
|
27
43
|
"build": "cross-env BUILD_TARGET=all vite build --mode production && tsc",
|
|
44
|
+
"example:offscreen": "vite --config examples/offscreen/vite.config.ts",
|
|
28
45
|
"docs:dev": "vitepress dev docs",
|
|
29
46
|
"docs:build": "vitepress build docs",
|
|
30
47
|
"docs:preview": "vitepress preview docs",
|
|
31
48
|
"docs:deploy": "pnpm docs:build && vercel --prod",
|
|
32
49
|
"publish:mcp": "npm --prefix ./packages/u-space-mcp version patch && pnpm --filter u-space-mcp build && npm publish ./packages/u-space-mcp --access public --ignore-scripts",
|
|
33
|
-
"release": "npm version patch && pnpm build && npm publish --access=public"
|
|
50
|
+
"release": "npm version patch && pnpm build && npm publish --access=public",
|
|
51
|
+
"release:all": "node scripts/trigger-release.mjs"
|
|
34
52
|
},
|
|
35
53
|
"files": [
|
|
36
54
|
"dist",
|
|
@@ -39,6 +57,10 @@
|
|
|
39
57
|
"docs/*.md"
|
|
40
58
|
],
|
|
41
59
|
"homepage": "https://u-space-phi.vercel.app",
|
|
60
|
+
"repository": {
|
|
61
|
+
"type": "git",
|
|
62
|
+
"url": "git+https://github.com/spatial-claw/u-space.git"
|
|
63
|
+
},
|
|
42
64
|
"keywords": [
|
|
43
65
|
"u-space",
|
|
44
66
|
"space",
|
|
@@ -60,11 +82,12 @@
|
|
|
60
82
|
},
|
|
61
83
|
"peerDependencies": {
|
|
62
84
|
"3d-tiles-renderer": ">=0.4.28",
|
|
63
|
-
"@takram/three-geospatial": ">=0.9.1",
|
|
64
85
|
"@takram/three-atmosphere": ">=0.19.1",
|
|
86
|
+
"@takram/three-geospatial": ">=0.9.1",
|
|
65
87
|
"@types/three": ">=0.185.0",
|
|
66
88
|
"camera-controls": ">=3.1.2",
|
|
67
89
|
"postprocessing": ">=6.39.2",
|
|
68
|
-
"three": ">=0.185.0"
|
|
90
|
+
"three": ">=0.185.0",
|
|
91
|
+
"three-mesh-bvh": ">=0.9.11"
|
|
69
92
|
}
|
|
70
93
|
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { Box3, Color, Object3D, type ColorRepresentation } from 'three/webgpu';
|
|
2
|
-
import { BaseGroup } from 'u-space';
|
|
3
|
-
export interface SemanticInstanceStyle {
|
|
4
|
-
color: Color | null;
|
|
5
|
-
colorMode: number;
|
|
6
|
-
opacity: number;
|
|
7
|
-
}
|
|
8
|
-
export interface SemanticInstanceObjectOptions {
|
|
9
|
-
boundsName?: string;
|
|
10
|
-
}
|
|
11
|
-
export declare const SEMANTIC_COLOR_MODE_NONE = 0;
|
|
12
|
-
export declare const SEMANTIC_COLOR_MODE_OVERRIDE = 1;
|
|
13
|
-
export declare const SEMANTIC_COLOR_MODE_TINT = 2;
|
|
14
|
-
export declare class SemanticInstanceObject extends BaseGroup {
|
|
15
|
-
#private;
|
|
16
|
-
isSemanticInstanceObject: boolean;
|
|
17
|
-
type: string;
|
|
18
|
-
constructor(options?: SemanticInstanceObjectOptions);
|
|
19
|
-
setSemanticBounds(bounds: Box3): this;
|
|
20
|
-
setSemanticRenderObject(object: Object3D | null): this;
|
|
21
|
-
getSemanticRenderObject(): Object3D<import("three").Object3DEventMap> | null;
|
|
22
|
-
getSemanticBoundingBox(target?: Box3, world?: boolean): Box3;
|
|
23
|
-
setSemanticVisible(visible: boolean): this;
|
|
24
|
-
setSemanticColor(color: ColorRepresentation): this;
|
|
25
|
-
resetSemanticColor(): this;
|
|
26
|
-
setSemanticOpacity(opacity: number): this;
|
|
27
|
-
getSemanticColor(target?: Color): Color;
|
|
28
|
-
hasSemanticColor(): boolean;
|
|
29
|
-
getSemanticOpacity(): number;
|
|
30
|
-
setSemanticHighlight(color: ColorRepresentation, opacity: number, overwrite?: boolean): this;
|
|
31
|
-
clearSemanticHighlight(): this;
|
|
32
|
-
getSemanticColorMode(): number;
|
|
33
|
-
onSemanticRenderDirty(callback: () => void): () => boolean;
|
|
34
|
-
markSemanticRenderDirty(): this;
|
|
35
|
-
updateMatrixWorld(force?: boolean): void;
|
|
36
|
-
}
|
|
37
|
-
export declare function isSemanticInstanceObject(object: Object3D): object is SemanticInstanceObject;
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { Object3D } from 'three/webgpu';
|
|
2
|
-
import { BaseGroup } from 'u-space';
|
|
3
|
-
import { SemanticInstanceObject } from './SemanticInstanceObject';
|
|
4
|
-
export interface SemanticInstanceCullingOptions {
|
|
5
|
-
enabled?: boolean;
|
|
6
|
-
frustum?: boolean;
|
|
7
|
-
minScreenRadius?: number;
|
|
8
|
-
}
|
|
9
|
-
export interface SemanticModelInstancedLayerOptions<T extends SemanticInstanceObject> {
|
|
10
|
-
name?: string;
|
|
11
|
-
getBatchUserData?: (url: string, instances: T[]) => Record<string, unknown>;
|
|
12
|
-
getHitUserData?: (instance: T, renderIndex: number) => Record<string, unknown>;
|
|
13
|
-
}
|
|
14
|
-
export declare class SemanticModelInstancedLayer<T extends SemanticInstanceObject = SemanticInstanceObject> extends BaseGroup {
|
|
15
|
-
#private;
|
|
16
|
-
isSemanticModelInstancedLayer: boolean;
|
|
17
|
-
type: string;
|
|
18
|
-
constructor(options?: SemanticModelInstancedLayerOptions<T>);
|
|
19
|
-
getSemanticInstances(): T[];
|
|
20
|
-
getInstanceCulling(): {
|
|
21
|
-
enabled: boolean;
|
|
22
|
-
frustum: boolean;
|
|
23
|
-
minScreenRadius: number;
|
|
24
|
-
};
|
|
25
|
-
setInstanceCulling(options?: SemanticInstanceCullingOptions): this;
|
|
26
|
-
setSemanticVisible(visible: boolean): this;
|
|
27
|
-
setSemanticColor(color: Parameters<SemanticInstanceObject['setSemanticColor']>[0]): this;
|
|
28
|
-
resetSemanticColor(): this;
|
|
29
|
-
setSemanticOpacity(opacity: number): this;
|
|
30
|
-
setSemanticHighlight(color: Parameters<SemanticInstanceObject['setSemanticHighlight']>[0], opacity: number, overwrite?: boolean): this;
|
|
31
|
-
clearSemanticHighlight(): this;
|
|
32
|
-
addSemanticBatch(url: string, template: Object3D, instances: T[]): boolean;
|
|
33
|
-
}
|