s3m-three 0.4.18 → 0.4.20
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/dist/browser/assets/s3mWorker-DvAUA8NJ.js +1 -0
- package/dist/browser/s3m-three.iife.ext-three.js +619 -304
- package/dist/browser/s3m-three.iife.js +647 -332
- package/dist/core/Draco.d.ts.map +1 -1
- package/dist/core/Draco.js +0 -1
- package/dist/core/Draco.js.map +1 -1
- package/dist/core/GaussianSplat.d.ts +64 -0
- package/dist/core/GaussianSplat.d.ts.map +1 -0
- package/dist/core/GaussianSplat.js +139 -0
- package/dist/core/GaussianSplat.js.map +1 -0
- package/dist/core/S3M1Parser.d.ts +1 -1
- package/dist/core/S3M1Parser.d.ts.map +1 -1
- package/dist/core/S3M1Parser.js +320 -25
- package/dist/core/S3M1Parser.js.map +1 -1
- package/dist/core/S3MBParser.d.ts.map +1 -1
- package/dist/core/S3MBParser.js +13 -0
- package/dist/core/S3MBParser.js.map +1 -1
- package/dist/core/S3MBlockParser.d.ts.map +1 -1
- package/dist/core/S3MBlockParser.js +83 -28
- package/dist/core/S3MBlockParser.js.map +1 -1
- package/dist/core/SplatLod.d.ts +36 -0
- package/dist/core/SplatLod.d.ts.map +1 -0
- package/dist/core/SplatLod.js +54 -0
- package/dist/core/SplatLod.js.map +1 -0
- package/dist/core/SplatProjection.d.ts +75 -0
- package/dist/core/SplatProjection.d.ts.map +1 -0
- package/dist/core/SplatProjection.js +162 -0
- package/dist/core/SplatProjection.js.map +1 -0
- package/dist/core/SplatSort.d.ts +26 -0
- package/dist/core/SplatSort.d.ts.map +1 -0
- package/dist/core/SplatSort.js +61 -0
- package/dist/core/SplatSort.js.map +1 -0
- package/dist/core/TexCoordZ.d.ts +94 -0
- package/dist/core/TexCoordZ.d.ts.map +1 -0
- package/dist/core/TexCoordZ.js +125 -0
- package/dist/core/TexCoordZ.js.map +1 -0
- package/dist/core/TextureDecode.d.ts +19 -0
- package/dist/core/TextureDecode.d.ts.map +1 -1
- package/dist/core/TextureDecode.js +53 -11
- package/dist/core/TextureDecode.js.map +1 -1
- package/dist/core/TileGeometry.d.ts +39 -0
- package/dist/core/TileGeometry.d.ts.map +1 -1
- package/dist/core/TileGeometry.js +133 -14
- package/dist/core/TileGeometry.js.map +1 -1
- package/dist/core/degradations.d.ts +37 -0
- package/dist/core/degradations.d.ts.map +1 -0
- package/dist/core/degradations.js +32 -0
- package/dist/core/degradations.js.map +1 -0
- package/dist/core/types.d.ts +36 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/render/DatasetManager.d.ts +11 -0
- package/dist/render/DatasetManager.d.ts.map +1 -1
- package/dist/render/DatasetManager.js +2 -0
- package/dist/render/DatasetManager.js.map +1 -1
- package/dist/render/FeatureStyleManager.d.ts.map +1 -1
- package/dist/render/FeatureStyleManager.js +7 -5
- package/dist/render/FeatureStyleManager.js.map +1 -1
- package/dist/render/GeometryBuilder.d.ts +31 -0
- package/dist/render/GeometryBuilder.d.ts.map +1 -1
- package/dist/render/GeometryBuilder.js +229 -6
- package/dist/render/GeometryBuilder.js.map +1 -1
- package/dist/render/Picker.d.ts.map +1 -1
- package/dist/render/Picker.js +19 -5
- package/dist/render/Picker.js.map +1 -1
- package/dist/render/S3MViewer.d.ts +106 -379
- package/dist/render/S3MViewer.d.ts.map +1 -1
- package/dist/render/S3MViewer.js +324 -1494
- package/dist/render/S3MViewer.js.map +1 -1
- package/dist/render/SplatMaterial.d.ts +103 -0
- package/dist/render/SplatMaterial.d.ts.map +1 -0
- package/dist/render/SplatMaterial.js +388 -0
- package/dist/render/SplatMaterial.js.map +1 -0
- package/dist/render/SplatSorter.d.ts +14 -0
- package/dist/render/SplatSorter.d.ts.map +1 -0
- package/dist/render/SplatSorter.js +66 -0
- package/dist/render/SplatSorter.js.map +1 -0
- package/dist/render/StyleMaterial.d.ts +48 -0
- package/dist/render/StyleMaterial.d.ts.map +1 -1
- package/dist/render/StyleMaterial.js +292 -69
- package/dist/render/StyleMaterial.js.map +1 -1
- package/dist/render/TextureFactory.d.ts +10 -0
- package/dist/render/TextureFactory.d.ts.map +1 -1
- package/dist/render/TextureFactory.js +35 -5
- package/dist/render/TextureFactory.js.map +1 -1
- package/dist/render/lightingPreset.d.ts +53 -0
- package/dist/render/lightingPreset.d.ts.map +1 -0
- package/dist/render/lightingPreset.js +36 -0
- package/dist/render/lightingPreset.js.map +1 -0
- package/dist/render/materialAlpha.d.ts +51 -0
- package/dist/render/materialAlpha.d.ts.map +1 -0
- package/dist/render/materialAlpha.js +68 -0
- package/dist/render/materialAlpha.js.map +1 -0
- package/dist/render/viewer/EdgeDecorator.d.ts +206 -0
- package/dist/render/viewer/EdgeDecorator.d.ts.map +1 -0
- package/dist/render/viewer/EdgeDecorator.js +628 -0
- package/dist/render/viewer/EdgeDecorator.js.map +1 -0
- package/dist/render/viewer/HeightIndex.d.ts +36 -0
- package/dist/render/viewer/HeightIndex.d.ts.map +1 -0
- package/dist/render/viewer/HeightIndex.js +98 -0
- package/dist/render/viewer/HeightIndex.js.map +1 -0
- package/dist/render/viewer/LightRig.d.ts +88 -0
- package/dist/render/viewer/LightRig.d.ts.map +1 -0
- package/dist/render/viewer/LightRig.js +229 -0
- package/dist/render/viewer/LightRig.js.map +1 -0
- package/dist/render/viewer/PickService.d.ts +109 -0
- package/dist/render/viewer/PickService.d.ts.map +1 -0
- package/dist/render/viewer/PickService.js +591 -0
- package/dist/render/viewer/PickService.js.map +1 -0
- package/dist/render/viewer/SelectionDecorator.d.ts +84 -0
- package/dist/render/viewer/SelectionDecorator.d.ts.map +1 -0
- package/dist/render/viewer/SelectionDecorator.js +339 -0
- package/dist/render/viewer/SelectionDecorator.js.map +1 -0
- package/dist/render/viewer/SplatLayer.d.ts +26 -0
- package/dist/render/viewer/SplatLayer.d.ts.map +1 -0
- package/dist/render/viewer/SplatLayer.js +44 -0
- package/dist/render/viewer/SplatLayer.js.map +1 -0
- package/dist/render/viewer/types.d.ts +250 -0
- package/dist/render/viewer/types.d.ts.map +1 -0
- package/dist/render/viewer/types.js +3 -0
- package/dist/render/viewer/types.js.map +1 -0
- package/dist/tileset/S3MTileset.d.ts +42 -1
- package/dist/tileset/S3MTileset.d.ts.map +1 -1
- package/dist/tileset/S3MTileset.js +52 -2
- package/dist/tileset/S3MTileset.js.map +1 -1
- package/dist/vendor/browser-node-stub.js +10 -0
- package/dist/worker/s3mWorker.js +1166 -979
- package/dist/worker/s3mWorker.js.map +1 -1
- package/docs/API.md +55 -1
- package/docs/FORMAT-NOTES.md +362 -0
- package/package.json +1 -1
- package/src/core/Draco.ts +1 -2
- package/src/core/GaussianSplat.ts +175 -0
- package/src/core/S3M1Parser.ts +330 -24
- package/src/core/S3MBParser.ts +18 -0
- package/src/core/S3MBlockParser.ts +83 -27
- package/src/core/SplatLod.ts +83 -0
- package/src/core/SplatProjection.ts +231 -0
- package/src/core/SplatSort.ts +92 -0
- package/src/core/TexCoordZ.ts +160 -0
- package/src/core/TextureDecode.ts +63 -11
- package/src/core/TileGeometry.ts +151 -14
- package/src/core/degradations.ts +74 -0
- package/src/core/types.ts +32 -0
- package/src/index.ts +8 -1
- package/src/render/DatasetManager.ts +10 -0
- package/src/render/FeatureStyleManager.ts +8 -6
- package/src/render/GeometryBuilder.ts +271 -7
- package/src/render/Picker.ts +21 -5
- package/src/render/S3MViewer.ts +358 -1727
- package/src/render/SplatMaterial.ts +433 -0
- package/src/render/SplatSorter.ts +66 -0
- package/src/render/StyleMaterial.ts +339 -69
- package/src/render/TextureFactory.ts +39 -5
- package/src/render/lightingPreset.ts +76 -0
- package/src/render/materialAlpha.ts +75 -0
- package/src/render/viewer/EdgeDecorator.ts +722 -0
- package/src/render/viewer/HeightIndex.ts +94 -0
- package/src/render/viewer/LightRig.ts +267 -0
- package/src/render/viewer/PickService.ts +651 -0
- package/src/render/viewer/SelectionDecorator.ts +377 -0
- package/src/render/viewer/SplatLayer.ts +44 -0
- package/src/render/viewer/types.ts +258 -0
- package/src/tileset/S3MTileset.ts +78 -2
- package/src/vendor/browser-node-stub.js +10 -0
- package/dist/browser/assets/s3mWorker-BjPOUgjg.js +0 -1
|
@@ -7,6 +7,9 @@
|
|
|
7
7
|
* 命中阈值就请求 childTile,实现渐进式细化。
|
|
8
8
|
*/
|
|
9
9
|
import { parseS3MB } from '../core/S3MBParser.js';
|
|
10
|
+
import { planDegradations } from '../core/degradations.js';
|
|
11
|
+
import { splatLodDecision } from '../core/SplatLod.js';
|
|
12
|
+
import type { UnsupportedPolicy } from '../core/degradations.js';
|
|
10
13
|
import { authFetch, type AuthenticateFn } from '../core/AuthFetch.js';
|
|
11
14
|
import { getSharedS3MWorker, S3MWorkerClient, WorkerDeadError } from '../worker/S3MWorkerClient.js';
|
|
12
15
|
import {
|
|
@@ -219,6 +222,14 @@ export interface TileNode {
|
|
|
219
222
|
parentUrl?: string;
|
|
220
223
|
/** 当前帧是否满足细化条件 */
|
|
221
224
|
needRefine?: boolean;
|
|
225
|
+
/**
|
|
226
|
+
* 该瓦片高斯的最长轴中位长度(米)。非泼溅瓦片为 undefined。
|
|
227
|
+
* 有值时细化判据改走 core/SplatLod.ts —— 点云的各层 σ 恒定,
|
|
228
|
+
* 包围球像素误差那套判据对它无效(见该文件头部)。
|
|
229
|
+
*/
|
|
230
|
+
splatSigma?: number;
|
|
231
|
+
/** 该瓦片的高斯实例数(泼溅瓦片才有) */
|
|
232
|
+
splatCount?: number;
|
|
222
233
|
/** 该瓦片引用的纹理 key 清单,用于引用计数与显存释放 */
|
|
223
234
|
textureKeys?: string[];
|
|
224
235
|
/** 瓦片构建产生的统计信息,用于淘汰时准确扣减 stats */
|
|
@@ -233,6 +244,8 @@ export type BuildTileFn = (
|
|
|
233
244
|
uniforms: StyleUniforms | null;
|
|
234
245
|
/** Worker 侧已完成的纯数据几何组装(经典 .s3mb 路径),构建器直接包装成 three 对象 */
|
|
235
246
|
assembled?: TileGeometryData;
|
|
247
|
+
/** 深度偏移配置(透传给 buildTileObjects),见 BuildTileOptions.polygonOffset */
|
|
248
|
+
polygonOffset?: { factor: number; units: number };
|
|
236
249
|
}
|
|
237
250
|
) => Promise<{ group: Group; stats: Partial<Stats> }>;
|
|
238
251
|
|
|
@@ -243,6 +256,8 @@ export interface S3MTilesetOptions {
|
|
|
243
256
|
/** 原始图像/子图集缓存上限(LRU),默认 128 */
|
|
244
257
|
maxImageCache?: number;
|
|
245
258
|
buildTile?: BuildTileFn | null;
|
|
259
|
+
/** 三角面材质深度偏移(共面摩尔纹 / 重合面归属),透传给 buildTileObjects */
|
|
260
|
+
polygonOffset?: { factor: number; units: number };
|
|
246
261
|
/**
|
|
247
262
|
* 是否用 Web Worker 解析经典 `.s3mb` 瓦片(默认开)。
|
|
248
263
|
*
|
|
@@ -287,6 +302,17 @@ export interface S3MTilesetOptions {
|
|
|
287
302
|
* 子图集)发出前过一遍,可改写 URL(加 `?token=`)或附加请求头。见 `AuthenticateFn`。
|
|
288
303
|
*/
|
|
289
304
|
authenticate?: AuthenticateFn;
|
|
305
|
+
/**
|
|
306
|
+
* 遇到「解析得了但画不出该有的样子」的数据时怎么办。**默认 `'warn'`**。
|
|
307
|
+
*
|
|
308
|
+
* 目前只有一类:3DGS 数据按点渲染(`gsScale` / `gsRotation` 的量化格式未标定)。
|
|
309
|
+
* 'warn' —— 首次遇到告警一次,照常出图。旧版没有这个开关,但也不告警,
|
|
310
|
+
* 所以这里的差异只有多一条日志,不传参时的渲染路径逐字未变。
|
|
311
|
+
* 'throw' —— 直接拒绝这类瓦片(标 `permanent`,不重试)。给「宁可不显示,
|
|
312
|
+
* 也不要显示一个看不出是错的画面」的场景。
|
|
313
|
+
* 'silent' —— 只记录到 `stats.degradations`,由 UI 自己决定怎么提示。
|
|
314
|
+
*/
|
|
315
|
+
unsupported?: UnsupportedPolicy;
|
|
290
316
|
}
|
|
291
317
|
|
|
292
318
|
export class S3MTileset {
|
|
@@ -341,6 +367,7 @@ export class S3MTileset {
|
|
|
341
367
|
programs: 0,
|
|
342
368
|
textures: 0,
|
|
343
369
|
geometries: 0,
|
|
370
|
+
degradations: [],
|
|
344
371
|
};
|
|
345
372
|
|
|
346
373
|
maxConcurrent: number;
|
|
@@ -368,13 +395,14 @@ export class S3MTileset {
|
|
|
368
395
|
private readonly _maxRetries: number;
|
|
369
396
|
/** 鉴权适配函数;undefined = 不做任何改写(行为与旧版一致) */
|
|
370
397
|
readonly authenticate: AuthenticateFn | undefined;
|
|
398
|
+
/** 能力降级的处置策略,默认 'warn',见 `S3MTilesetOptions.unsupported` */
|
|
399
|
+
private readonly _unsupported: UnsupportedPolicy;
|
|
371
400
|
/** 失败重试计数与下次可用时间,退避期间 _enqueue 会直接跳过 */
|
|
372
401
|
private readonly _retryCount = new Map<string, number>();
|
|
373
402
|
private readonly _retryAt = new Map<string, number>();
|
|
374
403
|
/** 子瓦片 URL → 父瓦片 URL,用于淘汰后补洞 */
|
|
375
404
|
private readonly _parentOf = new Map<string, string>();
|
|
376
405
|
private _frame = 0;
|
|
377
|
-
private _lodDbgOnce = false;
|
|
378
406
|
/** 格式类永久错误只向上报一次,避免整棵瓦片树刷同样的日志 */
|
|
379
407
|
private _permanentReported = false;
|
|
380
408
|
/** 请求量的硬上限(软上限 maxTiles 的超额余量),见构造函数注释 */
|
|
@@ -382,6 +410,7 @@ export class S3MTileset {
|
|
|
382
410
|
/** 本数据集是 S3M 1.x(SuperMapCache,.s3m):子瓦地址规则与 3.x 不同 */
|
|
383
411
|
private isS3MV1 = false;
|
|
384
412
|
private _buildTile: BuildTileFn | null;
|
|
413
|
+
private readonly _polygonOffset: { factor: number; units: number } | undefined;
|
|
385
414
|
private readonly _uniforms: StyleUniforms | null;
|
|
386
415
|
/** 经典 .s3mb 的 Worker 解析客户端;undefined = 尚未尝试创建,null = 不可用/已降级 */
|
|
387
416
|
private _workerClient: S3MWorkerClient | null | undefined; private readonly _useWorker: boolean;
|
|
@@ -397,9 +426,11 @@ export class S3MTileset {
|
|
|
397
426
|
this._onProgress = options.onProgress ?? (() => {});
|
|
398
427
|
this._maxRetries = Math.max(0, options.maxRetries ?? 2);
|
|
399
428
|
this.authenticate = options.authenticate;
|
|
429
|
+
this._unsupported = options.unsupported ?? 'warn';
|
|
400
430
|
|
|
401
431
|
// 渲染层可注入:Node 环境下不需要 three,也能跑 URL / 解析链路
|
|
402
432
|
this._buildTile = options.buildTile ?? null;
|
|
433
|
+
this._polygonOffset = options.polygonOffset;
|
|
403
434
|
// 着色器共享 uniform,由 S3MLayer 持有并传进来
|
|
404
435
|
this._uniforms = options.uniforms ?? null;
|
|
405
436
|
this._useWorker = options.useWorker !== false;
|
|
@@ -1039,6 +1070,23 @@ export class S3MTileset {
|
|
|
1039
1070
|
return;
|
|
1040
1071
|
}
|
|
1041
1072
|
|
|
1073
|
+
/**
|
|
1074
|
+
* 处置一块瓦片的降级项。
|
|
1075
|
+
*
|
|
1076
|
+
* 位置很讲究:必须在 `build` 之前。`'throw'` 策略下要在浪费一次几何组装
|
|
1077
|
+
* (几十万面的解交错 + 合批)之前就拒绝,否则「拒绝」本身也成了开销。
|
|
1078
|
+
*
|
|
1079
|
+
* 抛出的错带 `permanent`,由 `_load` 的 catch 识别 → 不重试、直接进 failed。
|
|
1080
|
+
*/
|
|
1081
|
+
private _noteDegradations(tile: ParsedTile): void {
|
|
1082
|
+
const incoming = tile.degradations;
|
|
1083
|
+
if (!incoming?.length) return;
|
|
1084
|
+
const plan = planDegradations(incoming, this.stats.degradations, this._unsupported);
|
|
1085
|
+
this.stats.degradations = plan.known;
|
|
1086
|
+
for (const msg of plan.messages) console.warn(msg);
|
|
1087
|
+
if (plan.error) throw plan.error;
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1042
1090
|
private async _load(url: string): Promise<void> {
|
|
1043
1091
|
if (this.nodes.has(url) || this.pending.has(url) || this.failed.has(url)) return;
|
|
1044
1092
|
this.pending.add(url);
|
|
@@ -1088,11 +1136,15 @@ export class S3MTileset {
|
|
|
1088
1136
|
await this._upgradeAtlasLod(tile, baseUrl);
|
|
1089
1137
|
}
|
|
1090
1138
|
|
|
1139
|
+
// 解析成功但能力不完整的(目前只有 3DGS),在花力气建几何之前先决定处置
|
|
1140
|
+
this._noteDegradations(tile);
|
|
1141
|
+
|
|
1091
1142
|
const build = await this._builder();
|
|
1092
1143
|
const buildRes = await build(tile, {
|
|
1093
1144
|
textureCache: this.textureCache,
|
|
1094
1145
|
uniforms: this._uniforms,
|
|
1095
1146
|
assembled,
|
|
1147
|
+
polygonOffset: this._polygonOffset,
|
|
1096
1148
|
});
|
|
1097
1149
|
const { group, stats } = buildRes;
|
|
1098
1150
|
const texKeys = (buildRes as any).textureKeys ?? (group.userData?.textureKeys as string[] | undefined) ?? Object.keys(tile.textures ?? {});
|
|
@@ -1130,6 +1182,8 @@ export class S3MTileset {
|
|
|
1130
1182
|
childUrls,
|
|
1131
1183
|
parentUrl: this._parentOf.get(url),
|
|
1132
1184
|
state: 'ready',
|
|
1185
|
+
...(stats.splatSigma ? { splatSigma: stats.splatSigma } : {}),
|
|
1186
|
+
...(stats.splatCount ? { splatCount: stats.splatCount } : {}),
|
|
1133
1187
|
stats: {
|
|
1134
1188
|
meshes: stats.meshes ?? 0,
|
|
1135
1189
|
vertices: stats.vertices ?? 0,
|
|
@@ -1242,7 +1296,29 @@ export class S3MTileset {
|
|
|
1242
1296
|
const childUrls = node.childUrls ?? (node.childUrl ? [node.childUrl] : []);
|
|
1243
1297
|
// 加入 8% 迟滞区间(Hysteresis Band),防止相机在 LOD 临界距离处发生父子瓦片逐帧来回横跳闪烁
|
|
1244
1298
|
const hFactor = node.needRefine ? (byDistance ? 1.08 : 0.92) : 1.0;
|
|
1245
|
-
|
|
1299
|
+
|
|
1300
|
+
// 泼溅 / 点云瓦片走另一套判据:每层 σ 是同一个物理量、只有点数在涨,包围球
|
|
1301
|
+
// 像素误差对它没有含义 —— 按上面那套算,metric 在任何距离都远大于阈值,等于
|
|
1302
|
+
// 「永远细化到叶子」。
|
|
1303
|
+
// 判据换成**屏幕上的高斯尺寸**(3σ 超过 SPLAT_REFINE_PX 就细化),见 core/SplatLod.ts。
|
|
1304
|
+
// 别用覆盖率:主体那块根瓦片 32 万高斯、σ=13.5cm,覆盖率一上来就是 51,
|
|
1305
|
+
// 当场停止细化,最后只画了总量 2.3% 的高斯 —— 柱子就是这么被糊掉的。
|
|
1306
|
+
const splat =
|
|
1307
|
+
node.splatSigma && node.sphere
|
|
1308
|
+
? splatLodDecision({
|
|
1309
|
+
splats: node.splatCount ?? node.stats?.vertices ?? 0,
|
|
1310
|
+
radius: node.sphere.radius,
|
|
1311
|
+
distance: dist,
|
|
1312
|
+
sigma: node.splatSigma,
|
|
1313
|
+
screenHeight,
|
|
1314
|
+
hasChild: childUrls.length > 0,
|
|
1315
|
+
})
|
|
1316
|
+
: null;
|
|
1317
|
+
|
|
1318
|
+
const needRefine = splat
|
|
1319
|
+
? splat.needRefine
|
|
1320
|
+
: childUrls.length > 0 &&
|
|
1321
|
+
(byDistance ? metric < threshold * hFactor : metric > threshold * hFactor);
|
|
1246
1322
|
node.needRefine = needRefine;
|
|
1247
1323
|
|
|
1248
1324
|
const dbgSeen = ((globalThis as { __S3M_LOD_SEEN?: Set<string> }).__S3M_LOD_SEEN ??= new Set<string>());
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 浏览器构建(iife)的 node 内建模块占位。
|
|
3
|
+
*
|
|
4
|
+
* vendor 里的 emscripten 解码器(draco / crunch)带 Node 环境分支:
|
|
5
|
+
* `if (ENVIRONMENT_IS_NODE) { fs = require('node:fs'); ... }`——浏览器里
|
|
6
|
+
* 这个分支永远不执行,这里只需要让解析器有个落点、消除
|
|
7
|
+
* 「Module "node:fs" has been externalized for browser compatibility」告警。
|
|
8
|
+
* Node 环境不走这份 iife 产物(走 tsc 的 ESM 产物),不受影响。
|
|
9
|
+
*/
|
|
10
|
+
export default {};
|