@realsee/five 6.8.0-alpha.25 → 6.8.0-alpha.26

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 (211) hide show
  1. package/ai_guides/api.md +18 -8
  2. package/ai_guides/features/event.md +99 -8
  3. package/ai_guides/features/flowing-light-2d-pass.md +10 -6
  4. package/ai_guides/features/flowing-light-3d-pass.md +11 -6
  5. package/ai_guides/features/load-external-model.md +1 -0
  6. package/ai_guides/features/state.md +2 -2
  7. package/ai_guides/glossary.md +2 -2
  8. package/ai_guides/release_notes/6.8.md +1 -0
  9. package/docs/assets/hierarchy.js +1 -1
  10. package/docs/assets/navigation.js +1 -1
  11. package/docs/assets/search.js +1 -1
  12. package/docs/classes/five.AdaptiveLuminancePass.html +1 -1
  13. package/docs/classes/five.BoundingMesh.html +1 -1
  14. package/docs/classes/five.Camera.html +1 -1
  15. package/docs/classes/five.EyeDomeLightingPass.html +1 -1
  16. package/docs/classes/five.Five.html +13 -13
  17. package/docs/classes/five.FivePass.html +1 -1
  18. package/docs/classes/five.InternalWebGLRenderer.html +1 -1
  19. package/docs/classes/five.Model.html +1 -1
  20. package/docs/classes/five.ModelScene.html +1 -1
  21. package/docs/classes/five.NetworkSubscribe.html +1 -1
  22. package/docs/classes/five.PBMContainer.html +1 -1
  23. package/docs/classes/five.PBMCustomShader.html +1 -1
  24. package/docs/classes/five.PBMGSObject.html +1 -1
  25. package/docs/classes/five.PBMGroup.html +1 -1
  26. package/docs/classes/five.PBMMesh.html +1 -1
  27. package/docs/classes/five.PBMMeshMaterial.html +1 -1
  28. package/docs/classes/five.PBMPanoFilter.html +1 -1
  29. package/docs/classes/five.PBMPointCloud.html +1 -1
  30. package/docs/classes/five.PBMPointCloudMaterial.html +1 -1
  31. package/docs/classes/five.PBMSkinnedMesh.html +1 -1
  32. package/docs/classes/five.PBMUpdateable.html +1 -1
  33. package/docs/classes/five.PanoCircleMesh.html +1 -1
  34. package/docs/classes/five.PanoCircleMeshCustom.html +1 -1
  35. package/docs/classes/five.PanoCircleMeshSolid.html +1 -1
  36. package/docs/classes/five.Parameter.html +1 -1
  37. package/docs/classes/five.Scene.html +1 -1
  38. package/docs/classes/five.Subscribe.html +1 -1
  39. package/docs/classes/five.Tile3D.html +1 -1
  40. package/docs/classes/five.TileNode.html +1 -1
  41. package/docs/classes/five.TrajectoryNode.html +1 -1
  42. package/docs/classes/five.WorkResolvedObserver.html +1 -1
  43. package/docs/classes/gltf-loader.DDSLoader.html +1 -1
  44. package/docs/classes/gltf-loader.DRACOLoader.html +1 -1
  45. package/docs/classes/gltf-loader.GLTFLoader.html +1 -1
  46. package/docs/classes/gltf-loader.GLTFObject.html +1 -1
  47. package/docs/classes/gltf-loader.THREEGLTFLoader.html +1 -1
  48. package/docs/classes/line.Line.html +1 -1
  49. package/docs/classes/line.LineGeometry.html +1 -1
  50. package/docs/classes/line.LineMaterial.html +1 -1
  51. package/docs/classes/line.LineSegmentsGeometry.html +1 -1
  52. package/docs/classes/line.THREE_Line2.html +1 -1
  53. package/docs/classes/line.THREE_LineSegments2.html +1 -1
  54. package/docs/classes/plugins.BasePlugin.Controller.html +1 -1
  55. package/docs/classes/plugins.RoundedBoxGeometry.html +1 -1
  56. package/docs/classes/sticker.Sticker.html +1 -1
  57. package/docs/classes/vfx.Airflow.html +1 -1
  58. package/docs/classes/vfx.Flame.html +1 -1
  59. package/docs/classes/vfx.Particle.html +1 -1
  60. package/docs/classes/vfx.ParticleGPU.html +1 -1
  61. package/docs/classes/vfx.SpotLight.html +1 -1
  62. package/docs/documents/api.html +58 -8
  63. package/docs/documents/features_event.html +39 -6
  64. package/docs/documents/features_flowing-light-2d-pass.html +12 -109
  65. package/docs/documents/features_flowing-light-3d-pass.html +15 -117
  66. package/docs/documents/features_load-external-model.html +1 -0
  67. package/docs/documents/features_state.html +1 -1
  68. package/docs/documents/glossary.html +3 -3
  69. package/docs/documents/release_notes_6.8.html +1 -0
  70. package/docs/functions/plugins.GaussianSplattingEntranceAnimationPlugin.html +1 -0
  71. package/docs/hierarchy.html +1 -1
  72. package/docs/interfaces/five.AddableObject.html +1 -1
  73. package/docs/interfaces/five.AjaxOptions.html +1 -1
  74. package/docs/interfaces/five.BaseEvent.html +5 -5
  75. package/docs/interfaces/five.BaseExtendableEvent.html +11 -0
  76. package/docs/interfaces/five.EventCallback.html +45 -43
  77. package/docs/interfaces/five.FloorplanControllerCustomInitArgs.html +9 -9
  78. package/docs/interfaces/five.GestureEvent.html +19 -19
  79. package/docs/interfaces/five.GesturePointer.html +9 -9
  80. package/docs/interfaces/five.ImageOptions.html +1 -1
  81. package/docs/interfaces/five.IntersectEvent.html +8 -8
  82. package/docs/interfaces/five.IntersectMesh.html +1 -1
  83. package/docs/interfaces/five.IntersectMeshInterface.html +1 -1
  84. package/docs/interfaces/five.Intersection.html +1 -1
  85. package/docs/interfaces/five.LooseWorkWithExtrinsics.html +1 -1
  86. package/docs/interfaces/five.MapviewControllerCustomInitArgs.html +9 -9
  87. package/docs/interfaces/five.ModeChangeEvent.html +7 -7
  88. package/docs/interfaces/five.ModelControllerCustomInitArgs.html +1 -1
  89. package/docs/interfaces/five.ModelEvent.html +5 -5
  90. package/docs/interfaces/five.ModelSceneEvent.html +5 -5
  91. package/docs/interfaces/five.ModelTileEvent.html +5 -5
  92. package/docs/interfaces/five.MovePanoOptions.html +1 -1
  93. package/docs/interfaces/five.NetworkAbortError.html +1 -1
  94. package/docs/interfaces/five.NetworkFirbiddenError.html +1 -1
  95. package/docs/interfaces/five.NetworkOptions.html +1 -1
  96. package/docs/interfaces/five.NetworkProxyError.html +1 -1
  97. package/docs/interfaces/five.NetworkResourceEvent.html +5 -5
  98. package/docs/interfaces/five.NetworkResponseError.html +1 -1
  99. package/docs/interfaces/five.NetworkTimeoutError.html +1 -1
  100. package/docs/interfaces/five.ObjectEvent.html +5 -5
  101. package/docs/interfaces/five.PBMMaterial.html +1 -1
  102. package/docs/interfaces/five.PBMMeshMaterialParameters.html +1 -1
  103. package/docs/interfaces/five.PBMPointCloudMaterialParameters.html +1 -1
  104. package/docs/interfaces/five.PanoCircleMeshInterface.html +1 -1
  105. package/docs/interfaces/five.PanoEvent.html +13 -11
  106. package/docs/interfaces/five.PanoPrepareEvent.html +15 -0
  107. package/docs/interfaces/five.PanoTextureEvent.html +9 -9
  108. package/docs/interfaces/five.PanoramaControllerCustomInitArgs.html +9 -9
  109. package/docs/interfaces/five.PanoramaLikeControllerCustomInitArgs.html +1 -1
  110. package/docs/interfaces/five.ParameterMaterialValue.html +1 -1
  111. package/docs/interfaces/five.ParameterTilesetValue.html +1 -1
  112. package/docs/interfaces/five.ParameterValue.html +1 -1
  113. package/docs/interfaces/five.Pose.html +1 -1
  114. package/docs/interfaces/five.RenderEvent.html +5 -5
  115. package/docs/interfaces/five.ResolvedParameterValue.html +1 -1
  116. package/docs/interfaces/five.State.html +1 -1
  117. package/docs/interfaces/five.StateEvent.html +7 -7
  118. package/docs/interfaces/five.TextureOptions.html +1 -1
  119. package/docs/interfaces/five.TopviewControllerCustomInitArgs.html +7 -7
  120. package/docs/interfaces/five.VRPanoramaControllerCustomInitArgs.html +9 -9
  121. package/docs/interfaces/five.ViewLayer.html +1 -1
  122. package/docs/interfaces/five.WorkCubeImage.html +1 -1
  123. package/docs/interfaces/five.WorkImage.html +1 -1
  124. package/docs/interfaces/five.WorkObserver.html +1 -1
  125. package/docs/interfaces/five.WorkObserverProto.html +1 -1
  126. package/docs/interfaces/five.WorkTile.html +1 -1
  127. package/docs/interfaces/five.WorksEvent.html +5 -5
  128. package/docs/interfaces/five.XRControllerEvent.html +8 -8
  129. package/docs/interfaces/five.XRControllerState.html +4 -4
  130. package/docs/interfaces/five.XRGestureEvent.html +11 -11
  131. package/docs/interfaces/five.XRPanoramaControllerCustomInitArgs.html +9 -9
  132. package/docs/interfaces/five.XRSessionEvent.html +7 -7
  133. package/docs/interfaces/plugins.BackgroundPluginController.html +1 -1
  134. package/docs/interfaces/plugins.BackgroundPluginType.EventMap.html +1 -1
  135. package/docs/interfaces/plugins.BasePlugin.State.html +1 -1
  136. package/docs/interfaces/plugins.DynamicPathLinePluginController.html +1 -1
  137. package/docs/interfaces/plugins.DynamicPathLinePluginType.EventMap.html +1 -1
  138. package/docs/interfaces/plugins.DynamicPathLinePluginType.State.html +1 -1
  139. package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationController.html +44 -0
  140. package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.BoundingAABB2D.html +3 -0
  141. package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.Config.html +8 -0
  142. package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.EventMap.html +10 -0
  143. package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.Keyframe.html +3 -0
  144. package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.State.html +8 -0
  145. package/docs/interfaces/plugins.ItemMaskController.html +1 -1
  146. package/docs/interfaces/plugins.ItemMaskPluginType.EventMap.html +1 -1
  147. package/docs/interfaces/plugins.ItemMaskPluginType.State.html +1 -1
  148. package/docs/interfaces/plugins.OrientationPluginController.html +1 -1
  149. package/docs/interfaces/plugins.OrientationPluginType.EventMap.html +1 -1
  150. package/docs/interfaces/plugins.OrientationPluginType.State.html +1 -1
  151. package/docs/interfaces/plugins.PanoAnimeController.html +1 -1
  152. package/docs/interfaces/plugins.PanoAnimePluginType.EventMap.html +1 -1
  153. package/docs/interfaces/plugins.PanoAnimePluginType.State.html +1 -1
  154. package/docs/interfaces/plugins.PluginTemplateType.EventMap.html +1 -1
  155. package/docs/interfaces/plugins.PluginTemplateType.State.html +1 -1
  156. package/docs/interfaces/plugins.TrajectoryController.html +1 -1
  157. package/docs/interfaces/react.FiveInjectionTypes.html +13 -13
  158. package/docs/modules/five.html +1 -1
  159. package/docs/modules/plugins.GaussianSplattingEntranceAnimationPluginType.html +1 -0
  160. package/docs/modules/plugins.html +1 -1
  161. package/docs/types/five.ControllerEventTypes.html +22 -20
  162. package/docs/types/five.EventTypes.html +26 -26
  163. package/docs/types/five.ParseOptions.html +1 -1
  164. package/docs/types/plugins.BasePlugin.EventMap.html +1 -1
  165. package/docs/variables/five.PROXY_CONTROLLER_EVENT_NAMES.html +1 -1
  166. package/five/application/events.d.ts +1 -1
  167. package/five/controllers/events.d.ts +3 -1
  168. package/five/controllers/panorama.d.ts +1 -1
  169. package/five/controllers/xrPanorama.d.ts +1 -1
  170. package/five/index.d.ts +1 -1
  171. package/five/index.js +64 -61
  172. package/five/index.mjs +1926 -1691
  173. package/five/model/loaders/glTF-helpers/extensions/KHR_gaussian_splatting.d.ts +8 -0
  174. package/five/model/loaders/glTF-helpers/extensions/KHR_gaussian_splatting_compression_spz.d.ts +4 -4
  175. package/five/model/loaders/glTF-helpers/extensions/base.d.ts +2 -1
  176. package/five/model/loaders/glTF-helpers/index.d.ts +2 -0
  177. package/five/model/loaders/glTF-helpers/parser.d.ts +2 -1
  178. package/five/utils/error.d.ts +1 -0
  179. package/five/utils/event.d.ts +14 -0
  180. package/gltf-loader/index.js +3 -3
  181. package/gltf-loader/index.mjs +3 -3
  182. package/line/index.js +3 -3
  183. package/line/index.mjs +3 -3
  184. package/package.json +1 -1
  185. package/plugins/GaussianSplattingEntranceAnimationPlugin/Controller.d.ts +30 -0
  186. package/plugins/GaussianSplattingEntranceAnimationPlugin/index.d.ts +5 -0
  187. package/plugins/GaussianSplattingEntranceAnimationPlugin/typing.d.ts +28 -0
  188. package/plugins/index.d.ts +1 -0
  189. package/plugins/index.js +10 -10
  190. package/plugins/index.mjs +164 -4
  191. package/react/index.js +2 -2
  192. package/react/index.mjs +2 -2
  193. package/shader-lib/index.js +2 -2
  194. package/shader-lib/index.mjs +2 -2
  195. package/sticker/index.js +3 -3
  196. package/sticker/index.mjs +3 -3
  197. package/umd/five-gltf-loader.js +3 -3
  198. package/umd/five-line.js +3 -3
  199. package/umd/five-plugins.js +10 -10
  200. package/umd/five-react.js +2 -2
  201. package/umd/five-shader-lib.js +2 -2
  202. package/umd/five-sticker.js +3 -3
  203. package/umd/five-vfx.js +2 -2
  204. package/umd/five-vue.js +2 -2
  205. package/umd/five.js +27 -24
  206. package/vfx/index.js +2 -2
  207. package/vfx/index.mjs +2 -2
  208. package/vue/index.js +2 -2
  209. package/vue/index.mjs +2 -2
  210. package/work-downloader/index.js +2 -2
  211. package/work-downloader/index.mjs +2 -2
package/ai_guides/api.md CHANGED
@@ -64,7 +64,7 @@ interface FiveInitArgs {
64
64
  /** Max FPS limit. false = unlimited. Default: false */
65
65
  maxFps?: number | false;
66
66
 
67
- /** Mode transition duration in ms. Default: 800 */
67
+ /** Mode transition duration in ms. Default: 1000 */
68
68
  modeChangeDuration?: number;
69
69
 
70
70
  /** Initial plugins to load. */
@@ -224,10 +224,15 @@ These events follow a standard naming convention and provide typed event objects
224
224
 
225
225
  | Event Name | Description | Payload |
226
226
  | :--- | :--- | :--- |
227
- | `gesture.tap` | Triggered on tap/click. Replaces `wantsTapGesture`. | `{ pointers, event, ... }` |
228
- | `gesture.pan` | Triggered on pan/drag. | `{ pointers, ... }` |
229
- | `gesture.pinch` | Triggered on pinch/zoom. | `{ scale, ... }` |
230
- | `gesture.press` | Triggered on long press. | `{ pointers, ... }` |
227
+ | `gesture.tap` | Triggered on tap/click. Replaces `wantsTapGesture`. | `GestureEvent` |
228
+ | `gesture.dbltap` | Triggered on double tap/click. | `GestureEvent` |
229
+ | `gesture.pan` | Triggered on pan/drag. | `GestureEvent` |
230
+ | `gesture.pinch` | Triggered on pinch/zoom. | `GestureEvent` |
231
+ | `gesture.press` | Triggered on long press. | `GestureEvent` |
232
+ | `gesture.mousewheel` | Triggered on mouse wheel scroll. | `GestureEvent` |
233
+ | `gesture.mousemove` | Triggered on mouse move. | `GestureEvent` |
234
+ | `gesture.momentum` | Triggered on inertia movement after pan. | `GestureEvent` |
235
+ | `gesture.fire` | Triggered when any gesture event fires. | `GestureEvent` |
231
236
 
232
237
  #### State & Mode
233
238
 
@@ -242,12 +247,17 @@ These events follow a standard naming convention and provide typed event objects
242
247
  | Event Name | Description | Payload |
243
248
  | :--- | :--- | :--- |
244
249
  | `works.load` | Triggered when work data starts loading. | `WorksEvent` |
250
+ | `works.ready` | Triggered when work data is loaded and controller is ready. | `WorksEvent` |
245
251
  | `models.load` | Triggered when models are loaded. | `ModelSceneEvent` |
246
- | `model.tileLoad` | Triggered when a 3D tile is loaded. | `Tile` |
247
- | `model.tileUnload` | Triggered when a 3D tile is unloaded. | `Tile` |
252
+ | `model.tileLoad` | Triggered when a 3D tile is loaded. | `ModelTileEvent` |
253
+ | `model.tileUnload` | Triggered when a 3D tile is unloaded. | `ModelTileEvent` |
254
+ | `pano.prepare` | Triggered before switching to a new pano. `ExtendableEvent`, supports `waitUntil`. | `PanoPrepareEvent` |
248
255
  | `pano.arrived` | Triggered when arrival at a panorama node. | `PanoEvent` |
249
- | `pano.texture.progress` | Triggered when panorama texture loading progresses. | `{ progress, panoIndex }` |
256
+ | `pano.moving` | Triggered during pano transition animation. | `PanoEvent` |
257
+ | `pano.error` | Triggered when pano loading or movement fails. | `PanoEvent` |
258
+ | `pano.texture.progress` | Triggered when panorama texture loading progresses. | `PanoTextureEvent` |
250
259
  | `render` | Triggered after each render frame. | `RenderEvent` |
260
+ | `render.prepare` | Triggered before each render frame. | `RenderEvent` |
251
261
  | `error` | Triggered on internal errors. | `Error` |
252
262
 
253
263
  ### Legacy Events (Deprecated)
@@ -1,9 +1,9 @@
1
1
  # Events (事件系统)
2
2
 
3
3
  - **Summary**: Five 提供了一套基于发布/订阅模式的事件系统,用于监听用户交互、状态变更、数据加载及渲染生命周期。
4
- - **Schema**: `on` / `once` / `off` 接口定义。
5
- - **Concepts**: Gesture Events, State Events, Pano Events, Model Events, Lifecycle Events.
6
- - **Examples**: 监听全景移动、手势交互及状态变更。
4
+ - **Schema**: `on` / `once` / `off` 接口定义;`BaseEvent` / `BaseExtendableEvent` 事件对象。
5
+ - **Concepts**: Event 对象(`preventDefault` / `waitUntil`)、Gesture Events, State Events, Pano Events, Model Events, Lifecycle Events.
6
+ - **Examples**: 监听全景移动、手势交互及状态变更;使用 `preventDefault` 拦截默认行为;使用 `waitUntil` 延迟点位切换。
7
7
 
8
8
  ## Schema
9
9
 
@@ -50,6 +50,96 @@ five.off(
50
50
  - **name**: (可选) 若不传,则清空所有事件;若传,则取消指定类型的事件。
51
51
  - **callback**: (可选) 若传,则仅取消该特定的回调函数;若不传,则取消该类型下的所有回调。
52
52
 
53
+ ## Event 对象
54
+
55
+ > **Definition**: [BaseEvent / BaseExtendableEvent](../../five/utils/event.d.ts)
56
+
57
+ Five 中所有事件回调的参数都是一个 Event 对象,分为两种基础类型:
58
+
59
+ ### BaseEvent
60
+
61
+ 所有事件的基础接口,包含以下属性和方法:
62
+
63
+ ```typescript
64
+ interface BaseEvent {
65
+ /** 事件类型名称 */
66
+ type: string;
67
+ /** 事件触发时的时间戳 */
68
+ timeStamp: number;
69
+ /** 阻止事件的默认行为 */
70
+ preventDefault(): void;
71
+ /** 是否已调用过 preventDefault */
72
+ readonly defaultPrevented: boolean;
73
+ }
74
+ ```
75
+
76
+ ### BaseExtendableEvent
77
+
78
+ 继承自 `BaseEvent`,额外提供 `waitUntil` 方法,用于在事件处理中插入异步等待逻辑:
79
+
80
+ ```typescript
81
+ interface BaseExtendableEvent extends BaseEvent {
82
+ waitUntil(f: Promise<any>): void;
83
+ }
84
+ ```
85
+
86
+ 目前 `pano.prepare` 事件使用 `BaseExtendableEvent`(对应 `PanoPrepareEvent`),其余事件均基于 `BaseEvent`。
87
+
88
+ ### preventDefault
89
+
90
+ 调用 `event.preventDefault()` 可以阻止事件的默认行为。Five 内部会在触发事件后检查 `event.defaultPrevented`,若为 `true` 则跳过后续的默认处理逻辑。
91
+
92
+ 比如:
93
+ - `gesture.tap`:阻止默认的点位跳转或相机弹跳动画。
94
+ - `intersect.update`:阻止默认的交互高亮行为。
95
+
96
+ ```typescript
97
+ // 示例:阻止点击时的默认点位跳转
98
+ five.on("gesture.tap", (event) => {
99
+ if (shouldBlockNavigation()) {
100
+ event.preventDefault();
101
+ // 执行自定义逻辑
102
+ showCustomMenu(event);
103
+ }
104
+ });
105
+
106
+ // 示例:阻止拖拽时的默认相机旋转
107
+ five.on("gesture.pan", (event) => {
108
+ event.preventDefault();
109
+ // 用拖拽手势实现自定义交互(如绘制标注)
110
+ drawAnnotation(event);
111
+ });
112
+ ```
113
+
114
+ ### waitUntil
115
+
116
+ `waitUntil(promise)` 仅在 `ExtendableEvent` 上可用。调用后,Five 会等待传入的 Promise 完成后再继续后续流程。可多次调用,所有 Promise 会被并行等待。
117
+
118
+ 目前仅 `pano.prepare` 事件支持 `waitUntil`。
119
+
120
+ ```typescript
121
+ // 示例:在切换点位前预加载资源
122
+ five.on("pano.prepare", (event) => {
123
+ // 等待自定义资源加载完成后再继续点位切换
124
+ event.waitUntil(
125
+ loadCustomResources(event.pano)
126
+ );
127
+
128
+ // 可以多次调用,所有 Promise 会被并行等待
129
+ event.waitUntil(
130
+ preloadTextures(event.pano)
131
+ );
132
+ });
133
+
134
+ // 示例:结合 preventDefault 和 waitUntil 实现条件拦截
135
+ five.on("pano.prepare", async (event) => {
136
+ const allowed = await checkPermission(event.pano);
137
+ if (!allowed) {
138
+ event.preventDefault();
139
+ }
140
+ });
141
+ ```
142
+
53
143
  ## Concepts
54
144
 
55
145
  Five 的事件系统将事件主要分为以下几类:
@@ -68,6 +158,7 @@ Five 的事件系统将事件主要分为以下几类:
68
158
  ### Pano Events (全景导航)
69
159
  监听全景图的点位切换过程。
70
160
 
161
+ - `pano.prepare`: 准备切换到新点位。这是一个 `ExtendableEvent`,支持通过 `waitUntil(promise)` 延迟后续加载流程(如预加载资源)。
71
162
  - `pano.arrived`: 成功到达新点位(移动动画结束)。
72
163
  - `pano.moving`: 正在移动到新点位(动画进行中)。
73
164
  - `pano.willChange`: 即将发生点位变更(旧版兼容)。
@@ -105,13 +196,13 @@ import { Five } from "@realsee/five";
105
196
  const five = new Five();
106
197
 
107
198
  // 监听点击事件
108
- five.on("gesture.tap", (pose) => {
109
- console.log("User tapped at:", pose);
199
+ five.on("gesture.tap", (event) => {
200
+ console.log("User tapped at:", event);
110
201
  });
111
202
 
112
203
  // 监听点位变更完成
113
- five.on("pano.arrived", (index) => {
114
- console.log("Arrived at pano index:", index);
204
+ five.on("pano.arrived", (event) => {
205
+ console.log("Arrived at pano:", event.pano);
115
206
  });
116
207
  ```
117
208
 
@@ -150,5 +241,5 @@ five.on("render", onRender);
150
241
  ---
151
242
 
152
243
  ```yaml
153
- tags: [events, interaction, lifecycle, gesture, state]
244
+ tags: [events, interaction, lifecycle, gesture, state, preventDefault, waitUntil]
154
245
  ```
@@ -130,7 +130,7 @@ pass.setLines([pathLine]);
130
130
  ### `setLine(params: { id: string } & Partial<Omit<Line, 'id'>>)`
131
131
  通过 `id` 修改单条线的参数。支持部分更新,只更新传入的字段。
132
132
 
133
- **性能优化**:
133
+ **性能优化**:
134
134
  - 如果 `points` 数量不变,只更新 GPU 的 instance attributes,性能极高
135
135
  - 如果 `points` 数量改变,会重建整个 mesh,性能开销较大
136
136
 
@@ -187,7 +187,7 @@ pass.setLine({
187
187
 
188
188
  ### 快速上手 (Quick Example)
189
189
 
190
-
190
+ ```typescript
191
191
  import { Five } from '@realsee/five';
192
192
  import { FlowingLight2DPass } from '../../lib/five/renderer/postprocessing';
193
193
  import * as THREE from 'three';
@@ -221,11 +221,12 @@ function animate() {
221
221
  five.render();
222
222
  }
223
223
  animate();
224
+ ```
224
225
 
225
226
 
226
227
  ### 多条路径 & 动态更新
227
228
 
228
-
229
+ ```typescript
229
230
  const pass = new FlowingLight2DPass(five.camera);
230
231
 
231
232
  // 初始路径集合
@@ -262,7 +263,7 @@ document.addEventListener('click', (e) => {
262
263
  const rect = five.canvas.getBoundingClientRect();
263
264
  const x = (e.clientX - rect.left) / rect.width;
264
265
  const y = (e.clientY - rect.top) / rect.height; // 左上角为原点,无需翻转
265
-
266
+
266
267
  const newPath = {
267
268
  points: [
268
269
  new THREE.Vector2(0.5, 0.5),
@@ -275,11 +276,12 @@ document.addEventListener('click', (e) => {
275
276
  };
276
277
  pass.setLines([...paths, newPath]);
277
278
  });
279
+ ```
278
280
 
279
281
 
280
282
  ### 计算路径总长度
281
283
 
282
-
284
+ ```typescript
283
285
  function calculatePathLength(points: THREE.Vector2[]): number {
284
286
  let length = 0;
285
287
  for (let i = 1; i < points.length; i++) {
@@ -303,6 +305,7 @@ const pathLine = {
303
305
  duration: 2000,
304
306
  lineWidth: 0.01,
305
307
  };
308
+ ```
306
309
 
307
310
 
308
311
  ### 矩形路径示例
@@ -332,7 +335,7 @@ pass.setLines([rectPath]);
332
335
 
333
336
  ### 高 DPR 场景优化
334
337
 
335
-
338
+ ```typescript
336
339
  // InstancedMesh 实现自动优化高 DPR 性能
337
340
  // 在 DPR=2 的 Retina 屏幕上,性能显著优于全屏着色器方案
338
341
 
@@ -352,6 +355,7 @@ const paths = Array.from({ length: 10 }, (_, i) => ({
352
355
  }));
353
356
 
354
357
  pass.setLines(paths);
358
+ ```
355
359
 
356
360
 
357
361
  ## Debugging
@@ -122,7 +122,7 @@ pass.setLines([pathLine]);
122
122
  ### `setLine(params: { id: string } & Partial<Omit<Line, 'id'>>)`
123
123
  通过 `id` 修改单条线的参数。支持部分更新,只更新传入的字段。
124
124
 
125
- **性能优化**:
125
+ **性能优化**:
126
126
  - 如果 `points` 数量不变,只更新 GPU 的 instance attributes,性能极高
127
127
  - 如果 `points` 数量改变,会重建整个 mesh,性能开销较大
128
128
 
@@ -180,7 +180,7 @@ pass.setLine({
180
180
 
181
181
  ### 快速上手 (Quick Example)
182
182
 
183
-
183
+ ```typescript
184
184
  import { Five } from '@realsee/five';
185
185
  import { FlowingLight3DPass } from '../../lib/five/renderer/postprocessing';
186
186
  import * as THREE from 'three';
@@ -215,11 +215,12 @@ function animate() {
215
215
  five.render();
216
216
  }
217
217
  animate();
218
+ ```
218
219
 
219
220
 
220
221
  ### 多条 3D 路径
221
222
 
222
-
223
+ ```typescript
223
224
  const pass = new FlowingLight3DPass(camera);
224
225
 
225
226
  const paths = [
@@ -258,11 +259,12 @@ const paths = [
258
259
  ];
259
260
 
260
261
  pass.setLines(paths);
262
+ ```
261
263
 
262
264
 
263
265
  ### 计算 3D 路径长度
264
266
 
265
-
267
+ ```typescript
266
268
  function calculatePath3DLength(points: THREE.Vector3[]): number {
267
269
  let length = 0;
268
270
  for (let i = 1; i < points.length; i++) {
@@ -284,11 +286,12 @@ const pathLine = {
284
286
  duration: 3000,
285
287
  lineWidth: 3.0,
286
288
  };
289
+ ```
287
290
 
288
291
 
289
292
  ### 结合相机动画
290
293
 
291
-
294
+ ```typescript
292
295
  // 光带路径随相机移动自动投影
293
296
  const pass = new FlowingLight3DPass(camera);
294
297
 
@@ -309,11 +312,12 @@ five.setState({
309
312
  mode: Five.Mode.Model,
310
313
  // ... 其他参数
311
314
  });
315
+ ```
312
316
 
313
317
 
314
318
  ### 高 DPR 场景优化
315
319
 
316
-
320
+ ```typescript
317
321
  // InstancedMesh 实现自动优化高 DPR 性能
318
322
  // 在 DPR=2 的 Retina 屏幕上,性能显著优于全屏着色器方案
319
323
 
@@ -333,6 +337,7 @@ const paths = Array.from({ length: 10 }, (_, i) => ({
333
337
  }));
334
338
 
335
339
  pass.setLines(paths);
340
+ ```
336
341
 
337
342
 
338
343
  ## Debugging
@@ -78,6 +78,7 @@ Five 使用 **Z-up** (Z 轴向上) 的右手坐标系。
78
78
  * `EXT_texture_webp`
79
79
  * `CESIUM_RTC`
80
80
  * `REALSEE_materials_lightmap`
81
+ * `KHR_gaussian_splatting`
81
82
  * `KHR_gaussian_splatting_compression_spz`
82
83
 
83
84
  | 参数 | 类型 | 默认值 | 说明 |
@@ -79,8 +79,8 @@ const state = five.state;
79
79
 
80
80
  // 在当前状态基础上,向右旋转 90 度,并略微拉远距离
81
81
  five.setState({
82
- longitude: tate.longitude + Math.PI / 2,
83
- distance: tate.distance + 2.0
82
+ longitude: state.longitude + Math.PI / 2,
83
+ distance: state.distance + 2.0
84
84
  });
85
85
  ```
86
86
 
@@ -64,10 +64,10 @@ Five 定义的五种浏览状态:
64
64
  - 拥有独立的 `Parameter` 配置(覆盖上层配置)。
65
65
  - 支持可见性控制 (`visible`) 和优先级加载。
66
66
 
67
- ### Gaussian Splatting (3DGS)
67
+ ### Gaussian Splatting
68
68
  一种基于点的 3D 渲染技术,通过各向异性高斯球(Splat)来表示场景。
69
69
  - 相比传统 Mesh,能更真实地还原复杂光照和细节。
70
- - Five 支持 `.spz` 和 `.splat` 格式的 3DGS 渲染。
70
+ - Five 支持 `.spz` 和 `.splat` 格式的 Gaussian Splatting 渲染。
71
71
 
72
72
  ### 3D Tiles Refinement (细化)
73
73
  3D Tiles 加载过程中的状态概念:
@@ -213,6 +213,7 @@ derived_id 的类型从 `number` 改为 `number | string`。
213
213
  8. 修复 gesture.pan 中第一次并没有 event.isFirst = true 的问题。
214
214
  9. 添加自定义着色器 mainPanoColor 插入点,可以修改 pano0Color、pano1Color。
215
215
  10. 新增 `parameter.resolveValue('xxx')` 快速获取单个参数的最终值,无需创建完整的 `ResolvedParameterValue` 对象。
216
+ 11. 新增 `pano.prepare` 事件(ExtendableEvent),支持通过 `waitUntil(promise)` 在点位切换前插入异步操作。`PanoEvent` 和 `PanoPrepareEvent` 新增 `pano` 字段,包含目标点位信息。
216
217
 
217
218
  ## 内部机制改动
218
219
  1. glTF 加载 mesh / points 都将直接使用 PBM 材质,而不是作为 PBM_Mesh 扩展形式去替换覆盖使用three内置材质的方式。
@@ -1 +1 @@
1
- window.hierarchyData = "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"
1
+ window.hierarchyData = "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"
@@ -1 +1 @@
1
- window.navigationData = "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"
1
+ window.navigationData = "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"