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
|
@@ -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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"}
|