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.
- package/dist/browser/assets/{s3mWorker-4iTAmWIu.js → s3mWorker-DvAUA8NJ.js} +1 -1
- package/dist/browser/s3m-three.iife.ext-three.js +243 -243
- package/dist/browser/s3m-three.iife.js +227 -227
- 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/S3MBlockParser.d.ts.map +1 -1
- package/dist/core/S3MBlockParser.js +27 -14
- package/dist/core/S3MBlockParser.js.map +1 -1
- package/dist/core/SplatSort.d.ts +14 -1
- package/dist/core/SplatSort.d.ts.map +1 -1
- package/dist/core/SplatSort.js +51 -4
- package/dist/core/SplatSort.js.map +1 -1
- package/dist/core/TileGeometry.d.ts +10 -0
- package/dist/core/TileGeometry.d.ts.map +1 -1
- package/dist/core/TileGeometry.js +17 -14
- package/dist/core/TileGeometry.js.map +1 -1
- package/dist/render/DatasetManager.d.ts +3 -1
- package/dist/render/DatasetManager.d.ts.map +1 -1
- package/dist/render/DatasetManager.js +2 -1
- package/dist/render/DatasetManager.js.map +1 -1
- package/dist/render/FeatureStyleManager.d.ts.map +1 -1
- package/dist/render/GeometryBuilder.d.ts +8 -0
- package/dist/render/GeometryBuilder.d.ts.map +1 -1
- package/dist/render/GeometryBuilder.js +62 -7
- package/dist/render/GeometryBuilder.js.map +1 -1
- package/dist/render/S3MViewer.d.ts +106 -440
- package/dist/render/S3MViewer.d.ts.map +1 -1
- package/dist/render/S3MViewer.js +297 -1653
- package/dist/render/S3MViewer.js.map +1 -1
- package/dist/render/SplatSorter.d.ts.map +1 -1
- package/dist/render/SplatSorter.js +8 -1
- package/dist/render/SplatSorter.js.map +1 -1
- 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 +256 -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 +30 -3
- package/dist/tileset/S3MTileset.d.ts.map +1 -1
- package/dist/tileset/S3MTileset.js +99 -5
- package/dist/tileset/S3MTileset.js.map +1 -1
- package/dist/worker/s3mWorker.js +1 -1
- package/dist/worker/s3mWorker.js.map +1 -1
- package/docs/API.md +9 -28
- package/docs/FORMAT-NOTES.md +38 -14
- package/package.json +1 -1
- package/src/core/Draco.ts +1 -2
- package/src/core/S3MBlockParser.ts +27 -16
- package/src/core/SplatSort.ts +67 -5
- package/src/core/TileGeometry.ts +24 -11
- package/src/render/DatasetManager.ts +5 -1
- package/src/render/FeatureStyleManager.ts +1 -1
- package/src/render/GeometryBuilder.ts +59 -7
- package/src/render/S3MViewer.ts +327 -1916
- package/src/render/SplatSorter.ts +8 -1
- 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 +264 -0
- package/src/tileset/S3MTileset.ts +106 -6
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 世界高度范围的增量维护。
|
|
3
|
+
*
|
|
4
|
+
* 原来每注册一块瓦片都要把所有网格重新遍历一遍、每个都 clone 一个 Box3 再乘矩阵,
|
|
5
|
+
* 加载 n 块瓦片就是 O(n²) 次矩阵乘 + n² 个垃圾对象。现在只在网格进出的记一次,
|
|
6
|
+
* 全局值从缓存里滚:只有被移除的那块正好卡在边界上时,才回退到一次 O(n) 重算。
|
|
7
|
+
*
|
|
8
|
+
* 结果写进共享 uniform `uHeightMin` / `uHeightMax`,供着色器做高度渐变 / 拔高。
|
|
9
|
+
*/
|
|
10
|
+
import * as THREE from 'three';
|
|
11
|
+
import type { StyleUniforms } from '../../core/types.js';
|
|
12
|
+
export declare class HeightIndex {
|
|
13
|
+
private readonly uniforms;
|
|
14
|
+
/** 每块网格的世界高度范围 */
|
|
15
|
+
private readonly _meshHeight;
|
|
16
|
+
private _min;
|
|
17
|
+
private _max;
|
|
18
|
+
/** 换算世界包围盒用的临时对象,避免每次 new */
|
|
19
|
+
private readonly _box;
|
|
20
|
+
constructor(uniforms: StyleUniforms);
|
|
21
|
+
get size(): number;
|
|
22
|
+
add(mesh: THREE.Mesh): void;
|
|
23
|
+
remove(mesh: THREE.Mesh): void;
|
|
24
|
+
/** 数据集整体位移(换高程偏移 / 重新布局)后,缓存的世界高度全部失效 */
|
|
25
|
+
refreshAll(): void;
|
|
26
|
+
/** 场景清空时重置 */
|
|
27
|
+
clear(): void;
|
|
28
|
+
/** 当前高度范围(未初始化时是 Infinity / -Infinity,调用方自己兜底) */
|
|
29
|
+
get range(): {
|
|
30
|
+
min: number;
|
|
31
|
+
max: number;
|
|
32
|
+
};
|
|
33
|
+
private _recompute;
|
|
34
|
+
private _push;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=HeightIndex.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeightIndex.d.ts","sourceRoot":"","sources":["../../../src/render/viewer/HeightIndex.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,qBAAa,WAAW;IAQV,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAPrC,kBAAkB;IAClB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAuD;IACnF,OAAO,CAAC,IAAI,CAAY;IACxB,OAAO,CAAC,IAAI,CAAa;IACzB,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAoB;gBAEZ,QAAQ,EAAE,aAAa;IAEpD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,IAAI;IAa3B,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,IAAI;IAS9B,yCAAyC;IACzC,UAAU,IAAI,IAAI;IAUlB,cAAc;IACd,KAAK,IAAI,IAAI;IAMb,kDAAkD;IAClD,IAAI,KAAK,IAAI;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAExC;IAED,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,KAAK;CAUd"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 世界高度范围的增量维护。
|
|
3
|
+
*
|
|
4
|
+
* 原来每注册一块瓦片都要把所有网格重新遍历一遍、每个都 clone 一个 Box3 再乘矩阵,
|
|
5
|
+
* 加载 n 块瓦片就是 O(n²) 次矩阵乘 + n² 个垃圾对象。现在只在网格进出的记一次,
|
|
6
|
+
* 全局值从缓存里滚:只有被移除的那块正好卡在边界上时,才回退到一次 O(n) 重算。
|
|
7
|
+
*
|
|
8
|
+
* 结果写进共享 uniform `uHeightMin` / `uHeightMax`,供着色器做高度渐变 / 拔高。
|
|
9
|
+
*/
|
|
10
|
+
import * as THREE from 'three';
|
|
11
|
+
export class HeightIndex {
|
|
12
|
+
uniforms;
|
|
13
|
+
/** 每块网格的世界高度范围 */
|
|
14
|
+
_meshHeight = new Map();
|
|
15
|
+
_min = Infinity;
|
|
16
|
+
_max = -Infinity;
|
|
17
|
+
/** 换算世界包围盒用的临时对象,避免每次 new */
|
|
18
|
+
_box = new THREE.Box3();
|
|
19
|
+
constructor(uniforms) {
|
|
20
|
+
this.uniforms = uniforms;
|
|
21
|
+
}
|
|
22
|
+
get size() {
|
|
23
|
+
return this._meshHeight.size;
|
|
24
|
+
}
|
|
25
|
+
add(mesh) {
|
|
26
|
+
const bb = mesh.geometry?.boundingBox;
|
|
27
|
+
if (!bb)
|
|
28
|
+
return;
|
|
29
|
+
this._box.copy(bb).applyMatrix4(mesh.matrixWorld);
|
|
30
|
+
const min = this._box.min.z;
|
|
31
|
+
const max = this._box.max.z;
|
|
32
|
+
if (!Number.isFinite(min) || !Number.isFinite(max))
|
|
33
|
+
return;
|
|
34
|
+
this._meshHeight.set(mesh, { min, max });
|
|
35
|
+
if (min < this._min)
|
|
36
|
+
this._min = min;
|
|
37
|
+
if (max > this._max)
|
|
38
|
+
this._max = max;
|
|
39
|
+
this._push();
|
|
40
|
+
}
|
|
41
|
+
remove(mesh) {
|
|
42
|
+
const rec = this._meshHeight.get(mesh);
|
|
43
|
+
if (!rec)
|
|
44
|
+
return;
|
|
45
|
+
this._meshHeight.delete(mesh);
|
|
46
|
+
// 只有正好卡在边界上才需要重算,否则滚动的 min/max 依然成立
|
|
47
|
+
if (rec.min === this._min || rec.max === this._max)
|
|
48
|
+
this._recompute();
|
|
49
|
+
else
|
|
50
|
+
this._push();
|
|
51
|
+
}
|
|
52
|
+
/** 数据集整体位移(换高程偏移 / 重新布局)后,缓存的世界高度全部失效 */
|
|
53
|
+
refreshAll() {
|
|
54
|
+
if (this._meshHeight.size === 0)
|
|
55
|
+
return;
|
|
56
|
+
const meshes = [...this._meshHeight.keys()];
|
|
57
|
+
this._meshHeight.clear();
|
|
58
|
+
this._min = Infinity;
|
|
59
|
+
this._max = -Infinity;
|
|
60
|
+
for (const mesh of meshes)
|
|
61
|
+
this.add(mesh);
|
|
62
|
+
this._push();
|
|
63
|
+
}
|
|
64
|
+
/** 场景清空时重置 */
|
|
65
|
+
clear() {
|
|
66
|
+
this._meshHeight.clear();
|
|
67
|
+
this._min = Infinity;
|
|
68
|
+
this._max = -Infinity;
|
|
69
|
+
}
|
|
70
|
+
/** 当前高度范围(未初始化时是 Infinity / -Infinity,调用方自己兜底) */
|
|
71
|
+
get range() {
|
|
72
|
+
return { min: this._min, max: this._max };
|
|
73
|
+
}
|
|
74
|
+
_recompute() {
|
|
75
|
+
let min = Infinity;
|
|
76
|
+
let max = -Infinity;
|
|
77
|
+
for (const h of this._meshHeight.values()) {
|
|
78
|
+
if (h.min < min)
|
|
79
|
+
min = h.min;
|
|
80
|
+
if (h.max > max)
|
|
81
|
+
max = h.max;
|
|
82
|
+
}
|
|
83
|
+
this._min = min;
|
|
84
|
+
this._max = max;
|
|
85
|
+
this._push();
|
|
86
|
+
}
|
|
87
|
+
_push() {
|
|
88
|
+
let min = this._min;
|
|
89
|
+
let max = this._max;
|
|
90
|
+
if (!Number.isFinite(min) || !Number.isFinite(max) || max <= min) {
|
|
91
|
+
min = 0;
|
|
92
|
+
max = 100;
|
|
93
|
+
}
|
|
94
|
+
this.uniforms.uHeightMin.value = min;
|
|
95
|
+
this.uniforms.uHeightMax.value = max;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=HeightIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeightIndex.js","sourceRoot":"","sources":["../../../src/render/viewer/HeightIndex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 光照与色调映射:四个光源 + 光照预设 + 环境贴图。
|
|
3
|
+
*
|
|
4
|
+
* 从 `S3MViewer` 里整体搬出来的第一块 —— 它只依赖 `scene` / `renderer` / 共享
|
|
5
|
+
* uniform / 宿主方位角,不碰几何、瓦片、拾取,是耦合最低的一块。
|
|
6
|
+
*
|
|
7
|
+
* ## 两个模块级全局态
|
|
8
|
+
*
|
|
9
|
+
* `setColorPipeline` / `setSrgbTextureDecode` / `setAnisotropyCap` 都是模块级设置,
|
|
10
|
+
* 影响**之后创建**的材质与纹理。所以切预设时已加载的瓦片要重载才换观感,
|
|
11
|
+
* 这是已知的架构债(一个页面两个 viewer 用不同预设会互相污染),
|
|
12
|
+
* 拆分没有改变这一点。
|
|
13
|
+
*/
|
|
14
|
+
import * as THREE from 'three';
|
|
15
|
+
import { type LightingPreset } from '../lightingPreset.js';
|
|
16
|
+
import type { LightOptions, S3MViewerOptions } from '../S3MViewer.js';
|
|
17
|
+
import type { StyleUniforms } from '../../core/types.js';
|
|
18
|
+
/**
|
|
19
|
+
* 宿主侧依赖。全部用取值函数而不是对象引用 —— 宿主可能在 mount 之前构造 viewer,
|
|
20
|
+
* 而 `scene` / `renderer` 在 mount 时才存在,存快照会拿到 null。
|
|
21
|
+
*/
|
|
22
|
+
export interface LightRigContext {
|
|
23
|
+
scene: () => THREE.Scene | null;
|
|
24
|
+
renderer: () => THREE.WebGLRenderer | null;
|
|
25
|
+
uniforms: StyleUniforms;
|
|
26
|
+
options: S3MViewerOptions;
|
|
27
|
+
/** 地图方位角(度),让主光跟着视角走;纯 three 宿主可以不传 */
|
|
28
|
+
getBearing?: () => number | undefined;
|
|
29
|
+
/** 宿主需要重画的信号 */
|
|
30
|
+
repaint: () => void;
|
|
31
|
+
}
|
|
32
|
+
export declare class LightRig {
|
|
33
|
+
private readonly ctx;
|
|
34
|
+
ambient: THREE.AmbientLight | null;
|
|
35
|
+
hemi: THREE.HemisphereLight | null;
|
|
36
|
+
key: THREE.DirectionalLight | null;
|
|
37
|
+
fill: THREE.DirectionalLight | null;
|
|
38
|
+
private readonly _state;
|
|
39
|
+
/** 环境贴图的 PMREM 渲染目标(setEnvironment 建的,dispose 时释放) */
|
|
40
|
+
private _envRT;
|
|
41
|
+
/** @internal 环境贴图 RT,供单测观察「有没有释放旧的」 */
|
|
42
|
+
get envRT(): THREE.WebGLRenderTarget | null;
|
|
43
|
+
set envRT(v: THREE.WebGLRenderTarget | null);
|
|
44
|
+
constructor(ctx: LightRigContext);
|
|
45
|
+
private _create;
|
|
46
|
+
/** 把四个光源挂进场景;重复调用是幂等的 */
|
|
47
|
+
addToScene(): void;
|
|
48
|
+
/** 光源实例是否已建(构造后、mount 前是 false) */
|
|
49
|
+
get created(): boolean;
|
|
50
|
+
private _applyOptions;
|
|
51
|
+
/**
|
|
52
|
+
* 更新光照位置与方向:
|
|
53
|
+
* - `'headlamp'`:随地图方位角 bearing 旋转,主光始终在镜头上方,受光面面向镜头;
|
|
54
|
+
* - `'fixed'`:固定世界方位角(如模拟恒定日光)。
|
|
55
|
+
*/
|
|
56
|
+
update(): void;
|
|
57
|
+
/**
|
|
58
|
+
* supermap 完整版 = 光照强度 + 颜色管线一起切:
|
|
59
|
+
* direct 管线下纹理不做 sRGB 解码、片元按官方常数 Lambert 直乘(见 lightingPreset.ts)。
|
|
60
|
+
* 两个都是模块级全局态,只影响之后创建的材质 / 纹理 —— 已加载瓦片要重载才换。
|
|
61
|
+
*/
|
|
62
|
+
applyColorPipeline(preset: LightingPreset): void;
|
|
63
|
+
setLightingPreset(preset: LightingPreset): void;
|
|
64
|
+
setLight(options: Partial<LightOptions>): void;
|
|
65
|
+
getLight(): LightOptions;
|
|
66
|
+
setToneMapping(toneMapping: THREE.ToneMapping, exposure?: number): void;
|
|
67
|
+
getToneMapping(): {
|
|
68
|
+
toneMapping: THREE.ToneMapping;
|
|
69
|
+
toneMappingExposure: number;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* 挂 / 摘环境贴图。
|
|
73
|
+
*
|
|
74
|
+
* 金属度(`setStyle({ metalness })`)**必须**有环境图才看得出质感:
|
|
75
|
+
* PBR 的金属几乎没有漫反射,画面全靠 `scene.environment` 里的环境反射,
|
|
76
|
+
* 没有它时 metalness 一高就整片发黑,只剩两盏平行灯打成的小高光点。
|
|
77
|
+
*
|
|
78
|
+
* @param source 等距柱状图(.hdr / .jpg / .png,2:1)地址,或已加载的 `THREE.Texture`;
|
|
79
|
+
* `null` = 关掉环境图
|
|
80
|
+
* @param intensity 环境光强度(`scene.environmentIntensity`,默认 1)
|
|
81
|
+
*
|
|
82
|
+
* 传入 URL 时纹理由内部加载并转成 PMREM(预滤波 mipmap);传 Texture 时不会接管它的生命周期。
|
|
83
|
+
*/
|
|
84
|
+
setEnvironment(source: string | THREE.Texture | null, intensity?: number): Promise<void>;
|
|
85
|
+
/** 释放环境贴图与光源(unmount 时调) */
|
|
86
|
+
dispose(): void;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=LightRig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LightRig.d.ts","sourceRoot":"","sources":["../../../src/render/viewer/LightRig.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGlF,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAoBzD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC;IAChC,QAAQ,EAAE,MAAM,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;IAC3C,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACtC,gBAAgB;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,qBAAa,QAAQ;IAkBP,OAAO,CAAC,QAAQ,CAAC,GAAG;IAjBhC,OAAO,EAAE,KAAK,CAAC,YAAY,GAAG,IAAI,CAAQ;IAC1C,IAAI,EAAE,KAAK,CAAC,eAAe,GAAG,IAAI,CAAQ;IAC1C,GAAG,EAAE,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAQ;IAC1C,IAAI,EAAE,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAQ;IAE3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,sDAAsD;IACtD,OAAO,CAAC,MAAM,CAAwC;IAEtD,uCAAuC;IACvC,IAAI,KAAK,IAAI,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAE1C;IACD,IAAI,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,iBAAiB,GAAG,IAAI,EAE1C;gBAE4B,GAAG,EAAE,eAAe;IAYjD,OAAO,CAAC,OAAO;IAYf,yBAAyB;IACzB,UAAU,IAAI,IAAI;IAOlB,mCAAmC;IACnC,IAAI,OAAO,IAAI,OAAO,CAErB;IAID,OAAO,CAAC,aAAa;IAqBrB;;;;OAIG;IACH,MAAM,IAAI,IAAI;IAkBd;;;;OAIG;IACH,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAShD,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAS/C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;IAc9C,QAAQ,IAAI,YAAY;IAIxB,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,QAAQ,SAAM,GAAG,IAAI;IAWpE,cAAc,IAAI;QAAE,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAA;KAAE;IAUjF;;;;;;;;;;;;OAYG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,EAAE,SAAS,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCzF,4BAA4B;IAC5B,OAAO,IAAI,IAAI;CAIhB"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 光照与色调映射:四个光源 + 光照预设 + 环境贴图。
|
|
3
|
+
*
|
|
4
|
+
* 从 `S3MViewer` 里整体搬出来的第一块 —— 它只依赖 `scene` / `renderer` / 共享
|
|
5
|
+
* uniform / 宿主方位角,不碰几何、瓦片、拾取,是耦合最低的一块。
|
|
6
|
+
*
|
|
7
|
+
* ## 两个模块级全局态
|
|
8
|
+
*
|
|
9
|
+
* `setColorPipeline` / `setSrgbTextureDecode` / `setAnisotropyCap` 都是模块级设置,
|
|
10
|
+
* 影响**之后创建**的材质与纹理。所以切预设时已加载的瓦片要重载才换观感,
|
|
11
|
+
* 这是已知的架构债(一个页面两个 viewer 用不同预设会互相污染),
|
|
12
|
+
* 拆分没有改变这一点。
|
|
13
|
+
*/
|
|
14
|
+
import * as THREE from 'three';
|
|
15
|
+
import { resolveLightingPreset } from '../lightingPreset.js';
|
|
16
|
+
import { setColorPipeline } from '../StyleMaterial.js';
|
|
17
|
+
import { setAnisotropyCap, setSrgbTextureDecode } from '../TextureFactory.js';
|
|
18
|
+
const DEFAULT_LIGHT = {
|
|
19
|
+
ambientIntensity: 0.4,
|
|
20
|
+
ambientColor: 0xffffff,
|
|
21
|
+
hemisphereIntensity: 0.8,
|
|
22
|
+
hemisphereColor: 0xffffff,
|
|
23
|
+
hemisphereGroundColor: 0xb6c0cb,
|
|
24
|
+
keyLightIntensity: 1.0,
|
|
25
|
+
keyLightColor: 0xffffff,
|
|
26
|
+
fillLightIntensity: 0.35,
|
|
27
|
+
fillLightColor: 0xffffff,
|
|
28
|
+
mode: 'headlamp',
|
|
29
|
+
azimuth: 150,
|
|
30
|
+
altitude: 50,
|
|
31
|
+
};
|
|
32
|
+
export class LightRig {
|
|
33
|
+
ctx;
|
|
34
|
+
ambient = null;
|
|
35
|
+
hemi = null;
|
|
36
|
+
key = null;
|
|
37
|
+
fill = null;
|
|
38
|
+
_state;
|
|
39
|
+
/** 环境贴图的 PMREM 渲染目标(setEnvironment 建的,dispose 时释放) */
|
|
40
|
+
_envRT = null;
|
|
41
|
+
/** @internal 环境贴图 RT,供单测观察「有没有释放旧的」 */
|
|
42
|
+
get envRT() {
|
|
43
|
+
return this._envRT;
|
|
44
|
+
}
|
|
45
|
+
set envRT(v) {
|
|
46
|
+
this._envRT = v;
|
|
47
|
+
}
|
|
48
|
+
constructor(ctx) {
|
|
49
|
+
this.ctx = ctx;
|
|
50
|
+
this._state = { ...DEFAULT_LIGHT };
|
|
51
|
+
const options = ctx.options;
|
|
52
|
+
if (options.lightingPreset && options.lightingPreset !== 'default') {
|
|
53
|
+
Object.assign(this._state, resolveLightingPreset(options.lightingPreset));
|
|
54
|
+
this.applyColorPipeline(options.lightingPreset);
|
|
55
|
+
}
|
|
56
|
+
if (options.light)
|
|
57
|
+
Object.assign(this._state, options.light);
|
|
58
|
+
}
|
|
59
|
+
/* ---------------------------------------------------------------- 场景挂载 */
|
|
60
|
+
_create() {
|
|
61
|
+
this.ambient = new THREE.AmbientLight(this._state.ambientColor, this._state.ambientIntensity);
|
|
62
|
+
this.hemi = new THREE.HemisphereLight(this._state.hemisphereColor, this._state.hemisphereGroundColor, this._state.hemisphereIntensity);
|
|
63
|
+
this.key = new THREE.DirectionalLight(this._state.keyLightColor, this._state.keyLightIntensity);
|
|
64
|
+
this.fill = new THREE.DirectionalLight(this._state.fillLightColor, this._state.fillLightIntensity);
|
|
65
|
+
this.update();
|
|
66
|
+
}
|
|
67
|
+
/** 把四个光源挂进场景;重复调用是幂等的 */
|
|
68
|
+
addToScene() {
|
|
69
|
+
const scene = this.ctx.scene();
|
|
70
|
+
if (!scene)
|
|
71
|
+
return;
|
|
72
|
+
if (!this.ambient)
|
|
73
|
+
this._create();
|
|
74
|
+
scene.add(this.ambient, this.hemi, this.key, this.fill);
|
|
75
|
+
}
|
|
76
|
+
/** 光源实例是否已建(构造后、mount 前是 false) */
|
|
77
|
+
get created() {
|
|
78
|
+
return this.ambient !== null;
|
|
79
|
+
}
|
|
80
|
+
/* ---------------------------------------------------------------- 参数 */
|
|
81
|
+
_applyOptions() {
|
|
82
|
+
const s = this._state;
|
|
83
|
+
if (this.ambient) {
|
|
84
|
+
this.ambient.intensity = s.ambientIntensity;
|
|
85
|
+
this.ambient.color.set(s.ambientColor);
|
|
86
|
+
}
|
|
87
|
+
if (this.hemi) {
|
|
88
|
+
this.hemi.intensity = s.hemisphereIntensity;
|
|
89
|
+
this.hemi.color.set(s.hemisphereColor);
|
|
90
|
+
this.hemi.groundColor.set(s.hemisphereGroundColor);
|
|
91
|
+
}
|
|
92
|
+
if (this.key) {
|
|
93
|
+
this.key.intensity = s.keyLightIntensity;
|
|
94
|
+
this.key.color.set(s.keyLightColor);
|
|
95
|
+
}
|
|
96
|
+
if (this.fill) {
|
|
97
|
+
this.fill.intensity = s.fillLightIntensity;
|
|
98
|
+
this.fill.color.set(s.fillLightColor);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* 更新光照位置与方向:
|
|
103
|
+
* - `'headlamp'`:随地图方位角 bearing 旋转,主光始终在镜头上方,受光面面向镜头;
|
|
104
|
+
* - `'fixed'`:固定世界方位角(如模拟恒定日光)。
|
|
105
|
+
*/
|
|
106
|
+
update() {
|
|
107
|
+
if (!this.key || !this.fill)
|
|
108
|
+
return;
|
|
109
|
+
const s = this._state;
|
|
110
|
+
const bearing = s.mode === 'fixed' ? 0 : ((this.ctx.getBearing?.() ?? 0) * Math.PI) / 180;
|
|
111
|
+
const place = (light, azOffsetDeg, elevDeg) => {
|
|
112
|
+
if (!light)
|
|
113
|
+
return;
|
|
114
|
+
const az = bearing + (azOffsetDeg * Math.PI) / 180;
|
|
115
|
+
const el = (elevDeg * Math.PI) / 180;
|
|
116
|
+
const c = Math.cos(el);
|
|
117
|
+
light.position.set(Math.sin(az) * c, Math.cos(az) * c, Math.sin(el)).multiplyScalar(1000);
|
|
118
|
+
};
|
|
119
|
+
place(this.key, s.azimuth, s.altitude);
|
|
120
|
+
place(this.fill, s.azimuth + 65, Math.max(10, s.altitude - 20));
|
|
121
|
+
// direct 管线的官方 Lambert 用主光方向(共享 uniform,所有材质同步生效)
|
|
122
|
+
const sun = this.ctx.uniforms?.uSunDirection;
|
|
123
|
+
if (sun)
|
|
124
|
+
sun.value.copy(this.key.position).normalize();
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* supermap 完整版 = 光照强度 + 颜色管线一起切:
|
|
128
|
+
* direct 管线下纹理不做 sRGB 解码、片元按官方常数 Lambert 直乘(见 lightingPreset.ts)。
|
|
129
|
+
* 两个都是模块级全局态,只影响之后创建的材质 / 纹理 —— 已加载瓦片要重载才换。
|
|
130
|
+
*/
|
|
131
|
+
applyColorPipeline(preset) {
|
|
132
|
+
const direct = preset === 'supermap';
|
|
133
|
+
setColorPipeline(direct ? 'direct' : 'linear');
|
|
134
|
+
setSrgbTextureDecode(!direct);
|
|
135
|
+
// 官方不开各向异性:远处直接采高 mip 平均成纯色("灰色滤镜"的一部分)。
|
|
136
|
+
// 我们默认 Infinity(倾斜摄影立面清晰度优先),supermap 模式必须收回。
|
|
137
|
+
setAnisotropyCap(direct ? 1 : Infinity);
|
|
138
|
+
}
|
|
139
|
+
setLightingPreset(preset) {
|
|
140
|
+
Object.assign(this._state, resolveLightingPreset(preset));
|
|
141
|
+
this.applyColorPipeline(preset);
|
|
142
|
+
this.ctx.options.lightingPreset = preset;
|
|
143
|
+
this._applyOptions();
|
|
144
|
+
this.update();
|
|
145
|
+
this.ctx.repaint();
|
|
146
|
+
}
|
|
147
|
+
setLight(options) {
|
|
148
|
+
const normalized = { ...options };
|
|
149
|
+
if (normalized.mainColor !== undefined && normalized.keyLightColor === undefined) {
|
|
150
|
+
normalized.keyLightColor = normalized.mainColor;
|
|
151
|
+
}
|
|
152
|
+
if (normalized.mainIntensity !== undefined && normalized.keyLightIntensity === undefined) {
|
|
153
|
+
normalized.keyLightIntensity = normalized.mainIntensity;
|
|
154
|
+
}
|
|
155
|
+
Object.assign(this._state, normalized);
|
|
156
|
+
this._applyOptions();
|
|
157
|
+
this.update();
|
|
158
|
+
this.ctx.repaint();
|
|
159
|
+
}
|
|
160
|
+
getLight() {
|
|
161
|
+
return { ...this._state };
|
|
162
|
+
}
|
|
163
|
+
setToneMapping(toneMapping, exposure = 1.0) {
|
|
164
|
+
this.ctx.options.toneMapping = toneMapping;
|
|
165
|
+
this.ctx.options.toneMappingExposure = exposure;
|
|
166
|
+
const r = this.ctx.renderer();
|
|
167
|
+
if (r) {
|
|
168
|
+
r.toneMapping = toneMapping;
|
|
169
|
+
r.toneMappingExposure = exposure;
|
|
170
|
+
this.ctx.repaint();
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
getToneMapping() {
|
|
174
|
+
const r = this.ctx.renderer();
|
|
175
|
+
return {
|
|
176
|
+
toneMapping: r ? r.toneMapping : (this.ctx.options.toneMapping ?? THREE.NoToneMapping),
|
|
177
|
+
toneMappingExposure: r ? r.toneMappingExposure : (this.ctx.options.toneMappingExposure ?? 1.0),
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/* ---------------------------------------------------------------- 环境贴图 */
|
|
181
|
+
/**
|
|
182
|
+
* 挂 / 摘环境贴图。
|
|
183
|
+
*
|
|
184
|
+
* 金属度(`setStyle({ metalness })`)**必须**有环境图才看得出质感:
|
|
185
|
+
* PBR 的金属几乎没有漫反射,画面全靠 `scene.environment` 里的环境反射,
|
|
186
|
+
* 没有它时 metalness 一高就整片发黑,只剩两盏平行灯打成的小高光点。
|
|
187
|
+
*
|
|
188
|
+
* @param source 等距柱状图(.hdr / .jpg / .png,2:1)地址,或已加载的 `THREE.Texture`;
|
|
189
|
+
* `null` = 关掉环境图
|
|
190
|
+
* @param intensity 环境光强度(`scene.environmentIntensity`,默认 1)
|
|
191
|
+
*
|
|
192
|
+
* 传入 URL 时纹理由内部加载并转成 PMREM(预滤波 mipmap);传 Texture 时不会接管它的生命周期。
|
|
193
|
+
*/
|
|
194
|
+
async setEnvironment(source, intensity = 1) {
|
|
195
|
+
const renderer = this.ctx.renderer();
|
|
196
|
+
const scene = this.ctx.scene();
|
|
197
|
+
if (!renderer || !scene)
|
|
198
|
+
return;
|
|
199
|
+
scene.environmentIntensity = Math.max(0, intensity);
|
|
200
|
+
if (source == null) {
|
|
201
|
+
scene.environment = null;
|
|
202
|
+
this._envRT?.dispose();
|
|
203
|
+
this._envRT = null;
|
|
204
|
+
this.ctx.repaint();
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
const fromUrl = typeof source === 'string';
|
|
208
|
+
const tex = fromUrl ? await new THREE.TextureLoader().loadAsync(source) : source;
|
|
209
|
+
// PMREM 只认等距柱状图;普通贴图也按 2:1 全景处理
|
|
210
|
+
tex.mapping = THREE.EquirectangularReflectionMapping;
|
|
211
|
+
const pmrem = new THREE.PMREMGenerator(renderer);
|
|
212
|
+
pmrem.compileEquirectangularShader();
|
|
213
|
+
const rt = pmrem.fromEquirectangular(tex);
|
|
214
|
+
pmrem.dispose();
|
|
215
|
+
if (fromUrl)
|
|
216
|
+
tex.dispose();
|
|
217
|
+
scene.environment = rt.texture;
|
|
218
|
+
// 上一张(同一个 viewer 反复换)要释放,否则显存里会一直堆
|
|
219
|
+
this._envRT?.dispose();
|
|
220
|
+
this._envRT = rt;
|
|
221
|
+
this.ctx.repaint();
|
|
222
|
+
}
|
|
223
|
+
/** 释放环境贴图与光源(unmount 时调) */
|
|
224
|
+
dispose() {
|
|
225
|
+
this._envRT?.dispose();
|
|
226
|
+
this._envRT = null;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=LightRig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LightRig.js","sourceRoot":"","sources":["../../../src/render/viewer/LightRig.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 拾取:屏幕坐标 → 射线 → 命中单体 / 位置 / 包围盒。
|
|
3
|
+
*
|
|
4
|
+
* 从 `S3MViewer` 整体搬出来的第二大块。它持有**拾取表**(`pickables`)与
|
|
5
|
+
* 2 字节 pickId 池 —— 这两样本来就是一件事:瓦片注册时分配 id 并登记,
|
|
6
|
+
* 淘汰时回收,拾取时按 id 反查。
|
|
7
|
+
*
|
|
8
|
+
* ## pickId 为什么要回收
|
|
9
|
+
*
|
|
10
|
+
* 拾取结果编码在 RG 两个通道里,只有 65535 个槽。倾斜摄影一块瓦片可能几十个网格,
|
|
11
|
+
* 一个数据集上千块瓦片就是几万个 —— 不回收的话瓦片进出几轮就溢出了。
|
|
12
|
+
*
|
|
13
|
+
* ## 泼溅是独立分支
|
|
14
|
+
*
|
|
15
|
+
* 泼溅既没有 `instanceMatrix`,也没有 `geoRef.pickInfo` 里的单体表。走通用路径会在
|
|
16
|
+
* `_instanceFeature()` 拿到 null 直接返回 —— 表现是「点得中但拿不到结果」。
|
|
17
|
+
*/
|
|
18
|
+
import * as THREE from 'three';
|
|
19
|
+
import type { FeatureStyleManager } from '../FeatureStyleManager.js';
|
|
20
|
+
import type { Picker } from '../Picker.js';
|
|
21
|
+
import type { InstanceFeature } from '../../core/FeatureInfo.js';
|
|
22
|
+
import type { GeoPackageEntry, SegmentBox } from '../../core/types.js';
|
|
23
|
+
import type { PickResult, PickableRef } from '../S3MViewer.js';
|
|
24
|
+
export interface PickHost {
|
|
25
|
+
readonly picker: Picker | null;
|
|
26
|
+
readonly camera: THREE.Camera | null;
|
|
27
|
+
readonly scene: THREE.Scene | null;
|
|
28
|
+
readonly canvas: HTMLCanvasElement | null;
|
|
29
|
+
readonly style: {
|
|
30
|
+
floorHeight: number;
|
|
31
|
+
};
|
|
32
|
+
readonly sceneAnchor: {
|
|
33
|
+
x: number;
|
|
34
|
+
y: number;
|
|
35
|
+
z: number;
|
|
36
|
+
meterInMercator: number;
|
|
37
|
+
altitude?: number;
|
|
38
|
+
} | null;
|
|
39
|
+
readonly datasets: Map<string, {
|
|
40
|
+
name: string;
|
|
41
|
+
}>;
|
|
42
|
+
readonly featureStyleManager: FeatureStyleManager;
|
|
43
|
+
readonly smidMeshes: Map<number, Set<THREE.Mesh>>;
|
|
44
|
+
lngLatFromWorld(x: number, y: number): [number, number];
|
|
45
|
+
gpuPathPoseAt(smid: number): {
|
|
46
|
+
pos: [number, number, number];
|
|
47
|
+
yaw: number;
|
|
48
|
+
} | null;
|
|
49
|
+
isFeatureHidden(smid: number | null, batchId: number): boolean;
|
|
50
|
+
}
|
|
51
|
+
export declare class PickService {
|
|
52
|
+
private readonly host;
|
|
53
|
+
/** 拾取表:pickId → 网格 */
|
|
54
|
+
readonly pickables: Map<number, PickableRef>;
|
|
55
|
+
private _pickSeq;
|
|
56
|
+
private readonly _freePickIds;
|
|
57
|
+
constructor(host: PickHost);
|
|
58
|
+
/** 分配一个 pickId(优先复用回收的) */
|
|
59
|
+
allocPickId(): number;
|
|
60
|
+
releasePickId(id: number): void;
|
|
61
|
+
/** 全部网格(拾取表的另一种视角,供样式 / 统计遍历) */
|
|
62
|
+
meshes(): THREE.Mesh[];
|
|
63
|
+
clear(): void;
|
|
64
|
+
/** 获取指定屏幕像素对应的场景射线(用于高精度求交与穿透拾取) */
|
|
65
|
+
getRayAt(x: number, y: number): THREE.Ray | null;
|
|
66
|
+
intersectMeshAtRay(mesh: THREE.Mesh, ray: THREE.Ray, instanceIndex?: number): THREE.Vector3 | null;
|
|
67
|
+
buildPickResult(hit: {
|
|
68
|
+
objectId: number;
|
|
69
|
+
batchId: number;
|
|
70
|
+
instanceIndex?: number;
|
|
71
|
+
}, ref: PickableRef, exactPoint?: THREE.Vector3, ray?: THREE.Ray): PickResult | null;
|
|
72
|
+
/**
|
|
73
|
+
* 泼溅的拾取结果。
|
|
74
|
+
*
|
|
75
|
+
* 整块泼溅瓦片当一个单体(没有单体级 smid 可报),命中点由 `splatRaycast` 给出 ——
|
|
76
|
+
* 它按每个高斯的 3σ 球求交,比拾取那一趟为了命中率摊开的 4px 方块准得多。
|
|
77
|
+
* 包围盒必须由 `iCenter` 算:geometry 的 position 只是 [-1,1]² 的四边形角点。
|
|
78
|
+
*/
|
|
79
|
+
buildSplatPickResult(hit: {
|
|
80
|
+
objectId: number;
|
|
81
|
+
batchId: number;
|
|
82
|
+
instanceIndex?: number;
|
|
83
|
+
}, ref: PickableRef, exactPoint?: THREE.Vector3, ray?: THREE.Ray): PickResult | null;
|
|
84
|
+
/** 按 canvas 左上角的 CSS 像素坐标拾取。 */
|
|
85
|
+
pick(x: number, y: number): PickResult | null;
|
|
86
|
+
/**
|
|
87
|
+
* 拾取指定屏幕像素对应的世界坐标与场景位置。
|
|
88
|
+
* 优先与命中的建筑网格精确求交;未命中建筑时若视线与地表相交则返回地面交点。
|
|
89
|
+
*/
|
|
90
|
+
pickPosition(x: number, y: number): {
|
|
91
|
+
lngLat: [number, number];
|
|
92
|
+
altitude: number;
|
|
93
|
+
point: [number, number, number];
|
|
94
|
+
} | null;
|
|
95
|
+
/**
|
|
96
|
+
* 沿视线方向穿透拾取多个单体,按由近至远排序返回。
|
|
97
|
+
*/
|
|
98
|
+
drillPick(x: number, y: number, limit?: number): PickResult[];
|
|
99
|
+
/**
|
|
100
|
+
* 获取指定 SMID 单体的经纬度包围盒 [[minLng, minLat], [maxLng, maxLat]]。
|
|
101
|
+
* 若模型尚未加载到场景中或无此单体则返回 null。
|
|
102
|
+
*/
|
|
103
|
+
getFeatureBounds(smid: number): [[number, number], [number, number]] | null;
|
|
104
|
+
/** 实例序号 → 所属单体(按网格缓存反查表,实例多的数据不用每次重建) */
|
|
105
|
+
instanceFeature(mesh: THREE.Mesh, geoRef: GeoPackageEntry | undefined, instanceIndex: number): InstanceFeature | null;
|
|
106
|
+
/** 实例化几何的单体包围盒:base mesh 的包围盒套上该实例的矩阵 */
|
|
107
|
+
instanceBox(mesh: THREE.Mesh, instanceIndex: number): SegmentBox | null;
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=PickService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PickService.d.ts","sourceRoot":"","sources":["../../../src/render/viewer/PickService.ts"],"names":[],"mappings":"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"}
|