s3m-three 0.3.0 → 0.3.2
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/README.md +1 -1
- package/dist/browser/s3m-three.iife.ext-three.js +163 -15
- package/dist/browser/s3m-three.iife.js +190 -42
- package/dist/core/AtlasAlpha.d.ts +31 -0
- package/dist/core/AtlasAlpha.d.ts.map +1 -0
- package/dist/core/AtlasAlpha.js +82 -0
- package/dist/core/AtlasAlpha.js.map +1 -0
- package/dist/core/AtlasPack.d.ts +57 -0
- package/dist/core/AtlasPack.d.ts.map +1 -0
- package/dist/core/AtlasPack.js +81 -0
- package/dist/core/AtlasPack.js.map +1 -0
- package/dist/core/AtlasUpgrade.d.ts +68 -0
- package/dist/core/AtlasUpgrade.d.ts.map +1 -0
- package/dist/core/AtlasUpgrade.js +154 -0
- package/dist/core/AtlasUpgrade.js.map +1 -0
- package/dist/core/DXTTextureDecode.d.ts.map +1 -1
- package/dist/core/DXTTextureDecode.js +28 -6
- package/dist/core/DXTTextureDecode.js.map +1 -1
- package/dist/core/Draco.d.ts +52 -0
- package/dist/core/Draco.d.ts.map +1 -0
- package/dist/core/Draco.js +323 -0
- package/dist/core/Draco.js.map +1 -0
- package/dist/core/MeshOpt.d.ts +14 -3
- package/dist/core/MeshOpt.d.ts.map +1 -1
- package/dist/core/MeshOpt.js +101 -18
- package/dist/core/MeshOpt.js.map +1 -1
- package/dist/core/S3M1Parser.d.ts +16 -0
- package/dist/core/S3M1Parser.d.ts.map +1 -0
- package/dist/core/S3M1Parser.js +367 -0
- package/dist/core/S3M1Parser.js.map +1 -0
- package/dist/core/S3MBParser.d.ts +43 -1
- package/dist/core/S3MBParser.d.ts.map +1 -1
- package/dist/core/S3MBParser.js +101 -23
- package/dist/core/S3MBParser.js.map +1 -1
- package/dist/core/S3MBlockParser.d.ts +209 -0
- package/dist/core/S3MBlockParser.d.ts.map +1 -0
- package/dist/core/S3MBlockParser.js +789 -0
- package/dist/core/S3MBlockParser.js.map +1 -0
- package/dist/core/TextureFormat.d.ts +0 -1
- package/dist/core/TextureFormat.d.ts.map +1 -1
- package/dist/core/TextureFormat.js +19 -2
- package/dist/core/TextureFormat.js.map +1 -1
- package/dist/core/types.d.ts +65 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -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 +68 -3
- package/dist/render/DatasetManager.js.map +1 -1
- package/dist/render/GeometryBuilder.d.ts +3 -0
- package/dist/render/GeometryBuilder.d.ts.map +1 -1
- package/dist/render/GeometryBuilder.js +189 -17
- package/dist/render/GeometryBuilder.js.map +1 -1
- package/dist/render/GroundManager.d.ts +57 -1
- package/dist/render/GroundManager.d.ts.map +1 -1
- package/dist/render/GroundManager.js +149 -21
- package/dist/render/GroundManager.js.map +1 -1
- package/dist/render/Picker.d.ts.map +1 -1
- package/dist/render/Picker.js +12 -4
- package/dist/render/Picker.js.map +1 -1
- package/dist/render/PointCloudMaterial.d.ts +36 -0
- package/dist/render/PointCloudMaterial.d.ts.map +1 -0
- package/dist/render/PointCloudMaterial.js +159 -0
- package/dist/render/PointCloudMaterial.js.map +1 -0
- package/dist/render/S3MViewer.d.ts +75 -3
- package/dist/render/S3MViewer.d.ts.map +1 -1
- package/dist/render/S3MViewer.js +284 -54
- package/dist/render/S3MViewer.js.map +1 -1
- package/dist/render/StyleMaterial.d.ts +6 -0
- package/dist/render/StyleMaterial.d.ts.map +1 -1
- package/dist/render/StyleMaterial.js +125 -2
- package/dist/render/StyleMaterial.js.map +1 -1
- package/dist/render/TextureFactory.d.ts.map +1 -1
- package/dist/render/TextureFactory.js +64 -10
- package/dist/render/TextureFactory.js.map +1 -1
- package/dist/tileset/S3MTileset.d.ts +177 -1
- package/dist/tileset/S3MTileset.d.ts.map +1 -1
- package/dist/tileset/S3MTileset.js +754 -60
- package/dist/tileset/S3MTileset.js.map +1 -1
- package/dist/vendor/crunch_decoder.module.js +12 -18
- package/dist/vendor/draco_decoder.module.js +3178 -0
- package/docs/API.md +150 -11
- package/package.json +1 -1
- package/src/core/AtlasAlpha.ts +82 -0
- package/src/core/AtlasPack.ts +127 -0
- package/src/core/AtlasUpgrade.ts +182 -0
- package/src/core/DXTTextureDecode.ts +28 -6
- package/src/core/Draco.ts +409 -0
- package/src/core/MeshOpt.ts +124 -18
- package/src/core/S3M1Parser.ts +430 -0
- package/src/core/S3MBParser.ts +112 -21
- package/src/core/S3MBlockParser.ts +953 -0
- package/src/core/TextureFormat.ts +20 -2
- package/src/core/types.ts +63 -0
- package/src/index.ts +3 -1
- package/src/render/DatasetManager.ts +70 -5
- package/src/render/GeometryBuilder.ts +212 -16
- package/src/render/GroundManager.ts +174 -20
- package/src/render/Picker.ts +13 -4
- package/src/render/PointCloudMaterial.ts +174 -0
- package/src/render/S3MViewer.ts +322 -55
- package/src/render/StyleMaterial.ts +135 -2
- package/src/render/TextureFactory.ts +67 -11
- package/src/tileset/S3MTileset.ts +798 -65
- package/src/vendor/crunch_decoder.module.js +12 -18
- package/src/vendor/draco_decoder.module.d.ts +128 -0
- package/src/vendor/draco_decoder.module.js +3178 -0
|
@@ -9,6 +9,12 @@
|
|
|
9
9
|
* - 地表相交线(Z = 0):出入口穿透地表处有清晰物理交线。
|
|
10
10
|
* 3. 支持「基坑开挖模式(Excavate)」与「地下透视模式(Translucent)」,
|
|
11
11
|
* 可开辟虚拟基坑井口或全域透视地表。
|
|
12
|
+
*
|
|
13
|
+
* 关于「遮挡」:地表能不能挡住建筑,只取决于有没有一块**先于建筑绘制、并且写了深度**的
|
|
14
|
+
* 几何进到同一深度缓冲里。半透明覆盖网格 `depthWrite = false` 且排在 transparent 队列末尾,
|
|
15
|
+
* 它只是画在上面的一层色,不参与遮挡;真正的遮挡由独立的**纯深度代理**(`_depthMesh`,
|
|
16
|
+
* `colorWrite = false` + `renderOrder` 负值)负责,可用 `occlude` 开关控制。
|
|
17
|
+
* 与 MapLibre terrain 共用同一深度缓冲,两者是「深度来源」的关系而非替代关系。
|
|
12
18
|
*/
|
|
13
19
|
import * as THREE from 'three';
|
|
14
20
|
export class GroundManager {
|
|
@@ -21,9 +27,19 @@ export class GroundManager {
|
|
|
21
27
|
size;
|
|
22
28
|
/** 物理地表网格的高度(米,场景 ENU Z 坐标),默认 0 */
|
|
23
29
|
groundHeight = 0;
|
|
30
|
+
/** 地表是否作为深度遮挡源(见 `GroundOptions.occlude`) */
|
|
31
|
+
occlude;
|
|
32
|
+
/** 地表高度是否跟随主数据集抬升量(见 `GroundOptions.trackHeight`),默认 true */
|
|
33
|
+
trackHeight;
|
|
24
34
|
group;
|
|
25
35
|
_mesh = null;
|
|
26
36
|
_material = null;
|
|
37
|
+
/** 纯深度代理:只写深度不写颜色,负责真正的遮挡 */
|
|
38
|
+
_depthMesh = null;
|
|
39
|
+
_depthMaterial = null;
|
|
40
|
+
_geom = null;
|
|
41
|
+
/** 用户显式指定过 occlude 后,setMode 不再自动改写它 */
|
|
42
|
+
_occludeExplicit;
|
|
27
43
|
constructor(options = {}) {
|
|
28
44
|
this.mode = options.mode ?? 'none';
|
|
29
45
|
this.opacity = options.opacity ?? 0.62;
|
|
@@ -32,12 +48,19 @@ export class GroundManager {
|
|
|
32
48
|
this.gridSize = options.gridSize ?? 10.0;
|
|
33
49
|
this.excavationBounds = options.excavationBounds ?? null;
|
|
34
50
|
this.size = options.size ?? 6000;
|
|
51
|
+
this._occludeExplicit = options.occlude !== undefined;
|
|
52
|
+
this.occlude = options.occlude ?? this.mode === 'excavate';
|
|
53
|
+
this.trackHeight = options.trackHeight ?? true;
|
|
35
54
|
this.group = new THREE.Group();
|
|
36
55
|
this.group.name = 's3m-ground-surface';
|
|
37
56
|
this._initMesh();
|
|
57
|
+
// 构造时就按当前 mode 应用一次:以前 depthWrite / 可见性只在 setMode 里改,
|
|
58
|
+
// 用 `{ mode: 'excavate' }` 建出来的实例会一直停在 depthWrite = false。
|
|
59
|
+
this._applyMode();
|
|
38
60
|
}
|
|
39
61
|
_initMesh() {
|
|
40
62
|
const geom = new THREE.PlaneGeometry(this.size, this.size, 1, 1);
|
|
63
|
+
this._geom = geom;
|
|
41
64
|
// ENU 坐标系下,Z 为天(Up),PlaneGeometry 默认在 XY 平面上,正常法线正是 (0, 0, 1)!
|
|
42
65
|
const material = new THREE.ShaderMaterial({
|
|
43
66
|
transparent: true,
|
|
@@ -120,14 +143,91 @@ export class GroundManager {
|
|
|
120
143
|
this.group.add(mesh);
|
|
121
144
|
this._mesh = mesh;
|
|
122
145
|
this._material = material;
|
|
123
|
-
|
|
146
|
+
// ---- 纯深度代理 ----
|
|
147
|
+
// 遮挡是「片元绘制那一刻」由深度测试决定的:覆盖网格排在 transparent 队列末尾,
|
|
148
|
+
// 房子早就画完了,它写不写深度都挡不住任何东西。所以单独放一块只写深度、
|
|
149
|
+
// 不写颜色、排进 opaque 队列最前的孪生网格,让后续所有片元在它后面被裁掉。
|
|
150
|
+
const depthMaterial = new THREE.ShaderMaterial({
|
|
151
|
+
// 关掉颜色写入但仍走 depthWrite ⇒ 只留一层「隐形墙」
|
|
152
|
+
colorWrite: false,
|
|
153
|
+
depthWrite: true,
|
|
154
|
+
depthTest: true,
|
|
155
|
+
transparent: false, // 必须是 opaque,才能靠 renderOrder 抢到全场景最前
|
|
156
|
+
// 只挡「从上方看下去」的方向:相机钻到地下时不该被自己这层地表糊住
|
|
157
|
+
side: THREE.FrontSide,
|
|
158
|
+
uniforms: {
|
|
159
|
+
// 基坑开挖时,坑口是「挖开的地方」,地下必须还能看见 ⇒ 代理也要在这里开洞
|
|
160
|
+
uPunchPit: { value: 0 },
|
|
161
|
+
uHasExcavation: { value: 0 },
|
|
162
|
+
uExcavationMin: { value: new THREE.Vector2(-9999, -9999) },
|
|
163
|
+
uExcavationMax: { value: new THREE.Vector2(9999, 9999) },
|
|
164
|
+
},
|
|
165
|
+
vertexShader: /* glsl */ `
|
|
166
|
+
varying vec2 vEnuPos;
|
|
167
|
+
void main() {
|
|
168
|
+
vec4 worldPos = modelMatrix * vec4(position, 1.0);
|
|
169
|
+
vEnuPos = worldPos.xy;
|
|
170
|
+
gl_Position = projectionMatrix * viewMatrix * worldPos;
|
|
171
|
+
}
|
|
172
|
+
`,
|
|
173
|
+
fragmentShader: /* glsl */ `
|
|
174
|
+
uniform int uPunchPit;
|
|
175
|
+
uniform int uHasExcavation;
|
|
176
|
+
uniform vec2 uExcavationMin;
|
|
177
|
+
uniform vec2 uExcavationMax;
|
|
178
|
+
varying vec2 vEnuPos;
|
|
179
|
+
void main() {
|
|
180
|
+
if (uPunchPit == 1 && uHasExcavation == 1 &&
|
|
181
|
+
vEnuPos.x >= uExcavationMin.x && vEnuPos.x <= uExcavationMax.x &&
|
|
182
|
+
vEnuPos.y >= uExcavationMin.y && vEnuPos.y <= uExcavationMax.y) {
|
|
183
|
+
discard;
|
|
184
|
+
}
|
|
185
|
+
gl_FragColor = vec4(1.0);
|
|
186
|
+
}
|
|
187
|
+
`,
|
|
188
|
+
});
|
|
189
|
+
const depthMesh = new THREE.Mesh(geom, depthMaterial);
|
|
190
|
+
// 比覆盖网格低 2cm:避免与它等深度打架(覆盖层 LEQUAL 时仍能画上去)
|
|
191
|
+
depthMesh.position.set(0, 0, -0.02);
|
|
192
|
+
depthMesh.renderOrder = -1000;
|
|
193
|
+
depthMesh.name = 's3m-ground-depth';
|
|
194
|
+
depthMesh.visible = false;
|
|
195
|
+
this.group.add(depthMesh);
|
|
196
|
+
this._depthMesh = depthMesh;
|
|
197
|
+
this._depthMaterial = depthMaterial;
|
|
124
198
|
this._syncUniforms();
|
|
125
199
|
}
|
|
126
200
|
/**
|
|
127
|
-
*
|
|
201
|
+
* 把 mode / occlude 的状态一次性刷到材质和可见性上。
|
|
202
|
+
* 构造与 setMode / setOcclude 都走这里,避免出现「构造时漏设」的分叉。
|
|
203
|
+
*
|
|
204
|
+
* 覆盖网格与深度代理**各自独立控制**:
|
|
205
|
+
* - 覆盖网格(视觉)只跟 mode 走;
|
|
206
|
+
* - 深度代理(遮挡)只跟 occlude 走 —— mode 'none' 时也可以单独开一块
|
|
207
|
+
* 「隐形地面」把地面以下切掉,不显示任何地表。
|
|
208
|
+
*/
|
|
209
|
+
_applyMode() {
|
|
210
|
+
if (this._mesh)
|
|
211
|
+
this._mesh.visible = this.mode !== 'none';
|
|
212
|
+
if (this._material) {
|
|
213
|
+
this._material.uniforms.uMode.value = this.mode === 'excavate' ? 2 : this.mode === 'translucent' ? 1 : 0;
|
|
214
|
+
// 覆盖网格排在最后,写深度的意义已经由代理接管,这里保留 excavate 的历史行为
|
|
215
|
+
this._material.depthWrite = this.mode === 'excavate';
|
|
216
|
+
}
|
|
217
|
+
if (this._depthMesh) {
|
|
218
|
+
this._depthMesh.visible = this.occlude;
|
|
219
|
+
if (this._depthMaterial) {
|
|
220
|
+
// 只有开挖模式才在坑口开洞;translucent / none + occlude 是「一刀切」语义
|
|
221
|
+
this._depthMaterial.uniforms.uPunchPit.value = this.mode === 'excavate' ? 1 : 0;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* 每帧根据相机位置更新地表网格中心,实现地表随相机平移而无限延伸且网格线不漂移。
|
|
227
|
+
* 遮挡代理与地表模式已解耦,所以 mode 'none' 时也要跟着相机走。
|
|
128
228
|
*/
|
|
129
229
|
update(camera) {
|
|
130
|
-
if (!camera
|
|
230
|
+
if (!camera)
|
|
131
231
|
return;
|
|
132
232
|
this.group.position.set(camera.position.x, camera.position.y, this.groundHeight);
|
|
133
233
|
}
|
|
@@ -143,11 +243,21 @@ export class GroundManager {
|
|
|
143
243
|
}
|
|
144
244
|
setMode(mode) {
|
|
145
245
|
this.mode = mode;
|
|
146
|
-
|
|
147
|
-
if (this.
|
|
148
|
-
this.
|
|
149
|
-
|
|
150
|
-
|
|
246
|
+
// 没显式要过 occlude 的,跟着模式走:开挖模式才遮挡
|
|
247
|
+
if (!this._occludeExplicit)
|
|
248
|
+
this.occlude = mode === 'excavate';
|
|
249
|
+
this._applyMode();
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* 开关「地表作为深度遮挡源」。
|
|
253
|
+
*
|
|
254
|
+
* 打开后地表以下的几何会被真正切掉(不再透过地表显露);关闭后回到纯视觉覆盖。
|
|
255
|
+
* 与宿主是否开启 MapLibre terrain 无关:两者都在同一个深度缓冲里比深度,谁更近谁赢。
|
|
256
|
+
*/
|
|
257
|
+
setOcclude(enabled) {
|
|
258
|
+
this.occlude = enabled;
|
|
259
|
+
this._occludeExplicit = true;
|
|
260
|
+
this._applyMode();
|
|
151
261
|
}
|
|
152
262
|
setOpacity(opacity) {
|
|
153
263
|
this.opacity = Math.max(0, Math.min(1, opacity));
|
|
@@ -210,23 +320,41 @@ export class GroundManager {
|
|
|
210
320
|
}
|
|
211
321
|
}
|
|
212
322
|
_syncUniforms() {
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
323
|
+
const bounds = this.excavationBounds;
|
|
324
|
+
if (this._material) {
|
|
325
|
+
const u = this._material.uniforms;
|
|
326
|
+
if (bounds) {
|
|
327
|
+
u.uHasExcavation.value = 1;
|
|
328
|
+
u.uExcavationMin.value.set(bounds[0], bounds[1]);
|
|
329
|
+
u.uExcavationMax.value.set(bounds[2], bounds[3]);
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
u.uHasExcavation.value = 0;
|
|
333
|
+
}
|
|
220
334
|
}
|
|
221
|
-
|
|
222
|
-
|
|
335
|
+
// 深度代理要和覆盖网格用同一套基坑参数,否则坑口会出现「看得见色块、却被挡住地下」
|
|
336
|
+
if (this._depthMaterial) {
|
|
337
|
+
const d = this._depthMaterial.uniforms;
|
|
338
|
+
if (bounds) {
|
|
339
|
+
d.uHasExcavation.value = 1;
|
|
340
|
+
d.uExcavationMin.value.set(bounds[0], bounds[1]);
|
|
341
|
+
d.uExcavationMax.value.set(bounds[2], bounds[3]);
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
d.uHasExcavation.value = 0;
|
|
345
|
+
}
|
|
223
346
|
}
|
|
224
347
|
}
|
|
225
348
|
dispose() {
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
349
|
+
// 两块网格共用同一份 geometry,只释放一次
|
|
350
|
+
this._geom?.dispose();
|
|
351
|
+
this._geom = null;
|
|
352
|
+
this._material?.dispose();
|
|
353
|
+
this._material = null;
|
|
354
|
+
this._depthMaterial?.dispose();
|
|
355
|
+
this._depthMaterial = null;
|
|
356
|
+
this._mesh = null;
|
|
357
|
+
this._depthMesh = null;
|
|
230
358
|
this.group.clear();
|
|
231
359
|
}
|
|
232
360
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GroundManager.js","sourceRoot":"","sources":["../../src/render/GroundManager.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"GroundManager.js","sourceRoot":"","sources":["../../src/render/GroundManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Picker.d.ts","sourceRoot":"","sources":["../../src/render/Picker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Picker.d.ts","sourceRoot":"","sources":["../../src/render/Picker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA2E/B,MAAM,WAAW,OAAO;IACtB,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,qCAAqC;IACrC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AA2CD,qBAAa,MAAM;IACjB,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC;IACvC,sCAAsC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqB;gBAE7B,QAAQ,EAAE,KAAK,CAAC,aAAa,EAAE,OAAO,GAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAO;IAK1E,OAAO,CAAC,aAAa;IAgBrB;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IA4HhG,OAAO,IAAI,IAAI;CAIhB"}
|
package/dist/render/Picker.js
CHANGED
|
@@ -67,6 +67,9 @@ const PICK_VERT = /* glsl */ `
|
|
|
67
67
|
#else
|
|
68
68
|
gl_Position = projectionMatrix * modelViewMatrix * vec4( p, 1.0 );
|
|
69
69
|
#endif
|
|
70
|
+
// 点云也用这条着色器:不写 gl_PointSize 时光栅化出来只有 1px,
|
|
71
|
+
// 跟显示尺寸(2px)不匹配,点云会很难点中。对 Mesh 图元这行被忽略。
|
|
72
|
+
gl_PointSize = 2.0;
|
|
70
73
|
}
|
|
71
74
|
`;
|
|
72
75
|
const PICK_FRAG = /* glsl */ `
|
|
@@ -110,6 +113,10 @@ function createPickMaterial(objectId) {
|
|
|
110
113
|
toneMapped: false,
|
|
111
114
|
});
|
|
112
115
|
}
|
|
116
|
+
/** 点云是 THREE.Points 不是 Mesh,拾取链路要放行 */
|
|
117
|
+
function isPointsObject(o) {
|
|
118
|
+
return o.isPoints === true;
|
|
119
|
+
}
|
|
113
120
|
export class Picker {
|
|
114
121
|
renderer;
|
|
115
122
|
/** 拾取用的渲染目标边长(像素),默认 1 —— 只要点击点那一格 */
|
|
@@ -173,7 +180,8 @@ export class Picker {
|
|
|
173
180
|
const instancedPickIds = new Set();
|
|
174
181
|
scene.traverseVisible((o) => {
|
|
175
182
|
const mesh = o;
|
|
176
|
-
|
|
183
|
+
// 点云是 THREE.Points,同样要参与拾取
|
|
184
|
+
if (!mesh.isMesh && !isPointsObject(mesh))
|
|
177
185
|
return;
|
|
178
186
|
const ud = mesh.userData;
|
|
179
187
|
if (ud.pickId === undefined)
|
|
@@ -211,7 +219,7 @@ export class Picker {
|
|
|
211
219
|
const hidden = [];
|
|
212
220
|
scene.traverseVisible((o) => {
|
|
213
221
|
const mesh = o;
|
|
214
|
-
if (mesh.isMesh && mesh.userData.pickId === undefined) {
|
|
222
|
+
if ((mesh.isMesh || isPointsObject(mesh)) && mesh.userData.pickId === undefined) {
|
|
215
223
|
hidden.push(mesh);
|
|
216
224
|
mesh.visible = false;
|
|
217
225
|
}
|
|
@@ -244,8 +252,8 @@ export class Picker {
|
|
|
244
252
|
}
|
|
245
253
|
}
|
|
246
254
|
finally {
|
|
247
|
-
for (const [
|
|
248
|
-
|
|
255
|
+
for (const [obj, mat] of swapped)
|
|
256
|
+
obj.material = mat;
|
|
249
257
|
for (const o of hidden)
|
|
250
258
|
o.visible = true;
|
|
251
259
|
renderer.setRenderTarget(prevTarget);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Picker.js","sourceRoot":"","sources":["../../src/render/Picker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,MAAM,SAAS,GAAG,UAAU,CAAC
|
|
1
|
+
{"version":3,"file":"Picker.js","sourceRoot":"","sources":["../../src/render/Picker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 点云着色
|
|
3
|
+
*
|
|
4
|
+
* 点云没有法线、没有 uv、没有楼层概念,所以 StyleMaterial 那套按面着色的模式
|
|
5
|
+
* (顶/侧分色、按楼层、动态扫描…)对 `THREE.Points` 天然不适用。这里只做三种
|
|
6
|
+
* 点云真正能表达的模式,其余一律回退顶点色:
|
|
7
|
+
*
|
|
8
|
+
* vertex 原色:顶点色上屏(Draco 点云在解析阶段已把分类码烘成分类色带)
|
|
9
|
+
* solid 单色:整个点云一个颜色
|
|
10
|
+
* height 按高度:顶点世界坐标 z 在 uColorA → uColorB 之间连续渐变
|
|
11
|
+
* selected 选中高亮:整块点云混成 uSelColor(点云没有单体粒度,只能整块亮)
|
|
12
|
+
*
|
|
13
|
+
* 两个设计要点:
|
|
14
|
+
* 1. height / selected 的 ShaderMaterial 直接**引用**全局共享 uniform 对象
|
|
15
|
+
* (`shared.uColorA` 等),所以 `_applyStyleUniforms()` 改一次颜色,
|
|
16
|
+
* 点云渐变自动跟着变,不需要额外同步。
|
|
17
|
+
* 2. 材质由本模块按 mode 创建并打上 `pcOwned` 标记,换 mode 时旧的自己
|
|
18
|
+
* 销毁;GeometryBuilder 里那个共享单例没有标记,替换时不碰它。
|
|
19
|
+
*/
|
|
20
|
+
import * as THREE from 'three';
|
|
21
|
+
import { type S3MStyle, type StyleMode } from './StyleMaterial.js';
|
|
22
|
+
import type { StyleUniforms } from '../core/types.js';
|
|
23
|
+
/** 点云实际持有的材质形态 */
|
|
24
|
+
export type PointCloudKind = 'vertex' | 'solid' | 'height' | 'selected';
|
|
25
|
+
/** S3M 着色模式 → 点云形态。不适用于点云的模式统一回退顶点色。 */
|
|
26
|
+
export declare function pointCloudKindOf(mode: StyleMode): 'vertex' | 'solid' | 'height';
|
|
27
|
+
/**
|
|
28
|
+
* 把点云对象的材质同步到当前样式。
|
|
29
|
+
*
|
|
30
|
+
* kind 没变就只改不透明度 / 单色色值,不重建材质;变了才换,旧的自己销毁。
|
|
31
|
+
* 每次 setStyle 都会走到这里,代价是一次属性比较。
|
|
32
|
+
*/
|
|
33
|
+
export declare function applyPointCloudStyle(points: THREE.Points, style: S3MStyle, shared: StyleUniforms, selected?: boolean): void;
|
|
34
|
+
/** 点云对象是否由本模块持有材质(卸载时用来决定要不要 dispose) */
|
|
35
|
+
export declare function isOwnedPointCloudMaterial(mat: THREE.Material | THREE.Material[] | undefined): boolean;
|
|
36
|
+
//# sourceMappingURL=PointCloudMaterial.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PointCloudMaterial.d.ts","sourceRoot":"","sources":["../../src/render/PointCloudMaterial.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAS,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,kBAAkB;AAClB,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;AAKxE,wCAAwC;AACxC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAI/E;AA6FD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,aAAa,EACrB,QAAQ,UAAQ,GACf,IAAI,CA6BN;AAED,yCAAyC;AACzC,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,SAAS,GAAG,OAAO,CAGrG"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 点云着色
|
|
3
|
+
*
|
|
4
|
+
* 点云没有法线、没有 uv、没有楼层概念,所以 StyleMaterial 那套按面着色的模式
|
|
5
|
+
* (顶/侧分色、按楼层、动态扫描…)对 `THREE.Points` 天然不适用。这里只做三种
|
|
6
|
+
* 点云真正能表达的模式,其余一律回退顶点色:
|
|
7
|
+
*
|
|
8
|
+
* vertex 原色:顶点色上屏(Draco 点云在解析阶段已把分类码烘成分类色带)
|
|
9
|
+
* solid 单色:整个点云一个颜色
|
|
10
|
+
* height 按高度:顶点世界坐标 z 在 uColorA → uColorB 之间连续渐变
|
|
11
|
+
* selected 选中高亮:整块点云混成 uSelColor(点云没有单体粒度,只能整块亮)
|
|
12
|
+
*
|
|
13
|
+
* 两个设计要点:
|
|
14
|
+
* 1. height / selected 的 ShaderMaterial 直接**引用**全局共享 uniform 对象
|
|
15
|
+
* (`shared.uColorA` 等),所以 `_applyStyleUniforms()` 改一次颜色,
|
|
16
|
+
* 点云渐变自动跟着变,不需要额外同步。
|
|
17
|
+
* 2. 材质由本模块按 mode 创建并打上 `pcOwned` 标记,换 mode 时旧的自己
|
|
18
|
+
* 销毁;GeometryBuilder 里那个共享单例没有标记,替换时不碰它。
|
|
19
|
+
*/
|
|
20
|
+
import * as THREE from 'three';
|
|
21
|
+
import { STYLE } from './StyleMaterial.js';
|
|
22
|
+
/** 与 GeometryBuilder 里共享 PointsMaterial 保持同一个点尺寸(屏幕像素,不衰减) */
|
|
23
|
+
const POINT_SIZE = 2;
|
|
24
|
+
/** S3M 着色模式 → 点云形态。不适用于点云的模式统一回退顶点色。 */
|
|
25
|
+
export function pointCloudKindOf(mode) {
|
|
26
|
+
if (mode === STYLE.SOLID)
|
|
27
|
+
return 'solid';
|
|
28
|
+
if (mode === STYLE.HEIGHT)
|
|
29
|
+
return 'height';
|
|
30
|
+
return 'vertex';
|
|
31
|
+
}
|
|
32
|
+
/* ------------------------------------------------------------------ 着色器 */
|
|
33
|
+
const POINT_VERT = /* glsl */ `
|
|
34
|
+
uniform float uPointSize;
|
|
35
|
+
varying float vWorldZ;
|
|
36
|
+
void main() {
|
|
37
|
+
vec4 world = modelMatrix * vec4( position, 1.0 );
|
|
38
|
+
vWorldZ = world.z;
|
|
39
|
+
gl_Position = projectionMatrix * viewMatrix * world;
|
|
40
|
+
gl_PointSize = uPointSize;
|
|
41
|
+
}
|
|
42
|
+
`;
|
|
43
|
+
const HEIGHT_FRAG = /* glsl */ `
|
|
44
|
+
uniform vec3 uColorA;
|
|
45
|
+
uniform vec3 uColorB;
|
|
46
|
+
uniform float uHeightMin;
|
|
47
|
+
uniform float uHeightMax;
|
|
48
|
+
uniform float uOpacity;
|
|
49
|
+
varying float vWorldZ;
|
|
50
|
+
void main() {
|
|
51
|
+
float h = clamp( ( vWorldZ - uHeightMin ) / max( uHeightMax - uHeightMin, 0.001 ), 0.0, 1.0 );
|
|
52
|
+
gl_FragColor = vec4( mix( uColorA, uColorB, h ), uOpacity );
|
|
53
|
+
}
|
|
54
|
+
`;
|
|
55
|
+
const SELECTED_FRAG = /* glsl */ `
|
|
56
|
+
uniform vec3 uSelColor;
|
|
57
|
+
uniform float uOpacity;
|
|
58
|
+
void main() {
|
|
59
|
+
gl_FragColor = vec4( uSelColor, uOpacity );
|
|
60
|
+
}
|
|
61
|
+
`;
|
|
62
|
+
function createPointCloudMaterial(kind, style, shared) {
|
|
63
|
+
let mat;
|
|
64
|
+
if (kind === 'height') {
|
|
65
|
+
mat = new THREE.ShaderMaterial({
|
|
66
|
+
uniforms: {
|
|
67
|
+
// 直接引用共享 uniform 对象:换色不用重建材质
|
|
68
|
+
uColorA: shared.uColorA,
|
|
69
|
+
uColorB: shared.uColorB,
|
|
70
|
+
uHeightMin: shared.uHeightMin,
|
|
71
|
+
uHeightMax: shared.uHeightMax,
|
|
72
|
+
uPointSize: { value: POINT_SIZE },
|
|
73
|
+
uOpacity: { value: style.opacity ?? 1 },
|
|
74
|
+
},
|
|
75
|
+
vertexShader: POINT_VERT,
|
|
76
|
+
fragmentShader: HEIGHT_FRAG,
|
|
77
|
+
transparent: (style.opacity ?? 1) < 0.999,
|
|
78
|
+
depthWrite: (style.opacity ?? 1) >= 0.999,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
else if (kind === 'selected') {
|
|
82
|
+
mat = new THREE.ShaderMaterial({
|
|
83
|
+
uniforms: {
|
|
84
|
+
uSelColor: shared.uSelColor,
|
|
85
|
+
uPointSize: { value: POINT_SIZE },
|
|
86
|
+
uOpacity: { value: style.opacity ?? 1 },
|
|
87
|
+
},
|
|
88
|
+
vertexShader: POINT_VERT,
|
|
89
|
+
fragmentShader: SELECTED_FRAG,
|
|
90
|
+
transparent: (style.opacity ?? 1) < 0.999,
|
|
91
|
+
depthWrite: (style.opacity ?? 1) >= 0.999,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
else if (kind === 'solid') {
|
|
95
|
+
mat = new THREE.PointsMaterial({
|
|
96
|
+
size: POINT_SIZE,
|
|
97
|
+
sizeAttenuation: false,
|
|
98
|
+
color: new THREE.Color(style.colorA),
|
|
99
|
+
transparent: (style.opacity ?? 1) < 0.999,
|
|
100
|
+
opacity: style.opacity ?? 1,
|
|
101
|
+
depthWrite: (style.opacity ?? 1) >= 0.999,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
mat = new THREE.PointsMaterial({
|
|
106
|
+
size: POINT_SIZE,
|
|
107
|
+
sizeAttenuation: false,
|
|
108
|
+
vertexColors: true,
|
|
109
|
+
transparent: (style.opacity ?? 1) < 0.999,
|
|
110
|
+
opacity: style.opacity ?? 1,
|
|
111
|
+
depthWrite: (style.opacity ?? 1) >= 0.999,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
mat.userData.pcOwned = true;
|
|
115
|
+
return mat;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* 把点云对象的材质同步到当前样式。
|
|
119
|
+
*
|
|
120
|
+
* kind 没变就只改不透明度 / 单色色值,不重建材质;变了才换,旧的自己销毁。
|
|
121
|
+
* 每次 setStyle 都会走到这里,代价是一次属性比较。
|
|
122
|
+
*/
|
|
123
|
+
export function applyPointCloudStyle(points, style, shared, selected = false) {
|
|
124
|
+
const ud = points.userData;
|
|
125
|
+
const want = selected ? 'selected' : pointCloudKindOf(style.mode);
|
|
126
|
+
if (ud.pcKind !== want) {
|
|
127
|
+
const prev = points.material;
|
|
128
|
+
points.material = createPointCloudMaterial(want, style, shared);
|
|
129
|
+
// 只销毁自己创建的;GeometryBuilder 的共享单例没有 pcOwned 标记,不能碰
|
|
130
|
+
if (prev && prev.userData?.pcOwned)
|
|
131
|
+
prev.dispose();
|
|
132
|
+
ud.pcKind = want;
|
|
133
|
+
ud.pcTransparent = undefined;
|
|
134
|
+
}
|
|
135
|
+
else if (want === 'solid') {
|
|
136
|
+
points.material.color?.set(style.colorA);
|
|
137
|
+
}
|
|
138
|
+
const o = Math.min(1, Math.max(0.05, style.opacity ?? 1));
|
|
139
|
+
const transparent = o < 0.999;
|
|
140
|
+
const keepDepth = style.depthWrite !== false;
|
|
141
|
+
const mat = points.material;
|
|
142
|
+
mat.transparent = transparent;
|
|
143
|
+
mat.opacity = o;
|
|
144
|
+
mat.depthWrite = transparent ? keepDepth : true;
|
|
145
|
+
// ShaderMaterial 的 .opacity 不参与渲染,透明度走自己的 uniform
|
|
146
|
+
if (mat.uniforms?.uOpacity)
|
|
147
|
+
mat.uniforms.uOpacity.value = o;
|
|
148
|
+
// 只有混合开关真变了才标记重编译,避免每次 setStyle 都重编一遍
|
|
149
|
+
if (ud.pcTransparent !== transparent) {
|
|
150
|
+
ud.pcTransparent = transparent;
|
|
151
|
+
mat.needsUpdate = true;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
/** 点云对象是否由本模块持有材质(卸载时用来决定要不要 dispose) */
|
|
155
|
+
export function isOwnedPointCloudMaterial(mat) {
|
|
156
|
+
const m = Array.isArray(mat) ? mat[0] : mat;
|
|
157
|
+
return !!m && m.userData?.pcOwned === true;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=PointCloudMaterial.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PointCloudMaterial.js","sourceRoot":"","sources":["../../src/render/PointCloudMaterial.ts"],"names":[],"mappings":"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"}
|