@deck.gl/geo-layers 9.3.0-alpha.2 → 9.3.0-alpha.5

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/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "deck.gl layers supporting geospatial use cases and GIS formats",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
- "version": "9.3.0-alpha.2",
6
+ "version": "9.3.0-alpha.5",
7
7
  "publishConfig": {
8
8
  "access": "public"
9
9
  },
@@ -46,8 +46,8 @@
46
46
  "@loaders.gl/terrain": "^4.4.0-alpha.18",
47
47
  "@loaders.gl/tiles": "^4.4.0-alpha.18",
48
48
  "@loaders.gl/wms": "^4.4.0-alpha.18",
49
- "@luma.gl/gltf": "^9.3.0-alpha.6",
50
- "@luma.gl/shadertools": "^9.3.0-alpha.6",
49
+ "@luma.gl/gltf": "^9.3.0-alpha.10",
50
+ "@luma.gl/shadertools": "^9.3.0-alpha.10",
51
51
  "@math.gl/core": "^4.1.0",
52
52
  "@math.gl/culling": "^4.1.0",
53
53
  "@math.gl/web-mercator": "^4.1.0",
@@ -57,13 +57,13 @@
57
57
  "long": "^3.2.0"
58
58
  },
59
59
  "peerDependencies": {
60
- "@deck.gl/core": "~9.2.0",
61
- "@deck.gl/extensions": "~9.2.0",
62
- "@deck.gl/layers": "~9.2.0",
63
- "@deck.gl/mesh-layers": "~9.2.0",
60
+ "@deck.gl/core": "~9.3.0-alpha.1",
61
+ "@deck.gl/extensions": "~9.3.0-alpha.1",
62
+ "@deck.gl/layers": "~9.3.0-alpha.1",
63
+ "@deck.gl/mesh-layers": "~9.3.0-alpha.1",
64
64
  "@loaders.gl/core": "^4.4.0-alpha.18",
65
- "@luma.gl/core": "~9.3.0-alpha.6",
66
- "@luma.gl/engine": "~9.3.0-alpha.6"
65
+ "@luma.gl/core": "~9.3.0-alpha.10",
66
+ "@luma.gl/engine": "~9.3.0-alpha.10"
67
67
  },
68
- "gitHead": "135d329f4a4b596ae2c16e4eb801eda30252f3bc"
68
+ "gitHead": "c3ad1cee357af674cc31df37979d61325baf9d7a"
69
69
  }
@@ -5,7 +5,7 @@
5
5
  import type {ShaderModule} from '@luma.gl/shadertools';
6
6
 
7
7
  const uniformBlock = `\
8
- uniform meshUniforms {
8
+ layout(std140) uniform meshUniforms {
9
9
  bool pickFeatureIds;
10
10
  } mesh;
11
11
  `;
@@ -226,17 +226,20 @@ export default class MVTLayer<
226
226
  const {fetch} = this.props;
227
227
  loadOptions = {
228
228
  ...loadOptions,
229
- mimeType: 'application/x-protobuf',
229
+ core: {
230
+ ...loadOptions?.core,
231
+ mimeType: 'application/x-protobuf'
232
+ },
230
233
  mvt: {
231
234
  ...loadOptions?.mvt,
235
+ shape: binary ? 'binary' : 'geojson',
232
236
  coordinates: this.context.viewport.resolution ? 'wgs84' : 'local',
233
237
  tileIndex: index
234
238
  // Local worker debug
235
239
  // workerUrl: `modules/mvt/dist/mvt-loader.worker.js`
236
240
  // Set worker to null to skip web workers
237
241
  // workerUrl: null
238
- },
239
- gis: binary ? {format: 'binary'} : {}
242
+ }
240
243
  };
241
244
  return fetch(url, {propName: 'data', layer: this, loadOptions, signal});
242
245
  }
@@ -18,7 +18,8 @@ import {
18
18
  PickingInfo,
19
19
  UpdateParameters,
20
20
  Viewport,
21
- DefaultProps
21
+ DefaultProps,
22
+ LayerContext
22
23
  } from '@deck.gl/core';
23
24
  import {PointCloudLayer} from '@deck.gl/layers';
24
25
  import {ScenegraphLayer} from '@deck.gl/mesh-layers';
@@ -138,6 +139,15 @@ export default class Tile3DLayer<DataT = any, ExtraPropsT extends {} = {}> exten
138
139
  }
139
140
  }
140
141
 
142
+ finalizeState(context: LayerContext): void {
143
+ this.state.tileset3d?.destroy();
144
+ this.state.tileset3d = null;
145
+ this.state.layerMap = {};
146
+ this.state.activeViewports = {};
147
+ this.state.lastUpdatedViewports = null;
148
+ super.finalizeState(context);
149
+ }
150
+
141
151
  activateViewport(viewport: Viewport): void {
142
152
  const {activeViewports, lastUpdatedViewports} = this.state;
143
153
  this.internalState!.viewport = viewport;
@@ -160,11 +170,29 @@ export default class Tile3DLayer<DataT = any, ExtraPropsT extends {} = {}> exten
160
170
  return info;
161
171
  }
162
172
 
163
- filterSubLayer({layer, viewport}: FilterContext): boolean {
173
+ filterSubLayer({layer, viewport, cullRect, isPicking}: FilterContext): boolean {
164
174
  // All sublayers will have a tile prop
165
175
  const {tile} = layer.props as unknown as {tile: Tile3D};
166
176
  const {id: viewportId} = viewport;
167
- return tile.selected && tile.viewportIds.includes(viewportId);
177
+ if (!tile.selected || !tile.viewportIds.includes(viewportId)) {
178
+ return false;
179
+ }
180
+
181
+ // When picking, skip tiles whose content center is far from the
182
+ // pick point on screen. Avoids unnecessary draw calls.
183
+ if (isPicking && cullRect && tile.content?.cartographicOrigin) {
184
+ const [sx, sy] = viewport.project(tile.content.cartographicOrigin);
185
+ const cx = cullRect.x + cullRect.width / 2;
186
+ const cy = cullRect.y + cullRect.height / 2;
187
+ const threshold = Math.max(viewport.width, viewport.height) / 4;
188
+ const dx = sx - cx;
189
+ const dy = sy - cy;
190
+ if (dx * dx + dy * dy > threshold * threshold) {
191
+ return false;
192
+ }
193
+ }
194
+
195
+ return true;
168
196
  }
169
197
 
170
198
  protected _updateAutoHighlight(info: PickingInfo): void {
@@ -194,7 +194,12 @@ export default class TileLayer<DataT = any, ExtraPropsT extends {} = {}> extends
194
194
  get isLoaded(): boolean {
195
195
  return Boolean(
196
196
  this.state?.tileset?.selectedTiles?.every(
197
- tile => tile.isLoaded && tile.layers && tile.layers.every(layer => layer.isLoaded)
197
+ tile =>
198
+ // Error / empty tiles resolve to `content === null`. Once Tile2DHeader marks those
199
+ // requests as loaded, do not wait for generated sublayers because there is nothing to
200
+ // render for that tile and `tile.layers` will remain null.
201
+ tile.isLoaded &&
202
+ (!tile.content || !tile.layers || tile.layers.every(layer => layer.isLoaded))
198
203
  )
199
204
  );
200
205
  }
@@ -148,7 +148,8 @@ export class Tile2DHeader<DataT = any> {
148
148
  // Clear the `isLoading` flag
149
149
  this._loader = undefined;
150
150
  // Rewrite tile content with the result of getTileData if successful, or `null` in case of
151
- // error or cancellation
151
+ // error or cancellation. A `null` tile is still a terminal result for the request: the tile
152
+ // should stop blocking viewport loading even if the source returned 404 / empty content.
152
153
  this.content = tileData;
153
154
  // If cancelled, do not invoke the callbacks
154
155
  // Consider it loaded if we tried to cancel but `getTileData` still returned data
@@ -156,6 +157,9 @@ export class Tile2DHeader<DataT = any> {
156
157
  this._isLoaded = false;
157
158
  return;
158
159
  }
160
+ // Errors are reported via onError below, but the request itself has completed. Mark the tile
161
+ // as loaded so higher-level layers can treat expected missing tiles as settled instead of
162
+ // waiting forever for content or sublayers that will never exist.
159
163
  this._isLoaded = true;
160
164
  this._isCancelled = false;
161
165
 
@@ -5,7 +5,7 @@
5
5
  import type {ShaderModule} from '@luma.gl/shadertools';
6
6
 
7
7
  const uniformBlock = `\
8
- uniform tripsUniforms {
8
+ layout(std140) uniform tripsUniforms {
9
9
  bool fadeTrail;
10
10
  float trailLength;
11
11
  float currentTime;