s3m-three 0.3.9 → 0.3.11

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 (36) hide show
  1. package/dist/browser/s3m-three.iife.ext-three.js +174 -40
  2. package/dist/browser/s3m-three.iife.js +174 -40
  3. package/dist/core/types.d.ts +16 -0
  4. package/dist/core/types.d.ts.map +1 -1
  5. package/dist/index.d.ts +3 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +1 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/render/EdgeLines.d.ts +12 -0
  10. package/dist/render/EdgeLines.d.ts.map +1 -1
  11. package/dist/render/EdgeLines.js +60 -6
  12. package/dist/render/EdgeLines.js.map +1 -1
  13. package/dist/render/FeatureStyleManager.d.ts +33 -0
  14. package/dist/render/FeatureStyleManager.d.ts.map +1 -1
  15. package/dist/render/FeatureStyleManager.js +98 -11
  16. package/dist/render/FeatureStyleManager.js.map +1 -1
  17. package/dist/render/GPUPathManager.d.ts +95 -0
  18. package/dist/render/GPUPathManager.d.ts.map +1 -0
  19. package/dist/render/GPUPathManager.js +265 -0
  20. package/dist/render/GPUPathManager.js.map +1 -0
  21. package/dist/render/S3MViewer.d.ts +47 -0
  22. package/dist/render/S3MViewer.d.ts.map +1 -1
  23. package/dist/render/S3MViewer.js +104 -3
  24. package/dist/render/S3MViewer.js.map +1 -1
  25. package/dist/render/StyleMaterial.d.ts +12 -0
  26. package/dist/render/StyleMaterial.d.ts.map +1 -1
  27. package/dist/render/StyleMaterial.js +117 -14
  28. package/dist/render/StyleMaterial.js.map +1 -1
  29. package/package.json +1 -1
  30. package/src/core/types.ts +8 -0
  31. package/src/index.ts +3 -1
  32. package/src/render/EdgeLines.ts +64 -6
  33. package/src/render/FeatureStyleManager.ts +130 -11
  34. package/src/render/GPUPathManager.ts +306 -0
  35. package/src/render/S3MViewer.ts +119 -2
  36. package/src/render/StyleMaterial.ts +121 -14
@@ -10,6 +10,7 @@
10
10
  */
11
11
  import * as THREE from 'three';
12
12
  import { DEFAULT_FLOOR_HEIGHT } from '../core/FeatureInfo.js';
13
+ import { GPUPathManager } from './GPUPathManager.js';
13
14
  /** 着色模式,数值与着色器里的 uMode 一一对应 */
14
15
  export const STYLE = {
15
16
  WHITE: 0, // 白膜:忽略贴图与顶点色,纯色 + 光照
@@ -88,8 +89,9 @@ const DUMMY_DATA = new Float32Array([
88
89
  1, 0, 0, 0, // Row 2: rot row 0, pivot.x
89
90
  0, 1, 0, 0, // Row 3: rot row 1, pivot.y
90
91
  0, 0, 1, 0, // Row 4: rot row 2, pivot.z
92
+ -1, 0, 0, 0, // Row 5: pathId (-1=none), speed, phase, modeFlag
91
93
  ]);
92
- export const DUMMY_BATCH_TEX = new THREE.DataTexture(DUMMY_DATA, 1, 5, THREE.RGBAFormat, THREE.FloatType);
94
+ export const DUMMY_BATCH_TEX = new THREE.DataTexture(DUMMY_DATA, 1, 6, THREE.RGBAFormat, THREE.FloatType);
93
95
  DUMMY_BATCH_TEX.minFilter = THREE.NearestFilter;
94
96
  DUMMY_BATCH_TEX.magFilter = THREE.NearestFilter;
95
97
  DUMMY_BATCH_TEX.needsUpdate = true;
@@ -134,6 +136,14 @@ export function createSharedUniforms() {
134
136
  uAmbientGain: { value: 0 },
135
137
  /** 双纹理交叉淡化插值系数(0 = 纯 uBatchTex, 1 = 纯 uBatchTex2) */
136
138
  uBatchMix: { value: 0 },
139
+ /** GPU 路径数据采样纹理 */
140
+ uPathTex: { value: GPUPathManager.DUMMY_PATH_TEX },
141
+ /** GPU 路径纹理中包含的路径条数(高度) */
142
+ uPathCount: { value: 1 },
143
+ /** 是否激活 GPU 路径动画(0 = 未激活,1 = 激活) */
144
+ uPathTexActive: { value: 0 },
145
+ /** GPU 路径时间戳(秒) */
146
+ uPathTime: { value: 0 },
137
147
  /**
138
148
  * 图层整体透明度:在片元里乘进 diffuseColor.a。
139
149
  *
@@ -176,6 +186,10 @@ const VERT_PARS = /* glsl */ `
176
186
  uniform float uBatchMix;
177
187
  uniform float uBatchTexWidth;
178
188
  uniform int uBatchTexActive;
189
+ uniform sampler2D uPathTex;
190
+ uniform float uPathCount;
191
+ uniform float uPathTime;
192
+ uniform int uPathTexActive;
179
193
  varying float vBatchId;
180
194
  varying vec3 vVertColor;
181
195
  varying float vWorldZ;
@@ -239,22 +253,63 @@ const VERT_SETUP = /* glsl */ `
239
253
  float s3mBatchSetup = s3mBatchRaw();
240
254
  if ( uBatchTexActive > 0 && s3mBatchSetup >= 0.0 ) {
241
255
  float s3mU = ( s3mBatchSetup + 0.5 ) / uBatchTexWidth;
242
- vec4 bState = s3mSampleBatchRow0( uBatchTex, uBatchTex2, vec2( s3mU, 0.1 ), uBatchMix );
256
+ vec4 bState = s3mSampleBatchRow0( uBatchTex, uBatchTex2, vec2( s3mU, 0.08333333 ), uBatchMix );
243
257
  if ( bState.a >= -0.5 ) {
244
- vec4 bOffset = s3mSampleBatchRow1( uBatchTex, uBatchTex2, vec2( s3mU, 0.3 ), uBatchMix );
258
+ vec4 bOffset = s3mSampleBatchRow1( uBatchTex, uBatchTex2, vec2( s3mU, 0.25 ), uBatchMix );
245
259
  s3mCustomOffset = bOffset.xyz;
246
260
  if ( s3mCustomOffset.z == 0.0 && bState.a > 0.0 ) {
247
261
  s3mCustomOffset.z = bState.a;
248
262
  }
249
- vec4 r2 = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.5 ), uBatchMix );
250
- vec4 r3 = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.7 ), uBatchMix );
251
- vec4 r4 = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.9 ), uBatchMix );
263
+ vec4 r2 = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.41666667 ), uBatchMix );
264
+ vec4 r3 = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.58333333 ), uBatchMix );
265
+ vec4 r4 = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.75 ), uBatchMix );
252
266
  s3mRot = mat3(
253
267
  vec3( r2.x, r3.x, r4.x ),
254
268
  vec3( r2.y, r3.y, r4.y ),
255
269
  vec3( r2.z, r3.z, r4.z )
256
270
  );
257
271
  s3mPivot = vec3( r2.w, r3.w, r4.w );
272
+
273
+ // Row 5: GPU 路径动画计算
274
+ if ( uPathTexActive > 0 ) {
275
+ vec4 r5 = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.91666667 ), uBatchMix );
276
+ float pathId = r5.x;
277
+ float speed = r5.y;
278
+ float phase = r5.z;
279
+ float mode = r5.w;
280
+ if ( pathId >= 0.0 && mode > 0.5 && uPathCount > 0.0 ) {
281
+ float t = phase + uPathTime * speed;
282
+ bool autoHeading = true;
283
+ if ( mode >= 4.0 ) {
284
+ autoHeading = false;
285
+ mode -= 3.0;
286
+ }
287
+ if ( mode < 1.5 ) {
288
+ t = fract( t );
289
+ } else if ( mode < 2.5 ) {
290
+ t = clamp( t, 0.0, 1.0 );
291
+ } else {
292
+ t = mod( t, 2.0 );
293
+ t = ( t > 1.0 ) ? ( 2.0 - t ) : t;
294
+ }
295
+ float pathU = ( t * 255.0 + 0.5 ) / 256.0;
296
+ float pathV = ( pathId + 0.5 ) / uPathCount;
297
+ vec4 pathSample = texture2D( uPathTex, vec2( pathU, pathV ) );
298
+ vec3 pathPos = pathSample.xyz;
299
+ float pathYaw = pathSample.w;
300
+ if ( autoHeading ) {
301
+ float c = cos( pathYaw );
302
+ float s = sin( pathYaw );
303
+ mat3 rotHeading = mat3(
304
+ c, -s, 0.0,
305
+ s, c, 0.0,
306
+ 0.0, 0.0, 1.0
307
+ );
308
+ s3mRot = rotHeading * s3mRot;
309
+ }
310
+ s3mCustomOffset += pathPos;
311
+ }
312
+ }
258
313
  }
259
314
  }
260
315
  objectNormal = normalize( s3mRot * objectNormal );
@@ -263,7 +318,7 @@ const VERT_ELEVATION = /* glsl */ `
263
318
  float s3mBatchElev = s3mBatchRaw();
264
319
  if ( uBatchTexActive > 0 && s3mBatchElev >= 0.0 ) {
265
320
  float s3mU = ( s3mBatchElev + 0.5 ) / uBatchTexWidth;
266
- vec4 bState = s3mSampleBatchRow0( uBatchTex, uBatchTex2, vec2( s3mU, 0.1 ), uBatchMix );
321
+ vec4 bState = s3mSampleBatchRow0( uBatchTex, uBatchTex2, vec2( s3mU, 0.08333333 ), uBatchMix );
267
322
  if ( bState.a < -0.5 ) {
268
323
  transformed = vec3( 0.0 );
269
324
  }
@@ -531,7 +586,7 @@ const FRAG_COLOR = /* glsl */ `
531
586
  if ( uBatchTexActive > 0 && s3mBid >= 0.0 ) {
532
587
  // 用取整后的 id 采样:否则逐像素的插值误差会让纹素在边界上来回跳,同样出彩色噪点
533
588
  float s3mU = ( s3mBid + 0.5 ) / uBatchTexWidth;
534
- vec4 bState = s3mSampleBatchRow0( uBatchTex, uBatchTex2, vec2( s3mU, 0.1 ), uBatchMix );
589
+ vec4 bState = s3mSampleBatchRow0( uBatchTex, uBatchTex2, vec2( s3mU, 0.08333333 ), uBatchMix );
535
590
  if ( bState.a < -0.5 ) {
536
591
  discard; // 属于被过滤隐藏的单体
537
592
  }
@@ -542,7 +597,7 @@ const FRAG_COLOR = /* glsl */ `
542
597
  }
543
598
  // 单体独立透明度(状态纹理第 2 行 alpha,0 = 无覆盖)。
544
599
  // 与全局 uOpacity(diffuseColor.a 初值)和图集贴图自带 alpha 逐级叠乘
545
- vec4 bOffset = s3mSampleBatchRow1( uBatchTex, uBatchTex2, vec2( s3mU, 0.3 ), uBatchMix );
600
+ vec4 bOffset = s3mSampleBatchRow1( uBatchTex, uBatchTex2, vec2( s3mU, 0.25 ), uBatchMix );
546
601
  if ( bOffset.a > 0.0 ) {
547
602
  diffuseColor.a *= bOffset.a;
548
603
  }
@@ -699,6 +754,10 @@ const OUTLINE_VERT = /* glsl */ `
699
754
  uniform float uBatchMix;
700
755
  uniform float uBatchTexWidth;
701
756
  uniform int uBatchTexActive;
757
+ uniform sampler2D uPathTex;
758
+ uniform float uPathCount;
759
+ uniform float uPathTime;
760
+ uniform int uPathTexActive;
702
761
  varying float vSel;
703
762
 
704
763
  vec4 s3mSampleBatch( sampler2D texA, sampler2D texB, vec2 uv, float mixVal ) {
@@ -715,24 +774,64 @@ const OUTLINE_VERT = /* glsl */ `
715
774
  vec3 s3mPivot = vec3( 0.0 );
716
775
  if ( uBatchTexActive > 0 && aBatchId >= 0.0 ) {
717
776
  float s3mU = ( aBatchId + 0.5 ) / uBatchTexWidth;
718
- vec4 bState = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.1 ), uBatchMix );
777
+ vec4 bState = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.08333333 ), uBatchMix );
719
778
  if ( bState.a < -0.5 ) {
720
779
  vSel = 0.0; // 过滤隐藏的单体不显示描边
721
780
  } else {
722
- vec4 bOffset = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.3 ), uBatchMix );
781
+ vec4 bOffset = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.25 ), uBatchMix );
723
782
  s3mCustomOffset = bOffset.xyz;
724
783
  if ( s3mCustomOffset.z == 0.0 && bState.a > 0.0 ) {
725
784
  s3mCustomOffset.z = bState.a;
726
785
  }
727
- vec4 r2 = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.5 ), uBatchMix );
728
- vec4 r3 = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.7 ), uBatchMix );
729
- vec4 r4 = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.9 ), uBatchMix );
786
+ vec4 r2 = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.41666667 ), uBatchMix );
787
+ vec4 r3 = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.58333333 ), uBatchMix );
788
+ vec4 r4 = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.75 ), uBatchMix );
730
789
  s3mRot = mat3(
731
790
  vec3( r2.x, r3.x, r4.x ),
732
791
  vec3( r2.y, r3.y, r4.y ),
733
792
  vec3( r2.z, r3.z, r4.z )
734
793
  );
735
794
  s3mPivot = vec3( r2.w, r3.w, r4.w );
795
+
796
+ if ( uPathTexActive > 0 ) {
797
+ vec4 r5 = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.91666667 ), uBatchMix );
798
+ float pathId = r5.x;
799
+ float speed = r5.y;
800
+ float phase = r5.z;
801
+ float mode = r5.w;
802
+ if ( pathId >= 0.0 && mode > 0.5 && uPathCount > 0.0 ) {
803
+ float t = phase + uPathTime * speed;
804
+ bool autoHeading = true;
805
+ if ( mode >= 4.0 ) {
806
+ autoHeading = false;
807
+ mode -= 3.0;
808
+ }
809
+ if ( mode < 1.5 ) {
810
+ t = fract( t );
811
+ } else if ( mode < 2.5 ) {
812
+ t = clamp( t, 0.0, 1.0 );
813
+ } else {
814
+ t = mod( t, 2.0 );
815
+ t = ( t > 1.0 ) ? ( 2.0 - t ) : t;
816
+ }
817
+ float pathU = ( t * 255.0 + 0.5 ) / 256.0;
818
+ float pathV = ( pathId + 0.5 ) / uPathCount;
819
+ vec4 pathSample = texture2D( uPathTex, vec2( pathU, pathV ) );
820
+ vec3 pathPos = pathSample.xyz;
821
+ float pathYaw = pathSample.w;
822
+ if ( autoHeading ) {
823
+ float c = cos( pathYaw );
824
+ float s = sin( pathYaw );
825
+ mat3 rotHeading = mat3(
826
+ c, -s, 0.0,
827
+ s, c, 0.0,
828
+ 0.0, 0.0, 1.0
829
+ );
830
+ s3mRot = rotHeading * s3mRot;
831
+ }
832
+ s3mCustomOffset += pathPos;
833
+ }
834
+ }
736
835
  }
737
836
  }
738
837
  vec3 p = position + ( s3mRot * normal ) * uWidth * vSel;
@@ -762,6 +861,10 @@ export function createOutlineMaterial(shared, initialWidth = 0.9) {
762
861
  uBatchMix: shared.uBatchMix ?? { value: 0 },
763
862
  uBatchTexWidth: { value: 1.0 },
764
863
  uBatchTexActive: { value: 0 },
864
+ uPathTex: shared.uPathTex ?? { value: GPUPathManager.DUMMY_PATH_TEX },
865
+ uPathCount: shared.uPathCount ?? { value: 1 },
866
+ uPathTexActive: shared.uPathTexActive ?? { value: 0 },
867
+ uPathTime: shared.uPathTime ?? { value: 0 },
765
868
  uColor: { value: shared.uSelColor.value.clone() },
766
869
  },
767
870
  vertexShader: OUTLINE_VERT,
@@ -1 +1 @@
1
- {"version":3,"file":"StyleMaterial.js","sourceRoot":"","sources":["../../src/render/StyleMaterial.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"StyleMaterial.js","sourceRoot":"","sources":["../../src/render/StyleMaterial.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "s3m-three",
3
- "version": "0.3.9",
3
+ "version": "0.3.11",
4
4
  "description": "SuperMap S3M 三维模型格式的 three.js 渲染内核:浏览器内直接解析 .s3mb 瓦片,无需转 3D Tiles,支持 LOD 调度、白膜/按高度/按单体/动态扫描着色、单体级 GPU 拾取。宿主无关,可单独用于任意 three 场景。",
5
5
  "type": "module",
6
6
  "repository": {
package/src/core/types.ts CHANGED
@@ -291,5 +291,13 @@ export interface StyleUniforms {
291
291
  uEdgeFade?: { value: number };
292
292
  /** 整体压暗乘子(mode 切换的 fade-through) */
293
293
  uFade?: { value: number };
294
+ /** GPU 路径数据采样纹理 */
295
+ uPathTex?: { value: unknown };
296
+ /** GPU 路径纹理中包含的路径条数(高度) */
297
+ uPathCount?: { value: number };
298
+ /** 是否激活 GPU 路径动画(0 = 未激活,1 = 激活) */
299
+ uPathTexActive?: { value: number };
300
+ /** GPU 路径全局时间戳(秒) */
301
+ uPathTime?: { value: number };
294
302
  [key: string]: { value: unknown } | undefined;
295
303
  }
package/src/index.ts CHANGED
@@ -82,7 +82,9 @@ export {
82
82
  resolveRotationMatrix,
83
83
  extractEulerAngles,
84
84
  } from './render/FeatureStyleManager.js';
85
- export type { RotationMatrix9 } from './render/FeatureStyleManager.js';
85
+ export type { RotationMatrix9, GPUPathOptions } from './render/FeatureStyleManager.js';
86
+ export { GPUPathManager, SAMPLES_PER_PATH } from './render/GPUPathManager.js';
87
+ export type { GPUPathInfo } from './render/GPUPathManager.js';
86
88
  export type {
87
89
  DatasetAlignment,
88
90
  S3MDatasetOptions,
@@ -14,6 +14,7 @@
14
14
  */
15
15
  import * as THREE from 'three';
16
16
  import { DUMMY_BATCH_TEX } from './StyleMaterial.js';
17
+ import { GPUPathManager } from './GPUPathManager.js';
17
18
 
18
19
  /** 所有等宽线材质共享的分辨率 uniform(每帧更新一次即可) */
19
20
  export interface LineSharedUniforms {
@@ -42,6 +43,10 @@ export interface ThickLineBatchUniforms {
42
43
  uBatchMix?: { value: number };
43
44
  uBatchTexWidth: { value: number };
44
45
  uBatchTexActive: { value: number };
46
+ uPathTex?: { value: unknown };
47
+ uPathCount?: { value: number };
48
+ uPathTime?: { value: number };
49
+ uPathTexActive?: { value: number };
45
50
  }
46
51
 
47
52
  export interface ThickLineMaterial extends THREE.ShaderMaterial {
@@ -75,6 +80,10 @@ const VERT = /* glsl */ `
75
80
  uniform float uBatchMix;
76
81
  uniform float uBatchTexWidth;
77
82
  uniform int uBatchTexActive;
83
+ uniform sampler2D uPathTex;
84
+ uniform float uPathCount;
85
+ uniform float uPathTime;
86
+ uniform int uPathTexActive;
78
87
 
79
88
  vec4 s3mSampleBatch( sampler2D texA, sampler2D texB, vec2 uv, float mixVal ) {
80
89
  vec4 vA = texture2D( texA, uv );
@@ -84,7 +93,7 @@ const VERT = /* glsl */ `
84
93
  }
85
94
 
86
95
  void main() {
87
- // 单体平移 / 旋转 / 拔高 / 隐藏:与主着色器同一份 5 行状态纹理、同一套变换口径。
96
+ // 单体平移 / 旋转 / 拔高 / 隐藏:与主着色器同一份 6 行状态纹理、同一套变换口径。
88
97
  // 不采样的话,单体一动或一转棱线就留在原地——这正是「棱线跟随」要解决的。
89
98
  vec3 s3mA = position;
90
99
  vec3 s3mB = aOther;
@@ -94,26 +103,67 @@ const VERT = /* glsl */ `
94
103
 
95
104
  if ( uBatchTexActive > 0 && aBatchId >= 0.0 ) {
96
105
  float s3mU = ( aBatchId + 0.5 ) / uBatchTexWidth;
97
- vec4 bState = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.1 ), uBatchMix );
106
+ vec4 bState = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.08333333 ), uBatchMix );
98
107
  if ( bState.a < -0.5 ) {
99
108
  // 该单体被隐藏:顶点着色器不能 discard,扔到裁剪空间外
100
109
  gl_Position = vec4( 2.0, 2.0, 2.0, 1.0 );
101
110
  return;
102
111
  }
103
- vec4 bOffset = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.3 ), uBatchMix );
112
+ vec4 bOffset = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.25 ), uBatchMix );
104
113
  s3mCustomOffset = bOffset.xyz;
105
114
  if ( s3mCustomOffset.z == 0.0 && bState.a > 0.0 ) {
106
115
  s3mCustomOffset.z = bState.a;
107
116
  }
108
- vec4 r2 = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.5 ), uBatchMix );
109
- vec4 r3 = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.7 ), uBatchMix );
110
- vec4 r4 = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.9 ), uBatchMix );
117
+ vec4 r2 = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.41666667 ), uBatchMix );
118
+ vec4 r3 = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.58333333 ), uBatchMix );
119
+ vec4 r4 = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.75 ), uBatchMix );
111
120
  s3mRot = mat3(
112
121
  vec3( r2.x, r3.x, r4.x ),
113
122
  vec3( r2.y, r3.y, r4.y ),
114
123
  vec3( r2.z, r3.z, r4.z )
115
124
  );
116
125
  s3mPivot = vec3( r2.w, r3.w, r4.w );
126
+
127
+ // Row 5: GPU 路径动画计算
128
+ if ( uPathTexActive > 0 ) {
129
+ vec4 r5 = s3mSampleBatch( uBatchTex, uBatchTex2, vec2( s3mU, 0.91666667 ), uBatchMix );
130
+ float pathId = r5.x;
131
+ float speed = r5.y;
132
+ float phase = r5.z;
133
+ float mode = r5.w;
134
+ if ( pathId >= 0.0 && mode > 0.5 && uPathCount > 0.0 ) {
135
+ float t = phase + uPathTime * speed;
136
+ bool autoHeading = true;
137
+ if ( mode >= 4.0 ) {
138
+ autoHeading = false;
139
+ mode -= 3.0;
140
+ }
141
+ if ( mode < 1.5 ) {
142
+ t = fract( t );
143
+ } else if ( mode < 2.5 ) {
144
+ t = clamp( t, 0.0, 1.0 );
145
+ } else {
146
+ t = mod( t, 2.0 );
147
+ t = ( t > 1.0 ) ? ( 2.0 - t ) : t;
148
+ }
149
+ float pathU = ( t * 255.0 + 0.5 ) / 256.0;
150
+ float pathV = ( pathId + 0.5 ) / uPathCount;
151
+ vec4 pathSample = texture2D( uPathTex, vec2( pathU, pathV ) );
152
+ vec3 pathPos = pathSample.xyz;
153
+ float pathYaw = pathSample.w;
154
+ if ( autoHeading ) {
155
+ float c = cos( pathYaw );
156
+ float s = sin( pathYaw );
157
+ mat3 rotHeading = mat3(
158
+ c, -s, 0.0,
159
+ s, c, 0.0,
160
+ 0.0, 0.0, 1.0
161
+ );
162
+ s3mRot = rotHeading * s3mRot;
163
+ }
164
+ s3mCustomOffset += pathPos;
165
+ }
166
+ }
117
167
  }
118
168
 
119
169
  s3mA = s3mRot * ( s3mA - s3mPivot ) + s3mPivot + s3mCustomOffset;
@@ -190,6 +240,10 @@ export function createThickLineMaterial(
190
240
  uBatchMix: batchUniforms?.uBatchMix ?? { value: 0 },
191
241
  uBatchTexWidth: batchUniforms?.uBatchTexWidth ?? { value: 1 },
192
242
  uBatchTexActive: batchUniforms?.uBatchTexActive ?? { value: 0 },
243
+ uPathTex: batchUniforms?.uPathTex ?? { value: GPUPathManager.DUMMY_PATH_TEX },
244
+ uPathCount: batchUniforms?.uPathCount ?? { value: 1 },
245
+ uPathTexActive: batchUniforms?.uPathTexActive ?? { value: 0 },
246
+ uPathTime: batchUniforms?.uPathTime ?? { value: 0 },
193
247
  };
194
248
 
195
249
  const mat = new THREE.ShaderMaterial({
@@ -206,6 +260,10 @@ export function createThickLineMaterial(
206
260
  uBatchMix: batch.uBatchMix,
207
261
  uBatchTexWidth: batch.uBatchTexWidth,
208
262
  uBatchTexActive: batch.uBatchTexActive,
263
+ uPathTex: batch.uPathTex,
264
+ uPathCount: batch.uPathCount,
265
+ uPathTexActive: batch.uPathTexActive,
266
+ uPathTime: batch.uPathTime,
209
267
  },
210
268
  vertexShader: VERT,
211
269
  fragmentShader: FRAG,
@@ -21,6 +21,19 @@ import {
21
21
  import type { AttributeQuery, AttributeQueryOptions, AttributeRow } from '../core/AttributeQuery.js';
22
22
  import type { StyledMaterial } from './StyleMaterial.js';
23
23
 
24
+ export interface GPUPathOptions {
25
+ /** 绑定的路径索引 ID(0, 1, 2...) */
26
+ pathId: number;
27
+ /** 进度的运动速率(归一化进度/秒,例如 0.05 即 20 秒一圈;为 0 则靠 progress/phase 驱动) */
28
+ speed?: number;
29
+ /** 初始相位 / 进度偏移(0.0 ~ 1.0) */
30
+ phase?: number;
31
+ /** 循环模式:'loop'(循环,默认) | 'pingpong'(往返) | 'clamp'(单次到达终点停止) */
32
+ loop?: 'loop' | 'pingpong' | 'clamp' | boolean;
33
+ /** 是否根据路径切线自动旋转朝向(偏航角 yaw,默认 true) */
34
+ autoHeading?: boolean;
35
+ }
36
+
24
37
  export interface FeatureStyle {
25
38
  /** 自定义单体颜色 */
26
39
  color?: string;
@@ -50,6 +63,8 @@ export interface FeatureStyle {
50
63
  | THREE.Matrix4;
51
64
  /** 旋转中心轴心点 [px, py, pz](局部坐标,默认 [0, 0, 0]) */
52
65
  pivot?: [number, number, number];
66
+ /** GPU 路径动画配置 */
67
+ gpuPath?: GPUPathOptions;
53
68
  }
54
69
 
55
70
  export type RotationMatrix9 = [
@@ -762,6 +777,13 @@ export class FeatureStyleManager {
762
777
  data[r4 + 1] = 0;
763
778
  data[r4 + 2] = 1;
764
779
  data[r4 + 3] = 0;
780
+
781
+ // Row 5: [pathId, speed, phase, modeFlag] (默认 -1 表示未绑定 GPU 路径)
782
+ const r5 = (w * 5 + i) * 4;
783
+ data[r5 + 0] = -1;
784
+ data[r5 + 1] = 0;
785
+ data[r5 + 2] = 0;
786
+ data[r5 + 3] = 0;
765
787
  }
766
788
 
767
789
  let hasActive = false;
@@ -771,6 +793,7 @@ export class FeatureStyleManager {
771
793
  const translationOfBatch = new Map<number, [number, number, number]>();
772
794
  const rotationOfBatch = new Map<number, RotationMatrix9>();
773
795
  const pivotOfBatch = new Map<number, [number, number, number]>();
796
+ const gpuPathOfBatch = new Map<number, GPUPathOptions>();
774
797
  const opacityOfBatch = new Map<number, number>();
775
798
  const ownersOfBatch = new Map<number, number>();
776
799
  const filter = this.filter;
@@ -844,13 +867,16 @@ export class FeatureStyleManager {
844
867
  translationOfBatch.set(bId, st.translation);
845
868
  }
846
869
 
847
- const rotMat = resolveRotationMatrix(st?.rotation);
848
- if (rotMat && !rotationOfBatch.has(bId)) {
849
- rotationOfBatch.set(bId, rotMat);
870
+ if (st?.rotation != null && !rotationOfBatch.has(bId)) {
871
+ const rotMat = resolveRotationMatrix(st.rotation);
872
+ if (rotMat) rotationOfBatch.set(bId, rotMat);
850
873
  }
851
874
  if (st?.pivot && !pivotOfBatch.has(bId)) {
852
875
  pivotOfBatch.set(bId, st.pivot);
853
876
  }
877
+ if (st?.gpuPath && !gpuPathOfBatch.has(bId)) {
878
+ gpuPathOfBatch.set(bId, st.gpuPath);
879
+ }
854
880
  }
855
881
 
856
882
  for (const bId of hiddenBatches) {
@@ -925,10 +951,39 @@ export class FeatureStyleManager {
925
951
  hasActive = true;
926
952
  }
927
953
 
954
+ // Row 5: 烘焙 GPU 路径动画参数 [pathId, speed, phase, modeFlag]
955
+ for (const [bId, gp] of gpuPathOfBatch) {
956
+ if (hiddenBatches.has(bId)) continue;
957
+ const r5 = (w * 5 + bId) * 4;
958
+ data[r5 + 0] = gp.pathId;
959
+ data[r5 + 1] = gp.speed ?? 0;
960
+ data[r5 + 2] = gp.phase ?? 0;
961
+
962
+ let mode = 1; // 1 = loop (默认)
963
+ if (gp.loop === 'clamp' || gp.loop === false) {
964
+ mode = 2;
965
+ } else if (gp.loop === 'pingpong') {
966
+ mode = 3;
967
+ }
968
+ if (gp.autoHeading === false) {
969
+ mode += 3; // 4=loop+noHeading, 5=clamp+noHeading, 6=pingpong+noHeading
970
+ }
971
+ data[r5 + 3] = mode;
972
+ hasActive = true;
973
+ }
974
+
928
975
  let conflicts = 0;
929
976
  for (const [bId, owners] of ownersOfBatch) {
930
977
  if (owners < 2) continue;
931
- if (!hiddenBatches.has(bId) && !colorOfBatch.has(bId) && !elevOfBatch.has(bId) && !rotationOfBatch.has(bId)) continue;
978
+ if (
979
+ !hiddenBatches.has(bId) &&
980
+ !colorOfBatch.has(bId) &&
981
+ !elevOfBatch.has(bId) &&
982
+ !rotationOfBatch.has(bId) &&
983
+ !gpuPathOfBatch.has(bId)
984
+ ) {
985
+ continue;
986
+ }
932
987
  conflicts++;
933
988
  }
934
989
 
@@ -978,8 +1033,8 @@ export class FeatureStyleManager {
978
1033
 
979
1034
  let record = this._meshBatchTextures.get(mesh);
980
1035
  if (!record || record.width < width) {
981
- const data = new Float32Array(width * 5 * 4);
982
- const texture = new THREE.DataTexture(data, width, 5, THREE.RGBAFormat, THREE.FloatType);
1036
+ const data = new Float32Array(width * 6 * 4);
1037
+ const texture = new THREE.DataTexture(data, width, 6, THREE.RGBAFormat, THREE.FloatType);
983
1038
  texture.minFilter = THREE.NearestFilter;
984
1039
  texture.magFilter = THREE.NearestFilter;
985
1040
  record = { texture, data, width };
@@ -1037,8 +1092,8 @@ export class FeatureStyleManager {
1037
1092
 
1038
1093
  let record = this._meshBatchTextures.get(mesh);
1039
1094
  if (!record || record.width < width) {
1040
- const data = new Float32Array(width * 5 * 4);
1041
- const texture = new THREE.DataTexture(data, width, 5, THREE.RGBAFormat, THREE.FloatType);
1095
+ const data = new Float32Array(width * 6 * 4);
1096
+ const texture = new THREE.DataTexture(data, width, 6, THREE.RGBAFormat, THREE.FloatType);
1042
1097
  texture.minFilter = THREE.NearestFilter;
1043
1098
  texture.magFilter = THREE.NearestFilter;
1044
1099
  record = { texture, data, width };
@@ -1047,9 +1102,9 @@ export class FeatureStyleManager {
1047
1102
  mat.userData.uBatchTexWidth.value = width;
1048
1103
  }
1049
1104
 
1050
- if (!record.texture2 || !record.data2 || record.data2.length < record.width * 5 * 4) {
1051
- const data2 = new Float32Array(record.width * 5 * 4);
1052
- const texture2 = new THREE.DataTexture(data2, record.width, 5, THREE.RGBAFormat, THREE.FloatType);
1105
+ if (!record.texture2 || !record.data2 || record.data2.length < record.width * 6 * 4) {
1106
+ const data2 = new Float32Array(record.width * 6 * 4);
1107
+ const texture2 = new THREE.DataTexture(data2, record.width, 6, THREE.RGBAFormat, THREE.FloatType);
1053
1108
  texture2.minFilter = THREE.NearestFilter;
1054
1109
  texture2.magFilter = THREE.NearestFilter;
1055
1110
  record.data2 = data2;
@@ -1148,4 +1203,68 @@ export class FeatureStyleManager {
1148
1203
  this._markedMeshes.clear();
1149
1204
  this._triggerRepaint();
1150
1205
  }
1206
+
1207
+ /**
1208
+ * 将单体绑定到 GPU 路径动画
1209
+ * @param smid 单体 ID
1210
+ * @param pathId GPUPathManager 中的路径索引
1211
+ * @param options 速度、初始相位、循环模式与自动转向配置
1212
+ * @param meshes 可选指定的网格集合,不传则全量生效
1213
+ */
1214
+ bindGPUPath(
1215
+ smid: number,
1216
+ pathId: number,
1217
+ options: Omit<GPUPathOptions, 'pathId'> = {},
1218
+ meshes?: Iterable<THREE.Mesh>
1219
+ ): void {
1220
+ const cur = this.getFeatureStyle(smid) ?? {};
1221
+ this.setFeatureStyle(
1222
+ smid,
1223
+ {
1224
+ ...cur,
1225
+ gpuPath: {
1226
+ pathId,
1227
+ speed: options.speed ?? 0,
1228
+ phase: options.phase ?? 0,
1229
+ loop: options.loop ?? 'loop',
1230
+ autoHeading: options.autoHeading ?? true,
1231
+ },
1232
+ },
1233
+ meshes
1234
+ );
1235
+ }
1236
+
1237
+ /**
1238
+ * 解绑单体的 GPU 路径动画
1239
+ */
1240
+ unbindGPUPath(smid: number, meshes?: Iterable<THREE.Mesh>): void {
1241
+ const cur = this.getFeatureStyle(smid);
1242
+ if (!cur || !cur.gpuPath) return;
1243
+ const next = { ...cur };
1244
+ delete next.gpuPath;
1245
+ this.setFeatureStyle(smid, next, meshes);
1246
+ }
1247
+
1248
+ /**
1249
+ * 直接设置单体在 GPU 路径上的归一化进度(0.0 ~ 1.0)
1250
+ * @param smid 单体 ID
1251
+ * @param progress 归一化进度 (0~1)
1252
+ * @param meshes 可选指定的网格集合
1253
+ */
1254
+ setGPUPathProgress(smid: number, progress: number, meshes?: Iterable<THREE.Mesh>): void {
1255
+ const cur = this.getFeatureStyle(smid);
1256
+ if (!cur?.gpuPath) return;
1257
+ this.setFeatureStyle(
1258
+ smid,
1259
+ {
1260
+ ...cur,
1261
+ gpuPath: {
1262
+ ...cur.gpuPath,
1263
+ speed: 0,
1264
+ phase: Math.min(1.0, Math.max(0.0, progress)),
1265
+ },
1266
+ },
1267
+ meshes
1268
+ );
1269
+ }
1151
1270
  }