s3m-three 0.2.0 → 0.3.1

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 (114) hide show
  1. package/README.md +2 -2
  2. package/dist/browser/s3m-three.iife.ext-three.js +585 -0
  3. package/dist/browser/s3m-three.iife.js +4419 -0
  4. package/dist/browser.d.ts +3 -0
  5. package/dist/browser.d.ts.map +1 -0
  6. package/dist/browser.js +21 -0
  7. package/dist/browser.js.map +1 -0
  8. package/dist/core/AtlasAlpha.d.ts +31 -0
  9. package/dist/core/AtlasAlpha.d.ts.map +1 -0
  10. package/dist/core/AtlasAlpha.js +82 -0
  11. package/dist/core/AtlasAlpha.js.map +1 -0
  12. package/dist/core/AtlasPack.d.ts +57 -0
  13. package/dist/core/AtlasPack.d.ts.map +1 -0
  14. package/dist/core/AtlasPack.js +81 -0
  15. package/dist/core/AtlasPack.js.map +1 -0
  16. package/dist/core/AtlasUpgrade.d.ts +68 -0
  17. package/dist/core/AtlasUpgrade.d.ts.map +1 -0
  18. package/dist/core/AtlasUpgrade.js +154 -0
  19. package/dist/core/AtlasUpgrade.js.map +1 -0
  20. package/dist/core/DXTTextureDecode.d.ts.map +1 -1
  21. package/dist/core/DXTTextureDecode.js +28 -6
  22. package/dist/core/DXTTextureDecode.js.map +1 -1
  23. package/dist/core/Draco.d.ts +52 -0
  24. package/dist/core/Draco.d.ts.map +1 -0
  25. package/dist/core/Draco.js +323 -0
  26. package/dist/core/Draco.js.map +1 -0
  27. package/dist/core/MeshOpt.d.ts +14 -3
  28. package/dist/core/MeshOpt.d.ts.map +1 -1
  29. package/dist/core/MeshOpt.js +101 -18
  30. package/dist/core/MeshOpt.js.map +1 -1
  31. package/dist/core/S3M1Parser.d.ts +16 -0
  32. package/dist/core/S3M1Parser.d.ts.map +1 -0
  33. package/dist/core/S3M1Parser.js +367 -0
  34. package/dist/core/S3M1Parser.js.map +1 -0
  35. package/dist/core/S3MBParser.d.ts +43 -1
  36. package/dist/core/S3MBParser.d.ts.map +1 -1
  37. package/dist/core/S3MBParser.js +101 -23
  38. package/dist/core/S3MBParser.js.map +1 -1
  39. package/dist/core/S3MBlockParser.d.ts +209 -0
  40. package/dist/core/S3MBlockParser.d.ts.map +1 -0
  41. package/dist/core/S3MBlockParser.js +789 -0
  42. package/dist/core/S3MBlockParser.js.map +1 -0
  43. package/dist/core/TextureFormat.d.ts +0 -1
  44. package/dist/core/TextureFormat.d.ts.map +1 -1
  45. package/dist/core/TextureFormat.js +19 -2
  46. package/dist/core/TextureFormat.js.map +1 -1
  47. package/dist/core/types.d.ts +65 -0
  48. package/dist/core/types.d.ts.map +1 -1
  49. package/dist/index.d.ts +2 -1
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +2 -1
  52. package/dist/index.js.map +1 -1
  53. package/dist/render/DatasetManager.d.ts.map +1 -1
  54. package/dist/render/DatasetManager.js +5 -3
  55. package/dist/render/DatasetManager.js.map +1 -1
  56. package/dist/render/GeometryBuilder.d.ts +2 -0
  57. package/dist/render/GeometryBuilder.d.ts.map +1 -1
  58. package/dist/render/GeometryBuilder.js +185 -16
  59. package/dist/render/GeometryBuilder.js.map +1 -1
  60. package/dist/render/GroundManager.d.ts +57 -1
  61. package/dist/render/GroundManager.d.ts.map +1 -1
  62. package/dist/render/GroundManager.js +149 -21
  63. package/dist/render/GroundManager.js.map +1 -1
  64. package/dist/render/Picker.d.ts.map +1 -1
  65. package/dist/render/Picker.js +12 -4
  66. package/dist/render/Picker.js.map +1 -1
  67. package/dist/render/PointCloudMaterial.d.ts +36 -0
  68. package/dist/render/PointCloudMaterial.d.ts.map +1 -0
  69. package/dist/render/PointCloudMaterial.js +159 -0
  70. package/dist/render/PointCloudMaterial.js.map +1 -0
  71. package/dist/render/S3MViewer.d.ts +19 -0
  72. package/dist/render/S3MViewer.d.ts.map +1 -1
  73. package/dist/render/S3MViewer.js +143 -22
  74. package/dist/render/S3MViewer.js.map +1 -1
  75. package/dist/render/StyleMaterial.d.ts +6 -0
  76. package/dist/render/StyleMaterial.d.ts.map +1 -1
  77. package/dist/render/StyleMaterial.js +125 -2
  78. package/dist/render/StyleMaterial.js.map +1 -1
  79. package/dist/render/TextureFactory.d.ts.map +1 -1
  80. package/dist/render/TextureFactory.js +64 -10
  81. package/dist/render/TextureFactory.js.map +1 -1
  82. package/dist/tileset/S3MTileset.d.ts +152 -1
  83. package/dist/tileset/S3MTileset.d.ts.map +1 -1
  84. package/dist/tileset/S3MTileset.js +672 -54
  85. package/dist/tileset/S3MTileset.js.map +1 -1
  86. package/dist/vendor/crunch_decoder.module.js +12 -18
  87. package/dist/vendor/draco_decoder.module.js +3178 -0
  88. package/docs/API.md +112 -11
  89. package/package.json +5 -3
  90. package/src/browser.ts +21 -0
  91. package/src/core/AtlasAlpha.ts +82 -0
  92. package/src/core/AtlasPack.ts +127 -0
  93. package/src/core/AtlasUpgrade.ts +182 -0
  94. package/src/core/DXTTextureDecode.ts +28 -6
  95. package/src/core/Draco.ts +409 -0
  96. package/src/core/MeshOpt.ts +124 -18
  97. package/src/core/S3M1Parser.ts +430 -0
  98. package/src/core/S3MBParser.ts +112 -21
  99. package/src/core/S3MBlockParser.ts +953 -0
  100. package/src/core/TextureFormat.ts +20 -2
  101. package/src/core/types.ts +63 -0
  102. package/src/index.ts +2 -1
  103. package/src/render/DatasetManager.ts +5 -5
  104. package/src/render/GeometryBuilder.ts +207 -15
  105. package/src/render/GroundManager.ts +174 -20
  106. package/src/render/Picker.ts +13 -4
  107. package/src/render/PointCloudMaterial.ts +174 -0
  108. package/src/render/S3MViewer.ts +140 -24
  109. package/src/render/StyleMaterial.ts +135 -2
  110. package/src/render/TextureFactory.ts +67 -11
  111. package/src/tileset/S3MTileset.ts +704 -59
  112. package/src/vendor/crunch_decoder.module.js +12 -18
  113. package/src/vendor/draco_decoder.module.d.ts +128 -0
  114. package/src/vendor/draco_decoder.module.js +3178 -0
@@ -36,7 +36,7 @@ function configure(tex, srgb = true) {
36
36
  tex.magFilter = THREE.LinearFilter;
37
37
  tex.minFilter = THREE.LinearMipmapLinearFilter;
38
38
  tex.generateMipmaps = true;
39
- // 建筑立面大多是斜视角,各向异性过滤对清晰度的提升比提高分辨率更直接
39
+ // 各向异性过滤对斜视角立面清晰度的提升比提高分辨率更直接
40
40
  tex.anisotropy = maxAnisotropy;
41
41
  if (srgb)
42
42
  tex.colorSpace = THREE.SRGBColorSpace;
@@ -44,13 +44,58 @@ function configure(tex, srgb = true) {
44
44
  tex.needsUpdate = true;
45
45
  return tex;
46
46
  }
47
+ /**
48
+ * S3MBLOCK 图集专用:关掉 GPU mip。
49
+ *
50
+ * 官方 `sampleLod` 是显式 `textureLod(tex, uv, 0.0)`,层级靠「把子区域 rect 平移 +
51
+ * 内缩」自己算(见 StyleMaterial 的 s3mAtlasUnit)。若让 GPU 对整张图集生成 mip,
52
+ * 自动选的层级会把相邻子区域混进来,远处就是一糊串色 —— 实测照抄公式但留着 GPU mip
53
+ * 时,画面反而比不改更糟,就是因为这两个变量叠在一起了。
54
+ */
55
+ function configureAtlas(tex) {
56
+ configure(tex);
57
+ tex.wrapS = THREE.ClampToEdgeWrapping;
58
+ tex.wrapT = THREE.ClampToEdgeWrapping;
59
+ tex.minFilter = THREE.LinearFilter;
60
+ tex.generateMipmaps = false;
61
+ tex.anisotropy = 1;
62
+ tex.needsUpdate = true;
63
+ return tex;
64
+ }
65
+ /** 行序翻转(原地)。S3MBLOCK 图集按 GL 方向存储(v=0 在最后一行),解码后要翻一次行 */
66
+ function flipRows(rgba, width, height) {
67
+ const row = width * 4;
68
+ const tmp = new Uint8Array(row);
69
+ for (let y = 0; y < height >> 1; y++) {
70
+ const a = y * row;
71
+ const b = (height - 1 - y) * row;
72
+ tmp.set(rgba.subarray(a, a + row));
73
+ rgba.copyWithin(a, b, b + row);
74
+ rgba.set(tmp, b);
75
+ }
76
+ }
77
+ /** 该像素格式自带 alpha 通道(DXT1 的 1bit alpha 不算,历史上没开过 alphaTest) */
78
+ function hasAlphaChannel(pixelFormat) {
79
+ return (pixelFormat === PixelFormat.DXT3 ||
80
+ pixelFormat === PixelFormat.DXT4 ||
81
+ pixelFormat === PixelFormat.DXT5 ||
82
+ pixelFormat === PixelFormat.ARGB ||
83
+ pixelFormat === PixelFormat.ABGR ||
84
+ pixelFormat === PixelFormat.BGRA ||
85
+ pixelFormat === PixelFormat.RGBA);
86
+ }
47
87
  /** 解 DXT 到 RGBA8。DXT5 是 1 字节/像素,DXT1 是 0.5 字节/像素。 */
48
88
  /** DXT 解码只需要尺寸 / 格式 / 字节,CRN 转码出来的结果也走这条路 */
49
89
  function decodeDXT(tex) {
50
90
  const { width, height, pixelFormat, data } = tex;
51
91
  const out = new Uint8Array(width * height * 4);
52
92
  DXTTextureDecode.decode(out, width, height, data, pixelFormat);
53
- return new THREE.DataTexture(out, width, height, THREE.RGBAFormat, THREE.UnsignedByteType);
93
+ if (tex.flipY)
94
+ flipRows(out, width, height);
95
+ const dt = new THREE.DataTexture(out, width, height, THREE.RGBAFormat, THREE.UnsignedByteType);
96
+ if (hasAlphaChannel(pixelFormat))
97
+ dt.userData.s3mHasAlpha = true;
98
+ return dt;
54
99
  }
55
100
  function fromRawRGB(tex) {
56
101
  const { width, height, pixelFormat, data } = tex;
@@ -70,11 +115,20 @@ function fromRawRGB(tex) {
70
115
  out[d + 2] = swapRB ? data[p] : data[p + 2];
71
116
  out[d + 3] = hasAlpha ? data[alphaFirst ? s : s + 3] : 255;
72
117
  }
73
- return new THREE.DataTexture(out, width, height, THREE.RGBAFormat, THREE.UnsignedByteType);
118
+ if (tex.flipY)
119
+ flipRows(out, width, height);
120
+ const dt = new THREE.DataTexture(out, width, height, THREE.RGBAFormat, THREE.UnsignedByteType);
121
+ if (hasAlphaChannel(pixelFormat))
122
+ dt.userData.s3mHasAlpha = true;
123
+ return dt;
74
124
  }
75
125
  export async function createTexture(tex) {
76
126
  if (!tex || !tex.width || !tex.height)
77
127
  return { texture: null, decoded: 'empty' };
128
+ // 图集纹理(flipY 的原始 DXT 图集 / AtlasPack 拼出来的 RGBA 大图 / leaf 组合画布)都必须
129
+ // 关 GPU mip,层级由 StyleMaterial.s3mAtlasUnit 的内联金字塔自己算。
130
+ const isAtlas = tex.packed === true || tex.flipY === true || tex.composed === true;
131
+ const asAtlas = (t) => (isAtlas ? configureAtlas(t) : configure(t));
78
132
  // 判定只能看 compressType:v3.00 的 CRN 纹理 pixelFormat 是 13(ABGR)、
79
133
  // 行标的 CRN 是 32856(GL_RGBA8),都不是 26 / 27(见 core/TextureFormat.ts)
80
134
  const kind = resolveTextureKind(tex.compressType ?? 0, tex.pixelFormat);
@@ -87,7 +141,7 @@ export async function createTexture(tex) {
87
141
  pixelFormat: crn.dxtFormat === 1 ? 17 : 21,
88
142
  data: crn.data,
89
143
  });
90
- return { texture: configure(decoded), decoded: `crn->dxt${crn.dxtFormat}` };
144
+ return { texture: asAtlas(decoded), decoded: `crn->dxt${crn.dxtFormat}` };
91
145
  }
92
146
  catch (e) {
93
147
  // 一张纹理坏了不该带崩整个瓦片,如实上报并降级成无贴图
@@ -96,20 +150,20 @@ export async function createTexture(tex) {
96
150
  }
97
151
  }
98
152
  if (kind === 'dxt1' || kind === 'dxt3' || kind === 'dxt4' || kind === 'dxt5') {
99
- return {
100
- texture: configure(decodeDXT({ ...tex, pixelFormat: dxtPixelFormatOf(kind) })),
101
- decoded: kind,
102
- };
153
+ const decoded = decodeDXT({ ...tex, pixelFormat: dxtPixelFormatOf(kind) });
154
+ // flipY 为真即 S3MBLOCK 图集(见 core/types.ts),必须无 mip
155
+ return { texture: asAtlas(decoded), decoded: kind };
103
156
  }
104
157
  if (kind === 'webp') {
105
158
  const blob = new Blob([tex.data], { type: 'image/webp' });
106
159
  const bmp = await createImageBitmap(blob);
107
160
  const t = new THREE.Texture(bmp);
108
161
  t.needsUpdate = true;
109
- return { texture: configure(t), decoded: 'webp' };
162
+ return { texture: asAtlas(t), decoded: 'webp' };
110
163
  }
111
164
  if (kind === 'raw') {
112
- return { texture: configure(fromRawRGB(tex)), decoded: 'raw' };
165
+ const decoded = fromRawRGB(tex);
166
+ return { texture: asAtlas(decoded), decoded: 'raw' };
113
167
  }
114
168
  // KTX2 / ETC 需要额外解码器,先如实上报而不是静默出错
115
169
  return { texture: null, decoded: `unsupported(${tex.compressType}/${tex.pixelFormat})` };
@@ -1 +1 @@
1
- {"version":3,"file":"TextureFactory.js","sourceRoot":"","sources":["../../src/render/TextureFactory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TextureFactory.js","sourceRoot":"","sources":["../../src/render/TextureFactory.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,43 @@
1
+ import type { S3MBlockAtlasImage } from '../core/S3MBlockParser.js';
1
2
  import type { Anchor, ParsedTile, Stats, StyleUniforms } from '../core/types.js';
2
3
  import type { Group, Texture } from 'three';
4
+ /**
5
+ * 修补路径里没被编码、但会被服务端改写的字符。
6
+ *
7
+ * 最典型的是 `+`:OSGB 转 S3M 的缓存瓦片名就是 `Tile_+002_+001`,而 iServer 的 Java 侧
8
+ * 按 URLDecoder 解路径,未编码的 `+` 会变成空格 → 404「瓦片数据不存在」。
9
+ * new URL() 的序列化器认为 `+` 在 path 里是合法字符,所以不会替我们编码,必须自己补上。
10
+ * 只动 path,不动 query/hash:query 里的 `+` 本来就是空格的约定,改了反而换味。
11
+ */
12
+ export declare function fixPathEncoding(url: string): string;
13
+ /** 配置文件里的经纬度范围 */
14
+ export interface GeoBounds {
15
+ left: number;
16
+ bottom: number;
17
+ right: number;
18
+ top: number;
19
+ }
20
+ /**
21
+ * 判断 config.geoBounds 是不是一张「真的能用」的经纬度范围。
22
+ *
23
+ * 挡掉三种情况:字段缺失 / 非有限值;超出经纬度量级(OSGB 那类只给米制局部坐标的,
24
+ * 反算不出来就是这种);以及退化成一条线或一个点的全 0 框。
25
+ * 退化框尤其危险:拿它去 fitBounds 会把视角甩到几内亚湾 (0,0),
26
+ * 拿它去校验 position 又会把唯一正确的 position 判成异常。
27
+ */
28
+ export declare function usableGeoBounds(b: unknown): GeoBounds | null;
29
+ /**
30
+ * S3M 1.x(SuperMapCache)的子瓦地址。
31
+ *
32
+ * XML 的 RangeDataList 写的是切片时的原始文件名(`Tile_+002_+001_L16_0.osgb`),
33
+ * 而 iServer 实际发布的是**同名换 .s3m 后缀**、并且插在 `datas/<数据源>/data/path/` 下:
34
+ * .../datas/Config/Tile_+002_+001/Tile_+002_+001.s3m ← 根
35
+ * .../datas/Config/data/path/Tile_+002_+001/Tile_+002_+001_L16_0.s3m ← 子
36
+ * 实测 L16/L17/L18 都是 200,`?sceneName=` 不参与寻址。
37
+ */
38
+ export declare function s3m1ChildUrl(tileUrl: string, child: string | null | undefined): string | null;
39
+ /** 兼容解析 JSON 与 XML 格式的 SuperMap .scp / config 配置文件(导出以便单测与自建数据集列表复用) */
40
+ export declare function parseConfigText(text: string): Record<string, unknown>;
3
41
  export interface TileNode {
4
42
  url: string;
5
43
  tile: ParsedTile;
@@ -49,16 +87,51 @@ export interface S3MTilesetOptions {
49
87
  maxRetries?: number;
50
88
  /** LOD 切换范围缩放系数(默认 1.0),> 1 更倾向保留粗模,< 1 提前换细模 */
51
89
  lodRangeScale?: number;
90
+ /**
91
+ * 是否请求 `.texblock` 子图集(S3MBLOCK 根图集的清晰版)。**默认关**。
92
+ *
93
+ * 不是没实现,而是「换图不换归一化 rect」这条规则只在部分链上成立:实测三对样本里
94
+ * 有一对的比例是 2.000×1.579(不成比例),打开后整场景建筑会碎成满屏空洞
95
+ * (错裁到 alpha=0 的区域被 alphaTest 丢弃)。要安全启用必须先做逐图集一致性自检
96
+ * (把子图集按归一化 rect 裁回来与根槽位比 alpha 轮廓 IoU + 色差),通过才换。
97
+ * 度量方式见 `_tmp/atlas/rule2.mts`。
98
+ */
99
+ atlasLod?: boolean;
52
100
  }
53
101
  export declare class S3MTileset {
54
102
  configUrl: string;
55
103
  config: Record<string, unknown> | null;
104
+ /**
105
+ * S3MBLOCK 数据集的完整瓦片清单(config.tiles 解析成绝对 URL)。
106
+ * 这类数据的 pageLOD 会引用服务端并不存在的子块(LOD 树占位),
107
+ * 按清单过滤可以避免成片的 404。经典 scp 不建这个索引,行为不变。
108
+ */
109
+ private _blockTileIndex;
56
110
  anchor: Anchor;
57
111
  readonly rootUrls: string[];
58
112
  readonly nodes: Map<string, TileNode>;
59
113
  readonly failed: Set<string>;
60
114
  readonly textureCache: Map<string, Texture>;
61
115
  readonly pending: Set<string>;
116
+ /** 是否请求 `.texblock` 子图集,默认关,见 S3MTilesetOptions.atlasLod */
117
+ atlasLod: boolean;
118
+ /** 根图集 id → 已拉到的清晰版子图集;null = 正在请求或确认没有,避免重复发请求 */
119
+ readonly atlasLodCache: Map<string, S3MBlockAtlasImage | null>;
120
+ /** 块 URL → 该文件里的全部 LOD 组(一个 .s3mblock 是一棵子树,不是一块瓦片) */
121
+ private readonly _groupCache;
122
+ /** 独立 `.texblock` 图集缓存:id → 图像;null 表示正在请求或确认不可用 */
123
+ readonly externalAtlasCache: Map<string, S3MBlockAtlasImage | null>;
124
+ /**
125
+ * leaf 子请求缓存:去扩展名的子请求名(`Tex_0_000` / `Tile_6_000000`)→ 响应里的记录;
126
+ * null = 已判定不可用。精灵按全局共享(同名同内容),跨瓦片复用。
127
+ */
128
+ readonly leafRequestCache: Map<string, S3MBlockAtlasImage[] | null>;
129
+ /** 进行中的 leaf 请求(stem → Promise),跨瓦片并发时同名只发一次 */
130
+ private readonly _leafPending;
131
+ /** 真正被高清版顶替掉的图集 id(判定通过) */
132
+ readonly atlasUpgraded: Set<string>;
133
+ /** 拿到高清版但判定不通过 → 原因。用于排查「为什么这块还是糊的」 */
134
+ readonly atlasUpgradeSkipped: Map<string, string>;
62
135
  readonly stats: Stats;
63
136
  maxConcurrent: number;
64
137
  maxTiles: number;
@@ -79,6 +152,13 @@ export declare class S3MTileset {
79
152
  /** 子瓦片 URL → 父瓦片 URL,用于淘汰后补洞 */
80
153
  private readonly _parentOf;
81
154
  private _frame;
155
+ private _lodDbgOnce;
156
+ /** 格式类永久错误只向上报一次,避免整棵瓦片树刷同样的日志 */
157
+ private _permanentReported;
158
+ /** 请求量的硬上限(软上限 maxTiles 的超额余量),见构造函数注释 */
159
+ private hardCap;
160
+ /** 本数据集是 S3M 1.x(SuperMapCache,.s3m):子瓦地址规则与 3.x 不同 */
161
+ private isS3MV1;
82
162
  private _buildTile;
83
163
  private readonly _uniforms;
84
164
  private _queue;
@@ -99,9 +179,20 @@ export declare class S3MTileset {
99
179
  * 淘汰最细一级时,如果上一级也不在内存里,顺手把上一级排回队列补洞。
100
180
  */
101
181
  private _evictOne;
182
+ /**
183
+ * 预算裁剪 —— 必须在可见性算完之后调用(make-before-break):
184
+ * 新瓦片已经落地、也已经决定由谁负责显示,这时候才把没人依赖的那块裁掉。
185
+ * 只踢「当前不显示」或「位置已被可见子瓦接手」的瓦片;挑不出安全候选时允许
186
+ * 暂时超出 maxTiles,等下一帧再裁 —— 宁可多占一会儿内存,也不在画面上开洞。
187
+ */
188
+ private _trimBudget;
102
189
  /**
103
190
  * 挑淘汰候选。
104
- * @param allowRefined false = 只挑叶子;true = 只挑「子节点已全部加载」的父瓦片
191
+ * @param allowRefined false = 只挑叶子;true = 也允许挑「子节点已全部加载」的父瓦片
192
+ * @param allowUncovered true = 允许淘汰「正在显示、但位置还没被子瓦接手」的瓦片。
193
+ * 默认 false:这种瓦片一踢,画面上立刻是一个洞,下一帧调度又会把它请回来补洞,
194
+ * 于是「淘汰 → 开洞 → 回补 → 再淘汰」无限循环 = 屏幕不停闪烁。
195
+ * 只有在实在挑不出安全候选时才允许(否则预算满死锁、相机移到哪都不出图)。
105
196
  */
106
197
  private _pickVictim;
107
198
  /** 把之前彻底失败的瓦片全部放回队列(网络恢复后手动调一次) */
@@ -111,10 +202,70 @@ export declare class S3MTileset {
111
202
  * 定位锚点。规范里 position 是局部 ENU 坐标系原点,
112
203
  * 但实际数据里 position 偶尔是生产时的占位值(与 geoBounds 不符),
113
204
  * 所以这里做一次一致性检查,不一致就退回 geoBounds 中心。
205
+ *
206
+ * 前提是 geoBounds 真的可用:OSGB/SuperMapCache 这类配置只给米制局部包围盒,
207
+ * 全 0 的退化框不能反过来否定一个正常的 position —— 那等于把模型甩到 (0,0)。
114
208
  */
115
209
  private _resolveAnchor;
116
210
  private _pickLod;
117
211
  private _builder;
212
+ /**
213
+ * 记住一个块文件里解析出来的全部 LOD 组。
214
+ *
215
+ * 一棵 LOD 子树的几层几何加图集动辄好几 MB,全数据集都留着会把内存吃光,
216
+ * 所以只保留最近 24 个块(LRU 足够:相机在附近移动时命中的永远是同几个块)。
217
+ */
218
+ private _rememberGroups;
219
+ /**
220
+ * 补齐「图集像素不在块文件里」的那一半 —— 官方 `requestSubTextures` 的等价物。
221
+ *
222
+ * 根瓦片(如 6.s3mblock)的图集是内嵌的(isSaveData=1);但**子瓦片**(6_00 / 6_01)
223
+ * 的图集段只有元信息:`data = null` + `requestNames`,像素在同目录的 `.texblock` 里。
224
+ * 不补这一步的后果不是「糊一点」,而是子瓦片整块无贴图:`tile.textures` 里根本没有
225
+ * 这条纹理,材质拿不到 map,建筑变成纯白几何——精细 LOD 一旦真的加载进来就会显露。
226
+ *
227
+ * ★ 只认 requestNames。`childTexNames` 是**下一级 LOD 的图集指针**(官方 `_ancestorTexture`
228
+ * 用它继承 batchTable 的 rect),它有自己的 subTexInfos:同一个精灵在父级叫 `1460_3`
229
+ * 96x64、子级叫 `1460_2` 192x128,排布也不一样。拿父级的 rect 去套子级像素必然错位 ——
230
+ * 上一版就是这么把画面搞坏的。官方从不拿它换像素,那个 LOD 的瓦片自己会加载。
231
+ *
232
+ * requestNames 展开(见 `expandTexblockRequestNames`,逐字对应官方 `_subRequestNames`):
233
+ *
234
+ * 1. **整图**(`['-704919438.texblock']`,单条记录 = 整张图集)→ 用 `evaluateAtlasUpgrade`
235
+ * 验证后整体替换;根块自带缩略图必须验证过才能换,子瓦片(无基准)至少要求长宽比一致。
236
+ * 2. **leaf 多精灵**(`['Tex_0.texblock#000009…', 'Tile_6_000000.texblock']`,官方 isLeaf)→
237
+ * 图集本身没有像素,只有 `subTexInfos` 里每块一个精灵 rect。按 subName 把精灵贴回
238
+ * 各 rect(`composeLeafAtlas`),组合出整张自上而下 RGBA 画布(compressType=0 /
239
+ * pixelFormat=28 / flipY=false)。精灵自带「左 2/3 base + 右 1/3 内联 mip 金字塔」,
240
+ * 与 StyleMaterial 的 `s3mAtlasLod` 2/3 采样公式直接配套,rect 一个像素都不用改。
241
+ *
242
+ * 请求方式:pack 组按官方 `Uci` 合并成
243
+ * `GET Tex_0_<code>.texblock?extratiles=Tex_0_000;Tex_0_009;…`(extratiles **去扩展名**、
244
+ * 段序 = 请求序,kMi 取第 i 段);`Tile_*` 是普通多记录容器,整文件解析后按记录名分发。
245
+ *
246
+ * 不补/补失败时保持缩略图(或无贴图),由上层照常渲染几何,绝不清空已有纹理表。
247
+ */
248
+ private _fillExternalAtlases;
249
+ /** 同名子请求去重:命中缓存立即返回;否则共享进行中的 Promise(跨瓦片并发只发一次) */
250
+ private _ensureLeafFetch;
251
+ /**
252
+ * pack 组请求 —— 官方 `Uci`:URL = 组内第一个请求的 URL,追加
253
+ * `extratiles=<全组 quadKey,去扩展名,';' 连接>`;响应是 kMi pack,段序 = extratiles 序。
254
+ *
255
+ * 实测服务端两种写法都 200,但带 `.texblock` 的 extratiles 会解出 recs=4 的错内容,
256
+ * 所以必须用**去扩展名**的 quadKey。
257
+ */
258
+ private _fetchLeafPack;
259
+ /** 普通 `.texblock`(整图或多记录容器):文件里的全部记录都归这个子请求名 */
260
+ private _fetchLeafFile;
261
+ /**
262
+ * @deprecated 已由 `_fillExternalAtlases` 覆盖,保留仅为兼容 `atlasLod` 选项。
263
+ *
264
+ * 旧实现「像素数更大就整体换图」,正是被证伪的那个前提:实测 8 张图集里只有 2 张的
265
+ * child 是等比放大,其余是重新排版过的另一张图,硬换会整张错位。
266
+ * 现在换图统一走 `_fillExternalAtlases` + `evaluateAtlasUpgrade` 的验证流程。
267
+ */
268
+ private _upgradeAtlasLod;
118
269
  private _load;
119
270
  /**
120
271
  * @param camEnu 相机在该数据集局部 ENU 坐标系中的位置(米)
@@ -1 +1 @@
1
- {"version":3,"file":"S3MTileset.d.ts","sourceRoot":"","sources":["../../src/tileset/S3MTileset.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"S3MTileset.d.ts","sourceRoot":"","sources":["../../src/tileset/S3MTileset.ts"],"names":[],"mappings":"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"}