Skip to content

Commit 06c7181

Browse files
committedMar 7, 2024·
feat(TiledGeometryLayer): layer can now hide skirt
1 parent e5810d7 commit 06c7181

File tree

8 files changed

+44
-18
lines changed

8 files changed

+44
-18
lines changed
 

‎src/Converter/convertToTile.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,9 @@ export default {
4545
const paramsGeometry = {
4646
extent,
4747
level,
48-
segment: layer.segments || 16,
48+
segments: layer.segments || 16,
4949
disableSkirt: layer.disableSkirt,
50+
hideSkirt: layer.hideSkirt,
5051
};
5152

5253
return newTileGeometry(builder, paramsGeometry).then((result) => {

‎src/Core/Prefab/TileBuilder.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const cacheTile = new Cache();
1010
export default function newTileGeometry(builder, params) {
1111
const { sharableExtent, quaternion, position } = builder.computeSharableExtent(params.extent);
1212
const south = sharableExtent.south.toFixed(6);
13-
const bufferKey = `${builder.crs}_${params.disableSkirt ? 0 : 1}_${params.segment}`;
13+
const bufferKey = `${builder.crs}_${params.disableSkirt ? 0 : 1}_${params.segments}`;
1414
let promiseGeometry = cacheTile.get(south, params.level, bufferKey);
1515

1616
// build geometry if doesn't exist

‎src/Core/Prefab/computeBufferTileGeometry.js

+10-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import * as THREE from 'three';
22

3+
export function getBufferIndexSize(segments, noSkirt) {
4+
const triangles = (segments) * (segments) * 2 + (noSkirt ? 0 : 4 * segments * 2);
5+
return triangles * 3;
6+
}
7+
38
export default function computeBuffers(params) {
49
// Create output buffers.
510
const outBuffers = {
@@ -26,7 +31,7 @@ export default function computeBuffers(params) {
2631
const computeUvs = [];
2732

2833
const builder = params.builder;
29-
const nSeg = params.segment || 8;
34+
const nSeg = params.segments;
3035
// segments count :
3136
// Tile : (nSeg + 1) * (nSeg + 1)
3237
// Skirt : 8 * (nSeg - 1)
@@ -35,8 +40,6 @@ export default function computeBuffers(params) {
3540
throw new Error('Tile segments count is too big');
3641
}
3742

38-
const triangles = (nSeg) * (nSeg) * 2 + (params.disableSkirt ? 0 : 4 * nSeg * 2);
39-
4043
outBuffers.position = new Float32Array(nVertex * 3);
4144
outBuffers.normal = new Float32Array(nVertex * 3);
4245

@@ -46,13 +49,14 @@ export default function computeBuffers(params) {
4649
}
4750

4851
computeUvs[0] = () => {};
52+
const bufferIndexSize = getBufferIndexSize(nSeg, params.disableSkirt);
4953
if (params.buildIndexAndUv_0) {
5054
if (nVertex < 2 ** 8) {
51-
outBuffers.index = new Uint8Array(triangles * 3);
55+
outBuffers.index = new Uint8Array(bufferIndexSize);
5256
} else if (nVertex < 2 ** 16) {
53-
outBuffers.index = new Uint16Array(triangles * 3);
57+
outBuffers.index = new Uint16Array(bufferIndexSize);
5458
} else if (nVertex < 2 ** 32) {
55-
outBuffers.index = new Uint32Array(triangles * 3);
59+
outBuffers.index = new Uint32Array(bufferIndexSize);
5660
}
5761
outBuffers.uvs[0] = new Float32Array(nVertex * 2);
5862
computeUvs[0] = (id, u, v) => {

‎src/Core/TileGeometry.js

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as THREE from 'three';
2-
import computeBuffers from 'Core/Prefab/computeBufferTileGeometry';
2+
import computeBuffers, { getBufferIndexSize } from 'Core/Prefab/computeBufferTileGeometry';
33

44
function defaultBuffers(params) {
55
params.buildIndexAndUv_0 = true;
@@ -20,7 +20,7 @@ class TileGeometry extends THREE.BufferGeometry {
2020
super();
2121
this.center = params.center;
2222
this.extent = params.extent;
23-
23+
this.segments = params.segments;
2424
this.setIndex(buffers.index);
2525
this.setAttribute('position', buffers.position);
2626
this.setAttribute('normal', buffers.normal);
@@ -31,6 +31,12 @@ class TileGeometry extends THREE.BufferGeometry {
3131

3232
this.computeBoundingBox();
3333
this.OBB = {};
34+
if (params.hideSkirt) {
35+
this.hideSkirt = params.hideSkirt;
36+
}
37+
}
38+
set hideSkirt(value) {
39+
this.setDrawRange(0, getBufferIndexSize(this.segments, value));
3440
}
3541
}
3642

‎src/Layer/TiledGeometryLayer.js

+16-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ const boundingSphereCenter = new THREE.Vector3();
1616
* @property {boolean} isTiledGeometryLayer - Used to checkout whether this
1717
* layer is a TiledGeometryLayer. Default is true. You should not change this,
1818
* as it is used internally for optimisation.
19-
*
19+
* @property {boolean} hideSkirt (default false) - Used to hide the skirt (tile borders).
20+
* Useful when the layer opacity < 1
2021
*/
2122
class TiledGeometryLayer extends GeometryLayer {
2223
/**
@@ -70,6 +71,7 @@ class TiledGeometryLayer extends GeometryLayer {
7071
this.object3d.geoidHeight = 0;
7172

7273
this.protocol = 'tile';
74+
this._hideSkirt = false;
7375

7476
this.sseSubdivisionThreshold = this.sseSubdivisionThreshold || 1.0;
7577

@@ -101,6 +103,19 @@ class TiledGeometryLayer extends GeometryLayer {
101103
this.maxScreenSizeNode = this.sseSubdivisionThreshold * (SIZE_DIAGONAL_TEXTURE * 2);
102104
}
103105

106+
get hideSkirt() {
107+
return this._hideSkirt;
108+
}
109+
set hideSkirt(value) {
110+
this._hideSkirt = value;
111+
for (const node of this.level0Nodes) {
112+
node.traverse((obj) => {
113+
if (obj.isTileMesh) {
114+
obj.geometry.hideSkirt = value;
115+
}
116+
});
117+
}
118+
}
104119
/**
105120
* Picking method for this layer. It uses the {@link Picking#pickTilesAt}
106121
* method.

‎src/Renderer/OBB.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,11 @@ class OBB extends THREE.Object3D {
107107
if (extent.crs == 'EPSG:4326') {
108108
const { sharableExtent, quaternion, position } = builder.computeSharableExtent(extent);
109109
// Compute the minimum count of segment to build tile
110-
const segment = Math.max(Math.floor(sharableExtent.planarDimensions(dimension).x / 90 + 1), 2);
110+
const segments = Math.max(Math.floor(sharableExtent.planarDimensions(dimension).x / 90 + 1), 2);
111111
const paramsGeometry = {
112112
extent: sharableExtent,
113113
level: 0,
114-
segment,
114+
segments,
115115
disableSkirt: true,
116116
builder,
117117
};

‎test/unit/obb.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ function assertVerticesAreInOBB(builder, extent) {
5151
extent,
5252
disableSkirt: true,
5353
level: 0,
54-
segment: 1,
54+
segments: 1,
5555
};
5656

5757
return newTileGeometry(builder, params)

‎test/unit/tilemesh.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ describe('TileMesh', function () {
7979
const paramsGeometry = {
8080
extent: planarlayer.object3d.children[0].extent,
8181
level: 0,
82-
segment: 260,
82+
segments: 260,
8383
disableSkirt: true,
8484
};
8585

@@ -91,7 +91,7 @@ describe('TileMesh', function () {
9191
const paramsGeometry2 = {
9292
extent: planarlayer.object3d.children[0].extent,
9393
level: 0,
94-
segment: (2 ** 16),
94+
segments: (2 ** 16),
9595
disableSkirt: true,
9696
};
9797

@@ -130,7 +130,7 @@ describe('TileMesh', function () {
130130
const paramsGeometry = {
131131
extent: planarlayer.object3d.children[0].extent,
132132
level: 0,
133-
segment: 4,
133+
segments: 4,
134134
disableSkirt: true,
135135
};
136136

@@ -147,7 +147,7 @@ describe('TileMesh', function () {
147147
const paramsGeometry = {
148148
extent: planarlayer.object3d.children[0].extent,
149149
level: 0,
150-
segment: 2,
150+
segments: 2,
151151
disableSkirt: true,
152152
};
153153

0 commit comments

Comments
 (0)
Please sign in to comment.