@realsee/five 6.8.7 → 6.9.0-alpha.0

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 (233) hide show
  1. package/ai_guides/README.md +2 -0
  2. package/ai_guides/features/flowing-fireworks-3d-pass.md +296 -0
  3. package/ai_guides/features/flowing-light-3d-pass.md +1 -0
  4. package/ai_guides/features/postprocessing.md +3 -1
  5. package/docs/assets/hierarchy.js +1 -1
  6. package/docs/assets/navigation.js +1 -1
  7. package/docs/assets/search.js +1 -1
  8. package/docs/classes/five.AdaptiveLuminancePass.html +1 -1
  9. package/docs/classes/five.BoundingMesh.html +1 -1
  10. package/docs/classes/five.Camera.html +1 -1
  11. package/docs/classes/five.EyeDomeLightingPass.html +1 -1
  12. package/docs/classes/five.Five.html +1 -1
  13. package/docs/classes/five.FivePass.html +1 -1
  14. package/docs/classes/five.FlowingLight2DPass.html +2 -2
  15. package/docs/classes/five.FlowingLight3DPass.html +2 -2
  16. package/docs/classes/five.GaussianBlurPass.html +1 -1
  17. package/docs/classes/five.InternalWebGLRenderer.html +1 -1
  18. package/docs/classes/five.Model.html +1 -1
  19. package/docs/classes/five.ModelScene.html +1 -1
  20. package/docs/classes/five.NetworkSubscribe.html +1 -1
  21. package/docs/classes/five.PBMContainer.html +1 -1
  22. package/docs/classes/five.PBMCustomShader.html +1 -1
  23. package/docs/classes/five.PBMGSObject.html +10 -13
  24. package/docs/classes/five.PBMGroup.html +1 -1
  25. package/docs/classes/five.PBMMesh.html +1 -1
  26. package/docs/classes/five.PBMMeshMaterial.html +1 -1
  27. package/docs/classes/five.PBMPanoFilter.html +1 -1
  28. package/docs/classes/five.PBMPointCloud.html +1 -1
  29. package/docs/classes/five.PBMPointCloudMaterial.html +1 -1
  30. package/docs/classes/five.PBMSkinnedMesh.html +1 -1
  31. package/docs/classes/five.PBMUpdateable.html +1 -1
  32. package/docs/classes/five.PanoCircleMesh.html +1 -1
  33. package/docs/classes/five.PanoCircleMeshCustom.html +1 -1
  34. package/docs/classes/five.PanoCircleMeshSolid.html +1 -1
  35. package/docs/classes/five.Parameter.html +1 -1
  36. package/docs/classes/five.Scene.html +1 -1
  37. package/docs/classes/five.Subscribe.html +1 -1
  38. package/docs/classes/five.TextureLoader.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.CSS2DObject.html +1 -1
  56. package/docs/classes/plugins.CSS3DObject.html +1 -1
  57. package/docs/classes/plugins.CSS3DSprite.html +1 -1
  58. package/docs/classes/plugins.InstancedPrefabBufferGeometry.html +1 -1
  59. package/docs/classes/plugins.Object3DHelperController.html +1 -1
  60. package/docs/classes/plugins.PointBufferGeometry.html +1 -1
  61. package/docs/classes/plugins.PrefabBufferGeometry.html +1 -1
  62. package/docs/classes/plugins.RoundedBoxGeometry.html +1 -1
  63. package/docs/classes/sticker.Sticker.html +1 -1
  64. package/docs/classes/vfx.Airflow.html +1 -1
  65. package/docs/classes/vfx.Flame.html +1 -1
  66. package/docs/classes/vfx.Particle.html +1 -1
  67. package/docs/classes/vfx.ParticleGPU.html +1 -1
  68. package/docs/classes/vfx.SpotLight.html +1 -1
  69. package/docs/documents/README.html +6 -0
  70. package/docs/documents/features_flowing-fireworks-3d-pass.html +242 -0
  71. package/docs/documents/features_flowing-light-3d-pass.html +1 -0
  72. package/docs/documents/features_postprocessing.html +3 -1
  73. package/docs/functions/five.loadSpz.html +1 -1
  74. package/docs/functions/plugins.calculatePath2DLength.html +1 -0
  75. package/docs/functions/plugins.calculatePath3DLength.html +1 -0
  76. package/docs/hierarchy.html +1 -1
  77. package/docs/index.html +6 -0
  78. package/docs/interfaces/five.AddableObject.html +1 -1
  79. package/docs/interfaces/five.AjaxOptions.html +1 -1
  80. package/docs/interfaces/five.BaseEvent.html +1 -1
  81. package/docs/interfaces/five.BaseExtendableEvent.html +1 -1
  82. package/docs/interfaces/five.EventCallback.html +1 -1
  83. package/docs/interfaces/five.GestureEvent.html +1 -1
  84. package/docs/interfaces/five.ImageOptions.html +1 -1
  85. package/docs/interfaces/five.IntersectEvent.html +1 -1
  86. package/docs/interfaces/five.IntersectMesh.html +1 -1
  87. package/docs/interfaces/five.IntersectMeshInterface.html +1 -1
  88. package/docs/interfaces/five.Intersection.html +1 -1
  89. package/docs/interfaces/five.LooseWorkWithExtrinsics.html +1 -1
  90. package/docs/interfaces/five.ModeChangeEvent.html +1 -1
  91. package/docs/interfaces/five.ModelControllerCustomInitArgs.html +1 -1
  92. package/docs/interfaces/five.ModelEvent.html +1 -1
  93. package/docs/interfaces/five.ModelSceneEvent.html +1 -1
  94. package/docs/interfaces/five.ModelTileEvent.html +1 -1
  95. package/docs/interfaces/five.MovePanoOptions.html +1 -1
  96. package/docs/interfaces/five.NetworkAbortError.html +1 -1
  97. package/docs/interfaces/five.NetworkFirbiddenError.html +1 -1
  98. package/docs/interfaces/five.NetworkOptions.html +1 -1
  99. package/docs/interfaces/five.NetworkProxyError.html +1 -1
  100. package/docs/interfaces/five.NetworkResourceEvent.html +1 -1
  101. package/docs/interfaces/five.NetworkResponseError.html +1 -1
  102. package/docs/interfaces/five.NetworkTimeoutError.html +1 -1
  103. package/docs/interfaces/five.ObjectEvent.html +1 -1
  104. package/docs/interfaces/five.PBMMaterial.html +1 -1
  105. package/docs/interfaces/five.PBMMeshMaterialParameters.html +1 -1
  106. package/docs/interfaces/five.PBMPointCloudMaterialParameters.html +1 -1
  107. package/docs/interfaces/five.PanoCircleMeshInterface.html +1 -1
  108. package/docs/interfaces/five.PanoEvent.html +1 -1
  109. package/docs/interfaces/five.PanoPrepareEvent.html +1 -1
  110. package/docs/interfaces/five.PanoTextureEvent.html +1 -1
  111. package/docs/interfaces/five.PanoramaControllerCustomInitArgs.html +1 -1
  112. package/docs/interfaces/five.PanoramaLikeControllerCustomInitArgs.html +1 -1
  113. package/docs/interfaces/five.ParameterMaterialValue.html +1 -1
  114. package/docs/interfaces/five.ParameterTilesetValue.html +1 -1
  115. package/docs/interfaces/five.ParameterValue.html +1 -1
  116. package/docs/interfaces/five.Pose.html +1 -1
  117. package/docs/interfaces/five.RenderEvent.html +1 -1
  118. package/docs/interfaces/five.ResolvedParameterValue.html +1 -1
  119. package/docs/interfaces/five.SplatData.html +3 -6
  120. package/docs/interfaces/five.State.html +1 -1
  121. package/docs/interfaces/five.StateEvent.html +1 -1
  122. package/docs/interfaces/five.TextureOptions.html +1 -1
  123. package/docs/interfaces/five.TopviewControllerCustomInitArgs.html +1 -1
  124. package/docs/interfaces/five.VRPanoramaControllerCustomInitArgs.html +1 -1
  125. package/docs/interfaces/five.ViewLayer.html +1 -1
  126. package/docs/interfaces/five.WorkCubeImage.html +1 -1
  127. package/docs/interfaces/five.WorkImage.html +1 -1
  128. package/docs/interfaces/five.WorkObserver.html +1 -1
  129. package/docs/interfaces/five.WorkObserverProto.html +1 -1
  130. package/docs/interfaces/five.WorkTile.html +1 -1
  131. package/docs/interfaces/five.WorksEvent.html +1 -1
  132. package/docs/interfaces/five.XRControllerEvent.html +1 -1
  133. package/docs/interfaces/five.XRGestureEvent.html +1 -1
  134. package/docs/interfaces/five.XRPanoramaControllerCustomInitArgs.html +1 -1
  135. package/docs/interfaces/five.XRSessionEvent.html +1 -1
  136. package/docs/interfaces/plugins.BackgroundPluginController.html +1 -1
  137. package/docs/interfaces/plugins.BackgroundPluginType.EventMap.html +1 -1
  138. package/docs/interfaces/plugins.BasePlugin.State.html +1 -1
  139. package/docs/interfaces/plugins.CSS2DPluginController.html +1 -1
  140. package/docs/interfaces/plugins.CSS2DPluginType.EventMap.html +1 -1
  141. package/docs/interfaces/plugins.CSS2DPluginType.State.html +1 -1
  142. package/docs/interfaces/plugins.CSS3DPluginController.html +1 -1
  143. package/docs/interfaces/plugins.CSS3DPluginType.EventMap.html +1 -1
  144. package/docs/interfaces/plugins.CSS3DPluginType.State.html +1 -1
  145. package/docs/interfaces/plugins.DynamicPathLinePluginController.html +1 -1
  146. package/docs/interfaces/plugins.DynamicPathLinePluginType.EventMap.html +1 -1
  147. package/docs/interfaces/plugins.DynamicPathLinePluginType.State.html +1 -1
  148. package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationController.html +1 -1
  149. package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.EventMap.html +1 -1
  150. package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.State.html +1 -1
  151. package/docs/interfaces/plugins.ItemMaskController.html +1 -1
  152. package/docs/interfaces/plugins.ItemMaskPluginType.EventMap.html +1 -1
  153. package/docs/interfaces/plugins.ItemMaskPluginType.State.html +1 -1
  154. package/docs/interfaces/plugins.Object3DHelperPluginType.BaseController.html +1 -1
  155. package/docs/interfaces/plugins.Object3DHelperPluginType.BaseHelper.html +1 -1
  156. package/docs/interfaces/plugins.Object3DHelperPluginType.BoundingBoxController.html +1 -1
  157. package/docs/interfaces/plugins.Object3DHelperPluginType.MoveController.html +1 -1
  158. package/docs/interfaces/plugins.Object3DHelperPluginType.MoveHelperAbstract.html +1 -1
  159. package/docs/interfaces/plugins.Object3DHelperPluginType.RotateController.html +1 -1
  160. package/docs/interfaces/plugins.Object3DHelperPluginType.RotateHelperAbstract.html +1 -1
  161. package/docs/interfaces/plugins.OrientationPluginController.html +1 -1
  162. package/docs/interfaces/plugins.OrientationPluginType.EventMap.html +1 -1
  163. package/docs/interfaces/plugins.OrientationPluginType.State.html +1 -1
  164. package/docs/interfaces/plugins.PanoAnimeController.html +1 -1
  165. package/docs/interfaces/plugins.PanoAnimePluginType.EventMap.html +1 -1
  166. package/docs/interfaces/plugins.PanoAnimePluginType.State.html +1 -1
  167. package/docs/interfaces/plugins.PluginTemplateType.EventMap.html +1 -1
  168. package/docs/interfaces/plugins.PluginTemplateType.State.html +1 -1
  169. package/docs/interfaces/plugins.TrajectoryController.html +9 -9
  170. package/docs/interfaces/react.FiveInjectionTypes.html +1 -1
  171. package/docs/interfaces/react.UseFivePluginOptions.html +1 -1
  172. package/docs/interfaces/react.UseFivePluginOptionsWithCreate.html +1 -1
  173. package/docs/modules/five.html +1 -1
  174. package/docs/modules/plugins.html +1 -1
  175. package/docs/modules.html +1 -1
  176. package/docs/types/five.FlowingLight2DPassLine.html +10 -0
  177. package/docs/types/five.FlowingLight3DPassLine.html +10 -0
  178. package/docs/types/five.ParseOptions.html +1 -1
  179. package/docs/types/plugins.BasePlugin.EventMap.html +1 -1
  180. package/five/gaussian-splatting/layerRegistry.d.ts +10 -0
  181. package/five/gaussian-splatting/orderTexture.d.ts +18 -0
  182. package/five/gaussian-splatting/reorderPass.d.ts +34 -0
  183. package/five/gaussian-splatting/shStore.d.ts +16 -0
  184. package/five/gaussian-splatting/splatAssembler.d.ts +60 -0
  185. package/five/gaussian-splatting/tileTexture.d.ts +10 -0
  186. package/five/gaussian-splatting/transformStore.d.ts +20 -0
  187. package/five/index.js +238 -173
  188. package/five/index.mjs +6526 -6506
  189. package/five/model/index.d.ts +0 -1
  190. package/five/model/loaders/spz.d.ts +19 -3
  191. package/five/model/objects/pbmGaussianSplattingObject.d.ts +10 -14
  192. package/five/model/objects/pbmGaussianSplattingRenderMesh.d.ts +48 -42
  193. package/five/renderer/index.d.ts +1 -1
  194. package/five/renderer/postprocessing/index.d.ts +3 -2
  195. package/five/renderer/postprocessing/passes/flowing-fireworks-3d-pass.d.ts +74 -0
  196. package/five/renderer/postprocessing/passes/flowing-light-2d-pass.d.ts +4 -5
  197. package/five/renderer/postprocessing/passes/flowing-light-3d-pass.d.ts +4 -5
  198. package/gltf-loader/index.js +3 -3
  199. package/gltf-loader/index.mjs +3 -3
  200. package/line/index.js +3 -3
  201. package/line/index.mjs +3 -3
  202. package/llms.txt +2 -0
  203. package/package.json +2 -2
  204. package/pbmGaussianSplattingObject-B2uXNUOB.cjs +255 -0
  205. package/pbmGaussianSplattingObject-yJQySQfR.js +328 -0
  206. package/plugins/index.d.ts +1 -0
  207. package/plugins/index.js +4 -4
  208. package/plugins/index.mjs +26 -14
  209. package/plugins/utils/math.d.ts +2 -0
  210. package/react/index.js +2 -2
  211. package/react/index.mjs +2 -2
  212. package/shader-lib/index.js +2 -2
  213. package/shader-lib/index.mjs +2 -2
  214. package/sticker/index.js +3 -3
  215. package/sticker/index.mjs +3 -3
  216. package/umd/five-gltf-loader.js +3 -3
  217. package/umd/five-line.js +3 -3
  218. package/umd/five-plugins.js +4 -4
  219. package/umd/five-react.js +2 -2
  220. package/umd/five-shader-lib.js +2 -2
  221. package/umd/five-sticker.js +3 -3
  222. package/umd/five-vfx.js +2 -2
  223. package/umd/five-vue.js +2 -2
  224. package/umd/five.js +147 -82
  225. package/vfx/index.js +2 -2
  226. package/vfx/index.mjs +2 -2
  227. package/vue/index.js +2 -2
  228. package/vue/index.mjs +2 -2
  229. package/work-downloader/index.js +2 -2
  230. package/work-downloader/index.mjs +2 -2
  231. package/docs/functions/five.loadSplat.html +0 -1
  232. package/five/gaussian-splatting/util/renderData.d.ts +0 -68
  233. package/five/model/loaders/splat.d.ts +0 -8
@@ -76,6 +76,7 @@
76
76
  * [Postprocessing](./features/postprocessing.md): 后处理效果 (Pass, EffectComposer)。
77
77
  * [Flowing Light 2D Pass](./features/flowing-light-2d-pass.md): 屏幕空间流光特效(InstancedMesh 优化)。
78
78
  * [Flowing Light 3D Pass](./features/flowing-light-3d-pass.md): 3D 世界坐标流光特效(InstancedMesh 优化)。
79
+ * [Flowing Fireworks 3D Pass](./features/flowing-fireworks-3d-pass.md): 流光尾部喷射的烟花粒子特效(GPU 粒子)。
79
80
  * [Gaussian Blur Pass](./features/gaussian-blur-pass.md): 高斯模糊特效。
80
81
  * [Material](./features/material.md): 材质参数配置 (透明度、点云大小、顶点标记)。
81
82
  * [Pano Filter](./features/pano-filter.md): 全景图滤镜 (亮度、对比度、色温调节)。
@@ -122,6 +123,7 @@
122
123
  | 截图 / 放大镜 / Screen capture | [Get Screen Pixels](./features/get-screen-pixels.md) | magnifier, screenshot, color-picker, 取色器 |
123
124
  | 模型裁切 / 房屋剖面 | [Clipper](./features/clipper.md) | clipping-box, section-view, discard, 开盖, 剖面 |
124
125
  | 流光特效 / Flowing light effect | [Flowing Light 2D](./features/flowing-light-2d-pass.md), [Flowing Light 3D](./features/flowing-light-3d-pass.md) | 光带, 导航路径, 动态路径, instanced |
126
+ | 烟花 / 火花 / 流光拖尾粒子 / Fireworks sparks | [Flowing Fireworks 3D](./features/flowing-fireworks-3d-pass.md) | 烟花, 火花, 粒子, 发散, 爆裂, fireworks, particle, sparks |
125
127
  | 模糊特效 / Blur effect | [Gaussian Blur Pass](./features/gaussian-blur-pass.md) | 毛玻璃, 背景虚化, gaussian |
126
128
  | 保存/恢复场景状态 | [State](./features/state.md) | snapshot, save, restore, 快照, 场景还原 |
127
129
  | 多场景切换 / 沙盘 | [Multi-Work](./features/multi-work.md) | sandbox, 多户型, 拼接, workCode |
@@ -0,0 +1,296 @@
1
+ # Flowing Fireworks 3D Pass (流光烟花 3D 通道)
2
+
3
+ - **Summary**: `FlowingFireworks3DPass` 与 [`FlowingLight3DPass`](./flowing-light-3d-pass.md) 配套使用,在每条流光线条的「尾部位置」(渐变淡出处)持续喷射出烟花状向四周发散的粒子,适合为流光拖尾增加飞溅火花、星点爆裂等增强效果。
4
+ - **Schema**: `FlowingFireworks3DPass` 类及 `FireworksLine` 数据结构。
5
+ - **Concepts**: GPU 粒子运动积分、环形缓冲发射、与流光尾部位置同步、加法混合发光。
6
+ - **Configuration**: 3D 路径点、颜色、动画周期、尾长比例、粒子数量/发射率/扩散/重力等调优参数。
7
+ - **Examples**: 流光拖尾火花、多条 3D 路径烟花、与 FlowingLight3DPass 配合、参数调优。
8
+
9
+ ## Schema
10
+
11
+ > **Definition**: [FlowingFireworks3DPass](../../five/renderer/postprocessing/passes/flowing-fireworks-3d-pass.d.ts)
12
+
13
+ `FlowingFireworks3DPass` 继承自 `FivePass`,与 `FlowingLight3DPass` 共享同一套线条数据结构(`points` / `totalLength` / `duration` / `startTime` / `tailLengthRatio`),并额外提供烟花粒子调优参数。核心接口如下:
14
+
15
+ ```ts
16
+ import * as THREE from 'three';
17
+ import { FivePass } from './pass';
18
+ import { type Camera } from '../../../core/camera';
19
+
20
+ type FireworksLine = {
21
+ id?: string; // 可选的唯一标识符,不传则自动生成 UUID
22
+ points: THREE.Vector3[]; // 世界坐标系路径点
23
+ totalLength: number; // 路径总长度(世界单位)
24
+ color: THREE.Color; // 粒子颜色
25
+ opacity?: number; // 粒子不透明度(0-1)
26
+ tailLengthRatio?: number; // 尾巴长度比例(0-1),默认 0.2,与 FlowingLight3DPass 含义一致
27
+ duration?: number; // 动画周期(毫秒),默认 1000
28
+ startTime?: number; // 线条开始时间(毫秒),默认使用当前内部时间
29
+
30
+ // ---- 烟花粒子调优参数(可选) ----
31
+ particleCount?: number; // 该线条的粒子池大小,默认 200
32
+ emissionRate?: number; // 每秒发射的粒子数量,默认 300
33
+ spread?: number; // 扩散尺度(世界单位),默认 0.1
34
+ particleSize?: number; // 粒子尺寸(世界单位),默认 spread * 0.12
35
+ particleLife?: number; // 粒子最大寿命(秒),默认 0.5
36
+ gravity?: THREE.Vector3; // 粒子加速度(世界单位/秒²),默认沿 -Y 缓慢下落
37
+ leadRatio?: number; // 发射点相对尾部向前(头部方向)的提前比例,默认 0.04
38
+ };
39
+
40
+ export class FlowingFireworks3DPass extends FivePass {
41
+ constructor(camera: Camera);
42
+
43
+ // 批量设置路径列表(替换所有现有线条)
44
+ public setLines(lines: FireworksLine[]): void;
45
+
46
+ // 追加一条或多条线,返回生成的 id 数组
47
+ public addLine(...lines: FireworksLine[]): string[];
48
+
49
+ // 按 id 移除一条或多条线,返回实际移除的数量
50
+ public removeLine(...ids: string[]): number;
51
+
52
+ // 修改单条线的参数(通过 id),支持部分更新
53
+ public setLine(params: { id: string } & Partial<Omit<FireworksLine, 'id'>>): void;
54
+
55
+ public render(
56
+ renderer: THREE.WebGLRenderer,
57
+ writeBuffer: THREE.WebGLRenderTarget,
58
+ readBuffer: THREE.WebGLRenderTarget,
59
+ deltaTime: number,
60
+ maskActive?: boolean,
61
+ ): void;
62
+
63
+ public dispose(): void;
64
+ }
65
+ ```
66
+
67
+ ## Concepts
68
+
69
+ ### 与流光尾部同步 (Tail-synced Emission)
70
+ 该 Pass 的粒子发射点与 `FlowingLight3DPass` 的「尾部位置」(`tailPosWorld`)保持一致:
71
+
72
+ - 流光的头部(Head)是前进方向的亮端,尾部(Tail)是渐变淡出的末端。
73
+ - `tailLengthRatio` 表示从头部到渐变结束所占路径比例(默认 0.2)。粒子在「渐变结束的位置」喷射,即 `headPos - tailLengthRatio * totalLength`。
74
+ - 把本 Pass 与 `FlowingLight3DPass` 配置**完全相同**的线条数据(`points`/`totalLength`/`duration`/`startTime`/`tailLengthRatio`),即可让烟花精准跟随流光尾部。
75
+
76
+ ### 提前量 (Lead Ratio)
77
+ 由于尾部沿路径滞后于头部,在视觉上粒子有时会显得「晚一拍」。`leadRatio` 让发射点相对尾部向头部方向提前一小段(占 `totalLength` 的比例,默认 0.04),使火花出现时机更早。提前量会被限制在当前尾长以内,不会越过头部。设为 `0` 即严格在尾部位置喷射。
78
+
79
+ ### GPU 粒子运动积分 (GPU Particle Integration)
80
+ 每个粒子在 CPU 端发射时仅写入「出生世界坐标 / 初速度 / 加速度 / 出生时间 / 寿命」等属性,后续运动完全在顶点着色器中按 `p = p0 + v·t + ½·a·t²` 积分计算,并随寿命淡出与缩小。CPU 每帧只需计算尾部位置并发射少量新粒子,性能开销低。
81
+
82
+ ### 环形缓冲发射 (Ring-buffer Emission)
83
+ 每条线条拥有独立的粒子池(`particleCount`),按环形缓冲循环复用槽位。`emissionRate`(粒子/秒)结合每帧 `deltaTime` 决定发射数量,寿命到期的粒子自动被新粒子覆盖。
84
+
85
+ ### 加法混合发光 (Additive Glow)
86
+ 粒子使用 `AdditiveBlending` 渲染到离屏缓冲并累加,再叠加到场景输出,自然形成重叠处更亮的发光效果。粒子为圆形柔光点,中心亮、边缘柔和。
87
+
88
+ ### 相机同步与 DPR
89
+ 与 `FlowingLight3DPass` 一致,Pass 自动同步相机投影/视图矩阵,并根据 `readBuffer` 尺寸自动调整离屏渲染目标,适配高 DPR 屏幕。
90
+
91
+ ## Configuration
92
+
93
+ ### FireworksLine 配置参数
94
+
95
+ | Parameter | Type | Required | Default | Description |
96
+ | :--- | :--- | :--- | :--- | :--- |
97
+ | `id` | `string` | | 自动生成 UUID | 唯一标识符,用于 `setLine` 更新单条线。 |
98
+ | `points` | `THREE.Vector3[]` | ✓ | - | 世界坐标系路径点数组。至少 2 个点。 |
99
+ | `totalLength` | `number` | ✓ | - | 路径总长度(世界单位)。通常为相邻点间距离之和。 |
100
+ | `color` | `THREE.Color` | ✓ | - | 粒子颜色(RGB)。 |
101
+ | `opacity` | `number` | | `1.0` | 粒子不透明度(0-1)。 |
102
+ | `tailLengthRatio` | `number` | | `0.2` | 尾巴长度比例(0-1)。决定粒子喷射点(渐变结束处)相对头部的距离。 |
103
+ | `duration` | `number` | | `1000` | 动画周期(毫秒)。尾部完成一个循环所需时长。 |
104
+ | `startTime` | `number` | | 当前内部时间 | 线条开始时间(毫秒)。可用于多条线错开起始时间。 |
105
+ | `particleCount` | `number` | | `200` | 该线条粒子池大小。越大可同时存在的火花越多。 |
106
+ | `emissionRate` | `number` | | `300` | 每秒发射的粒子数量。控制火花密度。 |
107
+ | `spread` | `number` | | `0.1` | 扩散尺度(世界单位)。控制火花向四周飞散的范围。 |
108
+ | `particleSize` | `number` | | `spread * 0.12` | 粒子尺寸(世界单位)。 |
109
+ | `particleLife` | `number` | | `0.5` | 粒子最大寿命(秒)。越长火花拖得越远。 |
110
+ | `gravity` | `THREE.Vector3` | | 沿 -Y 缓慢下落 | 粒子加速度(世界单位/秒²)。可制造下坠或上升效果。 |
111
+ | `leadRatio` | `number` | | `0.04` | 发射点相对尾部的提前比例(占 `totalLength`)。增大可让火花更早出现,`0` 表示严格在尾部。 |
112
+
113
+ > **注意**: `spread` / `particleSize` / `gravity` 均为世界坐标单位,需要结合场景尺度调整。默认值适配米级小场景,大场景应相应放大。
114
+
115
+ ## Instance Methods
116
+
117
+ ### `constructor(camera: Camera)`
118
+ 初始化 Pass,需传入相机以获取投影矩阵和视图矩阵。
119
+
120
+ ### `setLines(lines: FireworksLine[])`
121
+ 批量设置路径列表,替换所有现有线条。
122
+
123
+ **自动生成 ID**: 没有 `id` 时自动生成 UUID。
124
+ **自动设置 startTime**: 没有 `startTime` 时使用当前内部时间。
125
+
126
+ ```ts
127
+ pass.setLines([{
128
+ points: path,
129
+ totalLength: 12,
130
+ color: new THREE.Color(0xff6600),
131
+ duration: 3000,
132
+ tailLengthRatio: 0.2,
133
+ }]);
134
+ ```
135
+
136
+ ### `addLine(...lines: FireworksLine[]): string[]`
137
+ 追加一条或多条线,返回新增线条的 id 数组,不影响已有线条。
138
+
139
+ ### `removeLine(...ids: string[]): number`
140
+ 按 id 移除一条或多条线,返回实际移除的数量。id 不存在时输出警告。
141
+
142
+ ### `setLine(params: { id: string } & Partial<Omit<FireworksLine, 'id'>>)`
143
+ 通过 `id` 部分更新单条线。
144
+
145
+ **性能说明**:
146
+ - 大多数字段(`points`、`color`、`totalLength`、`duration`、`spread`、`gravity` 等)会在下一帧发射时即时生效,**无需重建**。
147
+ - 仅当 `particleCount` 改变时才会重建粒子缓冲。
148
+
149
+ ```ts
150
+ // 即时生效,无需重建
151
+ pass.setLine({ id: 'line-1', color: new THREE.Color(0x00ff00), emissionRate: 500 });
152
+
153
+ // 改变粒子池大小,会重建缓冲
154
+ pass.setLine({ id: 'line-1', particleCount: 400 });
155
+ ```
156
+
157
+ ### `render(...)`
158
+ 由 EffectComposer 自动调用,无需手动调用。自动同步相机矩阵与渲染目标尺寸。
159
+
160
+ ### `dispose()`
161
+ 释放粒子缓冲、着色材质、渲染目标等资源,销毁 Pass 时必须调用。
162
+
163
+ ## Examples
164
+
165
+ ### 与 FlowingLight3DPass 配合(推荐)
166
+
167
+ 烟花跟随流光尾部的标准用法:为两个 Pass 配置**相同**的线条数据。
168
+
169
+ ```typescript
170
+ import { Five } from '@realsee/five';
171
+ import { FlowingLight3DPass, FlowingFireworks3DPass } from '../../lib/five/renderer/postprocessing';
172
+ import { calculatePath3DLength } from '@realsee/five/plugins';
173
+ import * as THREE from 'three';
174
+
175
+ const five = new Five();
176
+
177
+ const flowingLight = new FlowingLight3DPass(five.camera);
178
+ const fireworks = new FlowingFireworks3DPass(five.camera);
179
+
180
+ const path = [
181
+ new THREE.Vector3(-5, 0, 0),
182
+ new THREE.Vector3(-2, 3, 2),
183
+ new THREE.Vector3(2, 3, -2),
184
+ new THREE.Vector3(5, 0, 0),
185
+ ];
186
+
187
+ const lineData = {
188
+ points: path,
189
+ totalLength: calculatePath3DLength(path),
190
+ color: new THREE.Color(0xff00ee),
191
+ duration: 8000,
192
+ tailLengthRatio: 0.2,
193
+ };
194
+
195
+ flowingLight.setLines([lineData]);
196
+ fireworks.setLines([lineData]); // 相同数据 => 烟花精准跟随流光尾部
197
+
198
+ // 注意添加顺序:烟花叠加在流光之上
199
+ five.addPass(flowingLight);
200
+ five.addPass(fireworks);
201
+
202
+ function animate() {
203
+ requestAnimationFrame(animate);
204
+ five.render();
205
+ }
206
+ animate();
207
+ ```
208
+
209
+ ### 多条 3D 路径烟花
210
+
211
+ ```typescript
212
+ const fireworks = new FlowingFireworks3DPass(camera);
213
+
214
+ fireworks.setLines([
215
+ {
216
+ points: [new THREE.Vector3(0, 0, 0), new THREE.Vector3(10, 5, 0)],
217
+ totalLength: 11,
218
+ color: new THREE.Color(0xff0000),
219
+ duration: 2000,
220
+ },
221
+ {
222
+ points: [new THREE.Vector3(0, 0, 0), new THREE.Vector3(0, 10, 5)],
223
+ totalLength: 12,
224
+ color: new THREE.Color(0x00ff00),
225
+ duration: 2500,
226
+ startTime: 500,
227
+ },
228
+ ]);
229
+ ```
230
+
231
+ ### 参数调优:更密集、飞溅更远的火花
232
+
233
+ ```typescript
234
+ fireworks.setLines([{
235
+ points: path,
236
+ totalLength: calculatePath3DLength(path),
237
+ color: new THREE.Color(0xffaa00),
238
+ duration: 6000,
239
+ emissionRate: 600, // 更密集
240
+ spread: 0.25, // 飞散更广
241
+ particleLife: 0.9, // 拖得更远
242
+ particleSize: 0.04,
243
+ gravity: new THREE.Vector3(0, -0.5, 0), // 明显下坠
244
+ leadRatio: 0.08, // 出现更早
245
+ }]);
246
+ ```
247
+
248
+ ### 调整火花出现时机
249
+
250
+ ```typescript
251
+ // 视觉上火花偏晚 => 增大 leadRatio 让其更早出现
252
+ pass.setLine({ id: lineId, leadRatio: 0.1 });
253
+
254
+ // 严格落在流光尾部(渐变结束处)
255
+ pass.setLine({ id: lineId, leadRatio: 0 });
256
+ ```
257
+
258
+ ## Debugging
259
+
260
+ - **看不到粒子**: 检查路径是否在相机视锥内;确认 `color` / `opacity` 非全透明;确认已调用 `addPass`。
261
+ - **火花太稀疏**: 增大 `emissionRate` 或 `particleCount`(注意 `particleCount` 是上限,过小会限制同时存在的粒子数)。
262
+ - **火花范围太小/太大**: 调整 `spread`(世界单位),需结合场景尺度。
263
+ - **火花出现偏晚/偏早**: 调整 `leadRatio`(增大更早,`0` 严格在尾部)。
264
+ - **位置与流光尾部不一致**: 确认两个 Pass 使用了**完全相同**的 `points`/`totalLength`/`duration`/`startTime`/`tailLengthRatio`。
265
+ - **粒子不下落或方向不对**: 检查 `gravity` 向量;默认沿 -Y(世界上方向取决于场景坐标系)。
266
+
267
+ ## Performance
268
+
269
+ - **GPU 积分**: 粒子运动全部在着色器中完成,CPU 每帧只发射少量新粒子,开销低。
270
+ - **环形缓冲**: 粒子池大小固定(`particleCount`),不会随时间增长,显存稳定。
271
+ - **加法混合**: 重叠粒子会累加亮度,过高的 `emissionRate` × `particleCount` 会增加片元填充率,建议按需调节。
272
+
273
+ ### 优化建议
274
+ 1. 控制 `particleCount` 与 `emissionRate`,避免不必要的高密度。
275
+ 2. 大场景适当放大 `spread` / `particleSize`,小场景调小,保持视觉比例。
276
+ 3. 使用 `setLine` 而非 `setLines` 更新单条线;除 `particleCount` 外的修改无需重建。
277
+ 4. 低端设备可通过 `pass.enabled = false` 禁用。
278
+
279
+ ## Common Pitfalls
280
+
281
+ 1. **数据不一致**: 烟花与流光必须共享相同的线条参数,否则尾部位置不对齐。
282
+ 2. **添加顺序**: 应在流光 Pass 之后 `addPass` 烟花 Pass,使火花叠加在流光之上。
283
+ 3. **单位混淆**: `spread` / `particleSize` / `gravity` 为世界单位,`totalLength` 也是世界单位,不要混用像素。
284
+ 4. **particleCount 过小**: 它是同时存在粒子数的上限,过小会使高 `emissionRate` 失效。
285
+ 5. **未调用 dispose()**: 销毁 Pass 时必须调用 `dispose()`,避免 GPU 资源泄漏。
286
+
287
+ ## Related
288
+
289
+ * [Flowing Light 3D Pass](./flowing-light-3d-pass.md): 3D 流光效果,本 Pass 的配套来源。
290
+ * [Flowing Light 2D Pass](./flowing-light-2d-pass.md): 屏幕空间的流光效果。
291
+ * [Postprocessing](./postprocessing.md): 后处理通用概念与 EffectComposer 使用指南。
292
+
293
+ ---
294
+
295
+
296
+ tags: [烟花, 火花, 粒子, 流光拖尾, 发散, 爆裂, 特效, postprocessing, effect, fireworks, particle, sparks, flowing, pass, rendering, worldspace, 3d, world-space, additive, gpu-particles]
@@ -472,6 +472,7 @@ setInterval(() => {
472
472
 
473
473
  * [Postprocessing](./postprocessing.md): 后处理通用概念与 EffectComposer 使用指南。
474
474
  * [Flowing Light 2D Pass](./flowing-light-2d-pass.md): 屏幕空间的流光效果。
475
+ * [Flowing Fireworks 3D Pass](./flowing-fireworks-3d-pass.md): 在流光尾部喷射烟花粒子的配套特效。
475
476
 
476
477
  ---
477
478
 
@@ -82,11 +82,12 @@ Five 默认挂载了两个 Pass 实例,挂载在 `five` 实例上,默认是
82
82
 
83
83
  ### 3. Optional Built-in Passes (可选内置 Pass)
84
84
 
85
- Five 新增了三个可选使用的内置 Pass,这些 Pass 没有预先挂载在 `five` 实例上,需手动导入并添加到渲染链中:
85
+ Five 新增了多个可选使用的内置 Pass,这些 Pass 没有预先挂载在 `five` 实例上,需手动导入并添加到渲染链中:
86
86
 
87
87
  * **[GaussianBlurPass](gaussian-blur-pass.md)**: 高斯模糊效果。
88
88
  * **[FlowingLight2DPass](flowing-light-2d-pass.md)**: 2D 流光效果(通常用于平面路线流光)。
89
89
  * **[FlowingLight3DPass](flowing-light-3d-pass.md)**: 3D 流光效果(通常用于空间路径流光)。
90
+ * **[FlowingFireworks3DPass](flowing-fireworks-3d-pass.md)**: 在 3D 流光尾部喷射烟花粒子的配套特效。
90
91
 
91
92
  #### GaussianBlurPass 使用示例
92
93
 
@@ -249,6 +250,7 @@ class FogPass extends FivePass {
249
250
  * [Gaussian Blur Pass](gaussian-blur-pass.md): 高斯模糊 Pass 文档。
250
251
  * [Flowing Light 2D Pass](flowing-light-2d-pass.md): 2D 流光 Pass 文档。
251
252
  * [Flowing Light 3D Pass](flowing-light-3d-pass.md): 3D 流光 Pass 文档。
253
+ * [Flowing Fireworks 3D Pass](flowing-fireworks-3d-pass.md): 流光烟花粒子 Pass 文档。
252
254
  * [five.ts](../../five/application/five.d.ts): 查看 `addPass` 方法的实现。
253
255
  * [pass.ts](../../five/renderer/postprocessing/passes/pass.d.ts): 查看 `FivePass` 基类定义。
254
256
 
@@ -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 = "eJy1nWlz20bSx7+L9m2UTQSv4807iZJsbySLS8rH1lbKNSSGFCIQg+CQpTy13/2pwTlHT3dDgt8S//71YNBzH/zv/x1V8rE6+vVodXF6fn1x9MNRLqq7o1+PYrWtDzKryr+3T368qw7p0Q9H90kWH/36Jnrz5vVPb/73w2AvkuNYbY/3dRLLNMlkCaE8EUnNE5CTJ5TlPlVlKYonyLx/RjGSrCoUBGgeUNZ/1sn2/risRFFBDOMxRSrrPFcwpXtEESp5yFNRSQjRP6MYOymqumg+7PYuSeNCZke//nd4HMVVkoIOesOvrYTysxUHWYhjkSUHUSUqQ5GumISnSZ7LAme2GhKlVBEnmajkcflUVvKAQ101hZcPMgM/+YBsFORXSx7wj6IFJCRV35Jsf7xLCvlNFfflcRQf56IEC/lIDllx3aXJ/q46PpngyrKY5mbKG1kWZE0k6rJMRHa8SeuC9uHLSQey1KY4tdXQqOq43BZSZsd58ihTIqmumqxQD2Ivj1WuSyqOtpQUNlUiPpaPlSwykR4fVCxTFA7oWS7yQu0LSXw/S0lhD6KSRSLw5PYiEqZiPAi0gAMhksPJr4N6kMe5yNSx3O3kFq/IXDEJr9MqOdZVCo4dZBSw8b1L0opoGQwdC0m2iIOKhasfaFj9QKMKcZD0q3YqEpfW+wRvpFsJCVJllRdqK8syyfY40JJS4EI8bUWJh2CnIVHyz1qWlS7fj2DXcgSaSrKD11WihfqDKiu2lARXgU7fyKsYXb+HRH47TsUTETOjjAKSZTdcan+3PkcqRSm/ZqoK9ktf//ga8mSZfn3942sqya9//IXD+YXmvOFw3tBvb3ftDiquU1n+3e/PncAZ80ml9UEuU5HJ91kli9IKPZnVhw4GCZ3UGak6jUVeJQ/yqj4kmci2cmn1eLapKMs+maDWRv98YsH7fv6lrp2ulMpDZE+IYc9UncVJtr+W5V0AaEow1KIZkAQg7UPM/KJpABfqkKvSLG0WxhahuCd5rg7ySvdXk2yPfApAiYEvZbW9Cyawe4oCrOC1rb0I9k2RN+kfU4iVzGJZhN/BkKCodkzQZNzJOZYuT8jFRlxsRGPrNF03Tci/axGHkJYIw73tBitnaV0gaXRlGPJdUlZqX4hDgDU8xyBNPZWJ9LPcvL0iPjSoxeDXdhfZgl37nWPAeL2VWSj6RwGOsadGHIQ/FWKbf5CVbmHX9abcFskmlBZXhiGXIlOLpNimEqlFbREft6jLSoUiApLy0WuVJqGCAChxsNezdnBgn9qBnF0vVFaJJAtzDImH+qHV6s6FzAu5FZWMjxx+k0XrOxGjLgwVkeC3hapDLXH/+DkJfbu+2dg9Yg/dKYgEYiHZPmUArr3BOgS6BkfrHlCH1qUz4nRxo4aCqSSrFqmqg4Fsatgw+oV9LQFf3ydZJmP8exgiAvcxj0UlxSYN1WCWBoNhVTJZG1P1KKsCvZWPeuxzpZBiaWlQWBLMkltvusE3jc4R4+icMl+I7R3mvnlOQT5Y01ke44M3meUjVu0gfL29k3pwFMxVQEqhSxmqlbqnKKAQutJS5vKUzRgEPAyWV5YIw322BuUW5LM3HPdNV7JU6YOMbzalLB6CmQ1JMfSX1VldVcG+Tv8YHTXGsS7+bluS6I7fTmzH0aghc4bQ/3ht8v4QjzfuJLZHG0UoyxqoIjhLxyfqjoL+nQnu5Bj/TJTywl6ccpmDhOQ8VjJrcp1DtMUouxutt1MXCNbS4cRHPvSRz22nBJaqRICjBiXVacpInSXDeOeF2Kowp3mM2TcfaSHSdCO292GOJcN4ekD+Pkuq02KPFDtTRdF0M0qWY0eIMlOlijwVmS5FhUpTWbSdaEayKVPM79t2cY8oQqaKQWu6dmYtHuB1Ooz4Xi/mkRltqkjax9XVtcjzJMMy1VVyqLxkjkKU2c+WEl/G1rGI1uA/yPNmAQI0uzsexPkdcoT3vqcwwYMe8/Db7ZeTME8/xayvlCqlHlTZPR0XY8lIHoPF5ujCbo23grhOyaI681VBJjB3FSD6XbwgFO7iBbg60wtxEAxuL2VxPyWxRJoyW8cifk6qu4vHqkiyMtkitUXAAPNxLXK9kDa9DSEMUZ8qlos7ke2pRsQRUsz0GW+BmZH+GMlPeSknGwJTRdKaKQRO4kYhydQDTQ5y0OFE/SK/yacdPg6xdTjxoalFGRlpCTFmNyF9ulFFdVEUCqmBPCmDe5kUmySOZcZj23IGn8wKW8cgLvX2Al5qRymDq0fodbGl4gtS8+i5ykrJS7ilZtBvk4NUNTM+TDHGbmcFiOwwRBgLWrAgQwMx4vtidMoCBnwfE99k8js0yzATnZg2lCfiGw8SirMsZC7IUZmrpKi6zzO9UaUsOV6vknv5fM+YNeW9m/Vm5KSpxKndSly/bPFJpDVaKCA9y0M3Hcx1YMpZfC6YQSzR7+gu2zvWZ9eLdt88sArqwXwxxTYWIxlBBxtM8LFOVcV30KgJur+YBkDhVTSfZawzDjmIJxc2IfzoInUu8wqZHDBVDFq7nEnFrKdlkJfJ1t4FH6B2OoroLWwy8xkzJHyu5C7JZNzuvEGdWEqUis4rUzPKK7lPVMad9obUOF1vtSEqdUOEs9oFJW6tCOtRD/uNOBcVMjXRKzDKOr+TheTmKKTG6amo8EQOEpRj7xr2GP6WYcCe+LCjBiN17TnZ27N1KLFZwKaBpoziLYazXWvnIBiEddUU/Z20NwRAzFZDkUpZcWCDjMFjZeSoQ4nqmfNehCHqc1gcJzPGUWLUT4n8dmXvlndxg4Ti2Ac/IYx//tOhrJ4/bqBtMc+f5ebL6vRRlk01i7hxhCRzTAyL7MpRviruF/VGNss8CNeUUTwGi8ehlgeYKwOG7F8ltpDkCCkmDeNQiOUK1krFIKKTNMhYPKJY2zo+kZnMQUuR6QUa7tqMqaNTaSq51GWhKmRxxpNS3L7GolNrKrnUko8tOdyS6CeNGopkb/mDOP7OP59CLJWxVsnMGpd4PU/K5RJ9VE+Kc3k7KGwdTnx+m0vb4p7X+lSkysh3MXXUbrd+Cv72KTcyvXrKzd1upsgB/vTPX37+xwkC7bZosNidlnThHQELpx6UUg7sgZldLxhwX0aDH9lsQEnhobDS71uCLoJqvpsmxDgeRiEJrzfy0lrHMIHdQwpyIfTx4cs6c/bTGChbQgLxF+W/XnOGzTlYbYDGx3yQ/m4ETEumAMtKn9kkoa2MBHvH466SLAAHpVMcRHwHEdtB1ziEv78poGBXci+2T0PEgDxHQyKViFeyrFOEaEko4LW169zAXHs7zWHjFM6n9hEN0EWyXeMLYEYBE6ayXQI3QqaAB9OlyVtY8oiGioelgExUu+Xiwrmcw6KZEgrYraY7a+4GzhRMgfkbiAPQwBZiCN6Mp6Q5TWoz++fMdC67y144SXW1TBd99wdD9xom0ulA+zyo2xyE1dstMwccKdNBsMYynlMoHc0gQz/gGL+Pg+bvYxpQlP5EtoUZBSTs7Po0ze9EsAY2BQzYQqWqWFdPgZrUUjBwzW52FDcqGLhmB0ez0BoMA0/FwDZLdWehcDUFXFiz7kenFNJyXazvBAFuFGxc8hdBS/7iwG4LkZVJsBttKUicKqvlcLtPOCM9GQWGViiDQ6uQmHbSHCS0h5T2iN/yElBTbtbbpCwDbW33DERQp66hNcdgHoXEZOL787BN3/Va5DDdVVHY4WgpVs26IhZUn4rLnKVVlzlqOMjuw98U1qqTwzRFE6DDIVYqHwJ6jqtSVk2shrsRnorEDktsZH5DSgrvLAX9Jp9Ati+bCA5WWICOROvZXximn1Dm28FZeS53ok4rf/rxQRSJPlPZccMmtrPI9BPbRwUdZOyfFLSs76vHk6CxfojYLlc3X/7zdXHz4XZ1c3V1sfp68eniw+3XD6fXF+sgEzNCfI1XuJa36lMTf6OLXTdFNGSjp7XJr1+Z5EKKSp7LTb2Hr6Jy6bCe9OCEE0gFAssixV1UdMfgmmZ9p4pDEBsyQHzsZdWvbK+3wuxFOmxXiDDvpND5dKuuVLZPqjoOU32py6Va0eb60rV7bbPjxhQhCU/K0H4hl1diW4Ucpjue8VjQqMZi6ItOT6sozOgFBOMsisPB0wsIhr66DGVoAYPxFwn5i6Bcbh5RxuXmkSC8TasditACgrHc4Fm63FA5ukyfcEL6RBGyKlzX9AKCsc7xL7LOqe/xJcpRwpcoRwldBXCr3rWVAgJzpVMrjYO4D24NdJz5UuQl9L2wF3/W5sYRBzcoCEozRYFSGgVBWetTkPtkFw4wS4XSCvcArkcqoPO3FuWhaZ5v1bgxLxy3gBYhNzNTyh4+OcBRgnDgC7u8Gz//tm10Za9rSa9+/uer6KcQbnFXZ2afAIduezUH7fc1cXiip8JbfQjfrAxYZzBQenNVdX999kMvD8GbDeL+Jm8fm28OuSkMAdtNpM5+Jh+n73+O4v7ibQasvf7JG9yh5LSxGa9et92Y18ru02p3nCo41oyHzuADvmT2/HwdutDKRA0yG2pf43O+Ol3csGijEOO9vbq95OBGHUUL3Vbn0ug767SqqUsZaWt1GO323erigvu6jhj9IufGIMvYYeJ8Wmx3iXZEMrSIgqzkThYyCxxtdGmDGsMOOUEiB6WPM4tWai0492Uq9deW4cJkr1f3364x99en7S+ln7+V6iAr6M6xAdFLKFT4ZsABxbkQUOvWct/cgM1InSslQ/6rtjoJEA0FD9S7p4GDkpuPULvTTvZ4+Rk8TtTN/pjx1l68DzQR3QNW1OkFkH2hO5vthg57fsslQmrbzSvYzWdRZEm2X6jY2WXW3kSO8h1b2591O7ezwG8UZ9QBuO7v33ZlzWRz2YHZbf+0J7xnEGXT+91bsZ4/fR86uYJ7sOwxT9cJtDkAhbcmz9mGgmM5i6LDe01Cj2bkGgg0cY6ykUl0s9Drq/LcvWN+KS3BDWSBsjlOWvtVH4Ac5Vj9pw2w40MA2DDBIo1Vys3UEmU7vNcYwPFOx7V36LCKtU02DafVR26EDVx8ec0MrcV6fXLOaQUcITfIqK/mYulPt2jmtBu7ttNtp5vjAyK8uCVwvczUCLhYOk7o2HaZZIDTVaeXTH6t2ZwDmcIeLVjxHXHjO/o+8R09M76jCfEdgfEdzRzf0feJ7+g7xHc0f3xH3zG+o+fG9/lTJg7JdimqOz2k4ER60GSumA87mKnTHXYwU1CGHTC636K6e1EmjYCXlYKwhxnKA5L8GUsG8goTykj/XzXNTQn6r5AusqrQBxiGPVqcYjOFwipJ/WrP6enZ2ck5+ikn+ba5L+xVT/I8U/Ge5JNT4tE7EJ/llXNbIl1CJ7kMFFoz0PV4/VqU95xw9rVzVf8AeabAAMicz6/NyE4UwO7t0CkQUd4/h93bvbChAshzdKAA7AxtBpTYGRsLKNETWom2qxydv5OpvsWMUYRCFrzaX5QSmoQBvkbQj83APo5WtubP99T+iHrpWp4z9fjiV4NQmO+WcLPbWX/jMsWlSUCLvHp48ZezGZS31vx0U1aFCPzdCcujzcG82pjnebQf8L21CLqSYjo2cPw0zOad6bcVjxGB1/qEbw+G+V+pZg7yhfHsUmiPc8Q0REIbPveExRRn8BEM+16mZivRyVK552am+HEgtL9oDn8Rx99pHNsY+HQt6TLAoboA8MFg0hvvuHBzGm46W1tR6POkcP/fg4kfLNkuXj3fxyvKyYu++ZQP3Wqp9Q7CFfeIUf9nsS90CmMo5zbu2c5hzDTnLW6mJNgwcmW2q3suC/MfYZmOTWNyEKFPFISONDNaAMOa5cqvmae4ClTJnquPZXM3ygdVHEQK3AfP9AljKOddc6X/DOW0KIR3Aovb3g0AnsPopQ4jwqE1NCwSmVXsmUJQPtfsCgyfaYIFhs80qQ7D55iugMkzzFgEkjzjpEUg6RPmLfSpHj1fyFr7AcRzBSaEZqx2Ngrqj4poH8x/MGKVAsjLTGUAQs9RAiDuDPEPJnfG6AeTPSX2WzN50BPokgh9Tztb5PvkmepjgDxXIPrkWeLQx84RhkBi54xCINHTtpj0G4nCe+kMEbaDrpG1N+RjO/MsGcGLOGmLeGmLeGmL+Glb50VSAVvgLVorwlj9lXTxspA7sTmrdztZhPefD0sGmBnmz5u+IDdThixQL8UmqTppiaBNGcZrb79h5g0gRtmTMn5qfq/0coCMz9Qjzfa1+J5Ve18ucyY0bIb2dsadbEw/oAXpoi9+xD+cgNUJ789NjD1L/DfxLUgX098EssHcgHtMmO9E2GJu6bV/ZhqmgKhVcr18ynTry1+8A4OzqcIbL3FXLsJ2eE+q66Ay3QB6vOsjnpJsz+lXjUIMaF+jw0gwZIAvJNv13ggfT0GH6kiba19mItJtrXtfuiidnF/JbF+Bl6X0bNCA6yCa6iCiHRgVNYY1ZDgs4sEiGgZWUhgWNEAccLcxYT65DCQZ9v4PzJmtRJDQHCIGhvQY3q2UULYrRsDOuBrDOlIEOlYVNNXVelhzAFVIawW4H7g3Pzt1ETxGX1eqAMYQLaB5iPUA9cXWp036V9qgn+CHOxotM2SC1ZyNTZ4vC5WT6E5G4RYiexAlh2goKej77I92PfDWvvUa5NpitKkr2iv4b3ba7lIKfW82hocNMBd6AWO4pBw7h9Y6gORT8XoRoT1uMdHRaMj+Hm3AdRnhzmUAn8TSU7MklqWe9+D7MdSTvPA9TKAvC/WQxM3/yuROALt4TzqFfwtcCeijgR2ewKlRVXSVybXI34ksBe6PNKoyVzqNH063r2OR6QzxZCxucxUMnWBTxvl+p7kx4zpeImjVvTYn8hB1pdr6lCANOgLIgZGg9x/+dbG4fX/z4etydbPUFx+Ggb4WAddt7bXeSvOqChdpqlwYdUtWe0uhUctDPYvWjSfFuvyDtg8+DrfXkmCn0wETgc6Hey1iuDPVggYJgilpTMnA1FkpdvLr1+5j+n8H4kIDBq4LKgA681Nnk5TnzZRhr9HqFuIgCwFsvgpwHT3XwUo8bUVZYdEF6xkO6qKQWeX/9VvIga1nO3DmH3A6MAcBoZt1Kn+rTYBtqWl4c9c8CW1UNMzd4xygQduYIVxzn1ezfaaU24ofHQE7psOVFPET7zs6etoBVbVYMgauULpfdwJeM2oTeyUNbRoe979PAlhDywCz8pSZk6GLDS0Wcbfht6S607Iwp1egg+6ySrb30H1w3QPmwNuB9EPvHrKGYO7SXRfyicquknt4INXzXLE/eDLf8WH36L/fw+6R9W6nSbFL1Tf/3TSge4hOK6TWfLdp3TxCF9NEUSXWXmfTvH/KIbxdfsQhb5cfMc46V1Xzp1kwZXjMSUvwTxLN9FD/hmikm8XrdEzk7TcpM3SxwmFbBhwn0zxMxuskASMmN9Ws/9bpkkDgwiyrKJr/cDUURe9vreCiOPb6PtUSn5/TSFhOzbOQ7Xb36p0DVnONzyEs1CFXmbXnzfbhCclv5jetIzHQmsJpDI9J+8Sxhrb+yMsHwSMuewzqjjP+CLTzmgmKZx+SNJ5mH5AY1O8xHPHw8w5GTPzcQxGfPddAxCDPNQwxkC8ehBisSUMQggX84XoQ1R/G5SB77awDJdfJdxomuW4mDZKwUY0BnjqmIXDAhNukUYyJ4o9hwNvUDRT8jyO//+/3/wfI2QPC"