@deck.gl/core 9.3.0-alpha.2 → 9.3.0-alpha.3

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.
@@ -0,0 +1,29 @@
1
+ import MapController from "./map-controller.js";
2
+ import { MapState, MapStateProps } from "./map-controller.js";
3
+ import type { ControllerProps, InteractionState } from "./controller.js";
4
+ import type { MjolnirGestureEvent, MjolnirWheelEvent } from 'mjolnir.js';
5
+ /**
6
+ * Controller that extends MapController with terrain-aware behavior.
7
+ * The camera smoothly follows terrain elevation during pan/zoom.
8
+ */
9
+ export default class TerrainController extends MapController {
10
+ /** Cached terrain altitude from depth picking at viewport center (smoothed) */
11
+ private _terrainAltitude?;
12
+ /** Raw (unsmoothed) terrain altitude from latest pick */
13
+ private _terrainAltitudeTarget?;
14
+ setProps(props: ControllerProps & MapStateProps & {
15
+ rotationPivot?: 'center' | '2d' | '3d';
16
+ getAltitude?: (pos: [number, number]) => number | undefined;
17
+ }): void;
18
+ protected updateViewport(newControllerState: MapState, extraProps?: Record<string, any> | null, interactionState?: InteractionState): void;
19
+ protected _onPanStart(event: MjolnirGestureEvent): boolean;
20
+ protected _onWheel(event: MjolnirWheelEvent): boolean;
21
+ protected _onDoubleClick(event: MjolnirGestureEvent): boolean;
22
+ private _pickTerrainCenterAltitude;
23
+ /**
24
+ * Utility function to return viewport that looks the same, but with
25
+ * a position shifted to [0, 0, altitude]
26
+ */
27
+ private _rebaseViewport;
28
+ }
29
+ //# sourceMappingURL=terrain-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terrain-controller.d.ts","sourceRoot":"","sources":["../../src/controllers/terrain-controller.ts"],"names":[],"mappings":"AAIA,OAAO,aAAa,4BAAyB;AAC7C,OAAO,EAAC,QAAQ,EAAE,aAAa,EAAC,4BAAyB;AACzD,OAAO,KAAK,EAAC,eAAe,EAAE,gBAAgB,EAAC,wBAAqB;AACpE,OAAO,KAAK,EAAC,mBAAmB,EAAE,iBAAiB,EAAC,MAAM,YAAY,CAAC;AAEvE;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,aAAa;IAC1D,+EAA+E;IAC/E,OAAO,CAAC,gBAAgB,CAAC,CAAqB;IAC9C,yDAAyD;IACzD,OAAO,CAAC,sBAAsB,CAAC,CAAqB;IAEpD,QAAQ,CACN,KAAK,EAAE,eAAe,GACpB,aAAa,GAAG;QACd,aAAa,CAAC,EAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;QACvC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC;KAC7D;IAoBL,SAAS,CAAC,cAAc,CACtB,kBAAkB,EAAE,QAAQ,EAC5B,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAW,EAC7C,gBAAgB,GAAE,gBAAqB,GACtC,IAAI;IA6BP,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO;IAK1D,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO;IAKrD,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO;IAK7D,OAAO,CAAC,0BAA0B;IAYlC;;;OAGG;IACH,OAAO,CAAC,eAAe;CAqCxB"}
@@ -0,0 +1,108 @@
1
+ // deck.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+ import MapController from "./map-controller.js";
5
+ /**
6
+ * Controller that extends MapController with terrain-aware behavior.
7
+ * The camera smoothly follows terrain elevation during pan/zoom.
8
+ */
9
+ export default class TerrainController extends MapController {
10
+ constructor() {
11
+ super(...arguments);
12
+ /** Cached terrain altitude from depth picking at viewport center (smoothed) */
13
+ this._terrainAltitude = undefined;
14
+ /** Raw (unsmoothed) terrain altitude from latest pick */
15
+ this._terrainAltitudeTarget = undefined;
16
+ }
17
+ setProps(props) {
18
+ super.setProps({ rotationPivot: '3d', ...props });
19
+ // Drive smoothing animation when terrain altitude hasn't converged yet.
20
+ if (this._terrainAltitude !== undefined &&
21
+ this._terrainAltitudeTarget !== undefined &&
22
+ Math.abs(this._terrainAltitudeTarget - this._terrainAltitude) > 0.01) {
23
+ this.updateViewport(new this.ControllerState({
24
+ makeViewport: this.makeViewport,
25
+ ...this.props,
26
+ ...this.state
27
+ }));
28
+ }
29
+ }
30
+ updateViewport(newControllerState, extraProps = null, interactionState = {}) {
31
+ const SMOOTHING = 0.05;
32
+ // No interactions yet, do not update
33
+ if (this._terrainAltitudeTarget === undefined)
34
+ return;
35
+ if (this._terrainAltitude === undefined) {
36
+ // First interaction, rebase to avoid jump
37
+ this._terrainAltitude = this._terrainAltitudeTarget;
38
+ extraProps = this._rebaseViewport(this._terrainAltitudeTarget, newControllerState, extraProps);
39
+ }
40
+ else {
41
+ // Standard interaction, smoothly blend target into actual altitude
42
+ this._terrainAltitude += (this._terrainAltitudeTarget - this._terrainAltitude) * SMOOTHING;
43
+ }
44
+ const viewportProps = newControllerState.getViewportProps();
45
+ const pos = viewportProps.position || [0, 0, 0];
46
+ extraProps = {
47
+ ...extraProps,
48
+ position: [pos[0], pos[1], this._terrainAltitude]
49
+ };
50
+ super.updateViewport(newControllerState, extraProps, interactionState);
51
+ }
52
+ _onPanStart(event) {
53
+ this._pickTerrainCenterAltitude();
54
+ return super._onPanStart(event);
55
+ }
56
+ _onWheel(event) {
57
+ this._pickTerrainCenterAltitude();
58
+ return super._onWheel(event);
59
+ }
60
+ _onDoubleClick(event) {
61
+ this._pickTerrainCenterAltitude();
62
+ return super._onDoubleClick(event);
63
+ }
64
+ _pickTerrainCenterAltitude() {
65
+ // TODO use async picking?
66
+ if (!this.pickPosition) {
67
+ return;
68
+ }
69
+ const { x, y, width, height } = this.props;
70
+ const pickResult = this.pickPosition(x + width / 2, y + height / 2);
71
+ if (pickResult?.coordinate && pickResult.coordinate.length >= 3) {
72
+ this._terrainAltitudeTarget = pickResult.coordinate[2];
73
+ }
74
+ }
75
+ /**
76
+ * Utility function to return viewport that looks the same, but with
77
+ * a position shifted to [0, 0, altitude]
78
+ */
79
+ _rebaseViewport(altitude, newControllerState, extraProps) {
80
+ const viewportProps = newControllerState.getViewportProps();
81
+ const oldViewport = this.makeViewport({ ...viewportProps, position: [0, 0, 0] });
82
+ const oldCameraPos = oldViewport.cameraPosition;
83
+ const centerZOffset = altitude * oldViewport.distanceScales.unitsPerMeter[2];
84
+ const cameraHeightAboveOldCenter = oldCameraPos[2];
85
+ const newCameraHeightAboveCenter = cameraHeightAboveOldCenter - centerZOffset;
86
+ if (newCameraHeightAboveCenter <= 0) {
87
+ return extraProps;
88
+ }
89
+ const zoomDelta = Math.log2(cameraHeightAboveOldCenter / newCameraHeightAboveCenter);
90
+ const newZoom = viewportProps.zoom + zoomDelta;
91
+ const newViewport = this.makeViewport({
92
+ ...viewportProps,
93
+ zoom: newZoom,
94
+ position: [0, 0, altitude]
95
+ });
96
+ const { width, height } = viewportProps;
97
+ const screenCenter = [width / 2, height / 2];
98
+ const worldPoint = oldViewport.unproject(screenCenter, { targetZ: altitude });
99
+ if (worldPoint &&
100
+ 'panByPosition3D' in newViewport &&
101
+ typeof newViewport.panByPosition3D === 'function') {
102
+ const adjusted = newViewport.panByPosition3D(worldPoint, screenCenter);
103
+ return { ...extraProps, position: [0, 0, altitude], zoom: newZoom, ...adjusted };
104
+ }
105
+ return extraProps;
106
+ }
107
+ }
108
+ //# sourceMappingURL=terrain-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terrain-controller.js","sourceRoot":"","sources":["../../src/controllers/terrain-controller.ts"],"names":[],"mappings":"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"}
package/dist/dist.dev.js CHANGED
@@ -11505,6 +11505,7 @@ ${source3}`;
11505
11505
  PointLight: () => PointLight,
11506
11506
  PostProcessEffect: () => PostProcessEffect,
11507
11507
  TRANSITION_EVENTS: () => TRANSITION_EVENTS,
11508
+ TerrainController: () => TerrainController,
11508
11509
  Tesselator: () => Tesselator,
11509
11510
  TransitionInterpolator: () => TransitionInterpolator,
11510
11511
  UNIT: () => UNIT,
@@ -39689,6 +39690,103 @@ void main(void) {
39689
39690
  };
39690
39691
  GlobeView.displayName = "GlobeView";
39691
39692
 
39693
+ // src/controllers/terrain-controller.ts
39694
+ var TerrainController = class extends MapController {
39695
+ constructor() {
39696
+ super(...arguments);
39697
+ /** Cached terrain altitude from depth picking at viewport center (smoothed) */
39698
+ this._terrainAltitude = void 0;
39699
+ /** Raw (unsmoothed) terrain altitude from latest pick */
39700
+ this._terrainAltitudeTarget = void 0;
39701
+ }
39702
+ setProps(props) {
39703
+ super.setProps({ rotationPivot: "3d", ...props });
39704
+ if (this._terrainAltitude !== void 0 && this._terrainAltitudeTarget !== void 0 && Math.abs(this._terrainAltitudeTarget - this._terrainAltitude) > 0.01) {
39705
+ this.updateViewport(
39706
+ new this.ControllerState({
39707
+ makeViewport: this.makeViewport,
39708
+ ...this.props,
39709
+ ...this.state
39710
+ })
39711
+ );
39712
+ }
39713
+ }
39714
+ updateViewport(newControllerState, extraProps = null, interactionState = {}) {
39715
+ const SMOOTHING = 0.05;
39716
+ if (this._terrainAltitudeTarget === void 0)
39717
+ return;
39718
+ if (this._terrainAltitude === void 0) {
39719
+ this._terrainAltitude = this._terrainAltitudeTarget;
39720
+ extraProps = this._rebaseViewport(
39721
+ this._terrainAltitudeTarget,
39722
+ newControllerState,
39723
+ extraProps
39724
+ );
39725
+ } else {
39726
+ this._terrainAltitude += (this._terrainAltitudeTarget - this._terrainAltitude) * SMOOTHING;
39727
+ }
39728
+ const viewportProps = newControllerState.getViewportProps();
39729
+ const pos = viewportProps.position || [0, 0, 0];
39730
+ extraProps = {
39731
+ ...extraProps,
39732
+ position: [pos[0], pos[1], this._terrainAltitude]
39733
+ };
39734
+ super.updateViewport(newControllerState, extraProps, interactionState);
39735
+ }
39736
+ _onPanStart(event) {
39737
+ this._pickTerrainCenterAltitude();
39738
+ return super._onPanStart(event);
39739
+ }
39740
+ _onWheel(event) {
39741
+ this._pickTerrainCenterAltitude();
39742
+ return super._onWheel(event);
39743
+ }
39744
+ _onDoubleClick(event) {
39745
+ this._pickTerrainCenterAltitude();
39746
+ return super._onDoubleClick(event);
39747
+ }
39748
+ _pickTerrainCenterAltitude() {
39749
+ if (!this.pickPosition) {
39750
+ return;
39751
+ }
39752
+ const { x, y, width, height } = this.props;
39753
+ const pickResult = this.pickPosition(x + width / 2, y + height / 2);
39754
+ if (pickResult?.coordinate && pickResult.coordinate.length >= 3) {
39755
+ this._terrainAltitudeTarget = pickResult.coordinate[2];
39756
+ }
39757
+ }
39758
+ /**
39759
+ * Utility function to return viewport that looks the same, but with
39760
+ * a position shifted to [0, 0, altitude]
39761
+ */
39762
+ _rebaseViewport(altitude, newControllerState, extraProps) {
39763
+ const viewportProps = newControllerState.getViewportProps();
39764
+ const oldViewport = this.makeViewport({ ...viewportProps, position: [0, 0, 0] });
39765
+ const oldCameraPos = oldViewport.cameraPosition;
39766
+ const centerZOffset = altitude * oldViewport.distanceScales.unitsPerMeter[2];
39767
+ const cameraHeightAboveOldCenter = oldCameraPos[2];
39768
+ const newCameraHeightAboveCenter = cameraHeightAboveOldCenter - centerZOffset;
39769
+ if (newCameraHeightAboveCenter <= 0) {
39770
+ return extraProps;
39771
+ }
39772
+ const zoomDelta = Math.log2(cameraHeightAboveOldCenter / newCameraHeightAboveCenter);
39773
+ const newZoom = viewportProps.zoom + zoomDelta;
39774
+ const newViewport = this.makeViewport({
39775
+ ...viewportProps,
39776
+ zoom: newZoom,
39777
+ position: [0, 0, altitude]
39778
+ });
39779
+ const { width, height } = viewportProps;
39780
+ const screenCenter = [width / 2, height / 2];
39781
+ const worldPoint = oldViewport.unproject(screenCenter, { targetZ: altitude });
39782
+ if (worldPoint && "panByPosition3D" in newViewport && typeof newViewport.panByPosition3D === "function") {
39783
+ const adjusted = newViewport.panByPosition3D(worldPoint, screenCenter);
39784
+ return { ...extraProps, position: [0, 0, altitude], zoom: newZoom, ...adjusted };
39785
+ }
39786
+ return extraProps;
39787
+ }
39788
+ };
39789
+
39692
39790
  // src/lib/layer-extension.ts
39693
39791
  var LayerExtension = class {
39694
39792
  static get componentName() {
package/dist/index.cjs CHANGED
@@ -50,6 +50,7 @@ __export(dist_exports, {
50
50
  PointLight: () => PointLight,
51
51
  PostProcessEffect: () => PostProcessEffect,
52
52
  TRANSITION_EVENTS: () => TRANSITION_EVENTS,
53
+ TerrainController: () => TerrainController,
53
54
  Tesselator: () => Tesselator,
54
55
  TransitionInterpolator: () => TransitionInterpolator,
55
56
  UNIT: () => UNIT,
@@ -229,7 +230,7 @@ var json_loader_default = {
229
230
 
230
231
  // dist/lib/init.js
231
232
  function checkVersion() {
232
- const version = true ? "9.3.0-alpha.2" : globalThis.DECK_VERSION || "untranspiled source";
233
+ const version = true ? "9.3.0-alpha.3" : globalThis.DECK_VERSION || "untranspiled source";
233
234
  const existingVersion = globalThis.deck && globalThis.deck.VERSION;
234
235
  if (existingVersion && existingVersion !== version) {
235
236
  throw new Error(`deck.gl - multiple versions detected: ${existingVersion} vs ${version}`);
@@ -13383,6 +13384,95 @@ var GlobeView = class extends View {
13383
13384
  GlobeView.displayName = "GlobeView";
13384
13385
  var globe_view_default = GlobeView;
13385
13386
 
13387
+ // dist/controllers/terrain-controller.js
13388
+ var TerrainController = class extends MapController {
13389
+ constructor() {
13390
+ super(...arguments);
13391
+ this._terrainAltitude = void 0;
13392
+ this._terrainAltitudeTarget = void 0;
13393
+ }
13394
+ setProps(props) {
13395
+ super.setProps({ rotationPivot: "3d", ...props });
13396
+ if (this._terrainAltitude !== void 0 && this._terrainAltitudeTarget !== void 0 && Math.abs(this._terrainAltitudeTarget - this._terrainAltitude) > 0.01) {
13397
+ this.updateViewport(new this.ControllerState({
13398
+ makeViewport: this.makeViewport,
13399
+ ...this.props,
13400
+ ...this.state
13401
+ }));
13402
+ }
13403
+ }
13404
+ updateViewport(newControllerState, extraProps = null, interactionState = {}) {
13405
+ const SMOOTHING = 0.05;
13406
+ if (this._terrainAltitudeTarget === void 0)
13407
+ return;
13408
+ if (this._terrainAltitude === void 0) {
13409
+ this._terrainAltitude = this._terrainAltitudeTarget;
13410
+ extraProps = this._rebaseViewport(this._terrainAltitudeTarget, newControllerState, extraProps);
13411
+ } else {
13412
+ this._terrainAltitude += (this._terrainAltitudeTarget - this._terrainAltitude) * SMOOTHING;
13413
+ }
13414
+ const viewportProps = newControllerState.getViewportProps();
13415
+ const pos = viewportProps.position || [0, 0, 0];
13416
+ extraProps = {
13417
+ ...extraProps,
13418
+ position: [pos[0], pos[1], this._terrainAltitude]
13419
+ };
13420
+ super.updateViewport(newControllerState, extraProps, interactionState);
13421
+ }
13422
+ _onPanStart(event) {
13423
+ this._pickTerrainCenterAltitude();
13424
+ return super._onPanStart(event);
13425
+ }
13426
+ _onWheel(event) {
13427
+ this._pickTerrainCenterAltitude();
13428
+ return super._onWheel(event);
13429
+ }
13430
+ _onDoubleClick(event) {
13431
+ this._pickTerrainCenterAltitude();
13432
+ return super._onDoubleClick(event);
13433
+ }
13434
+ _pickTerrainCenterAltitude() {
13435
+ if (!this.pickPosition) {
13436
+ return;
13437
+ }
13438
+ const { x, y, width, height } = this.props;
13439
+ const pickResult = this.pickPosition(x + width / 2, y + height / 2);
13440
+ if ((pickResult == null ? void 0 : pickResult.coordinate) && pickResult.coordinate.length >= 3) {
13441
+ this._terrainAltitudeTarget = pickResult.coordinate[2];
13442
+ }
13443
+ }
13444
+ /**
13445
+ * Utility function to return viewport that looks the same, but with
13446
+ * a position shifted to [0, 0, altitude]
13447
+ */
13448
+ _rebaseViewport(altitude, newControllerState, extraProps) {
13449
+ const viewportProps = newControllerState.getViewportProps();
13450
+ const oldViewport = this.makeViewport({ ...viewportProps, position: [0, 0, 0] });
13451
+ const oldCameraPos = oldViewport.cameraPosition;
13452
+ const centerZOffset = altitude * oldViewport.distanceScales.unitsPerMeter[2];
13453
+ const cameraHeightAboveOldCenter = oldCameraPos[2];
13454
+ const newCameraHeightAboveCenter = cameraHeightAboveOldCenter - centerZOffset;
13455
+ if (newCameraHeightAboveCenter <= 0) {
13456
+ return extraProps;
13457
+ }
13458
+ const zoomDelta = Math.log2(cameraHeightAboveOldCenter / newCameraHeightAboveCenter);
13459
+ const newZoom = viewportProps.zoom + zoomDelta;
13460
+ const newViewport = this.makeViewport({
13461
+ ...viewportProps,
13462
+ zoom: newZoom,
13463
+ position: [0, 0, altitude]
13464
+ });
13465
+ const { width, height } = viewportProps;
13466
+ const screenCenter = [width / 2, height / 2];
13467
+ const worldPoint = oldViewport.unproject(screenCenter, { targetZ: altitude });
13468
+ if (worldPoint && "panByPosition3D" in newViewport && typeof newViewport.panByPosition3D === "function") {
13469
+ const adjusted = newViewport.panByPosition3D(worldPoint, screenCenter);
13470
+ return { ...extraProps, position: [0, 0, altitude], zoom: newZoom, ...adjusted };
13471
+ }
13472
+ return extraProps;
13473
+ }
13474
+ };
13475
+
13386
13476
  // dist/lib/layer-extension.js
13387
13477
  var LayerExtension = class {
13388
13478
  static get componentName() {