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,628 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 棱线装饰:折边线 / 外推 / 背面外扩轮廓 / GPU 后处理描边。
|
|
3
|
+
*
|
|
4
|
+
* 从 `S3MViewer` 整体搬出来的最大一块。它只碰 `mesh.userData`(`edges` / `edgeHull` /
|
|
5
|
+
* `nativeEdges`)与共享 uniform,不碰拾取表、不碰瓦片生命周期 —— 所以能独立成模块。
|
|
6
|
+
*
|
|
7
|
+
* ## 为什么外观 uniform 要共享
|
|
8
|
+
*
|
|
9
|
+
* 棱线材质必须**逐网格一份**(各绑各的单体状态纹理),但外观(颜色 / 粗细 / 透明度 /
|
|
10
|
+
* 外推距离)必须全局统一。做法是外观 uniform 用同一批对象,`syncStyle()` 改一次全部生效,
|
|
11
|
+
* 棱线淡入淡出也只改一个 `uEdgeFade` —— 新建瓦片自动继承当前进度。
|
|
12
|
+
*
|
|
13
|
+
* ## 三种画法的成本
|
|
14
|
+
*
|
|
15
|
+
* - `line` / `offset`:CPU 现算 EdgesGeometry,按 8ms 一帧切片建,几十万面不会卡死;
|
|
16
|
+
* - `hull`:不建几何,把同一块网格沿法线外扩再画一遍,只画背面;
|
|
17
|
+
* - `gpu`:零几何、零额外 pass 的片元描边,线宽约 1 像素。
|
|
18
|
+
*/
|
|
19
|
+
import * as THREE from 'three';
|
|
20
|
+
import { authFetch } from '../../core/AuthFetch.js';
|
|
21
|
+
import { createOutlineMaterial, resolveEdgeModes, sameEdgeModes, } from '../StyleMaterial.js';
|
|
22
|
+
import { buildFeatureEdgeSegments, buildPositionBatchMap, buildThickLineGeometry, createLineSharedUniforms, createThickLineMaterial, positionQuantKey, } from '../EdgeLines.js';
|
|
23
|
+
import { mergeVerticesByPosition } from '../MergeVertices.js';
|
|
24
|
+
import { GpuEdgePass } from '../GpuEdgePass.js';
|
|
25
|
+
/** 取网格上的 styled 材质(与 S3MViewer 里那份逐字一致) */
|
|
26
|
+
function styledMaterialOf(mesh) {
|
|
27
|
+
const m = Array.isArray(mesh.material) ? mesh.material[0] : mesh.material;
|
|
28
|
+
return m?.userData?.isStyled ? m : null;
|
|
29
|
+
}
|
|
30
|
+
/** 与 S3MViewer 里同名的工具(保持逐字一致,避免两处口径漂移) */
|
|
31
|
+
function clampOpacity(v) {
|
|
32
|
+
const n = v ?? 1;
|
|
33
|
+
return n < 0 ? 0 : n > 1 ? 1 : n;
|
|
34
|
+
}
|
|
35
|
+
/** 地形 / 绿地 / 道路 / 地面铺装等不参与自动描边(数据自带棱线包另说) */
|
|
36
|
+
const EDGE_SKIP_KEYWORDS = [
|
|
37
|
+
'terrain', 'ground', 'vegetation', 'green', 'road', 'dem',
|
|
38
|
+
'绿地', '道路', '地面', '地形', '植被', '铺装',
|
|
39
|
+
];
|
|
40
|
+
export class EdgeDecorator {
|
|
41
|
+
host;
|
|
42
|
+
/** 等宽线共享的分辨率 uniform(全局棱线 + 选中棱线共用) */
|
|
43
|
+
lineShared;
|
|
44
|
+
/** 全局棱线材质(外观 uniform 的持有者,逐网格棱线材质共享它的对象) */
|
|
45
|
+
edgeMaterial;
|
|
46
|
+
/** 选中棱线材质(同上,选中棱线的逐网格材质共享它的对象) */
|
|
47
|
+
selectionEdgeMaterial;
|
|
48
|
+
_edgeStyleUniforms;
|
|
49
|
+
_selEdgeStyleUniforms;
|
|
50
|
+
_hullStyleUniforms;
|
|
51
|
+
_enabled = false;
|
|
52
|
+
_modes;
|
|
53
|
+
/** 预制棱线缓存(Crease Cache):外部载入的全局统一 LineSegments */
|
|
54
|
+
_creaseLines = null;
|
|
55
|
+
/** 数据自带的棱线对象:改颜色时只刷这些,不再全场景 traverse */
|
|
56
|
+
_nativeLines = new Set();
|
|
57
|
+
/** GPU 描边后处理(深度 + 法线),只在 edges 含 'gpu' 时按帧执行 */
|
|
58
|
+
_gpuEdge = null;
|
|
59
|
+
/** 给 GPU 描边传色用的临时 Color,避免每帧 new */
|
|
60
|
+
_gpuEdgeColor = new THREE.Color();
|
|
61
|
+
constructor(host) {
|
|
62
|
+
this.host = host;
|
|
63
|
+
const style = host.style;
|
|
64
|
+
this._modes = resolveEdgeModes(false);
|
|
65
|
+
this.lineShared = createLineSharedUniforms();
|
|
66
|
+
this._edgeStyleUniforms = {
|
|
67
|
+
uColor: { value: new THREE.Color(style.edgeColor) },
|
|
68
|
+
uWidth: { value: Math.max(0.1, style.edgeWidth ?? 1.5) },
|
|
69
|
+
uOpacity: { value: 0.6 },
|
|
70
|
+
uOffset: { value: style.edgeOffset ?? 0.15 },
|
|
71
|
+
};
|
|
72
|
+
this.edgeMaterial = createThickLineMaterial(this.lineShared, {}, this._edgeStyleUniforms);
|
|
73
|
+
const full = style;
|
|
74
|
+
this._selEdgeStyleUniforms = {
|
|
75
|
+
uColor: { value: new THREE.Color(full.outlineColor ?? full.selectColor ?? '#ffffff') },
|
|
76
|
+
uWidth: { value: Math.max(0.1, full.outlineWidthPx ?? 3) },
|
|
77
|
+
uOpacity: { value: 1 },
|
|
78
|
+
uElevation: { value: full.selectElevation ?? 0 },
|
|
79
|
+
};
|
|
80
|
+
this.selectionEdgeMaterial = createThickLineMaterial(this.lineShared, {}, this._selEdgeStyleUniforms);
|
|
81
|
+
this._hullStyleUniforms = {
|
|
82
|
+
uColor: { value: new THREE.Color(style.edgeColor) },
|
|
83
|
+
uWidth: { value: Math.max(0, style.edgeHullWidth ?? 0.9) },
|
|
84
|
+
uOpacity: { value: 0.6 },
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/** 当前是否开启棱线 */
|
|
88
|
+
get enabled() {
|
|
89
|
+
return this._enabled;
|
|
90
|
+
}
|
|
91
|
+
/** 当前生效的画法 */
|
|
92
|
+
get modes() {
|
|
93
|
+
return this._modes;
|
|
94
|
+
}
|
|
95
|
+
/** 数据自带棱线包在当前画法下还算不算数 */
|
|
96
|
+
useNativeEdges(hasNative) {
|
|
97
|
+
return hasNative && this.host.style.forceCpuEdges !== true && !this._modes.gpu;
|
|
98
|
+
}
|
|
99
|
+
/** 登记数据自带的棱线(注册瓦片时调) */
|
|
100
|
+
registerNativeLine(lines, visible) {
|
|
101
|
+
this._nativeLines.add(lines);
|
|
102
|
+
lines.visible = visible;
|
|
103
|
+
this._styleEdgeLine(lines);
|
|
104
|
+
}
|
|
105
|
+
/** 注销数据自带的棱线(瓦片淘汰时调) */
|
|
106
|
+
unregisterNativeLine(lines) {
|
|
107
|
+
this._nativeLines.delete(lines);
|
|
108
|
+
}
|
|
109
|
+
/** 新瓦片是否要自动补棱线装饰(受全局开关 / 数据集开关 / 关键字跳过三道控制) */
|
|
110
|
+
autoDecorate(mesh, entry, hasNativeEdges) {
|
|
111
|
+
if (hasNativeEdges || isPointCloud(mesh))
|
|
112
|
+
return;
|
|
113
|
+
if (!this._datasetEdgesEnabled(entry))
|
|
114
|
+
return;
|
|
115
|
+
const ud = mesh.userData;
|
|
116
|
+
if (this._shouldSkipAutoEdges(ud, entry.name))
|
|
117
|
+
return;
|
|
118
|
+
// 数据集强制开启时全局画法可能还是关的,退回默认折边线;gpu 画法本来就不建几何
|
|
119
|
+
if (this._modes.line || this._modes.hull)
|
|
120
|
+
this._ensureEdgeDecoration(mesh);
|
|
121
|
+
else if (!this._modes.gpu)
|
|
122
|
+
this._ensureEdges(mesh);
|
|
123
|
+
}
|
|
124
|
+
/** 释放全部装饰与后处理资源(unmount 时调) */
|
|
125
|
+
disposeAll() {
|
|
126
|
+
for (const p of this.host.pickables.values())
|
|
127
|
+
this._removeEdges(p.mesh);
|
|
128
|
+
this._gpuEdge?.dispose();
|
|
129
|
+
this._gpuEdge = null;
|
|
130
|
+
this.edgeMaterial.dispose();
|
|
131
|
+
this.selectionEdgeMaterial.dispose();
|
|
132
|
+
}
|
|
133
|
+
/** @internal GPU 描边实例,单测会替换成假对象观察 dispose */
|
|
134
|
+
get gpuEdge() {
|
|
135
|
+
return this._gpuEdge;
|
|
136
|
+
}
|
|
137
|
+
set gpuEdge(v) {
|
|
138
|
+
this._gpuEdge = v;
|
|
139
|
+
}
|
|
140
|
+
/** GPU 描边资源单独释放(换上下文时调,下一帧按需重建) */
|
|
141
|
+
disposeGpuEdge() {
|
|
142
|
+
this._gpuEdge?.dispose();
|
|
143
|
+
this._gpuEdge = null;
|
|
144
|
+
}
|
|
145
|
+
/** 一帧的 GPU 描边,必须画在主场景之后(依赖本帧已写好的深度) */
|
|
146
|
+
renderGpuEdges(canvas) {
|
|
147
|
+
if (!this._modes.gpu)
|
|
148
|
+
return;
|
|
149
|
+
const renderer = this.host.renderer;
|
|
150
|
+
const scene = this.host.scene;
|
|
151
|
+
const camera = this.host.camera;
|
|
152
|
+
if (!renderer || !scene || !camera)
|
|
153
|
+
return;
|
|
154
|
+
const s = this.host.style;
|
|
155
|
+
const fade = this.host.uniforms.uEdgeFade?.value ?? 1;
|
|
156
|
+
const opacity = Math.min(1, Math.max(0, s.edgeOpacity ?? 0.6)) * clampOpacity(s.opacity) * fade;
|
|
157
|
+
if (opacity <= 0.004)
|
|
158
|
+
return;
|
|
159
|
+
if (!this._gpuEdge)
|
|
160
|
+
this._gpuEdge = new GpuEdgePass();
|
|
161
|
+
if (!this._gpuEdge.supported(renderer))
|
|
162
|
+
return;
|
|
163
|
+
// 度数 → 归一化法线差(|Δn| = 2·sin(θ/2)),乘 0.6 让阈值落在「刚好能描出」的位置
|
|
164
|
+
const deg = Math.min(179, Math.max(1, s.edgeThreshold ?? 55));
|
|
165
|
+
const normalThreshold = 2 * Math.sin((deg * Math.PI) / 360) * 0.6;
|
|
166
|
+
this._gpuEdge.render(renderer, scene, camera, canvas.width, canvas.height, {
|
|
167
|
+
color: this._gpuEdgeColor.set(s.edgeColor),
|
|
168
|
+
opacity,
|
|
169
|
+
radius: Math.max(1, s.edgeWidth ?? 1.5),
|
|
170
|
+
normalThreshold,
|
|
171
|
+
depthThreshold: 0.08,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
/** 建逐网格棱线材质;`selection` 为真时用选中棱线那套外观 uniform */
|
|
175
|
+
createPerMeshEdgeMaterial(mesh, selection = false) {
|
|
176
|
+
const styled = styledMaterialOf(mesh);
|
|
177
|
+
const u = this.host.uniforms;
|
|
178
|
+
const batch = styled?.userData?.uBatchTex
|
|
179
|
+
? {
|
|
180
|
+
uBatchTex: styled.userData.uBatchTex,
|
|
181
|
+
uBatchTex2: styled.userData.uBatchTex2,
|
|
182
|
+
uBatchMix: u.uBatchMix,
|
|
183
|
+
uBatchTexWidth: styled.userData.uBatchTexWidth,
|
|
184
|
+
uBatchTexActive: styled.userData.uBatchTexActive,
|
|
185
|
+
uPathTex: u.uPathTex,
|
|
186
|
+
uPathCount: u.uPathCount,
|
|
187
|
+
uPathTexActive: u.uPathTexActive,
|
|
188
|
+
uPathTime: u.uPathTime,
|
|
189
|
+
}
|
|
190
|
+
: undefined;
|
|
191
|
+
return createThickLineMaterial(this.lineShared, {}, selection ? this._selEdgeStyleUniforms : this._edgeStyleUniforms, batch);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* 全局棱线开关。
|
|
195
|
+
*
|
|
196
|
+
* 取值是 `boolean | EdgeStyle | EdgeStyle[]`(见 resolveEdgeModes):
|
|
197
|
+
* - `true` / `'line'` 折边线(旧口径)
|
|
198
|
+
* - `'offset'` 折边线 + 沿边法线外推 `edgeOffset` 米
|
|
199
|
+
* - `'hull'` 背面外扩轮廓(选中侧 outlineStyle:'hull' 的整场景版)
|
|
200
|
+
* - `'gpu'` 纯片元描边:零几何、零额外 pass,线宽约 1 像素
|
|
201
|
+
* - 数组 叠加,例如 `['line', 'hull']`
|
|
202
|
+
*
|
|
203
|
+
* 数据自带棱线包(primitiveType 13)时直接用,成本为零;`style.forceCpuEdges`
|
|
204
|
+
* 可以无视它,改由 CPU 现算 —— 那是 CPU 端的活,几十万面一次性建会卡住主线程
|
|
205
|
+
* (实测 20 个网格 1.9s),所以按 8ms 一帧切片,边建边出。
|
|
206
|
+
*
|
|
207
|
+
* 棱线本身用「屏幕空间等宽线」画(见 EdgeLines.ts):WebGL 的 lineWidth 基本无效,
|
|
208
|
+
* 只有摊成面向屏幕的四边形,`edgeWidth` 才能真正调粗。
|
|
209
|
+
*
|
|
210
|
+
* 带 `transition` 时做「淡入 / 淡出」,**不对几何做插值**(几何没法插值):
|
|
211
|
+
* 开:立刻置位 + 开始分片建线,同时 `uEdgeFade` 0→1 —— 建好一块亮一块,视觉上是渐显;
|
|
212
|
+
* 关:`uEdgeFade` 1→0,淡完才 dispose,避免棱线「啪」一下消失。
|
|
213
|
+
*/
|
|
214
|
+
setEdges(edges, transition) {
|
|
215
|
+
const wantAnim = !!transition && ((transition.duration ?? 0) > 0 || !!transition.spring);
|
|
216
|
+
const modes = resolveEdgeModes(edges);
|
|
217
|
+
// 换画法(line ↔ hull ↔ offset)是结构变更:旧装饰必须拆掉再建,
|
|
218
|
+
// 否则会出现「切到 hull 了折边线还留着」这种叠影。
|
|
219
|
+
// 同一画法重复调用(滑块逐帧 setEdges(true))不重建,几何是复用的。
|
|
220
|
+
const modesChanged = !sameEdgeModes(this._modes, modes);
|
|
221
|
+
this._modes = modes;
|
|
222
|
+
this._enabled = modes.enabled;
|
|
223
|
+
this.host.style.edges = edges;
|
|
224
|
+
this.host.styleTarget.edges = edges;
|
|
225
|
+
// 数据自带的棱线:直接切可见性(forceCpuEdges 时永远收起,改由 CPU 现算)。
|
|
226
|
+
// 只遍历注册时收集好的那批 LineSegments —— 全数据集 traverse 在几千节点下太贵。
|
|
227
|
+
// gpu 模式下 shader 自己描边,native 线段包必须收起,否则叠成双线
|
|
228
|
+
const nativeVisible = modes.enabled && !modes.gpu && this.host.style.forceCpuEdges !== true;
|
|
229
|
+
for (const lines of this._nativeLines) {
|
|
230
|
+
lines.visible = nativeVisible;
|
|
231
|
+
this._styleEdgeLine(lines);
|
|
232
|
+
}
|
|
233
|
+
this._syncEdgeStyle();
|
|
234
|
+
// 关掉 gpu 画法就把后处理资源还回去(整屏 RT 白占显存没意义)。
|
|
235
|
+
// 必须放在「整体关闭」的早退之前,否则关棱线时永远轮不到它。
|
|
236
|
+
if (!modes.gpu && this._gpuEdge) {
|
|
237
|
+
this._gpuEdge.dispose();
|
|
238
|
+
this._gpuEdge = null;
|
|
239
|
+
}
|
|
240
|
+
if (!modes.enabled) {
|
|
241
|
+
if (wantAnim) {
|
|
242
|
+
this.host.animator.to('style.edgeFade', 0, {
|
|
243
|
+
...transition,
|
|
244
|
+
onComplete: () => {
|
|
245
|
+
this._disposeEdges();
|
|
246
|
+
this.host.requestRepaint();
|
|
247
|
+
transition?.onComplete?.();
|
|
248
|
+
},
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
this._setEdgeFade(1);
|
|
253
|
+
this._disposeEdges();
|
|
254
|
+
}
|
|
255
|
+
this.host.requestRepaint();
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
if (modesChanged)
|
|
259
|
+
this._disposeEdges();
|
|
260
|
+
const pending = [...this.host.pickables.values()]
|
|
261
|
+
.map((p) => p.mesh)
|
|
262
|
+
.filter((m) => {
|
|
263
|
+
const ud = m.userData;
|
|
264
|
+
// 点云没有棱可描
|
|
265
|
+
if (isPointCloud(m))
|
|
266
|
+
return false;
|
|
267
|
+
// native 棱线还算不算数,取决于**当前**的 forceCpuEdges(它可以在运行中切换),
|
|
268
|
+
// 所以这里按注册时记下的原始标记重算,而不是沿用注册那一刻的结论。
|
|
269
|
+
ud.nativeEdges = ud.nativeEdgesRaw === true && this.host.style.forceCpuEdges !== true;
|
|
270
|
+
return !ud.nativeEdges && this._needsEdgeDecoration(ud);
|
|
271
|
+
});
|
|
272
|
+
let i = 0;
|
|
273
|
+
const step = () => {
|
|
274
|
+
const t0 = performance.now();
|
|
275
|
+
while (i < pending.length && performance.now() - t0 < 8)
|
|
276
|
+
this._ensureEdgeDecoration(pending[i++]);
|
|
277
|
+
if (i < pending.length)
|
|
278
|
+
setTimeout(step, 0);
|
|
279
|
+
else
|
|
280
|
+
this.host.requestRepaint();
|
|
281
|
+
};
|
|
282
|
+
step();
|
|
283
|
+
if (wantAnim) {
|
|
284
|
+
// 从 0 起淡入:新建出来的棱线自动继承当前进度,不会半路冒出一条满亮度的线
|
|
285
|
+
this._setEdgeFade(0);
|
|
286
|
+
this.host.animator.to('style.edgeFade', 1, transition);
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
this._setEdgeFade(1);
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
/** 直接写棱线淡入乘子(不走动画通道) */
|
|
293
|
+
_setEdgeFade(v) {
|
|
294
|
+
if (this.host.uniforms.uEdgeFade)
|
|
295
|
+
this.host.uniforms.uEdgeFade.value = v;
|
|
296
|
+
this._syncEdgeStyle();
|
|
297
|
+
}
|
|
298
|
+
/** 释放所有现算棱线几何 */
|
|
299
|
+
_disposeEdges() {
|
|
300
|
+
for (const p of this.host.pickables.values())
|
|
301
|
+
this._removeEdges(p.mesh);
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* 挂载预制棱线缓存(Crease Cache)。
|
|
305
|
+
*
|
|
306
|
+
* 直接把 `source-creases.f32` 这类 Float32Array 缓冲载入为一组全局统一的
|
|
307
|
+
* LineSegments —— 相比逐 Mesh 现算 EdgesGeometry,性能高一个量级,视觉也最干净。
|
|
308
|
+
* 坐标按「场景本地坐标」(相对场景锚点的米)处理,与瓦片几何同一坐标系。
|
|
309
|
+
*
|
|
310
|
+
* @param url 棱线缓存地址(二进制 Float32 序列:x,y,z,x,y,z,… 成对成段)
|
|
311
|
+
*/
|
|
312
|
+
async loadCreases(url) {
|
|
313
|
+
const resp = await authFetch(url, this.host.authenticate, 'creases');
|
|
314
|
+
if (!resp.ok)
|
|
315
|
+
throw new Error(`[s3m] 棱线缓存加载失败: ${resp.status} ${url}`);
|
|
316
|
+
const buf = await resp.arrayBuffer();
|
|
317
|
+
const arr = new Float32Array(buf);
|
|
318
|
+
if (arr.length < 6)
|
|
319
|
+
return;
|
|
320
|
+
const geo = new THREE.BufferGeometry();
|
|
321
|
+
geo.setAttribute('position', new THREE.BufferAttribute(arr, 3));
|
|
322
|
+
const s = this.host.style;
|
|
323
|
+
const mat = new THREE.LineBasicMaterial({
|
|
324
|
+
color: new THREE.Color(s.edgeColor),
|
|
325
|
+
transparent: true,
|
|
326
|
+
opacity: Math.min(1, Math.max(0, s.edgeOpacity ?? 0.6)) * clampOpacity(s.opacity),
|
|
327
|
+
depthWrite: false,
|
|
328
|
+
});
|
|
329
|
+
const lines = new THREE.LineSegments(geo, mat);
|
|
330
|
+
lines.renderOrder = 2;
|
|
331
|
+
lines.frustumCulled = false;
|
|
332
|
+
lines.raycast = () => { };
|
|
333
|
+
this.clearCreases();
|
|
334
|
+
this._creaseLines = lines;
|
|
335
|
+
this.host.scene?.add(lines);
|
|
336
|
+
this.host.requestRepaint();
|
|
337
|
+
}
|
|
338
|
+
/** 移除并释放预制棱线缓存 */
|
|
339
|
+
clearCreases() {
|
|
340
|
+
if (!this._creaseLines)
|
|
341
|
+
return;
|
|
342
|
+
this.host.scene?.remove(this._creaseLines);
|
|
343
|
+
this._creaseLines.geometry.dispose();
|
|
344
|
+
this._creaseLines.material?.dispose?.();
|
|
345
|
+
this._creaseLines = null;
|
|
346
|
+
this.host.requestRepaint();
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* 让全局棱线材质跟上 style.edgeColor / edgeWidth / edgeOpacity / edgeOffset。
|
|
350
|
+
*
|
|
351
|
+
* 全程 O(1):只有一份共享 edgeMaterial(所有逐 mesh 棱线都用它)+ 一份预制缓存
|
|
352
|
+
* + 一批共享外观对象的轮廓壳,所以棱线淡入淡出只要改一个 uniform,
|
|
353
|
+
* 新建瓦片自动继承当前进度。
|
|
354
|
+
*/
|
|
355
|
+
_syncEdgeStyle() {
|
|
356
|
+
const s = this.host.style;
|
|
357
|
+
const fade = this.host.uniforms.uEdgeFade?.value ?? 1;
|
|
358
|
+
const opacity = Math.min(1, Math.max(0, s.edgeOpacity ?? 0.6)) *
|
|
359
|
+
clampOpacity(s.opacity) *
|
|
360
|
+
fade;
|
|
361
|
+
const u = this.edgeMaterial.uniforms;
|
|
362
|
+
u.uColor.value.set(s.edgeColor);
|
|
363
|
+
u.uWidth.value = Math.max(0.1, s.edgeWidth ?? 1.5);
|
|
364
|
+
u.uOpacity.value = opacity;
|
|
365
|
+
// 外推距离只在 offset 画法下非 0;其它画法把线钉在面上(与改动前一致)
|
|
366
|
+
u.uOffset.value = this._modes.offset ? Math.max(0, s.edgeOffset ?? 0.15) : 0;
|
|
367
|
+
// 外扩轮廓壳与折边线共用颜色 / 透明度,厚度是米制的单独一项
|
|
368
|
+
const h = this._hullStyleUniforms;
|
|
369
|
+
h.uColor.value.set(s.edgeColor);
|
|
370
|
+
h.uWidth.value = Math.max(0, s.edgeHullWidth ?? 0.9);
|
|
371
|
+
h.uOpacity.value = opacity;
|
|
372
|
+
// GPU 描边(edges: 'gpu')是后处理,参数每帧从 style 现取,这里不用同步 uniform
|
|
373
|
+
// 预制棱线缓存(LineBasicMaterial)同步颜色 / 不透明度
|
|
374
|
+
if (this._creaseLines) {
|
|
375
|
+
const m = this._creaseLines.material;
|
|
376
|
+
m.color.set(s.edgeColor);
|
|
377
|
+
m.opacity = opacity;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
/** 让数据自带的棱线跟着 style.edgeColor / opacity 走(这些是 LineBasicMaterial,改不了粗细) */
|
|
381
|
+
_styleEdgeLine(lines) {
|
|
382
|
+
const mat = lines.material;
|
|
383
|
+
if (!mat || !mat.color)
|
|
384
|
+
return;
|
|
385
|
+
mat.color.set(this.host.style.edgeColor);
|
|
386
|
+
const baseOpacity = this.host.style.edgeOpacity ?? 0.6;
|
|
387
|
+
mat.opacity =
|
|
388
|
+
baseOpacity *
|
|
389
|
+
clampOpacity(this.host.style.opacity) *
|
|
390
|
+
(this.host.uniforms.uEdgeFade?.value ?? 1);
|
|
391
|
+
mat.transparent = true;
|
|
392
|
+
mat.polygonOffset = true;
|
|
393
|
+
mat.polygonOffsetFactor = -1;
|
|
394
|
+
mat.polygonOffsetUnits = -1;
|
|
395
|
+
mat.needsUpdate = true;
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* 刷新所有棱线外观。
|
|
399
|
+
*
|
|
400
|
+
* 数据自带的棱线是逐对象的 LineBasicMaterial,改颜色只能一个个写;但原来每次都要
|
|
401
|
+
* 遍历整个数据集树(几千个节点),颜色动画逐帧跑就是灾难。改成只刷注册时收集好的
|
|
402
|
+
* 那批 LineSegments,复杂度降到 O(棱线条数)。
|
|
403
|
+
*/
|
|
404
|
+
_refreshEdgeLines() {
|
|
405
|
+
this._syncEdgeStyle();
|
|
406
|
+
for (const lines of this._nativeLines) {
|
|
407
|
+
if (lines.parent)
|
|
408
|
+
this._styleEdgeLine(lines);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
/** 地形 / 绿地 / 道路 / 地面铺装等不参与自动描边(数据自带棱线包另说) */
|
|
412
|
+
/** 数据集级别的棱线开关:enableEdges 优先,否则跟随全局 style.edges */
|
|
413
|
+
_datasetEdgesEnabled(entry) {
|
|
414
|
+
const opt = entry.options?.enableEdges;
|
|
415
|
+
if (opt === true)
|
|
416
|
+
return true;
|
|
417
|
+
if (opt === false)
|
|
418
|
+
return false;
|
|
419
|
+
return this._enabled;
|
|
420
|
+
}
|
|
421
|
+
/** 该 mesh 是否命中「跳过自动描边」的关键字(skeletonName / 数据集名) */
|
|
422
|
+
_shouldSkipAutoEdges(ud, datasetName) {
|
|
423
|
+
const hay = `${ud.skeletonName ?? ''} ${datasetName}`.toLowerCase();
|
|
424
|
+
return EDGE_SKIP_KEYWORDS.some((k) => hay.includes(k));
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* 这块网格还缺哪种棱线装饰(缺就建,齐了就不动)。
|
|
428
|
+
*
|
|
429
|
+
* setEdges 的分片建线靠它筛「还没建完的」,注册新瓦片也靠它决定要不要动手。
|
|
430
|
+
*/
|
|
431
|
+
_needsEdgeDecoration(ud) {
|
|
432
|
+
if (this._modes.line && !ud.edges)
|
|
433
|
+
return true;
|
|
434
|
+
if (this._modes.hull && !ud.edgeHull)
|
|
435
|
+
return true;
|
|
436
|
+
return false;
|
|
437
|
+
}
|
|
438
|
+
/** 按当前画法补齐这块网格的棱线装饰 */
|
|
439
|
+
_ensureEdgeDecoration(mesh) {
|
|
440
|
+
if (this._modes.line)
|
|
441
|
+
this._ensureEdges(mesh);
|
|
442
|
+
if (this._modes.hull)
|
|
443
|
+
this._ensureHull(mesh);
|
|
444
|
+
}
|
|
445
|
+
_ensureEdges(mesh) {
|
|
446
|
+
const ud = mesh.userData;
|
|
447
|
+
if (ud.edges || ud.nativeEdges || !mesh.geometry)
|
|
448
|
+
return;
|
|
449
|
+
// 地形 / 绿地 / 道路等不参与自动描边(即使全局开棱线也要跳过)
|
|
450
|
+
if (this._shouldSkipAutoEdges(ud, ''))
|
|
451
|
+
return;
|
|
452
|
+
const posAttr = mesh.geometry.getAttribute('position');
|
|
453
|
+
const indexCount = mesh.geometry.index?.count ?? (posAttr ? posAttr.count : 0);
|
|
454
|
+
// 棱线是 CPU 端建的,超大几何直接跳过,避免拖慢加载
|
|
455
|
+
if (indexCount > 120000)
|
|
456
|
+
return;
|
|
457
|
+
// 1. 先做顶点容差焊合,让相邻三角形正确共享边索引。
|
|
458
|
+
// S3M 几何常为「每面独立顶点」,不焊合的话 EdgesGeometry 会把每条三角形边都当成边界,棱线爆炸。
|
|
459
|
+
// 注意用本地实现而不是 three/examples/jsm —— jsm 子路径导入会在宿主里
|
|
460
|
+
// 制造第二份 three 实例("Multiple instances of Three.js" 警告的元凶)。
|
|
461
|
+
// tolerance 取米级模型下的 5mm,足以合并重合顶点又不会误并真实相邻面。
|
|
462
|
+
const welded = mergeVerticesByPosition(mesh.geometry, 0.005);
|
|
463
|
+
// 2. 调大临界角(默认 55°,可在 style.edgeThreshold 调),过滤浅坡与曲面细分,只保留真正的棱。
|
|
464
|
+
const thresholdAngle = this.host.style.edgeThreshold ?? 55;
|
|
465
|
+
// 'offset' 画法要额外带一条「边法线」才知道往哪推,所以走本地实现(它本来就算好了
|
|
466
|
+
// 相邻两面法线);其余画法保持 EdgesGeometry 这条老路,几何输出与改动前逐字一致。
|
|
467
|
+
let segments;
|
|
468
|
+
let normals;
|
|
469
|
+
if (this._modes.offset) {
|
|
470
|
+
const raw = [];
|
|
471
|
+
segments = buildFeatureEdgeSegments(welded, null, thresholdAngle, raw);
|
|
472
|
+
if (raw.length > 0)
|
|
473
|
+
normals = new Float32Array(raw);
|
|
474
|
+
}
|
|
475
|
+
else {
|
|
476
|
+
const source = new THREE.EdgesGeometry(welded, thresholdAngle);
|
|
477
|
+
const attr = source.getAttribute('position');
|
|
478
|
+
segments = attr ? attr.array : null;
|
|
479
|
+
source.dispose();
|
|
480
|
+
}
|
|
481
|
+
welded.dispose();
|
|
482
|
+
if (!segments || segments.length < 6)
|
|
483
|
+
return;
|
|
484
|
+
// 3. 回填每段棱线所属的单体 batchId。
|
|
485
|
+
// EdgesGeometry 只输出坐标不输出顶点号,只能拿端点坐标去查「位置 → batchId」表。
|
|
486
|
+
// 没有这张表,单体一动棱线就留在原地——这正是「棱线跟随」的关键一环。
|
|
487
|
+
const TOL = 0.005;
|
|
488
|
+
const batchMap = buildPositionBatchMap(mesh.geometry, TOL);
|
|
489
|
+
let batchIds;
|
|
490
|
+
if (batchMap) {
|
|
491
|
+
const segCount = segments.length / 6;
|
|
492
|
+
batchIds = new Float32Array(segCount);
|
|
493
|
+
for (let i = 0; i < segCount; i++) {
|
|
494
|
+
const s = i * 6;
|
|
495
|
+
batchIds[i] =
|
|
496
|
+
batchMap.get(positionQuantKey(segments[s], segments[s + 1], segments[s + 2], 1 / TOL)) ?? -1;
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
const lines = new THREE.Mesh(buildThickLineGeometry(segments, batchIds, normals), this.createPerMeshEdgeMaterial(mesh));
|
|
500
|
+
lines.renderOrder = 2;
|
|
501
|
+
// 屏幕空间外扩后可能超出原包围球,关掉剔除更稳
|
|
502
|
+
lines.frustumCulled = false;
|
|
503
|
+
lines.raycast = () => { };
|
|
504
|
+
lines.userData.isThickEdge = true;
|
|
505
|
+
ud.edges = lines;
|
|
506
|
+
mesh.add(lines); // 作为子节点,自动继承 mesh 的世界变换
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* 给一块网格挂「背面外扩轮廓」(整场景版)。
|
|
510
|
+
*
|
|
511
|
+
* 复用选中侧那套 `createOutlineMaterial`:顶点沿法线鼓 `edgeHullWidth` 米、只画背面,
|
|
512
|
+
* 于是被本体挡住的部分不显示,露出来的那圈就是描边。与折边线的差别在于——
|
|
513
|
+
* 这里**不建任何新几何**,成本只是把同一块网格多画一遍,折边判定那套 CPU 活全省了。
|
|
514
|
+
*
|
|
515
|
+
* 实例化几何拿不到逐实例变换(轮廓壳是 mesh 的子节点,不吃 instanceMatrix),
|
|
516
|
+
* 直接跳过:宁可这栋没描边,也不要所有实例的壳叠在原点。
|
|
517
|
+
*/
|
|
518
|
+
_ensureHull(mesh) {
|
|
519
|
+
const ud = mesh.userData;
|
|
520
|
+
if (ud.edgeHull || !mesh.geometry)
|
|
521
|
+
return;
|
|
522
|
+
if (mesh.isInstancedMesh)
|
|
523
|
+
return;
|
|
524
|
+
// 地形 / 绿地 / 道路等不参与自动描边(即使全局开棱线也要跳过)
|
|
525
|
+
if (this._shouldSkipAutoEdges(ud, ''))
|
|
526
|
+
return;
|
|
527
|
+
// 逐网格一份材质(各绑各的单体状态纹理),外观 uniform 复用共享对象
|
|
528
|
+
const mat = createOutlineMaterial(this.host.uniforms, this.host.style.edgeHullWidth ?? 0.9, this._hullStyleUniforms, true);
|
|
529
|
+
// 整块几何都要外扩:选中侧靠 uSelBatch 只扩一栋,全局必须置 whole
|
|
530
|
+
mat.uniforms.uSelWhole.value = 1;
|
|
531
|
+
mat.uniforms.uSelBatch.value = -1;
|
|
532
|
+
const styled = styledMaterialOf(mesh);
|
|
533
|
+
if (styled?.userData?.uBatchTex) {
|
|
534
|
+
mat.uniforms.uBatchTex.value = styled.userData.uBatchTex.value;
|
|
535
|
+
mat.uniforms.uBatchTexWidth.value = styled.userData.uBatchTexWidth.value;
|
|
536
|
+
mat.uniforms.uBatchTexActive.value = styled.userData.uBatchTexActive.value;
|
|
537
|
+
}
|
|
538
|
+
const hull = new THREE.Mesh(mesh.geometry, mat);
|
|
539
|
+
hull.renderOrder = 2;
|
|
540
|
+
hull.frustumCulled = false;
|
|
541
|
+
hull.raycast = () => { };
|
|
542
|
+
hull.userData.isEdgeHull = true;
|
|
543
|
+
ud.edgeHull = hull;
|
|
544
|
+
mesh.add(hull); // 作为子节点,自动继承 mesh 的世界变换
|
|
545
|
+
}
|
|
546
|
+
/**
|
|
547
|
+
* 给一块网格造专属的棱线材质。
|
|
548
|
+
*
|
|
549
|
+
* 棱线材质必须逐网格一份,因为它要绑定**这个网格**的单体状态纹理;但外观
|
|
550
|
+
* (颜色 / 粗细 / 透明度)必须全局统一——所以外观 uniform 直接复用
|
|
551
|
+
* `_edgeStyleUniforms` 里的对象,`_syncEdgeStyle()` 改一次全部生效,
|
|
552
|
+
* program 也因为着色器相同而只编译一次。
|
|
553
|
+
*/
|
|
554
|
+
/** 选中棱线的逐网格材质,道理同上 */
|
|
555
|
+
_createSelectionEdgeMaterial(mesh) {
|
|
556
|
+
const styled = styledMaterialOf(mesh);
|
|
557
|
+
const batch = styled?.userData?.uBatchTex
|
|
558
|
+
? {
|
|
559
|
+
uBatchTex: styled.userData.uBatchTex,
|
|
560
|
+
uBatchTex2: styled.userData.uBatchTex2,
|
|
561
|
+
uBatchMix: this.host.uniforms.uBatchMix,
|
|
562
|
+
uBatchTexWidth: styled.userData.uBatchTexWidth,
|
|
563
|
+
uBatchTexActive: styled.userData.uBatchTexActive,
|
|
564
|
+
uPathTex: this.host.uniforms.uPathTex,
|
|
565
|
+
uPathCount: this.host.uniforms.uPathCount,
|
|
566
|
+
uPathTexActive: this.host.uniforms.uPathTexActive,
|
|
567
|
+
uPathTime: this.host.uniforms.uPathTime,
|
|
568
|
+
}
|
|
569
|
+
: undefined;
|
|
570
|
+
return createThickLineMaterial(this.lineShared, {}, this._selEdgeStyleUniforms, batch);
|
|
571
|
+
}
|
|
572
|
+
_removeEdges(mesh) {
|
|
573
|
+
const ud = mesh.userData;
|
|
574
|
+
const lines = ud.edges;
|
|
575
|
+
if (lines) {
|
|
576
|
+
mesh.remove(lines);
|
|
577
|
+
lines.geometry?.dispose();
|
|
578
|
+
// 棱线材质现在是逐网格一份(要绑各自的 batch 纹理),得跟着释放
|
|
579
|
+
const mat = lines.material;
|
|
580
|
+
if (Array.isArray(mat)) {
|
|
581
|
+
mat.forEach((m) => m?.dispose?.());
|
|
582
|
+
}
|
|
583
|
+
else {
|
|
584
|
+
mat?.dispose?.();
|
|
585
|
+
}
|
|
586
|
+
ud.edges = null;
|
|
587
|
+
}
|
|
588
|
+
// 外扩壳的 geometry 是**复用主网格的**,只能释放材质,不能 dispose 几何
|
|
589
|
+
const hull = ud.edgeHull;
|
|
590
|
+
if (hull) {
|
|
591
|
+
mesh.remove(hull);
|
|
592
|
+
const hmat = hull.material;
|
|
593
|
+
if (Array.isArray(hmat))
|
|
594
|
+
hmat.forEach((m) => m?.dispose?.());
|
|
595
|
+
else
|
|
596
|
+
hmat?.dispose?.();
|
|
597
|
+
ud.edgeHull = null;
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
/** 让全局棱线材质跟上当前 style(颜色 / 粗细 / 透明度 / 外推距离),O(1) */
|
|
601
|
+
syncStyle() {
|
|
602
|
+
this._syncEdgeStyle();
|
|
603
|
+
}
|
|
604
|
+
/** 刷新所有棱线外观:共享材质 + 数据自带的那批 LineSegments */
|
|
605
|
+
refreshLines() {
|
|
606
|
+
this._refreshEdgeLines();
|
|
607
|
+
}
|
|
608
|
+
/** 释放所有现算棱线几何(临界角 / 画法变了要重建,见 setEdges) */
|
|
609
|
+
disposeEdgeGeometry() {
|
|
610
|
+
this._disposeEdges();
|
|
611
|
+
}
|
|
612
|
+
/** @internal 给一块网格补折边线(单测直接调,观察顶点焊合 / 临界角) */
|
|
613
|
+
ensureEdges(mesh) {
|
|
614
|
+
this._ensureEdges(mesh);
|
|
615
|
+
}
|
|
616
|
+
/** 拆掉一块网格的棱线与外扩壳(瓦片淘汰时调) */
|
|
617
|
+
removeEdges(mesh) {
|
|
618
|
+
this._removeEdges(mesh);
|
|
619
|
+
}
|
|
620
|
+
/** 选中棱线的逐网格材质 */
|
|
621
|
+
createSelectionEdgeMaterial(mesh) {
|
|
622
|
+
return this._createSelectionEdgeMaterial(mesh);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
function isPointCloud(o) {
|
|
626
|
+
return o.isPoints === true;
|
|
627
|
+
}
|
|
628
|
+
//# sourceMappingURL=EdgeDecorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EdgeDecorator.js","sourceRoot":"","sources":["../../../src/render/viewer/EdgeDecorator.ts"],"names":[],"mappings":"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"}
|