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
@@ -116,13 +116,41 @@ const SEMANTIC_NAME = {
116
116
  [MeshOptSemantic.GS_SCALE]: 'gsScale',
117
117
  [MeshOptSemantic.GS_ROTATION]: 'gsRotation',
118
118
  };
119
+ function pushSink(sinks, semantic, dtype, components, chunk) {
120
+ let sink = sinks.get(semantic);
121
+ if (!sink) {
122
+ sink = { dtype, components, chunks: [], length: 0 };
123
+ sinks.set(semantic, sink);
124
+ }
125
+ sink.chunks.push(chunk);
126
+ sink.length += chunk.length;
127
+ }
119
128
  /**
120
- * 读取一个 MeshOpt 压缩的 Skeleton。
129
+ * 索引是块内局部编号(实测 max index 恰为所在块的 vertexCount - 1),
130
+ * 多块合并成一份顶点缓冲后要整体加上该块的顶点基数。
131
+ *
132
+ * 用 DataView 而不是 Uint32Array:未压缩索引那段是底层 buffer 的 subarray,
133
+ * byteOffset 未必 4 字节对齐,直接建 Uint32Array 会抛 RangeError。
134
+ */
135
+ function offsetIndices(packs, base) {
136
+ for (const pack of packs) {
137
+ const buf = pack.indices;
138
+ if (!buf || pack.indexCount <= 0 || buf.byteLength < pack.indexCount * 4)
139
+ continue;
140
+ const dv = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);
141
+ for (let i = 0; i < pack.indexCount; i++) {
142
+ dv.setUint32(i * 4, dv.getUint32(i * 4, true) + base, true);
143
+ }
144
+ }
145
+ }
146
+ /**
147
+ * 读取一个 MeshOpt 压缩的 Skeleton,以及**内嵌在块之间的索引包**。
121
148
  *
122
149
  * 二进制布局(v3.01 实测):
123
150
  * ```
124
151
  * uint32 compressOptions // 0x13 = Position | Normal | TexCoord
125
- * uint32 blockCount // 实测恒为 1
152
+ * uint32 blockCount // 实测 1 或 2
153
+ * ↑ 下面整段重复 blockCount 次:
126
154
  * uint32 vertexCount
127
155
  * float32 vertCompressConstant
128
156
  * float64 minVerticesValue.xyz
@@ -138,13 +166,23 @@ const SEMANTIC_NAME = {
138
166
  * pad4
139
167
  * String descript // {"TextureCoordMatrix":1,"VertexWeight":0}
140
168
  * pad4
169
+ * IndexPackage[] // ← 每块各带一份,不是所有块之后再统一放
141
170
  * ```
171
+ *
172
+ * 注意最后一行:blockCount > 1 时索引包夹在块与块之间。之前按「读完所有块再读索引包」
173
+ * 处理,会把第一块的索引包当成第二块的块头,读出天文数字的 compressedSize。
174
+ *
175
+ * 多块是同一份几何的拆分,这里把各块属性按顺序拼成一条流,并把各块索引加上
176
+ * 顶点基数偏移,对外仍是一份顶点缓冲 + 多组索引包,下游无需改动。
142
177
  */
143
- export async function parseMeshOptSkeleton(r, vp) {
178
+ export async function parseMeshOptGeometry(r, vp) {
144
179
  const decoder = await loadMeshoptDecoder();
145
180
  const compressOptions = r.u32();
146
181
  vp.compressOptions = compressOptions;
147
182
  const blockCount = r.u32();
183
+ if (blockCount > 64) {
184
+ throw new Error(`[s3m] MeshOpt 块数异常:blockCount=${blockCount}`);
185
+ }
148
186
  const info = {
149
187
  vertexCount: 0,
150
188
  compressOptions,
@@ -160,6 +198,10 @@ export async function parseMeshOptSkeleton(r, vp) {
160
198
  ],
161
199
  streams: [],
162
200
  };
201
+ const sinks = new Map();
202
+ const indexPackages = [];
203
+ let baseVertex = 0;
204
+ let hasCustomAttribute = false;
163
205
  for (let bi = 0; bi < blockCount; bi++) {
164
206
  const vertexCount = r.u32();
165
207
  const vertScale = r.f32();
@@ -178,14 +220,11 @@ export async function parseMeshOptSkeleton(r, vp) {
178
220
  texCoordOffset.push([a, b]);
179
221
  }
180
222
  const attrCount = r.i32();
181
- const decodeThisBlock = bi === 0;
182
- if (decodeThisBlock) {
183
- info.vertexCount = vertexCount;
184
- info.vertScale = vertScale;
223
+ if (bi === 0) {
185
224
  info.minVertices = [minX, minY, minZ];
225
+ info.vertScale = vertScale;
186
226
  info.texCoordScale = texCoordScale;
187
227
  info.texCoordOffset = texCoordOffset;
188
- vp.verticesCount = vertexCount;
189
228
  }
190
229
  for (let ai = 0; ai < attrCount; ai++) {
191
230
  const semantic = r.i32();
@@ -199,8 +238,6 @@ export async function parseMeshOptSkeleton(r, vp) {
199
238
  const compressedSize = r.i32();
200
239
  const data = r.bytes(compressedSize);
201
240
  r.align4();
202
- if (!decodeThisBlock)
203
- continue;
204
241
  // 切线流我们不用(渲染里没有法线贴图通道),解不出来也不该拖垮整个瓦片:
205
242
  // 真实服务里带 PBR 的数据(如 SubwayStationCombined)都带这条流,之前直接抛错导致整套数据不可见
206
243
  if (semantic === MeshOptSemantic.TANGENT) {
@@ -235,7 +272,7 @@ export async function parseMeshOptSkeleton(r, vp) {
235
272
  pos[i * 3 + 1] = minY + u16[i * 4 + 1] * vertScale;
236
273
  pos[i * 3 + 2] = minZ + u16[i * 4 + 2] * vertScale;
237
274
  }
238
- vp.vertexAttributes.push(f32Attribute('position', pos, 3));
275
+ pushSink(sinks, 'position', 'f32', 3, pos);
239
276
  }
240
277
  else if (semantic === MeshOptSemantic.NORMAL) {
241
278
  const i16 = new Int16Array(out.buffer, out.byteOffset, vertexCount * 2);
@@ -243,13 +280,13 @@ export async function parseMeshOptSkeleton(r, vp) {
243
280
  for (let i = 0; i < vertexCount; i++) {
244
281
  octDecode(i16[i * 2] / 32767, i16[i * 2 + 1] / 32767, nrm, i * 3);
245
282
  }
246
- vp.vertexAttributes.push(f32Attribute('normal', nrm, 3));
283
+ pushSink(sinks, 'normal', 'f32', 3, nrm);
247
284
  }
248
285
  else if (semantic === MeshOptSemantic.COLOR) {
249
- vp.vertexAttributes.push(u8Attribute('color', out, 4));
286
+ pushSink(sinks, 'color', 'u8', 4, out);
250
287
  }
251
288
  else if (semantic === MeshOptSemantic.COLOR1) {
252
- vp.vertexAttributes.push(u8Attribute('color2', out, 4));
289
+ pushSink(sinks, 'color2', 'u8', 4, out);
253
290
  }
254
291
  else if (semantic === MeshOptSemantic.TEXCOORD0 || semantic === MeshOptSemantic.TEXCOORD1) {
255
292
  const slot = semantic === MeshOptSemantic.TEXCOORD0 ? 0 : 1;
@@ -268,13 +305,23 @@ export async function parseMeshOptSkeleton(r, vp) {
268
305
  uv[i * 2 + 1] = offset[1] + u16[i * 2 + 1] * scale[1];
269
306
  }
270
307
  }
271
- vp.vertexAttributes.push(f32Attribute(slot === 0 ? 'uv' : 'uv2', uv, 2));
308
+ pushSink(sinks, slot === 0 ? 'uv' : 'uv2', 'f32', 2, uv);
309
+ }
310
+ else if (semantic === MeshOptSemantic.CUSTOM0 ||
311
+ semantic === MeshOptSemantic.CUSTOM1 ||
312
+ semantic === MeshOptSemantic.GS_SCALE ||
313
+ semantic === MeshOptSemantic.GS_ROTATION) {
314
+ // 自定义属性流 / 高斯泼溅的逐点参数:原样保留解码结果(每点 stride 字节),
315
+ // 语义由 vp.customVertexAttribute 的名字→槽位映射给出。
316
+ // 以前这里直接丢掉,导致 3DGaussianSplatting 数据只剩「点 + 颜色」,
317
+ // 上层永远拿不到泼溅尺寸与朝向。
318
+ pushSink(sinks, SEMANTIC_NAME[semantic], 'u8', stride, out);
272
319
  }
273
- // tangent / custom / GS 系列暂不使用
274
320
  }
275
321
  const descript = r.string();
276
322
  r.align4();
277
- if (decodeThisBlock && descript) {
323
+ if (descript && !hasCustomAttribute) {
324
+ hasCustomAttribute = true;
278
325
  try {
279
326
  vp.customVertexAttribute = JSON.parse(descript);
280
327
  }
@@ -282,12 +329,48 @@ export async function parseMeshOptSkeleton(r, vp) {
282
329
  vp.customVertexAttribute = descript;
283
330
  }
284
331
  }
332
+ // 每块后面紧跟自己的索引包(blockCount = 1 时等价于「骨架之后读索引包」)
333
+ const packs = await parseMeshOptIndexPackages(r);
334
+ if (baseVertex > 0)
335
+ offsetIndices(packs, baseVertex);
336
+ indexPackages.push(...packs);
337
+ baseVertex += vertexCount;
338
+ }
339
+ // blockCount = 0 的老数据:索引包仍然跟在骨架后面
340
+ if (blockCount === 0) {
341
+ indexPackages.push(...(await parseMeshOptIndexPackages(r)));
342
+ }
343
+ info.vertexCount = baseVertex;
344
+ vp.verticesCount = baseVertex;
345
+ // 留下原始流清单:诊断用,也是接自定义属性 / 高斯泼溅属性的入口
346
+ vp.meshOptInfo = info;
347
+ // 跨块拼接:属性流长度按理各块一致,缺块时补 0,宁可少一块颜色也不整块不可见
348
+ for (const [semantic, sink] of sinks) {
349
+ const expected = baseVertex * sink.components;
350
+ if (sink.dtype === 'f32') {
351
+ const out = new Float32Array(expected);
352
+ let off = 0;
353
+ for (const chunk of sink.chunks) {
354
+ out.set(chunk, off);
355
+ off += chunk.length;
356
+ }
357
+ vp.vertexAttributes.push(f32Attribute(semantic, out, sink.components));
358
+ }
359
+ else {
360
+ const out = new Uint8Array(expected);
361
+ let off = 0;
362
+ for (const chunk of sink.chunks) {
363
+ out.set(chunk, off);
364
+ off += chunk.length;
365
+ }
366
+ vp.vertexAttributes.push(u8Attribute(semantic, out, sink.components));
367
+ }
285
368
  }
286
369
  // attrLocation 供老接口按名字查索引
287
370
  for (let i = 0; i < vp.vertexAttributes.length; i++) {
288
371
  vp.attrLocation[`a${vp.vertexAttributes[i].semantic}`] = i;
289
372
  }
290
- return info;
373
+ return { info, indexPackages };
291
374
  }
292
375
  /* ------------------------------------------------------------------ 索引包 */
293
376
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"MeshOpt.js","sourceRoot":"","sources":["../../src/core/MeshOpt.ts"],"names":[],"mappings":"AAqBA,sBAAsB;AACtB,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,QAAQ,EAAE,GAAG;IACb,UAAU,EAAE,GAAG;IACf,MAAM,EAAE,GAAG;IACX,OAAO,EAAE,GAAG;IACZ,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,IAAI;IACf,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,KAAK;IACd,QAAQ,EAAE,OAAO;IACjB,WAAW,EAAE,OAAO;CACZ,CAAC;AAEX,oDAAoD;AACpD,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC,IAAI,cAAc,GAAmC,IAAI,CAAC;AAE1D;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,cAAc,GAAG,MAAM,CAAC,qCAAqC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAChF,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;YAC5B,IAAI,CAAC,OAAO,EAAE,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;YACtF,MAAM,OAAO,CAAC,KAAK,CAAC;YACpB,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,8EAA8E;AAE9E,SAAS,IAAI,CAAC,CAAS;IACrB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,2CAA2C;AAC3C,SAAS,SAAS,CAAC,CAAS,EAAE,CAAS,EAAE,GAAiB,EAAE,CAAS;IACnE,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,IAAI,EAAE,GAAG,CAAC,CAAC;IACX,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACV,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;QACxC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,EAAE,GAAG,CAAC,CAAC;IACT,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACvC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC;IAClB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC;IACtB,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;AACvB,CAAC;AAED,2EAA2E;AAE3E,SAAS,YAAY,CAAC,QAAgB,EAAE,IAAkB,EAAE,UAAkB;IAC5E,OAAO;QACL,QAAQ;QACR,IAAI,EAAE,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC;QACnE,UAAU;QACV,MAAM,EAAE,UAAU,GAAG,CAAC;QACtB,aAAa,EAAE,CAAC;QAChB,KAAK,EAAE,KAAK;KACb,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB,EAAE,IAAgB,EAAE,UAAkB;IACzE,OAAO;QACL,QAAQ;QACR,IAAI;QACJ,UAAU;QACV,MAAM,EAAE,UAAU;QAClB,aAAa,EAAE,CAAC;QAChB,KAAK,EAAE,IAAI;KACZ,CAAC;AACJ,CAAC;AAED,qCAAqC;AACrC,SAAS,SAAS,CAAC,QAAgB,EAAE,eAAuB,EAAE,QAAgB;IAC5E,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,eAAe,CAAC,MAAM,CAAC;QAC5B,KAAK,eAAe,CAAC,SAAS,CAAC;QAC/B,KAAK,eAAe,CAAC,SAAS;YAC5B,OAAO,CAAC,CAAC,CAAC,qBAAqB;QACjC,KAAK,eAAe,CAAC,KAAK,CAAC;QAC3B,KAAK,eAAe,CAAC,MAAM;YACzB,OAAO,CAAC,CAAC,CAAC,QAAQ;QACpB,KAAK,eAAe,CAAC,OAAO,CAAC;QAC7B,KAAK,eAAe,CAAC,OAAO;YAC1B,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACnC,KAAK,eAAe,CAAC,QAAQ,CAAC;QAC9B,KAAK,eAAe,CAAC,WAAW;YAC9B,OAAO,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAChE;YACE,OAAO,CAAC,CAAC,CAAC,sBAAsB;IACpC,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CACb,OAAuB,EACvB,WAAmB,EACnB,MAAc,EACd,MAAkB;IAElB,MAAM,IAAI,GAAG,WAAW,GAAG,MAAM,CAAC;IAClC,yEAAyE;IACzE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,uBAAuB,WAAW,SAAS,MAAM,OAAO,IAAI,GAAG,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACjC,OAAO,CAAC,kBAAkB,CAAC,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5E,OAAO,GAAG,CAAC;AACb,CAAC;AAiBD,MAAM,aAAa,GAA2B;IAC5C,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,UAAU;IACtC,CAAC,eAAe,CAAC,UAAU,CAAC,EAAE,WAAW;IACzC,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,QAAQ;IAClC,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,SAAS;IACpC,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,IAAI;IACjC,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,KAAK;IAClC,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,OAAO;IAChC,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,QAAQ;IAClC,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,SAAS;IACpC,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,SAAS;IACpC,CAAC,eAAe,CAAC,QAAQ,CAAC,EAAE,SAAS;IACrC,CAAC,eAAe,CAAC,WAAW,CAAC,EAAE,YAAY;CAC5C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,CAAe,EAAE,EAAiB;IAC3E,MAAM,OAAO,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAE3C,MAAM,eAAe,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IAChC,EAAE,CAAC,eAAe,GAAG,eAAe,CAAC;IACrC,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IAE3B,MAAM,IAAI,GAAqB;QAC7B,WAAW,EAAE,CAAC;QACd,eAAe;QACf,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACtB,SAAS,EAAE,CAAC;QACZ,aAAa,EAAE;YACb,CAAC,CAAC,EAAE,CAAC,CAAC;YACN,CAAC,CAAC,EAAE,CAAC,CAAC;SACP;QACD,cAAc,EAAE;YACd,CAAC,CAAC,EAAE,CAAC,CAAC;YACN,CAAC,CAAC,EAAE,CAAC,CAAC;SACP;QACD,OAAO,EAAE,EAAE;KACZ,CAAC;IAEF,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC;QACvC,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAErB,MAAM,aAAa,GAA4B,EAAE,CAAC;QAClD,MAAM,cAAc,GAA4B,EAAE,CAAC;QACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAClB,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAClB,uCAAuC;YACvC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;;gBACvC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,eAAe,GAAG,EAAE,KAAK,CAAC,CAAC;QAEjC,IAAI,eAAe,EAAE,CAAC;YACpB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;YAC/B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;YAC3B,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;YACnC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;YACrC,EAAE,CAAC,aAAa,GAAG,WAAW,CAAC;QACjC,CAAC;QAED,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACzB,IAAI,QAAQ,GAAG,CAAC,CAAC;YACjB,IACE,QAAQ,KAAK,eAAe,CAAC,OAAO;gBACpC,QAAQ,KAAK,eAAe,CAAC,OAAO;gBACpC,QAAQ,KAAK,eAAe,CAAC,QAAQ;gBACrC,QAAQ,KAAK,eAAe,CAAC,WAAW,EACxC,CAAC;gBACD,QAAQ,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACrB,CAAC;YACD,MAAM,cAAc,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YACrC,CAAC,CAAC,MAAM,EAAE,CAAC;YAEX,IAAI,CAAC,eAAe;gBAAE,SAAS;YAE/B,sCAAsC;YACtC,+DAA+D;YAC/D,IAAI,QAAQ,KAAK,eAAe,CAAC,OAAO,EAAE,CAAC;gBACzC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC7E,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,CAAC,CAAC;YAC9D,IAAI,GAAe,CAAC;YACpB,IAAI,CAAC;gBACH,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,2CAA2C;gBAC3C,IAAI,QAAQ,KAAK,eAAe,CAAC,SAAS,IAAI,QAAQ,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;oBACrF,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC9C,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,KAAK,CAAC,mCAAmC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;gBAC/E,CAAC;YACH,CAAC;YAED,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,cAAc,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YAC9E,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;gBAChB,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,cAAc;gBACrB,MAAM,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;aAC3D,CAAC,CAAC;YAEH,IAAI,QAAQ,KAAK,eAAe,CAAC,QAAQ,EAAE,CAAC;gBAC1C,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;gBACzE,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;gBAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;oBACrC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;oBAC3C,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;oBACnD,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;gBACrD,CAAC;gBACD,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7D,CAAC;iBAAM,IAAI,QAAQ,KAAK,eAAe,CAAC,MAAM,EAAE,CAAC;gBAC/C,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;gBACxE,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;gBAC9C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;oBACrC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;gBACpE,CAAC;gBACD,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3D,CAAC;iBAAM,IAAI,QAAQ,KAAK,eAAe,CAAC,KAAK,EAAE,CAAC;gBAC9C,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YACzD,CAAC;iBAAM,IAAI,QAAQ,KAAK,eAAe,CAAC,MAAM,EAAE,CAAC;gBAC/C,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1D,CAAC;iBAAM,IAAI,QAAQ,KAAK,eAAe,CAAC,SAAS,IAAI,QAAQ,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC;gBAC5F,MAAM,IAAI,GAAG,QAAQ,KAAK,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5D,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5C,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9C,MAAM,EAAE,GAAG,IAAI,YAAY,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;gBAC7C,IAAI,GAAG,CAAC,UAAU,KAAK,WAAW,GAAG,CAAC,EAAE,CAAC;oBACvC,oBAAoB;oBACpB,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;oBAC1E,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;oBACzE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;wBACrC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;wBAC9C,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACxD,CAAC;gBACH,CAAC;gBACD,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3E,CAAC;YACD,+BAA+B;QACjC,CAAC;QAED,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;QAC5B,CAAC,CAAC,MAAM,EAAE,CAAC;QACX,IAAI,eAAe,IAAI,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC;gBACH,EAAE,CAAC,qBAAqB,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAClD,CAAC;YAAC,MAAM,CAAC;gBACP,EAAE,CAAC,qBAAqB,GAAG,QAAQ,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,4EAA4E;AAE5E;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,CAAe;IAC7D,MAAM,OAAO,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACtB,MAAM,KAAK,GAAmB,EAAE,CAAC;IAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAI,UAAU,GAAG,CAAC;YAAE,SAAS;QAE7B,MAAM,iBAAiB,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;QACxB,MAAM,aAAa,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;QAC7B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEV,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACrB,IAAI,OAAmB,CAAC;QAExB,IAAI,aAAa,KAAK,kBAAkB,EAAE,CAAC;YACzC,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC5B,CAAC,CAAC,MAAM,EAAE,CAAC;QACb,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC,CAAC,MAAM,EAAE,CAAC;YACX,sBAAsB;YACtB,OAAO,GAAG,IAAI,UAAU,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;YACzC,OAAO,CAAC,iBAAiB,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE;YAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/D,CAAC,CAAC,MAAM,EAAE,CAAC;QAEX,oDAAoD;QACpD,+CAA+C;QAC/C,MAAM,KAAK,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,MAAM,SAAS,GACb,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,KAAK,CAAC,IAAI,iBAAiB,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;QACjH,KAAK,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"MeshOpt.js","sourceRoot":"","sources":["../../src/core/MeshOpt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { ParsedTile } from './types.js';
2
+ export interface ParseS3M1Options {
3
+ inflate?: (bytes: Uint8Array) => Uint8Array | Promise<Uint8Array>;
4
+ }
5
+ /** 是不是 S3M 1.x 容器 */
6
+ export declare function isS3M1Buffer(buffer: ArrayBuffer): boolean;
7
+ /**
8
+ * 按「字节/像素」反推 S3MPixelFormat。
9
+ *
10
+ * v1 头里那个 format 数字不能直接当 pixelFormat 用(实测恒为 14,而本库枚举里
11
+ * 14 = BGRA = 4 字节/像素,照搬会把 0.5 字节/像素的数据当 4 字节读 → 满屏彩噪)。
12
+ * 压缩格式与密度是一一对应的,所以用密度判定,并把原始数字留在告警里。
13
+ */
14
+ export declare function pixelFormatOfBpp(bpp: number, rawFormat: number): number;
15
+ export declare function parseS3M1(arrayBuffer: ArrayBuffer, options?: ParseS3M1Options): Promise<ParsedTile>;
16
+ //# sourceMappingURL=S3M1Parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"S3M1Parser.d.ts","sourceRoot":"","sources":["../../src/core/S3M1Parser.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAKV,UAAU,EAIX,MAAM,YAAY,CAAC;AAKpB,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACnE;AAED,qBAAqB;AACrB,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAGzD;AAoMD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAQvE;AA4CD,wBAAsB,SAAS,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC,CAuH7G"}
@@ -0,0 +1,367 @@
1
+ /**
2
+ * S3M 1.x(SuperMapCache,文件后缀 `.s3m`)容器解析
3
+ *
4
+ * iServer 把 OSGB 等倾斜摄影成果按这种格式发布。输出与 `parseS3MB` 同形状的
5
+ * `ParsedTile`,因此 GeometryBuilder / S3MTileset / 拾取这套下游不用改。
6
+ *
7
+ * 结构(root / L16 / L17 / L18 四块真实瓦片交叉标定,链尾全部精确闭合):
8
+ * ```
9
+ * byte[4] 's3m\0' + zlib
10
+ * 解压后:
11
+ * uint32 xmlSize; byte[] XML; <补齐 4 字节对齐>
12
+ * uint32 geoSize; 几何流
13
+ * uint32 4; uint32 0 // 固定小段,实测恒 0
14
+ * uint32 texSize; 纹理流
15
+ *
16
+ * 几何流: uint32 meshCount,然后每块网格
17
+ * uint32 geoName; uint32 7; uint32 772; uint32 V; uint32 0
18
+ * V × 16B 顶点 (x, y, z, w),实测 w 恒等于 z
19
+ * uint32[6] 数组头 [0,0,0,kind=1,count=V,flag=2]
20
+ * V × 8B UV (u, v)
21
+ * uint32[3] 索引头 [1, indexCount, 0x00040100]
22
+ * indexCount × uint16 // indexCount 恒为 3 的倍数,值域最大 V-1
23
+ * <补齐 4 字节对齐>
24
+ * uint32 1; uint32 materialId // 与 XML <material><name> 一致
25
+ *
26
+ * 纹理流: uint32 count,然后每条
27
+ * uint32 id; uint32 width; uint32 height; uint32 format; uint32 size; uint32 flag
28
+ * byte[size] // 实测 format=14、0.5B/px,即 DXT1
29
+ * ```
30
+ *
31
+ * 几何里**没有法线数组**,交给 GeometryBuilder 在绑定索引后 computeVertexNormals()。
32
+ */
33
+ import { BinaryReader } from './BinaryReader.js';
34
+ /** S3M 1.x 魔数:ASCII "s3m" + 结尾 0 */
35
+ const S3M_V1_MAGIC = 0x006d3373;
36
+ /** 是不是 S3M 1.x 容器 */
37
+ export function isS3M1Buffer(buffer) {
38
+ if (buffer.byteLength < 8)
39
+ return false;
40
+ return new DataView(buffer, 0, 8).getUint32(0, true) === S3M_V1_MAGIC;
41
+ }
42
+ async function defaultInflate(bytes) {
43
+ const DS = globalThis.DecompressionStream;
44
+ if (!DS)
45
+ throw new Error('[s3m] 当前环境无 DecompressionStream,请通过 options.inflate 注入解压实现');
46
+ const stream = new Blob([bytes])
47
+ .stream()
48
+ .pipeThrough(new DS('deflate'));
49
+ const out = await new Response(stream).arrayBuffer();
50
+ return new Uint8Array(out);
51
+ }
52
+ const align4 = (n) => (n % 4 === 0 ? n : n + (4 - (n % 4)));
53
+ function num(text, fallback = 0) {
54
+ const v = parseFloat(text ?? '');
55
+ return Number.isFinite(v) ? v : fallback;
56
+ }
57
+ /** 抓 <Tag>value</Tag>(带命名空间前缀,取第一个) */
58
+ function tag(scope, name) {
59
+ const m = new RegExp(`<(?:[A-Za-z0-9_-]+:)?${name}[^>]*>([^<]*)<\\/(?:[A-Za-z0-9_-]+:)?${name}>`, 'i').exec(scope);
60
+ return m ? m[1].trim() : null;
61
+ }
62
+ function allTags(scope, name) {
63
+ const re = new RegExp(`<(?:[A-Za-z0-9_-]+:)?${name}[^>]*>([^<]*)<\\/(?:[A-Za-z0-9_-]+:)?${name}>`, 'gi');
64
+ return [...scope.matchAll(re)].map((m) => m[1].trim());
65
+ }
66
+ /** RangeMode 文本 → 数值(规范:0 = 视点距离,1 = 屏幕像素) */
67
+ function rangeModeOf(text) {
68
+ const t = (text ?? '').toUpperCase();
69
+ if (t.includes('DISTANCE'))
70
+ return 0;
71
+ if (t.includes('GEOMETRIC') || t === '2')
72
+ return 2;
73
+ return 1;
74
+ }
75
+ function parseXmlLods(xml) {
76
+ const blocks = [...xml.matchAll(/<(?:[A-Za-z0-9_-]+:)?PagedLOD[^>]*>([\s\S]*?)<\/(?:[A-Za-z0-9_-]+:)?PagedLOD>/gi)];
77
+ const out = [];
78
+ for (const b of blocks) {
79
+ const s = b[1];
80
+ const matrix = (tag(s, 'GeoDeModMatrix') ?? '1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1')
81
+ .split(',')
82
+ .map((x) => parseFloat(x.trim()))
83
+ .filter((x) => Number.isFinite(x));
84
+ // 中心/半径只在 <BoundingSphere> 作用域里取,否则 <x> 会误吃到别处的同名标签
85
+ const sphere = /<(?:[A-Za-z0-9_-]+:)?BoundingSphere[^>]*>([\s\S]*?)<\/(?:[A-Za-z0-9_-]+:)?BoundingSphere>/i.exec(s)?.[1] ?? '';
86
+ out.push({
87
+ geoNames: allTags(s, 'GeoName'),
88
+ matrix: matrix.length === 16 ? matrix : [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],
89
+ childTile: tag(s, 'RangeDataList') ?? '',
90
+ rangeMode: rangeModeOf(tag(s, 'RangeMode')),
91
+ rangeValue: num(tag(s, 'RangeList')),
92
+ center: { x: num(tag(sphere, 'x')), y: num(tag(sphere, 'y')), z: num(tag(sphere, 'z')) },
93
+ radius: num(tag(sphere, 'radius')),
94
+ });
95
+ }
96
+ return out;
97
+ }
98
+ function parseXmlMaterials(xml) {
99
+ const blocks = [...xml.matchAll(/<(?:[A-Za-z0-9_-]+:)?material[^>]*>([\s\S]*?)<\/(?:[A-Za-z0-9_-]+:)?material>/gi)];
100
+ const out = [];
101
+ for (const b of blocks) {
102
+ const s = b[1];
103
+ const rgba = (name) => {
104
+ const inner = new RegExp(`<(?:[A-Za-z0-9_-]+:)?${name}[^>]*>([\\s\\S]*?)<\\/(?:[A-Za-z0-9_-]+:)?${name}>`, 'i').exec(s);
105
+ if (!inner)
106
+ return { r: 1, g: 1, b: 1, a: 1 };
107
+ const t = inner[1];
108
+ // 1.x 的取值键名实测是小写 r/g/b/a,个别版本写 A/R/G/B
109
+ return { r: num(tag(t, 'r'), 1), g: num(tag(t, 'g'), 1), b: num(tag(t, 'b'), 1), a: num(tag(t, 'a'), 1) };
110
+ };
111
+ out.push({
112
+ name: tag(s, 'name') ?? '',
113
+ diffuse: rgba('Diffuse'),
114
+ shininess: num(tag(s, 'Shininess')),
115
+ cullMode: tag(s, 'CullMode') ?? tag(s, 'cullmode') ?? 'none',
116
+ transparentSorting: (tag(s, 'TransparentSorting') ?? 'false').toLowerCase() === 'true',
117
+ textureName: undefined,
118
+ addressMode: undefined,
119
+ });
120
+ // 纹理单元:<texture><name>纹理号</name><AddressMode><u><v>…</texture>
121
+ const tex = /<(?:[A-Za-z0-9_-]+:)?texture[^>]*>([\s\S]*?)<\/(?:[A-Za-z0-9_-]+:)?texture>/i.exec(s);
122
+ if (tex) {
123
+ const t = tex[1];
124
+ const last = out[out.length - 1];
125
+ last.textureName = tag(t, 'name') ?? undefined;
126
+ const am = /<(?:[A-Za-z0-9_-]+:)?AddressMode[^>]*>([\s\S]*?)<\/(?:[A-Za-z0-9_-]+:)?AddressMode>/i.exec(t);
127
+ if (am)
128
+ last.addressMode = { u: num(tag(am[1], 'u')), v: num(tag(am[1], 'v')) };
129
+ }
130
+ }
131
+ return out;
132
+ }
133
+ function readGeometry(br, geoSize) {
134
+ const meshCount = br.u32();
135
+ if (meshCount > 4096)
136
+ throw new Error(`[s3m] S3M 1.x 网格数异常:${meshCount}`);
137
+ const out = [];
138
+ for (let m = 0; m < meshCount; m++) {
139
+ const geoName = String(br.u32());
140
+ const seven = br.u32();
141
+ const seven72 = br.u32();
142
+ const V = br.u32();
143
+ br.u32(); // 恒 0
144
+ if (!(V > 0 && V <= 8_000_000)) {
145
+ throw new Error(`[s3m] S3M 1.x 顶点数异常:网格 ${geoName} V=${V}(字段 7=${seven} 772=${seven72})`);
146
+ }
147
+ // 顶点 (x, y, z, w);w 实测恒等于 z
148
+ const position = new Float32Array(V * 3);
149
+ for (let i = 0; i < V; i++) {
150
+ const x = br.f32();
151
+ const y = br.f32();
152
+ const z = br.f32();
153
+ br.f32(); // w == z
154
+ position[i * 3] = x;
155
+ position[i * 3 + 1] = y;
156
+ position[i * 3 + 2] = z;
157
+ }
158
+ // UV 数组头 [0,0,0,kind=1,count=V,flag=2]
159
+ br.u32();
160
+ br.u32();
161
+ br.u32();
162
+ const uvKind = br.u32();
163
+ const uvCount = br.u32();
164
+ br.u32(); // flag
165
+ if (uvKind !== 1 || uvCount !== V) {
166
+ throw new Error(`[s3m] S3M 1.x UV 头不符:网格 ${geoName} kind=${uvKind} count=${uvCount} 期望 1/${V}`);
167
+ }
168
+ const uv = new Float32Array(V * 2);
169
+ for (let i = 0; i < V; i++) {
170
+ uv[i * 2] = br.f32();
171
+ uv[i * 2 + 1] = br.f32();
172
+ }
173
+ // 索引头 [1, indexCount, 0x00040100]
174
+ const idxKind = br.u32();
175
+ const indexCount = br.u32();
176
+ br.u32(); // 常量标记
177
+ if (idxKind !== 1 || indexCount === 0 || indexCount % 3 !== 0) {
178
+ throw new Error(`[s3m] S3M 1.x 索引头不符:网格 ${geoName} kind=${idxKind} count=${indexCount}`);
179
+ }
180
+ const indices = new Uint16Array(indexCount);
181
+ for (let i = 0; i < indexCount; i++)
182
+ indices[i] = br.u16();
183
+ if (br.offset > geoSize)
184
+ throw new Error(`[s3m] S3M 1.x 索引越界:网格 ${geoName}`);
185
+ br.align4();
186
+ const one = br.u32();
187
+ const materialId = String(br.u32());
188
+ if (one !== 1) {
189
+ throw new Error(`[s3m] S3M 1.x 记录尾标记异常:网格 ${geoName} 期望 1 实得 ${one}`);
190
+ }
191
+ out.push({ geoName, vertexCount: V, position, uv, indexCount, indices, materialId });
192
+ }
193
+ return out;
194
+ }
195
+ /**
196
+ * 按「字节/像素」反推 S3MPixelFormat。
197
+ *
198
+ * v1 头里那个 format 数字不能直接当 pixelFormat 用(实测恒为 14,而本库枚举里
199
+ * 14 = BGRA = 4 字节/像素,照搬会把 0.5 字节/像素的数据当 4 字节读 → 满屏彩噪)。
200
+ * 压缩格式与密度是一一对应的,所以用密度判定,并把原始数字留在告警里。
201
+ */
202
+ export function pixelFormatOfBpp(bpp, rawFormat) {
203
+ if (!Number.isFinite(bpp) || bpp <= 0)
204
+ return rawFormat;
205
+ if (Math.abs(bpp - 0.5) < 0.02)
206
+ return 17; // DXT1
207
+ if (Math.abs(bpp - 1) < 0.02)
208
+ return 21; // DXT5
209
+ if (Math.abs(bpp - 4) < 0.02)
210
+ return 14; // BGRA
211
+ if (Math.abs(bpp - 3) < 0.02)
212
+ return 10; // RGB
213
+ console.warn(`[s3m] S3M 1.x 纹理密度 ${bpp.toFixed(3)} B/px 不在已知档位,按原 format=${rawFormat} 交给上层判定`);
214
+ return rawFormat;
215
+ }
216
+ /* ------------------------------------------------------------------ 纹理 */
217
+ function readTextures(br, texSize) {
218
+ const count = br.u32();
219
+ const out = {};
220
+ if (count > 1024)
221
+ throw new Error(`[s3m] S3M 1.x 纹理数异常:${count}`);
222
+ for (let i = 0; i < count; i++) {
223
+ const id = String(br.u32());
224
+ const width = br.u32();
225
+ const height = br.u32();
226
+ const format = br.u32();
227
+ const size = br.u32();
228
+ br.u32(); // flag
229
+ if (br.offset + size > texSize + 4)
230
+ throw new Error(`[s3m] S3M 1.x 纹理越界:${id}`);
231
+ out[id] = {
232
+ code: id,
233
+ level: 0,
234
+ width,
235
+ height,
236
+ compressType: 0,
237
+ // v1 头里的 format 不是 S3MPixelFormat 枚举,照搬会把纹理解成一片彩噪:
238
+ // 实测四块瓦片(512×512 / 256×128 / 512×256 / 1024×512)的 format 都是 14,
239
+ // 而 data 长度恒等于 width*height*0.5 —— 只有 DXT1 是这个密度
240
+ // (DXT5 是 1 B/px,BGRA 是 4 B/px,而本库枚举里 14 恰恰是 BGRA)。
241
+ // 所以按「字节/像素」反推,别信那个数字。
242
+ pixelFormat: pixelFormatOfBpp(size / (width * height), format),
243
+ // 必须翻回来:DXT 解码器内部按 GL 约定做了一次 Y 翻转(DecompressImage 里的
244
+ // height - 1 - sy),而 v1 的 UV 是「v = 0 对应文件首行」。
245
+ // 实测这块 512×512 的图集内容在文件行 232~511(前 232 行是空的纯黑),
246
+ // 而几何 UV 的 v 落在 0.483~0.983(= 行 245~503):
247
+ // 按文件行采 → 区域均值亮度 76.1(有内容)
248
+ // 被内部翻转后再采 → 均值 5.6(正好采到空的那半张 → 模型一片黑块)
249
+ // 交给 TextureFactory 的 flipRows 翻一次,就回到前者。
250
+ flipY: true,
251
+ data: br.bytesCopy(size),
252
+ };
253
+ }
254
+ return out;
255
+ }
256
+ /* ------------------------------------------------------------------ 入口 */
257
+ export async function parseS3M1(arrayBuffer, options = {}) {
258
+ const inflate = options.inflate ?? defaultInflate;
259
+ const r = new BinaryReader(arrayBuffer);
260
+ r.skip(4); // 魔数
261
+ const zipped = new Uint8Array(arrayBuffer, r.base + r.offset, arrayBuffer.byteLength - r.base - r.offset);
262
+ const bytes = await inflate(zipped);
263
+ const raw = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);
264
+ const br = new BinaryReader(raw.buffer.slice(raw.byteOffset, raw.byteOffset + raw.byteLength));
265
+ const xmlSize = br.u32();
266
+ if (xmlSize <= 0 || xmlSize > raw.byteLength)
267
+ throw new Error(`[s3m] S3M 1.x XML 段长度异常:${xmlSize}`);
268
+ const xml = new TextDecoder('utf-8').decode(br.bytes(xmlSize));
269
+ br.offset = align4(br.offset);
270
+ const geoSize = br.u32();
271
+ const geoStart = br.offset;
272
+ const meshes = readGeometry(new BinaryReader(br.buffer, br.base + geoStart, geoSize), geoSize);
273
+ br.offset = geoStart + geoSize;
274
+ const smallSize = br.u32();
275
+ br.skip(smallSize);
276
+ const texSize = br.u32();
277
+ const textures = readTextures(new BinaryReader(br.buffer, br.base + br.offset, texSize), texSize);
278
+ /* ---- 组装成与 parseS3MB 一致的结构 ---- */
279
+ const geoPackage = {};
280
+ for (const mesh of meshes) {
281
+ const name = `SuperMapCache#${mesh.geoName}`;
282
+ const positionAttr = {
283
+ semantic: 'position',
284
+ data: new Uint8Array(mesh.position.buffer, mesh.position.byteOffset, mesh.position.byteLength),
285
+ components: 3,
286
+ stride: 12,
287
+ offsetInBytes: 0,
288
+ dtype: 'f32',
289
+ };
290
+ const uvAttr = {
291
+ semantic: 'uv',
292
+ data: new Uint8Array(mesh.uv.buffer, mesh.uv.byteOffset, mesh.uv.byteLength),
293
+ components: 2,
294
+ stride: 8,
295
+ offsetInBytes: 0,
296
+ dtype: 'f32',
297
+ };
298
+ const vp = {
299
+ verticesCount: mesh.vertexCount,
300
+ vertexAttributes: [positionAttr, uvAttr],
301
+ attrLocation: { aposition: 0, auv: 1 },
302
+ instanceCount: 0,
303
+ instanceMode: 0,
304
+ instanceIndex: -1,
305
+ };
306
+ const pack = {
307
+ indexCount: mesh.indexCount,
308
+ indexType: 0, // 0 = UNSIGNED_SHORT
309
+ useIndex: 1,
310
+ primitiveType: 4, // TRIANGLES
311
+ indices: new Uint8Array(mesh.indices.buffer, mesh.indices.byteOffset, mesh.indices.byteLength),
312
+ passNames: [mesh.materialId],
313
+ };
314
+ geoPackage[name] = { name, vertexPackage: vp, indexPackages: [pack] };
315
+ }
316
+ // pageLods 与网格必须按 GeoName 绑定,不能按出现顺序:
317
+ // 实测 L18 的 XML 列出 [2690529118, 1463699937, 451097586, 4063742103],
318
+ // 而二进制里网格是 [451097586, 1463699937, 2690529118, 4063742103] —— 同批不同序。
319
+ // 按位置配会把某个 LOD 的包围球/矩阵挂到别的网格上(单网格样本看不出问题)。
320
+ const keyOf = new Map(meshes.map((m) => [m.geoName, `SuperMapCache#${m.geoName}`]));
321
+ const xmlLods = parseXmlLods(xml);
322
+ const pageLods = [];
323
+ xmlLods.forEach((lod, i) => {
324
+ const named = lod.geoNames.map((n) => keyOf.get(n)).filter((k) => !!k);
325
+ // 名字对不上时退回位置匹配,并让上层有机会发现(宁可少一个 LOD 也不要挂错球)
326
+ const fallback = meshes[i] ? [`SuperMapCache#${meshes[i].geoName}`] : [];
327
+ const skeletonNames = named.length ? [...new Set(named)] : fallback;
328
+ if (!skeletonNames.length)
329
+ return;
330
+ pageLods.push({
331
+ rangeValue: lod.rangeValue,
332
+ rangeMode: lod.rangeMode,
333
+ boundingSphere: { center: { ...lod.center }, radius: lod.radius },
334
+ childTile: lod.childTile,
335
+ geodes: [{ matrix: lod.matrix, skeletonNames }],
336
+ });
337
+ });
338
+ const groupNode = { pageLods };
339
+ // 材质:拼成 3.x 那套 JSON 形状,下游 makeMaterial / resolveSide 直接吃
340
+ const materials = parseXmlMaterials(xml).map((m) => ({
341
+ material: {
342
+ name: m.name,
343
+ diffuse: m.diffuse,
344
+ shininess: m.shininess,
345
+ cullMode: m.cullMode,
346
+ transparentsorting: m.transparentSorting,
347
+ textureStates: m.textureName
348
+ ? [{ textureunitstate: { name: m.textureName, ...(m.addressMode ? { addressmode: m.addressMode } : {}) } }]
349
+ : [],
350
+ },
351
+ }));
352
+ return {
353
+ version: 1,
354
+ // 1.x 的整文件压缩就是 zlib,对齐 2.x/3.x 的 compressedType 语义(1 = zip)
355
+ compressedType: 1,
356
+ options: 0,
357
+ groupNode,
358
+ geoPackage,
359
+ textures,
360
+ materials,
361
+ pickInfo: null,
362
+ extensions: { s3m1: true },
363
+ bytesRead: br.offset + texSize,
364
+ bytesTotal: raw.byteLength,
365
+ };
366
+ }
367
+ //# sourceMappingURL=S3M1Parser.js.map