s3m-three 0.4.19 → 0.4.21

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 (87) hide show
  1. package/dist/browser/assets/{s3mWorker-4iTAmWIu.js → s3mWorker-DvAUA8NJ.js} +1 -1
  2. package/dist/browser/s3m-three.iife.ext-three.js +243 -243
  3. package/dist/browser/s3m-three.iife.js +227 -227
  4. package/dist/core/Draco.d.ts.map +1 -1
  5. package/dist/core/Draco.js +0 -1
  6. package/dist/core/Draco.js.map +1 -1
  7. package/dist/core/S3MBlockParser.d.ts.map +1 -1
  8. package/dist/core/S3MBlockParser.js +27 -14
  9. package/dist/core/S3MBlockParser.js.map +1 -1
  10. package/dist/core/SplatSort.d.ts +14 -1
  11. package/dist/core/SplatSort.d.ts.map +1 -1
  12. package/dist/core/SplatSort.js +51 -4
  13. package/dist/core/SplatSort.js.map +1 -1
  14. package/dist/core/TileGeometry.d.ts +10 -0
  15. package/dist/core/TileGeometry.d.ts.map +1 -1
  16. package/dist/core/TileGeometry.js +17 -14
  17. package/dist/core/TileGeometry.js.map +1 -1
  18. package/dist/render/DatasetManager.d.ts +3 -1
  19. package/dist/render/DatasetManager.d.ts.map +1 -1
  20. package/dist/render/DatasetManager.js +2 -1
  21. package/dist/render/DatasetManager.js.map +1 -1
  22. package/dist/render/FeatureStyleManager.d.ts.map +1 -1
  23. package/dist/render/GeometryBuilder.d.ts +8 -0
  24. package/dist/render/GeometryBuilder.d.ts.map +1 -1
  25. package/dist/render/GeometryBuilder.js +62 -7
  26. package/dist/render/GeometryBuilder.js.map +1 -1
  27. package/dist/render/S3MViewer.d.ts +106 -440
  28. package/dist/render/S3MViewer.d.ts.map +1 -1
  29. package/dist/render/S3MViewer.js +297 -1653
  30. package/dist/render/S3MViewer.js.map +1 -1
  31. package/dist/render/SplatSorter.d.ts.map +1 -1
  32. package/dist/render/SplatSorter.js +8 -1
  33. package/dist/render/SplatSorter.js.map +1 -1
  34. package/dist/render/viewer/EdgeDecorator.d.ts +206 -0
  35. package/dist/render/viewer/EdgeDecorator.d.ts.map +1 -0
  36. package/dist/render/viewer/EdgeDecorator.js +628 -0
  37. package/dist/render/viewer/EdgeDecorator.js.map +1 -0
  38. package/dist/render/viewer/HeightIndex.d.ts +36 -0
  39. package/dist/render/viewer/HeightIndex.d.ts.map +1 -0
  40. package/dist/render/viewer/HeightIndex.js +98 -0
  41. package/dist/render/viewer/HeightIndex.js.map +1 -0
  42. package/dist/render/viewer/LightRig.d.ts +88 -0
  43. package/dist/render/viewer/LightRig.d.ts.map +1 -0
  44. package/dist/render/viewer/LightRig.js +229 -0
  45. package/dist/render/viewer/LightRig.js.map +1 -0
  46. package/dist/render/viewer/PickService.d.ts +109 -0
  47. package/dist/render/viewer/PickService.d.ts.map +1 -0
  48. package/dist/render/viewer/PickService.js +591 -0
  49. package/dist/render/viewer/PickService.js.map +1 -0
  50. package/dist/render/viewer/SelectionDecorator.d.ts +84 -0
  51. package/dist/render/viewer/SelectionDecorator.d.ts.map +1 -0
  52. package/dist/render/viewer/SelectionDecorator.js +339 -0
  53. package/dist/render/viewer/SelectionDecorator.js.map +1 -0
  54. package/dist/render/viewer/SplatLayer.d.ts +26 -0
  55. package/dist/render/viewer/SplatLayer.d.ts.map +1 -0
  56. package/dist/render/viewer/SplatLayer.js +44 -0
  57. package/dist/render/viewer/SplatLayer.js.map +1 -0
  58. package/dist/render/viewer/types.d.ts +256 -0
  59. package/dist/render/viewer/types.d.ts.map +1 -0
  60. package/dist/render/viewer/types.js +3 -0
  61. package/dist/render/viewer/types.js.map +1 -0
  62. package/dist/tileset/S3MTileset.d.ts +30 -3
  63. package/dist/tileset/S3MTileset.d.ts.map +1 -1
  64. package/dist/tileset/S3MTileset.js +99 -5
  65. package/dist/tileset/S3MTileset.js.map +1 -1
  66. package/dist/worker/s3mWorker.js +1 -1
  67. package/dist/worker/s3mWorker.js.map +1 -1
  68. package/docs/API.md +9 -28
  69. package/docs/FORMAT-NOTES.md +38 -14
  70. package/package.json +1 -1
  71. package/src/core/Draco.ts +1 -2
  72. package/src/core/S3MBlockParser.ts +27 -16
  73. package/src/core/SplatSort.ts +67 -5
  74. package/src/core/TileGeometry.ts +24 -11
  75. package/src/render/DatasetManager.ts +5 -1
  76. package/src/render/FeatureStyleManager.ts +1 -1
  77. package/src/render/GeometryBuilder.ts +59 -7
  78. package/src/render/S3MViewer.ts +327 -1916
  79. package/src/render/SplatSorter.ts +8 -1
  80. package/src/render/viewer/EdgeDecorator.ts +722 -0
  81. package/src/render/viewer/HeightIndex.ts +94 -0
  82. package/src/render/viewer/LightRig.ts +267 -0
  83. package/src/render/viewer/PickService.ts +651 -0
  84. package/src/render/viewer/SelectionDecorator.ts +377 -0
  85. package/src/render/viewer/SplatLayer.ts +44 -0
  86. package/src/render/viewer/types.ts +264 -0
  87. package/src/tileset/S3MTileset.ts +106 -6
@@ -0,0 +1,256 @@
1
+ /**
2
+ * `S3MViewer` 的公共类型:选项、光照、拾取结果、路径跟随。
3
+ *
4
+ * 从 `S3MViewer.ts` 整块搬出来的纯类型定义(零运行时)。搬出去的原因只有一个:
5
+ * 这些类型占了两百多行,和「类怎么实现」没有关系,留在主类里会把真正的逻辑冲淡。
6
+ *
7
+ * `S3MViewer.ts` 仍然 re-export 它们,所以 `import { S3MViewerOptions } from '.../S3MViewer'`
8
+ * 这类既有写法不受影响。
9
+ */
10
+ import * as THREE from 'three';
11
+ import type { EasingFn, EasingName } from '../../anim/easing.js';
12
+ import type { FeatureAttributes, GeoPackageEntry, ParsedTile, Stats } from '../../core/types.js';
13
+ import type { UnsupportedPolicy } from '../../core/degradations.js';
14
+ import type { AttributeQueryOptions } from '../../core/AttributeQuery.js';
15
+ import type { AuthenticateFn } from '../../core/AuthFetch.js';
16
+ import type { LightingPreset } from '../lightingPreset.js';
17
+ import type { S3MStyle } from '../StyleMaterial.js';
18
+ import type { BuildTileFn } from '../../tileset/S3MTileset.js';
19
+ import type { S3MDatasetEntry, S3MDatasetOptions } from '../DatasetManager.js';
20
+ import type { GroundOptions } from '../GroundManager.js';
21
+ export interface PickResult extends FeatureAttributes {
22
+ datasetId: string;
23
+ datasetName: string;
24
+ /** 网格编号 */
25
+ objectId: number;
26
+ /** 单体控制位(顶点区间型 = batchId,实例化型 = 状态纹理下标),-1 表示没有单体化信息 */
27
+ batchId: number;
28
+ /** 实例化几何命中的实例序号;非实例化为 undefined */
29
+ instanceIndex?: number;
30
+ skeletonName: string;
31
+ /** 单体中心经纬度,拿不到时为 null */
32
+ centerLngLat: [number, number] | null;
33
+ /** 命中点三维场景坐标 [x, y, z](米,场景 ENU) */
34
+ point?: [number, number, number] | null;
35
+ /** 命中点经纬度 [lng, lat] */
36
+ lngLat?: [number, number] | null;
37
+ /** 命中点高程(米) */
38
+ altitude?: number | null;
39
+ mesh: THREE.Mesh;
40
+ }
41
+ export interface LightOptions {
42
+ /** 环境光强度,默认 0.4 */
43
+ ambientIntensity?: number;
44
+ /** 环境光颜色,十六进制或 CSS 颜色字符串,默认 0xffffff */
45
+ ambientColor?: number | string;
46
+ /** 半球光天空强度,默认 0.8 */
47
+ hemisphereIntensity?: number;
48
+ /** 半球光天空颜色,默认 0xffffff */
49
+ hemisphereColor?: number | string;
50
+ /** 半球光地面颜色,默认 0xb6c0cb */
51
+ hemisphereGroundColor?: number | string;
52
+ /** 主平行光强度,默认 1.0 */
53
+ keyLightIntensity?: number;
54
+ /** 主平行光强度别名(兼容写法) */
55
+ mainIntensity?: number;
56
+ /** 主平行光颜色,默认 0xffffff */
57
+ keyLightColor?: number | string;
58
+ /** 主平行光颜色别名(兼容写法) */
59
+ mainColor?: number | string;
60
+ /** 补光强度,默认 0.35 */
61
+ fillLightIntensity?: number;
62
+ /** 补光颜色,默认 0xffffff */
63
+ fillLightColor?: number | string;
64
+ /**
65
+ * 光照朝向模式:
66
+ * - 'headlamp': 默认头灯模式(随相机 bearing 旋转,受光面始终面向镜头)
67
+ * - 'fixed': 固定世界坐标方位角(如太阳光模拟)
68
+ */
69
+ mode?: 'headlamp' | 'fixed';
70
+ /** 方位角(度,0~360),固定模式下以正北为 0 顺时针,头灯模式下为相机相对偏角,默认 150 */
71
+ azimuth?: number;
72
+ /** 太阳/光源仰角(度,0~90),默认 50 */
73
+ altitude?: number;
74
+ }
75
+ export interface S3MViewerOptions {
76
+ /**
77
+ * 光照预设:
78
+ * - `'default'`(默认):现有 PBR 打光,亮部线性总量 ≈ 2.55;
79
+ * - `'supermap'`:对齐 iClient3D 观感(暗部 0.46 / 亮部 2.44),远处不发灰、饱和度更高。
80
+ * 只改光源,不动材质与色调映射;`light` 里的显式字段仍然优先生效。
81
+ */
82
+ lightingPreset?: LightingPreset;
83
+ /** 光照参数配置(强度、颜色、朝向模式、太阳方位角/仰角等) */
84
+ light?: LightOptions;
85
+ /**
86
+ * 三角面材质深度偏移(共面摩尔纹 / 重合面归属的人工定序)。
87
+ * 例:factor -1 / units -2 把配置材质的片元深度略微拉近。
88
+ * 这是 mesh 粒度开关,见 BuildTileOptions.polygonOffset 的说明。
89
+ */
90
+ polygonOffset?: {
91
+ factor: number;
92
+ units: number;
93
+ };
94
+ /**
95
+ * 色调映射模式(默认 THREE.NoToneMapping,避免 ACESFilmic 压暗中暗部及导致底图与建筑色彩失真;
96
+ * 可传入 THREE.ACESFilmicToneMapping、THREE.LinearToneMapping、THREE.ReinhardToneMapping 等)
97
+ */
98
+ toneMapping?: THREE.ToneMapping;
99
+ /** 色调映射曝光度,默认 1.0 */
100
+ toneMappingExposure?: number;
101
+ /** 全局总驻留瓦片上限(多数据集多图层共享预算),在所有可见数据集之间动态均衡分配,彻底防止爆显存 */
102
+ totalMaxTiles?: number;
103
+ /** 单数据集简写 */
104
+ configUrl?: string;
105
+ /** 多数据集 */
106
+ datasets?: S3MDatasetOptions[];
107
+ style?: Partial<S3MStyle>;
108
+ /** 3D 物理地表面 / 基坑开挖配置 */
109
+ ground?: GroundOptions;
110
+ pickable?: boolean;
111
+ /** 每个数据集最多驻留瓦片 */
112
+ maxTiles?: number;
113
+ /** 每个数据集并发请求数 */
114
+ maxConcurrent?: number;
115
+ /**
116
+ * 图层级默认的降级处置策略(默认 `'warn'`),数据集可用 `unsupported` 单独覆盖。
117
+ * 见 `S3MTilesetOptions.unsupported`。
118
+ */
119
+ unsupported?: UnsupportedPolicy;
120
+ /** 是否用 Web Worker 解析经典 .s3mb 瓦片(默认开,崩溃自动降级主线程),见 S3MTilesetOptions.useWorker */
121
+ useWorker?: boolean;
122
+ /** LOD 切换范围缩放系数(默认 1.0),> 1 更倾向保留粗模,< 1 提前换细模 */
123
+ lodRangeScale?: number;
124
+ /**
125
+ * LOD 判定用屏幕高度时的「设备像素比上限」(默认不限制,行为与旧版一致)。
126
+ *
127
+ * LOD 的屏幕空间误差按 `canvasHeight` 物理像素算(与官方 `calcPixFromCam` 同口径),
128
+ * 于是 3x DPR 的手机上判定高度是 2556 而不是 852,细化层数与瓦片数都会远多于桌面。
129
+ * 传 2 表示「按 CSS 高度 × 2 截断」,砍掉 3x 屏的超采样余量;传 `Infinity` = 不截断。
130
+ *
131
+ * 代价:截断会把每块瓦片的屏幕投影放大同样倍数,几何误差与纹理密度同步变差,
132
+ * 所以默认不启用,由接入方按设备档位自行决定。运行时可用 `setLodPixelRatioCap()` 调整。
133
+ */
134
+ lodPixelRatioCap?: number;
135
+ /**
136
+ * 每个数据集驻留三角形总数的软上限(默认不限制)。
137
+ * 见 `S3MTilesetOptions.maxTriangles`:瓦片数管不住的场景(精模、大面片)用这条刹车。
138
+ */
139
+ maxTriangles?: number;
140
+ /**
141
+ * 每个数据集驻留显存/内存字节总数的软上限(默认 Infinity = 不限制)。
142
+ * 包含几何顶点缓冲(精确字节)与纹理显存估计。
143
+ * 超限时在每帧末尾(make-before-break)主动回收非显示的瓦片及其独占纹理。
144
+ */
145
+ maxMemory?: number;
146
+ /**
147
+ * 纹理缓存条数上限(默认 128)。一条对应一张已解码的瓦片纹理,
148
+ * 1024² 的 RGBA 一张约 4MB,128 条就是 512MB 显存 —— 低端设备建议 32~48。
149
+ * 与 `maxTextureSize` 配合使用:后者降单张尺寸,这条降张数。
150
+ */
151
+ maxImageCache?: number;
152
+ /**
153
+ * 各向异性过滤上限(默认不封顶,取 GPU 报的最大值,通常 16)。
154
+ * 移动端封到 4 或 8 肉眼通常无差,采样成本明显下降。只影响**之后创建**的纹理。
155
+ */
156
+ anisotropyCap?: number;
157
+ /**
158
+ * 纹理长边像素上限(默认不限制)。
159
+ * 非图集的 RGBA / WebP 纹理会按 2× 盒式滤波逐次减半到上限内;DXT 压缩直传与
160
+ * 图集(UV 已重映射)不受影响。手机上 1024 与 2048 肉眼几乎无差,显存差 4 倍。
161
+ */
162
+ maxTextureSize?: number;
163
+ /**
164
+ * 光照模型(默认 `'pbr'`)。
165
+ *
166
+ * - `'pbr'`:`MeshStandardMaterial`,GGX + 环境球谐,质感最好也最贵
167
+ * - `'lambert'`:`MeshLambertMaterial`,只保留漫反射 + 平行光,片元开销约省一半;
168
+ * 白模 / 纯色 / 按高度着色这类不需要高光的模式肉眼差别很小
169
+ *
170
+ * 模块级全局状态:同页多个图层会互相覆盖,后创建的那个决定全局。
171
+ * 只影响**之后创建**的材质 —— 已加载的瓦片要重新加载才会换。
172
+ */
173
+ materialQuality?: 'pbr' | 'lambert';
174
+ /** 自定义瓦片构建器(测试 / 服务端渲染时注入) */
175
+ buildTile?: BuildTileFn | null;
176
+ /**
177
+ * 可选:业务属性查询配置(iServer 数据服务)。
178
+ * 配上之后才能用 `colorByField()` 按业务字段着色 —— 属性值不在 S3M 瓦片里,只能去数据服务查。
179
+ */
180
+ attributes?: AttributeQueryOptions;
181
+ /** 宿主请求重画的信号。MapLibre 传 `() => map.triggerRepaint()`;纯 three 宿主传自己的渲染循环 */
182
+ onRequestRepaint?: () => void;
183
+ /** 地图朝向(弧度),用于让灯光跟着视角走。不传则灯光方向固定 */
184
+ getBearing?: () => number;
185
+ /**
186
+ * 鉴权适配函数(全局默认,数据集可用自己的 `authenticate` 覆盖)。
187
+ * 内核主线程发出的全部请求(配置 scp / 瓦片 / 子图集 / 棱线缓存 / 属性查询)
188
+ * 发出前都过一遍,可改写 URL(加 `?token=`)或附加请求头。
189
+ * 不传 = 行为与旧版完全一致。见 `AuthenticateFn`。
190
+ */
191
+ authenticate?: AuthenticateFn;
192
+ onStats?: (stats: Stats) => void;
193
+ onReady?: (entry: S3MDatasetEntry) => void;
194
+ onPick?: (result: PickResult | null) => void;
195
+ onError?: (error: unknown) => void;
196
+ /**
197
+ * 首次出现瓦片后自动预热另一种 `shading` 变体(默认开)。
198
+ *
199
+ * `flat` / `smooth` 是编译期变体,不预热的话第一次 `setStyle({ shading })` 会同步
200
+ * 编译着色器、卡一帧。预热在首帧之后异步做,期间跳一两帧渲染,肉眼不可见。
201
+ */
202
+ prewarmShading?: boolean;
203
+ }
204
+ export interface PickableRef {
205
+ datasetId: string;
206
+ mesh: THREE.Mesh;
207
+ tile: ParsedTile;
208
+ skeletonName: string;
209
+ }
210
+ export interface MeshUserData {
211
+ pickId?: number;
212
+ datasetId?: string;
213
+ skeletonName?: string;
214
+ geoRef?: GeoPackageEntry;
215
+ tileRef?: ParsedTile;
216
+ primitiveType?: number;
217
+ /** 点云对象(THREE.Points):不吃面着色,也没有棱可描 */
218
+ isPointCloud?: boolean;
219
+ /** CPU 端现算的棱线对象(等宽线 Mesh) */
220
+ edges?: THREE.Object3D | null;
221
+ /** 背面外扩轮廓壳(edges 含 'hull' 时挂上) */
222
+ edgeHull?: THREE.Mesh | null;
223
+ /** 数据自带棱线包(此时不再用 EdgesGeometry 现算) */
224
+ nativeEdges?: boolean;
225
+ /** 数据本身有没有棱线包(不受 forceCpuEdges 影响,用来运行中切换时重算 nativeEdges) */
226
+ nativeEdgesRaw?: boolean;
227
+ /** 数据自带的棱线对象本身 */
228
+ isEdgeLines?: boolean;
229
+ /** CPU 现算的等宽棱线(与 isEdgeLines 区分,便于刷新样式) */
230
+ isThickEdge?: boolean;
231
+ /** 背面外扩轮廓壳(edges 含 'hull' 时挂上) */
232
+ isEdgeHull?: boolean;
233
+ /** 选中单体的棱线对象 */
234
+ isSelectionEdge?: boolean;
235
+ /** 该网格正在淡入时占用的动画通道 key,瓦片淘汰时要回收 */
236
+ tileFadeKey?: string;
237
+ pickMaterial?: THREE.Material;
238
+ [key: string]: unknown;
239
+ }
240
+ export interface PathFollowOptions {
241
+ /** 走完全程的时长(毫秒)。不传则按 speed 或默认 2000ms 推算 */
242
+ duration?: number;
243
+ /** 线速度(米/秒)。给了 duration 就以 duration 为准 */
244
+ speed?: number;
245
+ /** 是否循环 */
246
+ loop?: boolean;
247
+ /** 是否把折线首尾相连 */
248
+ closed?: boolean;
249
+ /** 缓动曲线:作用在**已走距离**上,默认 linear(恒速) */
250
+ easing?: EasingName | EasingFn;
251
+ /** 路径整体偏移(米),相当于路径原点 */
252
+ offset?: [number, number, number];
253
+ /** 单次走完(非循环)时回调 */
254
+ onComplete?: () => void;
255
+ }
256
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/render/viewer/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export {};
2
+ /* ------------------------------------------------------------------ 图层 */
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/render/viewer/types.ts"],"names":[],"mappings":";AAsQA,2EAA2E"}
@@ -81,6 +81,7 @@ export interface TileNode {
81
81
  meshes: number;
82
82
  vertices: number;
83
83
  triangles: number;
84
+ memory?: number;
84
85
  };
85
86
  }
86
87
  /** 瓦片构建器可注入,用于测试 / 服务端渲染(此时不需要 three) */
@@ -139,6 +140,14 @@ export interface S3MTilesetOptions {
139
140
  * 不传 = 不限制,行为与旧版完全一致。运行时可用 `setMaxTriangles()` 调整。
140
141
  */
141
142
  maxTriangles?: number;
143
+ /**
144
+ * 本数据集**驻留显存/内存字节数**的软上限(默认不限制)。
145
+ * 包含几何顶点缓冲(精确字节)与纹理显存估计。超限时按同一套 make-before-break
146
+ * 主动淘汰非显示瓦片及其独占纹理。
147
+ *
148
+ * 不传 = 不限制(Infinity),行为与旧版完全一致。运行时可用 `setMaxMemory()` 调整。
149
+ */
150
+ maxMemory?: number;
142
151
  /**
143
152
  * 是否请求 `.texblock` 子图集(S3MBLOCK 根图集的清晰版)。**默认关**。
144
153
  *
@@ -166,6 +175,10 @@ export interface S3MTilesetOptions {
166
175
  */
167
176
  unsupported?: UnsupportedPolicy;
168
177
  }
178
+ /** 估算单个纹理占用的显存字节数 */
179
+ export declare function estimateTextureBytes(tex: any): number;
180
+ /** 估算三维对象树中包含的几何缓冲字节数 */
181
+ export declare function estimateObjectGeometryBytes(obj: any): number;
169
182
  export declare class S3MTileset {
170
183
  configUrl: string;
171
184
  config: Record<string, unknown> | null;
@@ -211,6 +224,10 @@ export declare class S3MTileset {
211
224
  * 判据与旧版逐字一致,不会多算一次面数。
212
225
  */
213
226
  maxTriangles: number;
227
+ /**
228
+ * 驻留显存/内存字节数的软上限。`Infinity` = 不限制(默认)。
229
+ */
230
+ maxMemory: number;
214
231
  lodRangeScale: number;
215
232
  /** 数据集配置声明的高度范围(米),若配置未声明则返回 null */
216
233
  get heightRange(): {
@@ -232,7 +249,6 @@ export declare class S3MTileset {
232
249
  /** 子瓦片 URL → 父瓦片 URL,用于淘汰后补洞 */
233
250
  private readonly _parentOf;
234
251
  private _frame;
235
- private _lodDbgOnce;
236
252
  /** 格式类永久错误只向上报一次,避免整棵瓦片树刷同样的日志 */
237
253
  private _permanentReported;
238
254
  /** 请求量的硬上限(软上限 maxTiles 的超额余量),见构造函数注释 */
@@ -282,14 +298,25 @@ export declare class S3MTileset {
282
298
  * 收紧后不会立刻掉内容,要等下一次 `_trimBudget`(下一帧 update)才生效。
283
299
  */
284
300
  setMaxTriangles(n: number): void;
301
+ /**
302
+ * 运行时调整显存/内存字节预算。`Infinity` = 不限制(默认)。
303
+ * 收紧后不会立刻掉内容,要等下一次 `_trimBudget`(下一帧 update)才生效。
304
+ */
305
+ setMaxMemory(bytes: number): void;
306
+ /**
307
+ * 当前数据集驻留的显存与内存总字节数(几何缓冲精确大小 + 纹理显存估计)
308
+ */
309
+ residentMemory(): number;
310
+ private _residentGeometryBytes;
311
+ private _residentTextureBytes;
285
312
  /**
286
313
  * 预算裁剪 —— 必须在可见性算完之后调用(make-before-break):
287
314
  * 新瓦片已经落地、也已经决定由谁负责显示,这时候才把没人依赖的那块裁掉。
288
315
  * 只踢「当前不显示」或「位置已被可见子瓦接手」的瓦片;挑不出安全候选时允许
289
316
  * 暂时超出预算,等下一帧再裁 —— 宁可多占一会儿内存,也不在画面上开洞。
290
317
  *
291
- * 两条预算并行:瓦片数(`maxTiles`)与三角形总数(`maxTriangles`,默认不限制)。
292
- * `maxTriangles` 为 Infinity 时短路,行为与只有瓦片数预算时完全一致。
318
+ * 三条预算并行:瓦片数(`maxTiles`)、三角形总数(`maxTriangles`)与显存字节(`maxMemory`)。
319
+ * `maxTriangles` / `maxMemory` 为 Infinity 时短路,行为与只有瓦片数预算时完全一致。
293
320
  */
294
321
  private _trimBudget;
295
322
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"S3MTileset.d.ts","sourceRoot":"","sources":["../../src/tileset/S3MTileset.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"S3MTileset.d.ts","sourceRoot":"","sources":["../../src/tileset/S3MTileset.ts"],"names":[],"mappings":"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"}
@@ -172,6 +172,60 @@ export function parseConfigText(text) {
172
172
  }
173
173
  return JSON.parse(trimmed);
174
174
  }
175
+ /** 估算单个纹理占用的显存字节数 */
176
+ export function estimateTextureBytes(tex) {
177
+ if (!tex)
178
+ return 0;
179
+ if (Array.isArray(tex.mipmaps) && tex.mipmaps.length > 0) {
180
+ let bytes = 0;
181
+ for (const m of tex.mipmaps) {
182
+ if (m?.data?.byteLength)
183
+ bytes += m.data.byteLength;
184
+ }
185
+ if (bytes > 0)
186
+ return bytes;
187
+ }
188
+ const img = tex.image;
189
+ if (!img)
190
+ return 0;
191
+ if (img.data && typeof img.data.byteLength === 'number') {
192
+ return img.data.byteLength;
193
+ }
194
+ const w = img.width ?? 0;
195
+ const h = img.height ?? 0;
196
+ if (w > 0 && h > 0) {
197
+ const factor = tex.generateMipmaps ? 1.3333333333333333 : 1;
198
+ return Math.round(w * h * 4 * factor);
199
+ }
200
+ return 0;
201
+ }
202
+ /** 估算三维对象树中包含的几何缓冲字节数 */
203
+ export function estimateObjectGeometryBytes(obj) {
204
+ let bytes = 0;
205
+ if (!obj)
206
+ return 0;
207
+ obj.traverse?.((child) => {
208
+ const geo = child.geometry;
209
+ if (geo) {
210
+ if (geo.attributes) {
211
+ for (const attr of Object.values(geo.attributes)) {
212
+ if (attr?.array?.byteLength)
213
+ bytes += attr.array.byteLength;
214
+ }
215
+ }
216
+ if (geo.index?.array?.byteLength) {
217
+ bytes += geo.index.array.byteLength;
218
+ }
219
+ }
220
+ if (child.isInstancedMesh) {
221
+ if (child.instanceMatrix?.array?.byteLength)
222
+ bytes += child.instanceMatrix.array.byteLength;
223
+ if (child.instanceColor?.array?.byteLength)
224
+ bytes += child.instanceColor.array.byteLength;
225
+ }
226
+ });
227
+ return bytes;
228
+ }
175
229
  export class S3MTileset {
176
230
  configUrl;
177
231
  config = null;
@@ -232,6 +286,10 @@ export class S3MTileset {
232
286
  * 判据与旧版逐字一致,不会多算一次面数。
233
287
  */
234
288
  maxTriangles;
289
+ /**
290
+ * 驻留显存/内存字节数的软上限。`Infinity` = 不限制(默认)。
291
+ */
292
+ maxMemory;
235
293
  lodRangeScale;
236
294
  /** 数据集配置声明的高度范围(米),若配置未声明则返回 null */
237
295
  get heightRange() {
@@ -256,7 +314,6 @@ export class S3MTileset {
256
314
  /** 子瓦片 URL → 父瓦片 URL,用于淘汰后补洞 */
257
315
  _parentOf = new Map();
258
316
  _frame = 0;
259
- _lodDbgOnce = false;
260
317
  /** 格式类永久错误只向上报一次,避免整棵瓦片树刷同样的日志 */
261
318
  _permanentReported = false;
262
319
  /** 请求量的硬上限(软上限 maxTiles 的超额余量),见构造函数注释 */
@@ -291,6 +348,9 @@ export class S3MTileset {
291
348
  this.maxConcurrent = options.maxConcurrent ?? 4;
292
349
  this.maxTiles = options.maxTiles ?? 64;
293
350
  this.maxTriangles = options.maxTriangles ?? Infinity;
351
+ this.maxMemory = Number.isFinite(options.maxMemory) && options.maxMemory > 0
352
+ ? options.maxMemory
353
+ : Infinity;
294
354
  this.maxImageCache = options.maxImageCache ?? 128;
295
355
  // 硬上限 = 软上限 + 余量。淘汰只在「新瓦片已经落地并接管显示」之后做(make-before-break),
296
356
  // 所以中间态允许临时超出 maxTiles;硬上限只用来挡住失控的请求量,不用于挤掉正在显示的内容。
@@ -499,14 +559,46 @@ export class S3MTileset {
499
559
  setMaxTriangles(n) {
500
560
  this.maxTriangles = n > 0 ? n : Infinity;
501
561
  }
562
+ /**
563
+ * 运行时调整显存/内存字节预算。`Infinity` = 不限制(默认)。
564
+ * 收紧后不会立刻掉内容,要等下一次 `_trimBudget`(下一帧 update)才生效。
565
+ */
566
+ setMaxMemory(bytes) {
567
+ this.maxMemory = Number.isFinite(bytes) && bytes > 0 ? bytes : Infinity;
568
+ }
569
+ /**
570
+ * 当前数据集驻留的显存与内存总字节数(几何缓冲精确大小 + 纹理显存估计)
571
+ */
572
+ residentMemory() {
573
+ return this._residentGeometryBytes() + this._residentTextureBytes();
574
+ }
575
+ _residentGeometryBytes() {
576
+ let total = 0;
577
+ for (const node of this.nodes.values()) {
578
+ if (node.stats && typeof node.stats.memory === 'number') {
579
+ total += node.stats.memory;
580
+ }
581
+ else if (node.group) {
582
+ total += estimateObjectGeometryBytes(node.group);
583
+ }
584
+ }
585
+ return total;
586
+ }
587
+ _residentTextureBytes() {
588
+ let total = 0;
589
+ for (const tex of this.textureCache.values()) {
590
+ total += estimateTextureBytes(tex);
591
+ }
592
+ return total;
593
+ }
502
594
  /**
503
595
  * 预算裁剪 —— 必须在可见性算完之后调用(make-before-break):
504
596
  * 新瓦片已经落地、也已经决定由谁负责显示,这时候才把没人依赖的那块裁掉。
505
597
  * 只踢「当前不显示」或「位置已被可见子瓦接手」的瓦片;挑不出安全候选时允许
506
598
  * 暂时超出预算,等下一帧再裁 —— 宁可多占一会儿内存,也不在画面上开洞。
507
599
  *
508
- * 两条预算并行:瓦片数(`maxTiles`)与三角形总数(`maxTriangles`,默认不限制)。
509
- * `maxTriangles` 为 Infinity 时短路,行为与只有瓦片数预算时完全一致。
600
+ * 三条预算并行:瓦片数(`maxTiles`)、三角形总数(`maxTriangles`)与显存字节(`maxMemory`)。
601
+ * `maxTriangles` / `maxMemory` 为 Infinity 时短路,行为与只有瓦片数预算时完全一致。
510
602
  */
511
603
  _trimBudget() {
512
604
  let removed = false;
@@ -514,9 +606,10 @@ export class S3MTileset {
514
606
  // 在途的也算进"预期驻留数":不然一批瓦片同时落地时会先把画面撑爆再疯狂裁
515
607
  const overTiles = () => this.nodes.size + this.pending.size > this.maxTiles;
516
608
  const overTriangles = () => Number.isFinite(this.maxTriangles) && this._residentTriangles() > this.maxTriangles;
517
- // 面数预算生效时可能要连踢多块,迭代上限跟着驻留规模走;不生效时根本进不了循环
609
+ const overMemory = () => Number.isFinite(this.maxMemory) && this.residentMemory() > this.maxMemory;
610
+ // 预算生效时可能要连踢多块,迭代上限跟着驻留规模走;不生效时根本进不了循环
518
611
  const iterationCap = this.nodes.size + this.maxTiles + 16;
519
- while ((overTiles() || overTriangles()) && guard++ <= iterationCap) {
612
+ while ((overTiles() || overTriangles() || overMemory()) && guard++ <= iterationCap) {
520
613
  if (!this._evictOne(this.nodes.size + this.pending.size > this.hardCap))
521
614
  break;
522
615
  removed = true;
@@ -1033,6 +1126,7 @@ export class S3MTileset {
1033
1126
  meshes: stats.meshes ?? 0,
1034
1127
  vertices: stats.vertices ?? 0,
1035
1128
  triangles: stats.triangles ?? 0,
1129
+ memory: stats.memory ?? estimateObjectGeometryBytes(group),
1036
1130
  },
1037
1131
  };
1038
1132
  this.nodes.set(url, node);