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.
Files changed (73) hide show
  1. package/README.md +9 -0
  2. package/dist/Viewer-BKNV67Jj.cjs +1 -0
  3. package/dist/Viewer-Cs_y7IiH.js +1256 -0
  4. package/dist/index.cjs +3 -3
  5. package/dist/index.js +1715 -1497
  6. package/dist/plugins/atmosphere/AgxToneMapping.d.ts +1 -1
  7. package/dist/plugins/atmosphere/index.cjs +1 -1
  8. package/dist/plugins/atmosphere/index.js +4 -4
  9. package/dist/plugins/curve-movement/index.cjs +1 -1
  10. package/dist/plugins/curve-movement/index.js +1 -1
  11. package/dist/plugins/fire/index.cjs +1 -1
  12. package/dist/plugins/fire/index.js +5 -5
  13. package/dist/plugins/object-controls/index.cjs +1 -1
  14. package/dist/plugins/object-controls/index.js +4 -4
  15. package/dist/plugins/tiles/index.cjs +1 -1
  16. package/dist/plugins/tiles/index.js +5 -5
  17. package/dist/plugins/u-manager/index.cjs +51 -51
  18. package/dist/plugins/u-manager/index.d.ts +1 -1
  19. package/dist/plugins/u-manager/index.js +8330 -8637
  20. package/dist/plugins/u-manager/loaders/SceneEditableBatchLayer.d.ts +17 -0
  21. package/dist/plugins/u-manager/loaders/SceneInstancedLayer.d.ts +3 -3
  22. package/dist/plugins/u-manager/loaders/SceneLoader.d.ts +20 -3
  23. package/dist/plugins/u-manager/loaders/UManagerLoader.d.ts +4 -4
  24. package/dist/plugins/u-manager/semantics/objects/BuildingGroup.d.ts +12 -5
  25. package/dist/plugins/u-manager/semantics/objects/FacilityInstancedLayer.d.ts +4 -4
  26. package/dist/plugins/u-manager/semantics/objects/FloorMesh.d.ts +28 -22
  27. package/dist/plugins/u-manager/semantics/objects/SemanticGroup.d.ts +6 -6
  28. package/dist/protocol-C-OMPz15.js +10 -0
  29. package/dist/protocol-IUAzx0lk.cjs +1 -0
  30. package/dist/src/batches/EditableGeometryBatchLayer.d.ts +50 -0
  31. package/dist/src/batches/ModelInstancedLayer.d.ts +42 -0
  32. package/dist/src/batches/index.d.ts +2 -0
  33. package/dist/src/effects/TSLEffects.d.ts +24 -1
  34. package/dist/src/index.d.ts +2 -0
  35. package/dist/src/instances/InstanceObject.d.ts +57 -0
  36. package/dist/src/instances/index.d.ts +1 -0
  37. package/dist/src/interactions/MeshBVHRaycast.d.ts +9 -0
  38. package/dist/src/interactions/index.d.ts +1 -0
  39. package/dist/src/viewers/RenderPipeline.d.ts +37 -0
  40. package/dist/src/viewers/ReversedDepthSSGICompat.d.ts +10 -0
  41. package/dist/src/viewers/ReversedDepthSSRCompat.d.ts +20 -0
  42. package/dist/src/viewers/Viewer.d.ts +3 -1
  43. package/dist/src/viewers/renderInvalidation.d.ts +2 -0
  44. package/dist/src/worker/FrameTimingWindow.d.ts +16 -0
  45. package/dist/src/worker/OffscreenViewerHost.d.ts +20 -0
  46. package/dist/src/worker/WorkerDomTarget.d.ts +44 -0
  47. package/dist/src/worker/createWorkerViewer.d.ts +18 -0
  48. package/dist/src/worker/index.d.ts +2 -0
  49. package/dist/src/worker/installWorkerImageLoader.d.ts +5 -0
  50. package/dist/src/worker/protocol.d.ts +102 -0
  51. package/dist/src/worker/runtime.d.ts +2 -0
  52. package/dist/worker/index.cjs +1 -0
  53. package/dist/worker/index.js +224 -0
  54. package/dist/worker/runtime.cjs +1 -0
  55. package/dist/worker/runtime.js +418 -0
  56. package/docs/api-batches.md +112 -0
  57. package/docs/api-effects.md +2 -2
  58. package/docs/api-interactions.md +8 -0
  59. package/docs/api-managers.md +1 -1
  60. package/docs/api-objects.md +207 -0
  61. package/docs/api-plugin-u-manager.md +245 -96
  62. package/docs/api-render-pipeline.md +103 -5
  63. package/docs/api-viewer.md +188 -1
  64. package/docs/changelog.md +69 -6
  65. package/docs/examples-guide.md +111 -17
  66. package/docs/getting-started.md +1 -1
  67. package/docs/index.md +11 -4
  68. package/docs/mcp.md +29 -14
  69. package/docs/release.md +95 -0
  70. package/package.json +27 -4
  71. package/dist/plugins/u-manager/instances/SemanticInstanceObject.d.ts +0 -37
  72. package/dist/plugins/u-manager/instances/SemanticModelInstancedLayer.d.ts +0 -33
  73. package/dist/plugins/u-manager/instances/index.d.ts +0 -2
@@ -26,6 +26,213 @@
26
26
  | :--------------------------- | :-------- | :----- | :--------------------------------------------------------------- |
27
27
  | `ignoreInvisibleWhenRaycast` | `boolean` | `true` | 为 `true` 时,不可见的组在射线检测时会被跳过(不参与碰撞)。 |
28
28
 
29
+ ## `InstanceObject`
30
+
31
+ `InstanceObject` 是核心包导出的统一实例对象基类。无论实例最终由合并楼层几何、`InstancedMesh`、`EditableGeometryBatchLayer` 还是 fallback `Model` 渲染,业务代码都可以使用相同的身份、显隐、颜色、透明度、高亮、包围盒和 materialize API。
32
+
33
+ ```typescript
34
+ import {
35
+ InstanceObject,
36
+ isInstanceObject,
37
+ INSTANCE_COLOR_MODE_NONE,
38
+ INSTANCE_COLOR_MODE_OVERRIDE,
39
+ INSTANCE_COLOR_MODE_TINT,
40
+ } from 'u-space';
41
+ ```
42
+
43
+ ### 类型和常量
44
+
45
+ #### `InstanceStyle`
46
+
47
+ | 属性 | 类型 | 说明 |
48
+ | :---------- | :-------------- | :------------------------------------------------------ |
49
+ | `color` | `Color \| null` | 当前样式颜色;`null` 表示不使用实例颜色。 |
50
+ | `colorMode` | `number` | 当前颜色模式,值为下表中的颜色模式常量。 |
51
+ | `opacity` | `number` | 当前透明度,实例设置 API 会将其限制在 `0` 到 `1` 之间。 |
52
+
53
+ #### `InstanceObjectOptions`
54
+
55
+ | 属性 | 类型 | 必填 | 默认值 | 说明 |
56
+ | :------------ | :------- | :--- | :----------------- | :------------------------- |
57
+ | `boundsName?` | `string` | 否 | `'InstanceBounds'` | 内部手动包围盒节点的名称。 |
58
+
59
+ #### `InstanceIdentity`
60
+
61
+ | 属性 | 类型 | 必填 | 说明 |
62
+ | :------ | :--------------- | :--- | :------------------------------------------------------ |
63
+ | `id?` | `string \| null` | 否 | 实例 ID。省略时保持原值,显式传 `null` 时清为空字符串。 |
64
+ | `kind?` | `string \| null` | 否 | 实例类型。省略时保持原值,显式传 `null` 时清为空字符串。 |
65
+ | `name?` | `string \| null` | 否 | 实例名称。省略时保持原值,显式传 `null` 时清为空字符串。 |
66
+
67
+ `InstanceIdentity` 的三个字段都可省略且可为 `null`:省略的字段保持不变,显式传入 `null` 会将对应身份字段清为空字符串。
68
+
69
+ #### 颜色模式常量
70
+
71
+ | 常量 | 值 | 说明 |
72
+ | :----------------------------- | :-: | :--------------------------------------------- |
73
+ | `INSTANCE_COLOR_MODE_NONE` | `0` | 不使用实例颜色。 |
74
+ | `INSTANCE_COLOR_MODE_OVERRIDE` | `1` | 使用指定颜色覆盖原材质颜色。 |
75
+ | `INSTANCE_COLOR_MODE_TINT` | `2` | 将指定颜色作为 tint 与原材质颜色混合。 |
76
+
77
+ ### 字段
78
+
79
+ | 字段 | 类型 | 默认值 | 说明 |
80
+ | :--------------- | :------------------ | :----------------- | :------------------------------------------------------- |
81
+ | `isInstanceObject` | `boolean` | `true` | 实例对象标识,供 `isInstanceObject()` 类型守卫使用。 |
82
+ | `type` | `string` | `'InstanceObject'` | Three.js 对象类型名称。 |
83
+ | `instanceId` | `string` | `''` | 实例 ID。 |
84
+ | `instanceKind` | `string` | `''` | 实例类型。 |
85
+ | `instanceName` | `string` | `''` | 实例名称。 |
86
+ | `geometry` | `BufferGeometry` | 空几何体 | 实例对象公开的兼容几何体字段。 |
87
+ | `boundingBox` | `Box3 \| null` | `null` | 本地坐标包围盒缓存。 |
88
+ | `boundingSphere` | `Sphere \| null` | `null` | 本地坐标包围球缓存。 |
89
+
90
+ ### 构造函数
91
+
92
+ #### `new InstanceObject(options?)`
93
+
94
+ ```typescript
95
+ const instance = new InstanceObject({ boundsName: 'FloorBounds' });
96
+ ```
97
+
98
+ `options` 的类型为 `InstanceObjectOptions`;省略时使用默认的内部包围盒节点名称 `InstanceBounds`。
99
+
100
+ ### 身份和样式
101
+
102
+ 身份、显隐和基础样式方法都返回当前实例,可以链式调用:
103
+
104
+ ```typescript
105
+ const instance = new InstanceObject()
106
+ .setInstanceIdentity({ id: 'room-101', kind: 'room', name: '会议室 101' })
107
+ .setInstanceVisible(true)
108
+ .setInstanceColor('#4f8cff')
109
+ .setInstanceOpacity(0.65);
110
+
111
+ instance.setInstanceHighlight('#ffff00', 0.9);
112
+ instance.clearInstanceHighlight();
113
+ instance.resetInstanceColor();
114
+ ```
115
+
116
+ | 方法 | 返回值 | 说明 |
117
+ | :--- | :----- | :--- |
118
+ | `setInstanceIdentity(identity: InstanceIdentity)` | `this` | 更新身份字段;省略字段保持不变,`null` 将对应字段清为空字符串。 |
119
+ | `setInstanceVisible(visible: boolean)` | `this` | 设置实例显隐并标记渲染数据需要同步。 |
120
+ | `setInstanceColor(color: ColorRepresentation)` | `this` | 设置基础覆盖色,颜色模式变为 `INSTANCE_COLOR_MODE_OVERRIDE`。 |
121
+ | `resetInstanceColor()` | `this` | 清除基础颜色,颜色模式恢复为 `INSTANCE_COLOR_MODE_NONE`。 |
122
+ | `setInstanceOpacity(opacity: number)` | `this` | 设置基础透明度;传入值会被限制在 `0` 到 `1` 之间。 |
123
+ | `getInstanceColor(target = new Color())` | `Color` | 将当前生效样式的颜色写入 `target` 并返回;未设置颜色时返回白色。 |
124
+ | `hasInstanceColor()` | `boolean` | 当前生效样式是否包含颜色。 |
125
+ | `getInstanceOpacity()` | `number` | 返回当前生效样式的透明度。 |
126
+ | `setInstanceHighlight(color: ColorRepresentation, opacity: number, overwrite = false)` | `this` | 设置临时高亮;默认使用 `INSTANCE_COLOR_MODE_TINT`,`overwrite` 为 `true` 时使用覆盖模式,透明度会被限制在 `0` 到 `1` 之间。 |
127
+ | `clearInstanceHighlight()` | `this` | 清除临时高亮并恢复基础样式。 |
128
+ | `getInstanceColorMode()` | `number` | 返回当前生效样式的颜色模式。 |
129
+
130
+ 临时高亮优先于基础颜色和透明度;`clearInstanceHighlight()` 会恢复基础样式。默认场景矩阵自动更新开启时,实例 transform 的世界矩阵发生变化会自动触发 dirty callback,所属 `ModelInstancedLayer` 会在下一次渲染前同步 instance buffer。业务代码只需修改 `position`、`rotation`、`quaternion` 或 `scale`,不需要直接写内部 instance matrix,也不需要手动调用 `InstanceObject.updateMatrixWorld()`。
131
+
132
+ 如果为大型静态场景显式设置了 `viewer.scene.matrixWorldAutoUpdate = false`,renderer 不会再遍历该根节点,修改后必须用 Three.js 原生方法提交受影响范围并请求新帧:
133
+
134
+ ```typescript
135
+ instance.position.set(10, 0, 5);
136
+ instance.updateWorldMatrix(true, false);
137
+ viewer.invalidate();
138
+
139
+ // 修改父 Group 时更新整个受影响子树。
140
+ group.updateWorldMatrix(true, true);
141
+ viewer.invalidate();
142
+ ```
143
+
144
+ `InstanceObject` 覆盖了原生 `updateWorldMatrix(updateParents, updateChildren)` 和 `updateMatrixWorld(force)`,两条路径都会检测世界矩阵及祖先显隐变化并触发 dirty callback。对 Group 使用 `updateChildren: true` 时,后代 `InstanceObject` 也会执行该检测;editable batch 中与烘焙矩阵不同的 `SceneInstanceObject` 会按合批规则 materialize。
145
+
146
+ ### 包围盒和相机定位
147
+
148
+ `boundingBox` 和 `boundingSphere` 是本地坐标缓存;`computeBoundingBox()` 与 `computeBoundingSphere()` 会按需更新它们。`getInstanceBoundingBox(target, true)` 返回世界坐标包围盒。
149
+
150
+ | 方法 | 返回值 | 说明 |
151
+ | :--- | :----- | :--- |
152
+ | `setInstanceBounds(bounds: Box3)` | `this` | 克隆并设置手动本地包围盒;空包围盒会被忽略。 |
153
+ | `computeBoundingBox()` | `void` | 计算并缓存本地坐标包围盒。 |
154
+ | `computeBoundingSphere()` | `void` | 基于本地包围盒计算并缓存本地坐标包围球。 |
155
+ | `getInstanceBoundingBox(target = new Box3(), world = false)` | `Box3` | 将包围盒写入 `target`;`world` 为 `true` 时返回世界坐标结果。 |
156
+
157
+ 实例可以直接交给相机控制器定位:
158
+
159
+ ```typescript
160
+ await viewer.controls.flyToObject(instance);
161
+ ```
162
+
163
+ 当实例没有可供计算的渲染几何体,或业务端已经拥有精确范围时,可以手动提供本地包围盒并按需获取世界范围:
164
+
165
+ ```typescript
166
+ import { Box3, Vector3 } from 'three/webgpu';
167
+
168
+ instance
169
+ .setInstanceBounds(new Box3(
170
+ new Vector3(-2, 0, -3),
171
+ new Vector3(2, 4, 3),
172
+ ))
173
+ .position.set(100, 0, 50);
174
+
175
+ const worldBounds = instance.getInstanceBoundingBox(new Box3(), true);
176
+ ```
177
+
178
+ ### Fallback 渲染对象
179
+
180
+ `setInstanceRenderObject()` 用于挂载无法进入合并几何或 `InstancedMesh` 管线的 fallback Three.js 对象。`InstanceObject` 会将当前显隐、颜色、透明度和高亮语义统一应用到该对象。
181
+
182
+ | 方法 | 返回值 | 说明 |
183
+ | :--- | :----- | :--- |
184
+ | `setInstanceRenderObject(object: Object3D \| null)` | `this` | 替换 fallback 渲染对象;传入 `null` 时解除当前对象。 |
185
+ | `getInstanceRenderObject()` | `Object3D \| null` | 返回当前 fallback 渲染对象。 |
186
+ | `setInstanceMaterializer(materializer)` | `this` | 设置 batching 实现使用的低层 materialize delegate;传入 `null` 时解除。普通业务通常不直接调用。 |
187
+ | `clearInstanceMaterializer(materializer?)` | `this` | 不传参数时直接解除;传入 delegate 时只在当前 delegate 与其相同时解除,用于安全释放 materializer 所有权。 |
188
+ | `materialize()` | `Object3D \| null` | 调用当前 materializer;未连接 materializer 时返回已有 fallback render object 或 `null`。 |
189
+
190
+ ```typescript
191
+ import { Model } from 'u-space';
192
+
193
+ const fallbackModel = new Model();
194
+ await fallbackModel.loadAsync({ url: '/models/special-room.glb' });
195
+
196
+ instance
197
+ .setInstanceRenderObject(fallbackModel)
198
+ .setInstanceColor('#ff8a3d')
199
+ .setInstanceOpacity(0.8);
200
+ ```
201
+
202
+ `EditableGeometryBatchLayer` 会自动连接 `setInstanceMaterializer()`,并在 dispose 时通过所有权匹配安全解除。当实例 transform 或半透明状态无法继续由烘焙 Geometry 表达时,layer 会 clone 完整模板、克隆独立材质并挂到当前实例,同时立即提交新对象的世界矩阵并让其他 active layer 隐藏同一实例的旧烘焙副本;业务也可以显式调用 `instance.materialize()`。完整构建、unsupported fallback 和事件语义见 [Batches API](./api-batches#editablegeometrybatchlayer)。
203
+
204
+ ### Dirty callback
205
+
206
+ | 方法 | 返回值 | 说明 |
207
+ | :--- | :----- | :--- |
208
+ | `onInstanceRenderDirty(callback: () => void)` | `() => boolean` | 注册 dirty callback,并返回用于取消订阅的函数。 |
209
+ | `markInstanceRenderDirty()` | `this` | 立即通知所有已注册的 dirty callback。 |
210
+
211
+ 保存并调用取消订阅函数,避免监听方销毁后遗留回调:
212
+
213
+ ```typescript
214
+ const dirtyInstances = new Set<InstanceObject>();
215
+ const unsubscribe = instance.onInstanceRenderDirty(() => {
216
+ dirtyInstances.add(instance);
217
+ });
218
+
219
+ // 不再需要监听时
220
+ unsubscribe();
221
+ dirtyInstances.delete(instance);
222
+ ```
223
+
224
+ ### 类型守卫
225
+
226
+ #### `isInstanceObject(object)`
227
+
228
+ `isInstanceObject(object: Object3D): object is InstanceObject` 检查对象的 `isInstanceObject` 标识,并在 TypeScript 中将其收窄为 `InstanceObject`。
229
+
230
+ ```typescript
231
+ if (isInstanceObject(object)) {
232
+ object.setInstanceHighlight('#ffff00', 1);
233
+ }
234
+ ```
235
+
29
236
  ## 模型
30
237
 
31
238
  `Model` 类继承自 `BaseGroup`(进而继承自 `THREE.Group`),简化了异步加载 `glb`、`gltf` 等外部 3D 模型的流程,内置多层缓存支持。