@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.
- package/dist/controllers/terrain-controller.d.ts +29 -0
- package/dist/controllers/terrain-controller.d.ts.map +1 -0
- package/dist/controllers/terrain-controller.js +108 -0
- package/dist/controllers/terrain-controller.js.map +1 -0
- package/dist/dist.dev.js +98 -0
- package/dist/index.cjs +91 -1
- package/dist/index.cjs.map +3 -3
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/init.js +2 -2
- package/dist.min.js +70 -70
- package/package.json +2 -2
- package/src/controllers/terrain-controller.ts +146 -0
- package/src/index.ts +1 -0
|
@@ -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.
|
|
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() {
|