@realsee/five 6.8.0 → 6.8.2

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 (229) hide show
  1. package/ai_guides/features/flowing-light-2d-pass.md +64 -10
  2. package/ai_guides/features/flowing-light-3d-pass.md +64 -10
  3. package/docs/assets/hierarchy.js +1 -1
  4. package/docs/assets/navigation.js +1 -1
  5. package/docs/assets/search.js +1 -1
  6. package/docs/classes/five.AdaptiveLuminancePass.html +1 -1
  7. package/docs/classes/five.BoundingMesh.html +1 -1
  8. package/docs/classes/five.Camera.html +1 -1
  9. package/docs/classes/five.EyeDomeLightingPass.html +1 -1
  10. package/docs/classes/five.Five.html +1 -1
  11. package/docs/classes/five.FivePass.html +1 -1
  12. package/docs/classes/five.InternalWebGLRenderer.html +1 -1
  13. package/docs/classes/five.Model.html +1 -1
  14. package/docs/classes/five.ModelScene.html +1 -1
  15. package/docs/classes/five.NetworkSubscribe.html +1 -1
  16. package/docs/classes/five.PBMContainer.html +1 -1
  17. package/docs/classes/five.PBMCustomShader.html +1 -1
  18. package/docs/classes/five.PBMGSObject.html +1 -1
  19. package/docs/classes/five.PBMGroup.html +1 -1
  20. package/docs/classes/five.PBMMesh.html +1 -1
  21. package/docs/classes/five.PBMMeshMaterial.html +1 -1
  22. package/docs/classes/five.PBMPanoFilter.html +1 -1
  23. package/docs/classes/five.PBMPointCloud.html +1 -1
  24. package/docs/classes/five.PBMPointCloudMaterial.html +1 -1
  25. package/docs/classes/five.PBMSkinnedMesh.html +1 -1
  26. package/docs/classes/five.PBMUpdateable.html +1 -1
  27. package/docs/classes/five.PanoCircleMesh.html +1 -1
  28. package/docs/classes/five.PanoCircleMeshCustom.html +1 -1
  29. package/docs/classes/five.PanoCircleMeshSolid.html +1 -1
  30. package/docs/classes/five.Parameter.html +1 -1
  31. package/docs/classes/five.Scene.html +1 -1
  32. package/docs/classes/five.Subscribe.html +1 -1
  33. package/docs/classes/five.Tile3D.html +1 -1
  34. package/docs/classes/five.TileNode.html +1 -1
  35. package/docs/classes/five.TrajectoryNode.html +1 -1
  36. package/docs/classes/five.WorkResolvedObserver.html +1 -1
  37. package/docs/classes/gltf-loader.DDSLoader.html +1 -1
  38. package/docs/classes/gltf-loader.DRACOLoader.html +1 -1
  39. package/docs/classes/gltf-loader.GLTFLoader.html +1 -1
  40. package/docs/classes/gltf-loader.GLTFObject.html +1 -1
  41. package/docs/classes/gltf-loader.THREEGLTFLoader.html +1 -1
  42. package/docs/classes/line.Line.html +1 -1
  43. package/docs/classes/line.LineGeometry.html +1 -1
  44. package/docs/classes/line.LineMaterial.html +1 -1
  45. package/docs/classes/line.LineSegmentsGeometry.html +1 -1
  46. package/docs/classes/line.THREE_Line2.html +1 -1
  47. package/docs/classes/line.THREE_LineSegments2.html +1 -1
  48. package/docs/classes/plugins.BasePlugin.Controller.html +1 -1
  49. package/docs/classes/plugins.CSS2DObject.html +10 -0
  50. package/docs/classes/plugins.CSS2DRenderer.html +7 -0
  51. package/docs/classes/plugins.CSS3DObject.html +1 -1
  52. package/docs/classes/plugins.CSS3DSprite.html +1 -1
  53. package/docs/classes/plugins.InstancedPrefabBufferGeometry.html +18 -0
  54. package/docs/classes/plugins.Object3DHelperController.html +1 -1
  55. package/docs/classes/plugins.PointBufferGeometry.html +12 -0
  56. package/docs/classes/plugins.PrefabBufferGeometry.html +24 -0
  57. package/docs/classes/plugins.RoundedBoxGeometry.html +1 -1
  58. package/docs/classes/sticker.Sticker.html +1 -1
  59. package/docs/classes/vfx.Airflow.html +1 -1
  60. package/docs/classes/vfx.Flame.html +1 -1
  61. package/docs/classes/vfx.Particle.html +1 -1
  62. package/docs/classes/vfx.ParticleGPU.html +1 -1
  63. package/docs/classes/vfx.SpotLight.html +1 -1
  64. package/docs/documents/features_flowing-light-2d-pass.html +28 -15
  65. package/docs/documents/features_flowing-light-3d-pass.html +27 -14
  66. package/docs/functions/plugins.CSS2DPlugin.html +1 -0
  67. package/docs/functions/react.getPlugin.html +2 -0
  68. package/docs/functions/react.setPlugin.html +2 -0
  69. package/docs/functions/react.useFivePlugin.html +9 -0
  70. package/docs/functions/react.withFive.html +1 -1
  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 +1 -1
  75. package/docs/interfaces/five.BaseExtendableEvent.html +1 -1
  76. package/docs/interfaces/five.EventCallback.html +1 -1
  77. package/docs/interfaces/five.GestureEvent.html +13 -13
  78. package/docs/interfaces/five.GesturePointer.html +9 -9
  79. package/docs/interfaces/five.ImageOptions.html +1 -1
  80. package/docs/interfaces/five.IntersectEvent.html +1 -1
  81. package/docs/interfaces/five.IntersectMesh.html +1 -1
  82. package/docs/interfaces/five.IntersectMeshInterface.html +1 -1
  83. package/docs/interfaces/five.Intersection.html +1 -1
  84. package/docs/interfaces/five.LooseWorkWithExtrinsics.html +1 -1
  85. package/docs/interfaces/five.ModeChangeEvent.html +2 -2
  86. package/docs/interfaces/five.ModelControllerCustomInitArgs.html +1 -1
  87. package/docs/interfaces/five.ModelEvent.html +3 -3
  88. package/docs/interfaces/five.ModelSceneEvent.html +2 -2
  89. package/docs/interfaces/five.ModelTileEvent.html +3 -3
  90. package/docs/interfaces/five.MovePanoOptions.html +1 -1
  91. package/docs/interfaces/five.NetworkAbortError.html +1 -1
  92. package/docs/interfaces/five.NetworkFirbiddenError.html +1 -1
  93. package/docs/interfaces/five.NetworkOptions.html +1 -1
  94. package/docs/interfaces/five.NetworkProxyError.html +1 -1
  95. package/docs/interfaces/five.NetworkResourceEvent.html +2 -2
  96. package/docs/interfaces/five.NetworkResponseError.html +1 -1
  97. package/docs/interfaces/five.NetworkTimeoutError.html +1 -1
  98. package/docs/interfaces/five.ObjectEvent.html +2 -2
  99. package/docs/interfaces/five.PBMMaterial.html +1 -1
  100. package/docs/interfaces/five.PBMMeshMaterialParameters.html +1 -1
  101. package/docs/interfaces/five.PBMPointCloudMaterialParameters.html +1 -1
  102. package/docs/interfaces/five.PanoCircleMeshInterface.html +1 -1
  103. package/docs/interfaces/five.PanoEvent.html +1 -1
  104. package/docs/interfaces/five.PanoPrepareEvent.html +8 -4
  105. package/docs/interfaces/five.PanoTextureEvent.html +5 -5
  106. package/docs/interfaces/five.PanoramaControllerCustomInitArgs.html +9 -9
  107. package/docs/interfaces/five.PanoramaLikeControllerCustomInitArgs.html +1 -1
  108. package/docs/interfaces/five.ParameterMaterialValue.html +1 -1
  109. package/docs/interfaces/five.ParameterTilesetValue.html +1 -1
  110. package/docs/interfaces/five.ParameterValue.html +1 -1
  111. package/docs/interfaces/five.Pose.html +1 -1
  112. package/docs/interfaces/five.RenderEvent.html +2 -2
  113. package/docs/interfaces/five.ResolvedParameterValue.html +1 -1
  114. package/docs/interfaces/five.State.html +1 -1
  115. package/docs/interfaces/five.StateEvent.html +1 -1
  116. package/docs/interfaces/five.TextureOptions.html +1 -1
  117. package/docs/interfaces/five.TopviewControllerCustomInitArgs.html +1 -1
  118. package/docs/interfaces/five.VRPanoramaControllerCustomInitArgs.html +9 -9
  119. package/docs/interfaces/five.ViewLayer.html +1 -1
  120. package/docs/interfaces/five.WorkCubeImage.html +1 -1
  121. package/docs/interfaces/five.WorkImage.html +1 -1
  122. package/docs/interfaces/five.WorkObserver.html +1 -1
  123. package/docs/interfaces/five.WorkObserverProto.html +1 -1
  124. package/docs/interfaces/five.WorkTile.html +1 -1
  125. package/docs/interfaces/five.WorksEvent.html +3 -3
  126. package/docs/interfaces/five.XRControllerEvent.html +4 -4
  127. package/docs/interfaces/five.XRControllerState.html +4 -4
  128. package/docs/interfaces/five.XRGestureEvent.html +7 -7
  129. package/docs/interfaces/five.XRPanoramaControllerCustomInitArgs.html +9 -9
  130. package/docs/interfaces/five.XRSessionEvent.html +3 -3
  131. package/docs/interfaces/plugins.BackgroundPluginController.html +1 -1
  132. package/docs/interfaces/plugins.BackgroundPluginType.EventMap.html +1 -1
  133. package/docs/interfaces/plugins.BasePlugin.State.html +1 -1
  134. package/docs/interfaces/plugins.CSS2DPluginController.html +49 -0
  135. package/docs/interfaces/plugins.CSS2DPluginType.Config.html +2 -0
  136. package/docs/interfaces/plugins.CSS2DPluginType.CreateCSS2DObjectType.html +8 -0
  137. package/docs/interfaces/plugins.CSS2DPluginType.EventMap.html +10 -0
  138. package/docs/interfaces/plugins.CSS2DPluginType.Params.html +4 -0
  139. package/docs/interfaces/plugins.CSS2DPluginType.State.html +8 -0
  140. package/docs/interfaces/plugins.CSS2DRendererParameters.html +2 -0
  141. package/docs/interfaces/plugins.CSS3DPluginController.html +12 -12
  142. package/docs/interfaces/plugins.CSS3DPluginType.EventMap.html +1 -1
  143. package/docs/interfaces/plugins.CSS3DPluginType.State.html +1 -1
  144. package/docs/interfaces/plugins.DynamicPathLinePluginController.html +1 -1
  145. package/docs/interfaces/plugins.DynamicPathLinePluginType.EventMap.html +1 -1
  146. package/docs/interfaces/plugins.DynamicPathLinePluginType.State.html +1 -1
  147. package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationController.html +1 -1
  148. package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.EventMap.html +1 -1
  149. package/docs/interfaces/plugins.GaussianSplattingEntranceAnimationPluginType.State.html +1 -1
  150. package/docs/interfaces/plugins.ItemMaskController.html +1 -1
  151. package/docs/interfaces/plugins.ItemMaskPluginType.EventMap.html +1 -1
  152. package/docs/interfaces/plugins.ItemMaskPluginType.State.html +1 -1
  153. package/docs/interfaces/plugins.Object3DHelperPluginType.BaseController.html +1 -1
  154. package/docs/interfaces/plugins.Object3DHelperPluginType.BaseHelper.html +1 -1
  155. package/docs/interfaces/plugins.Object3DHelperPluginType.BoundingBoxController.html +1 -1
  156. package/docs/interfaces/plugins.Object3DHelperPluginType.MoveController.html +1 -1
  157. package/docs/interfaces/plugins.Object3DHelperPluginType.MoveHelperAbstract.html +1 -1
  158. package/docs/interfaces/plugins.Object3DHelperPluginType.RotateController.html +1 -1
  159. package/docs/interfaces/plugins.Object3DHelperPluginType.RotateHelperAbstract.html +1 -1
  160. package/docs/interfaces/plugins.OrientationPluginController.html +1 -1
  161. package/docs/interfaces/plugins.OrientationPluginType.EventMap.html +1 -1
  162. package/docs/interfaces/plugins.OrientationPluginType.State.html +1 -1
  163. package/docs/interfaces/plugins.PanoAnimeController.html +1 -1
  164. package/docs/interfaces/plugins.PanoAnimePluginType.EventMap.html +1 -1
  165. package/docs/interfaces/plugins.PanoAnimePluginType.State.html +1 -1
  166. package/docs/interfaces/plugins.PluginTemplateType.EventMap.html +1 -1
  167. package/docs/interfaces/plugins.PluginTemplateType.State.html +1 -1
  168. package/docs/interfaces/plugins.TrajectoryController.html +1 -1
  169. package/docs/interfaces/react.FiveAppProps.html +11 -0
  170. package/docs/interfaces/react.FiveInjectionTypes.html +1 -1
  171. package/docs/interfaces/react.UseFivePluginOptions.html +5 -0
  172. package/docs/interfaces/react.UseFivePluginOptionsWithCreate.html +5 -0
  173. package/docs/modules/plugins.CSS2DPluginType.html +1 -0
  174. package/docs/modules/plugins.html +1 -1
  175. package/docs/modules/react.html +1 -1
  176. package/docs/types/five.ParseOptions.html +1 -1
  177. package/docs/types/plugins.BasePlugin.EventMap.html +1 -1
  178. package/docs/types/plugins.CSS2DPluginType.PluginData.html +1 -0
  179. package/docs/types/plugins.CSS2DPluginType.ServerData.html +1 -0
  180. package/docs/variables/react.FiveApp.html +3 -0
  181. package/docs/variables/react.FiveAutoCanvas.html +3 -0
  182. package/five/controllers/panorama.d.ts +2 -2
  183. package/five/controllers/xrPanorama.d.ts +4 -2
  184. package/five/index.js +23 -23
  185. package/five/index.mjs +563 -549
  186. package/five/renderer/postprocessing/passes/flowing-light-2d-pass.d.ts +6 -1
  187. package/five/renderer/postprocessing/passes/flowing-light-3d-pass.d.ts +3 -1
  188. package/five/utils/event.d.ts +5 -1
  189. package/gltf-loader/index.js +3 -3
  190. package/gltf-loader/index.mjs +3 -3
  191. package/line/index.js +3 -3
  192. package/line/index.mjs +3 -3
  193. package/package.json +1 -1
  194. package/plugins/CSS2DPlugin/Controller.d.ts +59 -0
  195. package/plugins/CSS2DPlugin/index.d.ts +5 -0
  196. package/plugins/CSS2DPlugin/typing.d.ts +30 -0
  197. package/plugins/index.d.ts +5 -0
  198. package/plugins/index.js +24 -4
  199. package/plugins/index.mjs +871 -588
  200. package/plugins/thirdParty/CSS2DRenderer.d.ts +37 -0
  201. package/plugins/thirdParty/instancedPrefabBufferGeometry.d.ts +32 -0
  202. package/plugins/thirdParty/pointBufferGeometry.d.ts +22 -0
  203. package/plugins/thirdParty/prefabBufferGeometry.d.ts +38 -0
  204. package/react/autoCanvas.d.ts +9 -0
  205. package/react/fiveApp.d.ts +22 -0
  206. package/react/hooks/useFivePlugin.d.ts +22 -0
  207. package/react/index.d.ts +4 -0
  208. package/react/index.js +3 -3
  209. package/react/index.mjs +292 -175
  210. package/react/withFive.d.ts +1 -1
  211. package/shader-lib/index.js +2 -2
  212. package/shader-lib/index.mjs +2 -2
  213. package/sticker/index.js +3 -3
  214. package/sticker/index.mjs +3 -3
  215. package/umd/five-gltf-loader.js +3 -3
  216. package/umd/five-line.js +3 -3
  217. package/umd/five-plugins.js +24 -4
  218. package/umd/five-react.js +3 -3
  219. package/umd/five-shader-lib.js +2 -2
  220. package/umd/five-sticker.js +3 -3
  221. package/umd/five-vfx.js +2 -2
  222. package/umd/five-vue.js +2 -2
  223. package/umd/five.js +8 -8
  224. package/vfx/index.js +2 -2
  225. package/vfx/index.mjs +2 -2
  226. package/vue/index.js +2 -2
  227. package/vue/index.mjs +2 -2
  228. package/work-downloader/index.js +2 -2
  229. package/work-downloader/index.mjs +2 -2
@@ -24,7 +24,7 @@ type Line = {
24
24
  color: THREE.Color; // 光带颜色
25
25
  opacity?: number; // 光带不透明度(0-1)
26
26
  duration?: number; // 动画时长(毫秒)
27
- delay?: number; // 动画延迟(毫秒)
27
+ startTime?: number; // 线条开始时间(毫秒),默认使用当前内部时间
28
28
  lineWidth?: number; // 线宽(归一化单位)
29
29
  tailLengthRatio?: number; // 尾巴长度比例(0-1),默认 0.2
30
30
  };
@@ -32,10 +32,16 @@ type Line = {
32
32
  export class FlowingLight2DPass extends FivePass {
33
33
  constructor(camera: Camera);
34
34
 
35
- // 设置要渲染的路径列表
35
+ // 批量设置路径列表(替换所有现有线条)
36
36
  public setLines(lines: Line[]): void;
37
37
 
38
- // 修改单条线的参数(通过 id)
38
+ // 追加一条或多条线,返回生成的 id 数组
39
+ public addLine(...lines: Line[]): string[];
40
+
41
+ // 按 id 移除一条或多条线,返回实际移除的数量
42
+ public removeLine(...ids: string[]): number;
43
+
44
+ // 修改单条线的参数(通过 id),支持部分更新
39
45
  public setLine(params: { id: string } & Partial<Omit<Line, 'id'>>): void;
40
46
 
41
47
  public render(
@@ -92,7 +98,7 @@ export class FlowingLight2DPass extends FivePass {
92
98
  | `color` | `THREE.Color` | ✓ | - | 光带颜色(RGB)。 |
93
99
  | `opacity` | `number` | | `1.0` | 光带不透明度(0-1)。控制与背景的混合强度。 |
94
100
  | `duration` | `number` | | `1000` | 动画周期(毫秒)。光头从路径起点完成一个周期的时长。 |
95
- | `delay` | `number` | | `0` | 动画延迟(毫秒)。延迟后才开始播放动画。 |
101
+ | `startTime` | `number` | | 当前内部时间 | 线条开始时间(毫秒)。控制线条动画从何时开始播放,可用于多条线错开起始时间。 |
96
102
  | `lineWidth` | `number` | | `0.01` | 线宽(归一化单位)。控制光带在屏幕上的宽度。 |
97
103
  | `tailLengthRatio` | `number` | | `0.2` | 尾巴长度比例(0-1)。控制流光尾巴相对于路径总长的比例。 |
98
104
 
@@ -104,9 +110,10 @@ export class FlowingLight2DPass extends FivePass {
104
110
  初始化 Pass,需传入相机以获取屏幕分辨率。
105
111
 
106
112
  ### `setLines(lines: Line[])`
107
- 更新要渲染的路径列表。可随时调用以修改或新增路径。
113
+ 批量设置路径列表,替换所有现有线条。可随时调用以修改或新增路径。
108
114
 
109
115
  **自动生成 ID**: 如果 line 没有提供 `id`,会自动生成 UUID。
116
+ **自动设置 startTime**: 如果 line 没有提供 `startTime`,会使用当前内部时间。
110
117
 
111
118
  **示例**:
112
119
  ```ts
@@ -121,12 +128,59 @@ const pathLine: Line = {
121
128
  color: new THREE.Color(0x00c2ff),
122
129
  opacity: 0.8,
123
130
  duration: 2000,
124
- delay: 500,
131
+ startTime: 500,
125
132
  lineWidth: 0.01,
126
133
  };
127
134
  pass.setLines([pathLine]);
128
135
  ```
129
136
 
137
+ ### `addLine(...lines: Line[]): string[]`
138
+ 追加一条或多条线到现有列表中,不影响已有线条。返回新增线条的 id 数组。
139
+
140
+ **示例**:
141
+ ```ts
142
+ // 追加单条线
143
+ const [id1] = pass.addLine({
144
+ points: [
145
+ new THREE.Vector2(0.1, 0.1),
146
+ new THREE.Vector2(0.9, 0.9),
147
+ ],
148
+ totalLength: 1.13,
149
+ color: new THREE.Color(0xff0000),
150
+ duration: 2000,
151
+ });
152
+
153
+ // 追加多条线
154
+ const ids = pass.addLine(
155
+ {
156
+ points: [...],
157
+ totalLength: 0.8,
158
+ color: new THREE.Color(0x00ff00),
159
+ duration: 1500,
160
+ },
161
+ {
162
+ points: [...],
163
+ totalLength: 1.2,
164
+ color: new THREE.Color(0x0000ff),
165
+ duration: 1800,
166
+ },
167
+ );
168
+ // ids = ['uuid-1', 'uuid-2']
169
+ ```
170
+
171
+ ### `removeLine(...ids: string[]): number`
172
+ 按 id 移除一条或多条线,返回实际移除的数量。如果 id 不存在,会在控制台输出警告。
173
+
174
+ **示例**:
175
+ ```ts
176
+ // 移除单条线
177
+ pass.removeLine(id1);
178
+
179
+ // 移除多条线
180
+ const removedCount = pass.removeLine(id1, id2, id3);
181
+ console.log(`移除了 ${removedCount} 条线`);
182
+ ```
183
+
130
184
  ### `setLine(params: { id: string } & Partial<Omit<Line, 'id'>>)`
131
185
  通过 `id` 修改单条线的参数。支持部分更新,只更新传入的字段。
132
186
 
@@ -250,7 +304,7 @@ const paths = [
250
304
  color: new THREE.Color(0x0066ff),
251
305
  opacity: 0.7,
252
306
  duration: 2000,
253
- delay: 500,
307
+ startTime: 500,
254
308
  lineWidth: 0.015,
255
309
  },
256
310
  ];
@@ -326,7 +380,7 @@ const rectPath = {
326
380
  color: new THREE.Color(1.0, 1.0, 1.0),
327
381
  opacity: 1.0,
328
382
  duration: 4000,
329
- delay: 2000,
383
+ startTime: 2000,
330
384
  lineWidth: 0.01,
331
385
  };
332
386
 
@@ -350,7 +404,7 @@ const paths = Array.from({ length: 10 }, (_, i) => ({
350
404
  totalLength: 0.8,
351
405
  color: new THREE.Color(Math.random() * 0xffffff),
352
406
  duration: 2000 + i * 100,
353
- delay: i * 200,
407
+ startTime: i * 200,
354
408
  lineWidth: 0.01,
355
409
  }));
356
410
 
@@ -378,7 +432,7 @@ pass.setLines(paths);
378
432
  | 修改类型 | 性能 | 说明 |
379
433
  |---------|------|------|
380
434
  | 只修改颜色/透明度 | ⚡️ 极快 (~100x) | 只更新 instanceColor attribute |
381
- | 只修改 duration/delay | ⚡️ 极快 (~100x) | 只更新 instanceMeta attribute |
435
+ | 只修改 duration/startTime | ⚡️ 极快 (~100x) | 只更新 instanceMeta attribute |
382
436
  | 只修改 lineWidth | ⚡️ 极快 (~100x) | 只更新 instanceData attribute |
383
437
  | 修改 points (相同数量) | ⚡️ 快 (~50x) | 只更新 instanceStart/End attributes |
384
438
  | 修改 points (不同数量) | ⚠️ 慢 | 重建整个 mesh |
@@ -24,7 +24,7 @@ type Line = {
24
24
  color: THREE.Color; // 光带颜色
25
25
  opacity?: number; // 光带不透明度(0-1)
26
26
  duration?: number; // 动画周期(毫秒)
27
- delay?: number; // 动画延迟(毫秒)
27
+ startTime?: number; // 线条开始时间(毫秒),默认使用当前内部时间
28
28
  lineWidth?: number; // 线宽(像素)
29
29
  tailLengthRatio?: number; // 尾巴长度比例(0-1),默认 0.2
30
30
  };
@@ -32,10 +32,16 @@ type Line = {
32
32
  export class FlowingLight3DPass extends FivePass {
33
33
  constructor(camera: Camera);
34
34
 
35
- // 设置要渲染的路径列表
35
+ // 批量设置路径列表(替换所有现有线条)
36
36
  public setLines(lines: Line[]): void;
37
37
 
38
- // 修改单条线的参数(通过 id)
38
+ // 追加一条或多条线,返回生成的 id 数组
39
+ public addLine(...lines: Line[]): string[];
40
+
41
+ // 按 id 移除一条或多条线,返回实际移除的数量
42
+ public removeLine(...ids: string[]): number;
43
+
44
+ // 修改单条线的参数(通过 id),支持部分更新
39
45
  public setLine(params: { id: string } & Partial<Omit<Line, 'id'>>): void;
40
46
 
41
47
  public render(
@@ -84,7 +90,7 @@ Pass 自动同步相机的投影矩阵和视图矩阵,无需手动管理。支
84
90
  | `color` | `THREE.Color` | ✓ | - | 光带颜色(RGB)。 |
85
91
  | `opacity` | `number` | | `1.0` | 光带不透明度(0-1)。控制与背景的混合强度。 |
86
92
  | `duration` | `number` | | `1000` | 动画周期(毫秒)。光头完成一个循环所需时长。 |
87
- | `delay` | `number` | | `0` | 动画延迟(毫秒)。延迟后才开始播放动画。 |
93
+ | `startTime` | `number` | | 当前内部时间 | 线条开始时间(毫秒)。控制线条动画从何时开始播放,可用于多条线错开起始时间。 |
88
94
  | `lineWidth` | `number` | | `3.0` | 线宽(像素)。控制光带在屏幕上的宽度。 |
89
95
  | `tailLengthRatio` | `number` | | `0.2` | 尾巴长度比例(0-1)。控制流光尾巴相对于路径总长的比例。 |
90
96
 
@@ -96,9 +102,10 @@ Pass 自动同步相机的投影矩阵和视图矩阵,无需手动管理。支
96
102
  初始化 Pass,需传入相机以获取投影矩阵和视图矩阵。
97
103
 
98
104
  ### `setLines(lines: Line[])`
99
- 更新要渲染的路径列表。支持运行时动态更改。
105
+ 批量设置路径列表,替换所有现有线条。支持运行时动态更改。
100
106
 
101
107
  **自动生成 ID**: 如果 line 没有提供 `id`,会自动生成 UUID。
108
+ **自动设置 startTime**: 如果 line 没有提供 `startTime`,会使用当前内部时间。
102
109
 
103
110
  **示例**:
104
111
  ```ts
@@ -113,12 +120,59 @@ const pathLine: Line = {
113
120
  color: new THREE.Color(0xff6600),
114
121
  opacity: 0.85,
115
122
  duration: 3000,
116
- delay: 500,
123
+ startTime: 500,
117
124
  lineWidth: 4.0,
118
125
  };
119
126
  pass.setLines([pathLine]);
120
127
  ```
121
128
 
129
+ ### `addLine(...lines: Line[]): string[]`
130
+ 追加一条或多条线到现有列表中,不影响已有线条。返回新增线条的 id 数组。
131
+
132
+ **示例**:
133
+ ```ts
134
+ // 追加单条线
135
+ const [id1] = pass.addLine({
136
+ points: [
137
+ new THREE.Vector3(0, 0, 0),
138
+ new THREE.Vector3(10, 5, 5),
139
+ ],
140
+ totalLength: 12,
141
+ color: new THREE.Color(0xff0000),
142
+ duration: 2000,
143
+ });
144
+
145
+ // 追加多条线
146
+ const ids = pass.addLine(
147
+ {
148
+ points: [...],
149
+ totalLength: 8,
150
+ color: new THREE.Color(0x00ff00),
151
+ duration: 1500,
152
+ },
153
+ {
154
+ points: [...],
155
+ totalLength: 15,
156
+ color: new THREE.Color(0x0000ff),
157
+ duration: 1800,
158
+ },
159
+ );
160
+ // ids = ['uuid-1', 'uuid-2']
161
+ ```
162
+
163
+ ### `removeLine(...ids: string[]): number`
164
+ 按 id 移除一条或多条线,返回实际移除的数量。如果 id 不存在,会在控制台输出警告。
165
+
166
+ **示例**:
167
+ ```ts
168
+ // 移除单条线
169
+ pass.removeLine(id1);
170
+
171
+ // 移除多条线
172
+ const removedCount = pass.removeLine(id1, id2, id3);
173
+ console.log(`移除了 ${removedCount} 条线`);
174
+ ```
175
+
122
176
  ### `setLine(params: { id: string } & Partial<Omit<Line, 'id'>>)`
123
177
  通过 `id` 修改单条线的参数。支持部分更新,只更新传入的字段。
124
178
 
@@ -242,7 +296,7 @@ const paths = [
242
296
  totalLength: 12,
243
297
  color: new THREE.Color(0x00ff00),
244
298
  duration: 2500,
245
- delay: 500,
299
+ startTime: 500,
246
300
  lineWidth: 4.0,
247
301
  },
248
302
  {
@@ -253,7 +307,7 @@ const paths = [
253
307
  totalLength: 11,
254
308
  color: new THREE.Color(0x0000ff),
255
309
  duration: 2200,
256
- delay: 1000,
310
+ startTime: 1000,
257
311
  lineWidth: 2.5,
258
312
  },
259
313
  ];
@@ -332,7 +386,7 @@ const paths = Array.from({ length: 10 }, (_, i) => ({
332
386
  totalLength: 7,
333
387
  color: new THREE.Color(Math.random() * 0xffffff),
334
388
  duration: 2000 + i * 100,
335
- delay: i * 200,
389
+ startTime: i * 200,
336
390
  lineWidth: 3.0,
337
391
  }));
338
392
 
@@ -361,7 +415,7 @@ pass.setLines(paths);
361
415
  | 修改类型 | 性能 | 说明 |
362
416
  |---------|------|------|
363
417
  | 只修改颜色/透明度 | ⚡️ 极快 (~100x) | 只更新 instanceColor attribute |
364
- | 只修改 duration/delay | ⚡️ 极快 (~100x) | 只更新 instanceMeta attribute |
418
+ | 只修改 duration/startTime | ⚡️ 极快 (~100x) | 只更新 instanceMeta attribute |
365
419
  | 只修改 lineWidth | ⚡️ 极快 (~100x) | 只更新 instanceData attribute |
366
420
  | 修改 points (相同数量) | ⚡️ 快 (~50x) | 只更新 instanceStart/End attributes |
367
421
  | 修改 points (不同数量) | ⚠️ 慢 | 重建整个 mesh |
@@ -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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"