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.
- package/README.md +2 -2
- package/dist/browser/s3m-three.iife.ext-three.js +585 -0
- package/dist/browser/s3m-three.iife.js +4419 -0
- package/dist/browser.d.ts +3 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +21 -0
- package/dist/browser.js.map +1 -0
- package/dist/core/AtlasAlpha.d.ts +31 -0
- package/dist/core/AtlasAlpha.d.ts.map +1 -0
- package/dist/core/AtlasAlpha.js +82 -0
- package/dist/core/AtlasAlpha.js.map +1 -0
- package/dist/core/AtlasPack.d.ts +57 -0
- package/dist/core/AtlasPack.d.ts.map +1 -0
- package/dist/core/AtlasPack.js +81 -0
- package/dist/core/AtlasPack.js.map +1 -0
- package/dist/core/AtlasUpgrade.d.ts +68 -0
- package/dist/core/AtlasUpgrade.d.ts.map +1 -0
- package/dist/core/AtlasUpgrade.js +154 -0
- package/dist/core/AtlasUpgrade.js.map +1 -0
- package/dist/core/DXTTextureDecode.d.ts.map +1 -1
- package/dist/core/DXTTextureDecode.js +28 -6
- package/dist/core/DXTTextureDecode.js.map +1 -1
- package/dist/core/Draco.d.ts +52 -0
- package/dist/core/Draco.d.ts.map +1 -0
- package/dist/core/Draco.js +323 -0
- package/dist/core/Draco.js.map +1 -0
- package/dist/core/MeshOpt.d.ts +14 -3
- package/dist/core/MeshOpt.d.ts.map +1 -1
- package/dist/core/MeshOpt.js +101 -18
- package/dist/core/MeshOpt.js.map +1 -1
- package/dist/core/S3M1Parser.d.ts +16 -0
- package/dist/core/S3M1Parser.d.ts.map +1 -0
- package/dist/core/S3M1Parser.js +367 -0
- package/dist/core/S3M1Parser.js.map +1 -0
- package/dist/core/S3MBParser.d.ts +43 -1
- package/dist/core/S3MBParser.d.ts.map +1 -1
- package/dist/core/S3MBParser.js +101 -23
- package/dist/core/S3MBParser.js.map +1 -1
- package/dist/core/S3MBlockParser.d.ts +209 -0
- package/dist/core/S3MBlockParser.d.ts.map +1 -0
- package/dist/core/S3MBlockParser.js +789 -0
- package/dist/core/S3MBlockParser.js.map +1 -0
- package/dist/core/TextureFormat.d.ts +0 -1
- package/dist/core/TextureFormat.d.ts.map +1 -1
- package/dist/core/TextureFormat.js +19 -2
- package/dist/core/TextureFormat.js.map +1 -1
- package/dist/core/types.d.ts +65 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/render/DatasetManager.d.ts.map +1 -1
- package/dist/render/DatasetManager.js +5 -3
- package/dist/render/DatasetManager.js.map +1 -1
- package/dist/render/GeometryBuilder.d.ts +2 -0
- package/dist/render/GeometryBuilder.d.ts.map +1 -1
- package/dist/render/GeometryBuilder.js +185 -16
- package/dist/render/GeometryBuilder.js.map +1 -1
- package/dist/render/GroundManager.d.ts +57 -1
- package/dist/render/GroundManager.d.ts.map +1 -1
- package/dist/render/GroundManager.js +149 -21
- package/dist/render/GroundManager.js.map +1 -1
- package/dist/render/Picker.d.ts.map +1 -1
- package/dist/render/Picker.js +12 -4
- package/dist/render/Picker.js.map +1 -1
- package/dist/render/PointCloudMaterial.d.ts +36 -0
- package/dist/render/PointCloudMaterial.d.ts.map +1 -0
- package/dist/render/PointCloudMaterial.js +159 -0
- package/dist/render/PointCloudMaterial.js.map +1 -0
- package/dist/render/S3MViewer.d.ts +19 -0
- package/dist/render/S3MViewer.d.ts.map +1 -1
- package/dist/render/S3MViewer.js +143 -22
- package/dist/render/S3MViewer.js.map +1 -1
- package/dist/render/StyleMaterial.d.ts +6 -0
- package/dist/render/StyleMaterial.d.ts.map +1 -1
- package/dist/render/StyleMaterial.js +125 -2
- package/dist/render/StyleMaterial.js.map +1 -1
- package/dist/render/TextureFactory.d.ts.map +1 -1
- package/dist/render/TextureFactory.js +64 -10
- package/dist/render/TextureFactory.js.map +1 -1
- package/dist/tileset/S3MTileset.d.ts +152 -1
- package/dist/tileset/S3MTileset.d.ts.map +1 -1
- package/dist/tileset/S3MTileset.js +672 -54
- package/dist/tileset/S3MTileset.js.map +1 -1
- package/dist/vendor/crunch_decoder.module.js +12 -18
- package/dist/vendor/draco_decoder.module.js +3178 -0
- package/docs/API.md +112 -11
- package/package.json +5 -3
- package/src/browser.ts +21 -0
- package/src/core/AtlasAlpha.ts +82 -0
- package/src/core/AtlasPack.ts +127 -0
- package/src/core/AtlasUpgrade.ts +182 -0
- package/src/core/DXTTextureDecode.ts +28 -6
- package/src/core/Draco.ts +409 -0
- package/src/core/MeshOpt.ts +124 -18
- package/src/core/S3M1Parser.ts +430 -0
- package/src/core/S3MBParser.ts +112 -21
- package/src/core/S3MBlockParser.ts +953 -0
- package/src/core/TextureFormat.ts +20 -2
- package/src/core/types.ts +63 -0
- package/src/index.ts +2 -1
- package/src/render/DatasetManager.ts +5 -5
- package/src/render/GeometryBuilder.ts +207 -15
- package/src/render/GroundManager.ts +174 -20
- package/src/render/Picker.ts +13 -4
- package/src/render/PointCloudMaterial.ts +174 -0
- package/src/render/S3MViewer.ts +140 -24
- package/src/render/StyleMaterial.ts +135 -2
- package/src/render/TextureFactory.ts +67 -11
- package/src/tileset/S3MTileset.ts +704 -59
- package/src/vendor/crunch_decoder.module.js +12 -18
- package/src/vendor/draco_decoder.module.d.ts +128 -0
- package/src/vendor/draco_decoder.module.js +3178 -0
package/dist/core/MeshOpt.js
CHANGED
|
@@ -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
|
-
*
|
|
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 //
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
283
|
+
pushSink(sinks, 'normal', 'f32', 3, nrm);
|
|
247
284
|
}
|
|
248
285
|
else if (semantic === MeshOptSemantic.COLOR) {
|
|
249
|
-
|
|
286
|
+
pushSink(sinks, 'color', 'u8', 4, out);
|
|
250
287
|
}
|
|
251
288
|
else if (semantic === MeshOptSemantic.COLOR1) {
|
|
252
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
/**
|
package/dist/core/MeshOpt.js.map
CHANGED
|
@@ -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
|