s3m-three 0.3.7 → 0.3.8

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 (62) hide show
  1. package/dist/anim/Animator.d.ts +111 -0
  2. package/dist/anim/Animator.d.ts.map +1 -0
  3. package/dist/anim/Animator.js +382 -0
  4. package/dist/anim/Animator.js.map +1 -0
  5. package/dist/anim/Path.d.ts +30 -0
  6. package/dist/anim/Path.d.ts.map +1 -0
  7. package/dist/anim/Path.js +100 -0
  8. package/dist/anim/Path.js.map +1 -0
  9. package/dist/anim/easing.d.ts +70 -0
  10. package/dist/anim/easing.d.ts.map +1 -0
  11. package/dist/anim/easing.js +170 -0
  12. package/dist/anim/easing.js.map +1 -0
  13. package/dist/anim/index.d.ts +6 -0
  14. package/dist/anim/index.d.ts.map +1 -0
  15. package/dist/anim/index.js +4 -0
  16. package/dist/anim/index.js.map +1 -0
  17. package/dist/browser/s3m-three.iife.ext-three.js +48 -10
  18. package/dist/browser/s3m-three.iife.js +48 -10
  19. package/dist/core/types.d.ts +16 -0
  20. package/dist/core/types.d.ts.map +1 -1
  21. package/dist/index.d.ts +3 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +1 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/render/EdgeLines.d.ts +62 -14
  26. package/dist/render/EdgeLines.d.ts.map +1 -1
  27. package/dist/render/EdgeLines.js +97 -8
  28. package/dist/render/EdgeLines.js.map +1 -1
  29. package/dist/render/FeatureStyleManager.d.ts +17 -1
  30. package/dist/render/FeatureStyleManager.d.ts.map +1 -1
  31. package/dist/render/FeatureStyleManager.js +14 -4
  32. package/dist/render/FeatureStyleManager.js.map +1 -1
  33. package/dist/render/MergeVertices.d.ts +7 -0
  34. package/dist/render/MergeVertices.d.ts.map +1 -1
  35. package/dist/render/MergeVertices.js +10 -1
  36. package/dist/render/MergeVertices.js.map +1 -1
  37. package/dist/render/S3MViewer.d.ts +216 -9
  38. package/dist/render/S3MViewer.d.ts.map +1 -1
  39. package/dist/render/S3MViewer.js +763 -67
  40. package/dist/render/S3MViewer.js.map +1 -1
  41. package/dist/render/StyleMaterial.d.ts +19 -0
  42. package/dist/render/StyleMaterial.d.ts.map +1 -1
  43. package/dist/render/StyleMaterial.js +37 -0
  44. package/dist/render/StyleMaterial.js.map +1 -1
  45. package/dist/tileset/S3MTileset.d.ts.map +1 -1
  46. package/dist/tileset/S3MTileset.js +3 -1
  47. package/dist/tileset/S3MTileset.js.map +1 -1
  48. package/docs/ANIMATION.md +534 -0
  49. package/docs/API.md +2 -0
  50. package/package.json +1 -1
  51. package/src/anim/Animator.ts +460 -0
  52. package/src/anim/Path.ts +107 -0
  53. package/src/anim/easing.ts +195 -0
  54. package/src/anim/index.ts +10 -0
  55. package/src/core/types.ts +8 -0
  56. package/src/index.ts +10 -0
  57. package/src/render/EdgeLines.ts +131 -15
  58. package/src/render/FeatureStyleManager.ts +12 -4
  59. package/src/render/MergeVertices.ts +11 -1
  60. package/src/render/S3MViewer.ts +855 -64
  61. package/src/render/StyleMaterial.ts +54 -1
  62. package/src/tileset/S3MTileset.ts +3 -1
@@ -115,8 +115,23 @@ export interface S3MStyle {
115
115
  roofThreshold?: number;
116
116
  /** 是否与模型原色贴图叠加混合(0 = 纯色覆盖,1 = 叠乘原色贴图) */
117
117
  texMix?: number;
118
+ /**
119
+ * 基础漫反射底色增益 / 直通自发光微调(0~1,默认 0.0,建议开启 TOP_SIDE 时可设 0.15~0.3)。
120
+ * 绕过光照夹角直接补偿表面暗部底色,让 TOP_SIDE / 自定义等模式下的背光阴影面保持通透、不至于过黑。
121
+ */
122
+ ambientGain?: number;
118
123
  /** 半透明时是否保持深度写入(默认 true,保持写入可彻底遮挡背面与内部棱线,避免背面透出) */
119
124
  depthWrite?: boolean;
125
+ /**
126
+ * 新瓦片首次出现时的淡入时长(毫秒,0 = 关闭)。
127
+ *
128
+ * 只影响「刚加载进来」的瓦片,已经显示的不会被重播。LOD 细化换瓦片时也会淡入,
129
+ * 视觉上比「啪」一下换掉柔和得多。
130
+ *
131
+ * 注意代价:淡入期间该瓦片会进透明渲染队列(混合 + 前后排序),首次加载
132
+ * 几百块瓦片同时淡入时会有一小段额外开销,所以默认关闭、按需开启。
133
+ */
134
+ fadeIn?: number;
120
135
  }
121
136
 
122
137
  export const DEFAULT_STYLE: S3MStyle = {
@@ -147,7 +162,9 @@ export const DEFAULT_STYLE: S3MStyle = {
147
162
  edgeThreshold: 55,
148
163
  roofThreshold: 0.65,
149
164
  texMix: 0,
165
+ ambientGain: 0,
150
166
  depthWrite: true,
167
+ fadeIn: 0,
151
168
  };
152
169
 
153
170
  export interface StyledMaterial extends THREE.MeshStandardMaterial {
@@ -157,6 +174,8 @@ export interface StyledMaterial extends THREE.MeshStandardMaterial {
157
174
  uBatchTex: { value: THREE.Texture };
158
175
  uBatchTexWidth: { value: number };
159
176
  uBatchTexActive: { value: number };
177
+ /** 单块瓦片的淡入系数(1 = 完全显示) */
178
+ uTileFade: { value: number };
160
179
  isStyled: true;
161
180
  [key: string]: unknown;
162
181
  };
@@ -205,9 +224,25 @@ export function createSharedUniforms(): StyleUniforms {
205
224
  uRoofThreshold: { value: 0.65 },
206
225
  /** 与模型原色贴图混合强度:0 = 纯色覆盖,1 = 叠乘原色贴图 */
207
226
  uTexMix: { value: 0 },
227
+ /** 基础底色增益 / 暗部补偿(0~1,默认 0.0) */
228
+ uAmbientGain: { value: 0 },
229
+ /**
230
+ * 图层整体透明度:在片元里乘进 diffuseColor.a。
231
+ *
232
+ * 为什么不做成 `material.opacity`:那是逐材质写入,几百块瓦片就是 O(meshes),
233
+ * 而且跨 0.999 改 `material.transparent` 会换 program(`opaque` 参与缓存键)。
234
+ * 放到共享 uniform 里,透明度动画就退化成一次 float 赋值。
235
+ */
236
+ uOpacity: { value: 1 },
237
+ /** 棱线淡入淡出乘子:setEdges 过渡期间 0→1,新插入的瓦片自动继承 */
238
+ uEdgeFade: { value: 1 },
239
+ /**
240
+ * 整体压暗乘子:`mode` 这类不可插值的切换用它做 fade-through
241
+ * (压暗 → 换模式 → 亮回来),比硬切自然得多。
242
+ */
243
+ uFade: { value: 1 },
208
244
  };
209
245
  }
210
-
211
246
  const VERT_PARS = /* glsl */ `
212
247
  attribute float aBatchId;
213
248
  attribute vec3 aColor;
@@ -391,6 +426,10 @@ const FRAG_PARS = /* glsl */ `
391
426
  uniform float uSelWhole;
392
427
  uniform float uRoofThreshold;
393
428
  uniform float uTexMix;
429
+ uniform float uAmbientGain;
430
+ uniform float uOpacity;
431
+ uniform float uTileFade;
432
+ uniform float uFade;
394
433
  varying float vBatchId;
395
434
  varying vec3 vVertColor;
396
435
  varying float vWorldZ;
@@ -430,6 +469,8 @@ const FRAG_PARS = /* glsl */ `
430
469
  const FRAG_COLOR = /* glsl */ `
431
470
  float s3mH = clamp( ( vWorldZ - uHeightMin ) / max( uHeightMax - uHeightMin, 0.001 ), 0.0, 1.0 );
432
471
  vec3 s3mBase = diffuseColor.rgb; // 已含 diffuse × map
472
+ // 图层整体透明度(共享 uniform)+ 单瓦片淡入系数(逐材质),逐帧改都不产生重编译
473
+ diffuseColor.a *= uOpacity * uTileFade;
433
474
  // 所有按单体取值(配色 / 状态纹理 / 选中判定)都走取整后的 id,避免插值噪声
434
475
  float s3mBid = s3mBatchId();
435
476
 
@@ -531,6 +572,10 @@ const FRAG_COLOR = /* glsl */ `
531
572
  } else {
532
573
  diffuseColor.rgb *= mix( 1.0, uDimFactor, uDim );
533
574
  }
575
+
576
+ // 压暗乘子放在最后:mode 分支会整体覆写 diffuseColor.rgb,
577
+ // 放在前面会被覆盖掉。setMode 的 fade-through 就靠它。
578
+ diffuseColor.rgb *= uFade;
534
579
  `;
535
580
 
536
581
  const FRAG_EMISSIVE = /* glsl */ `
@@ -539,6 +584,10 @@ const FRAG_EMISSIVE = /* glsl */ `
539
584
  if ( uSelMode != 3 ) {
540
585
  totalEmissiveRadiance += uSelColor * s3mSelE * uSelMix * ( uSelEmissive * 0.4 );
541
586
  }
587
+ // 直通自发光微调 / 环境光底色提升:补偿背光阴影面(尤其 TOP_SIDE 立面),避免光照阴影面过暗
588
+ if ( uAmbientGain > 0.001 ) {
589
+ totalEmissiveRadiance += diffuseColor.rgb * uAmbientGain;
590
+ }
542
591
  `;
543
592
 
544
593
  const FRAG_BAKE = /* glsl */ `
@@ -596,6 +645,8 @@ export function createStyledMaterial(opts: StyledMaterialOptions): StyledMateria
596
645
  const uBatchTex = { value: DUMMY_BATCH_TEX };
597
646
  const uBatchTexWidth = { value: 1.0 };
598
647
  const uBatchTexActive = { value: 0 };
648
+ /** 单块瓦片的淡入系数:逐材质独享(每块网格一份材质),默认 1 = 完全显示 */
649
+ const uTileFade = { value: 1 };
599
650
 
600
651
  // 图集材质:只有几何确实带了 aAtlasRect 才开这个宏,否则缺属性会采到 (0,0) 的默认值
601
652
  const atlas = !!opts.atlas && !!opts.map;
@@ -613,6 +664,7 @@ export function createStyledMaterial(opts: StyledMaterialOptions): StyledMateria
613
664
  uBatchTex,
614
665
  uBatchTexWidth,
615
666
  uBatchTexActive,
667
+ uTileFade,
616
668
  uSecMap: { value: secMap },
617
669
  uAtlasDim,
618
670
  uAtlasDim1,
@@ -656,6 +708,7 @@ export function createStyledMaterial(opts: StyledMaterialOptions): StyledMateria
656
708
  mat.userData.uBatchTex = uBatchTex;
657
709
  mat.userData.uBatchTexWidth = uBatchTexWidth;
658
710
  mat.userData.uBatchTexActive = uBatchTexActive;
711
+ mat.userData.uTileFade = uTileFade;
659
712
  mat.userData.isStyled = true;
660
713
  return mat;
661
714
  }
@@ -1178,7 +1178,9 @@ export class S3MTileset {
1178
1178
  if (inRange) node.lastSeen = this._frame;
1179
1179
 
1180
1180
  const childUrls = node.childUrls ?? (node.childUrl ? [node.childUrl] : []);
1181
- const needRefine = childUrls.length > 0 && (byDistance ? metric < threshold : metric > threshold);
1181
+ // 加入 8% 迟滞区间(Hysteresis Band),防止相机在 LOD 临界距离处发生父子瓦片逐帧来回横跳闪烁
1182
+ const hFactor = node.needRefine ? (byDistance ? 1.08 : 0.92) : 1.0;
1183
+ const needRefine = childUrls.length > 0 && (byDistance ? metric < threshold * hFactor : metric > threshold * hFactor);
1182
1184
  node.needRefine = needRefine;
1183
1185
 
1184
1186
  const dbgSeen = ((globalThis as { __S3M_LOD_SEEN?: Set<string> }).__S3M_LOD_SEEN ??= new Set<string>());