@deck.gl/core 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.
Files changed (80) hide show
  1. package/dist/controllers/terrain-controller.d.ts +30 -0
  2. package/dist/controllers/terrain-controller.d.ts.map +1 -0
  3. package/dist/controllers/terrain-controller.js +127 -0
  4. package/dist/controllers/terrain-controller.js.map +1 -0
  5. package/dist/dist.dev.js +3137 -1160
  6. package/dist/index.cjs +584 -181
  7. package/dist/index.cjs.map +4 -4
  8. package/dist/index.d.ts +1 -0
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +1 -0
  11. package/dist/index.js.map +1 -1
  12. package/dist/lib/attribute/gl-utils.d.ts +1 -2
  13. package/dist/lib/attribute/gl-utils.d.ts.map +1 -1
  14. package/dist/lib/attribute/gl-utils.js +2 -2
  15. package/dist/lib/attribute/gl-utils.js.map +1 -1
  16. package/dist/lib/deck-picker.d.ts +3 -2
  17. package/dist/lib/deck-picker.d.ts.map +1 -1
  18. package/dist/lib/deck-picker.js +74 -17
  19. package/dist/lib/deck-picker.js.map +1 -1
  20. package/dist/lib/deck.d.ts +62 -0
  21. package/dist/lib/deck.d.ts.map +1 -1
  22. package/dist/lib/deck.js +219 -77
  23. package/dist/lib/deck.js.map +1 -1
  24. package/dist/lib/init.js +2 -2
  25. package/dist/lib/layer.d.ts.map +1 -1
  26. package/dist/lib/layer.js +60 -9
  27. package/dist/lib/layer.js.map +1 -1
  28. package/dist/lib/view-manager.js +1 -1
  29. package/dist/lib/view-manager.js.map +1 -1
  30. package/dist/passes/pick-layers-pass.d.ts.map +1 -1
  31. package/dist/passes/pick-layers-pass.js +7 -2
  32. package/dist/passes/pick-layers-pass.js.map +1 -1
  33. package/dist/passes/screen-pass-uniforms.d.ts +1 -1
  34. package/dist/passes/screen-pass-uniforms.js +1 -1
  35. package/dist/shaderlib/color/color.d.ts +1 -4
  36. package/dist/shaderlib/color/color.d.ts.map +1 -1
  37. package/dist/shaderlib/color/color.js +0 -12
  38. package/dist/shaderlib/color/color.js.map +1 -1
  39. package/dist/shaderlib/misc/layer-uniforms.d.ts +3 -2
  40. package/dist/shaderlib/misc/layer-uniforms.d.ts.map +1 -1
  41. package/dist/shaderlib/misc/layer-uniforms.js +10 -1
  42. package/dist/shaderlib/misc/layer-uniforms.js.map +1 -1
  43. package/dist/shaderlib/picking/picking.d.ts +3 -2
  44. package/dist/shaderlib/picking/picking.d.ts.map +1 -1
  45. package/dist/shaderlib/picking/picking.js +29 -0
  46. package/dist/shaderlib/picking/picking.js.map +1 -1
  47. package/dist/shaderlib/project/project.glsl.js +1 -1
  48. package/dist/shaderlib/project/project.wgsl.d.ts.map +1 -1
  49. package/dist/shaderlib/project/project.wgsl.js +4 -6
  50. package/dist/shaderlib/project/project.wgsl.js.map +1 -1
  51. package/dist/shaderlib/shadow/shadow.d.ts +2 -2
  52. package/dist/shaderlib/shadow/shadow.js +1 -1
  53. package/dist/transitions/gpu-interpolation-transition.js +2 -2
  54. package/dist/transitions/gpu-interpolation-transition.js.map +1 -1
  55. package/dist/transitions/gpu-spring-transition.js +1 -1
  56. package/dist/transitions/gpu-transition-utils.d.ts.map +1 -1
  57. package/dist/transitions/gpu-transition-utils.js +3 -4
  58. package/dist/transitions/gpu-transition-utils.js.map +1 -1
  59. package/dist/utils/typed-array-manager.js.map +1 -1
  60. package/dist.min.js +506 -234
  61. package/package.json +6 -7
  62. package/src/controllers/terrain-controller.ts +155 -0
  63. package/src/index.ts +1 -0
  64. package/src/lib/attribute/gl-utils.ts +2 -2
  65. package/src/lib/deck-picker.ts +98 -17
  66. package/src/lib/deck.ts +334 -86
  67. package/src/lib/layer.ts +98 -8
  68. package/src/lib/view-manager.ts +1 -1
  69. package/src/passes/pick-layers-pass.ts +6 -2
  70. package/src/passes/screen-pass-uniforms.ts +1 -1
  71. package/src/shaderlib/color/color.ts +0 -12
  72. package/src/shaderlib/misc/layer-uniforms.ts +11 -1
  73. package/src/shaderlib/picking/picking.ts +30 -0
  74. package/src/shaderlib/project/project.glsl.ts +1 -1
  75. package/src/shaderlib/project/project.wgsl.ts +4 -6
  76. package/src/shaderlib/shadow/shadow.ts +1 -1
  77. package/src/transitions/gpu-interpolation-transition.ts +2 -2
  78. package/src/transitions/gpu-spring-transition.ts +1 -1
  79. package/src/transitions/gpu-transition-utils.ts +4 -5
  80. package/src/utils/typed-array-manager.ts +3 -3
@@ -0,0 +1,30 @@
1
+ import MapController from "./map-controller.js";
2
+ import { MapState, MapStateProps } from "./map-controller.js";
3
+ import type { ControllerProps, InteractionState } from "./controller.js";
4
+ /**
5
+ * Controller that extends MapController with terrain-aware behavior.
6
+ * The camera smoothly follows terrain elevation during pan/zoom.
7
+ */
8
+ export default class TerrainController extends MapController {
9
+ /** Cached terrain altitude from depth picking at viewport center (smoothed) */
10
+ private _terrainAltitude?;
11
+ /** Raw (unsmoothed) terrain altitude from latest pick */
12
+ private _terrainAltitudeTarget?;
13
+ /** rAF handle for periodic terrain altitude picking */
14
+ private _pickFrameId;
15
+ /** Timestamp of last pick */
16
+ private _lastPickTime;
17
+ setProps(props: ControllerProps & MapStateProps & {
18
+ rotationPivot?: 'center' | '2d' | '3d';
19
+ getAltitude?: (pos: [number, number]) => number | undefined;
20
+ }): void;
21
+ finalize(): void;
22
+ protected updateViewport(newControllerState: MapState, extraProps?: Record<string, any> | null, interactionState?: InteractionState): void;
23
+ private _pickTerrainCenterAltitude;
24
+ /**
25
+ * Compute viewport adjustments to keep the view visually the same
26
+ * when shifting position to [0, 0, altitude].
27
+ */
28
+ private _rebaseViewport;
29
+ }
30
+ //# 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;AAGpE;;;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;IACpD,uDAAuD;IACvD,OAAO,CAAC,YAAY,CAAuB;IAC3C,6BAA6B;IAC7B,OAAO,CAAC,aAAa,CAAa;IAElC,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;IA0CL,QAAQ;IAQR,SAAS,CAAC,cAAc,CACtB,kBAAkB,EAAE,QAAQ,EAC5B,UAAU,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAW,EAC7C,gBAAgB,GAAE,gBAAqB,GACtC,IAAI;IAqBP,OAAO,CAAC,0BAA0B;IAWlC;;;OAGG;IACH,OAAO,CAAC,eAAe;CAoCxB"}
@@ -0,0 +1,127 @@
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
+ /** rAF handle for periodic terrain altitude picking */
17
+ this._pickFrameId = null;
18
+ /** Timestamp of last pick */
19
+ this._lastPickTime = 0;
20
+ }
21
+ setProps(props) {
22
+ super.setProps({ rotationPivot: '3d', ...props });
23
+ // Periodically pick terrain altitude at the viewport center using rAF.
24
+ // Keeps the altitude cache warm so interactions don't need expensive
25
+ // synchronous GPU readbacks. rAF naturally pauses when tab is backgrounded.
26
+ if (this._pickFrameId === null) {
27
+ const loop = () => {
28
+ const now = Date.now();
29
+ if (now - this._lastPickTime > 500 && !this.isDragging()) {
30
+ this._lastPickTime = now;
31
+ this._pickTerrainCenterAltitude();
32
+ // On first successful pick, rebase viewport to terrain altitude.
33
+ // Runs from rAF (outside React render) so onViewStateChange won't loop.
34
+ if (this._terrainAltitude === undefined && this._terrainAltitudeTarget !== undefined) {
35
+ this._terrainAltitude = this._terrainAltitudeTarget;
36
+ const controllerState = new this.ControllerState({
37
+ makeViewport: this.makeViewport,
38
+ ...this.props,
39
+ ...this.state
40
+ });
41
+ const rebaseProps = this._rebaseViewport(this._terrainAltitudeTarget, controllerState);
42
+ if (rebaseProps) {
43
+ // Build a controllerState that includes the rebase adjustments so
44
+ // internal state matches the rebased viewState after React round-trip.
45
+ const rebasedState = new this.ControllerState({
46
+ makeViewport: this.makeViewport,
47
+ ...this.props,
48
+ ...this.state,
49
+ ...rebaseProps
50
+ });
51
+ super.updateViewport(rebasedState);
52
+ }
53
+ }
54
+ }
55
+ this._pickFrameId = requestAnimationFrame(loop);
56
+ };
57
+ this._pickFrameId = requestAnimationFrame(loop);
58
+ }
59
+ }
60
+ finalize() {
61
+ if (this._pickFrameId !== null) {
62
+ cancelAnimationFrame(this._pickFrameId);
63
+ this._pickFrameId = null;
64
+ }
65
+ super.finalize();
66
+ }
67
+ updateViewport(newControllerState, extraProps = null, interactionState = {}) {
68
+ // Not initialized yet — pass through to MapController
69
+ if (this._terrainAltitude === undefined) {
70
+ super.updateViewport(newControllerState, extraProps, interactionState);
71
+ return;
72
+ }
73
+ // Smoothly blend toward target altitude
74
+ const SMOOTHING = 0.05;
75
+ this._terrainAltitude += (this._terrainAltitudeTarget - this._terrainAltitude) * SMOOTHING;
76
+ const viewportProps = newControllerState.getViewportProps();
77
+ const pos = viewportProps.position || [0, 0, 0];
78
+ extraProps = {
79
+ ...extraProps,
80
+ position: [pos[0], pos[1], this._terrainAltitude]
81
+ };
82
+ super.updateViewport(newControllerState, extraProps, interactionState);
83
+ }
84
+ _pickTerrainCenterAltitude() {
85
+ if (!this.pickPosition) {
86
+ return;
87
+ }
88
+ const { x, y, width, height } = this.props;
89
+ const pickResult = this.pickPosition(x + width / 2, y + height / 2);
90
+ if (pickResult?.coordinate && pickResult.coordinate.length >= 3) {
91
+ this._terrainAltitudeTarget = pickResult.coordinate[2];
92
+ }
93
+ }
94
+ /**
95
+ * Compute viewport adjustments to keep the view visually the same
96
+ * when shifting position to [0, 0, altitude].
97
+ */
98
+ _rebaseViewport(altitude, newControllerState) {
99
+ const viewportProps = newControllerState.getViewportProps();
100
+ const oldViewport = this.makeViewport({ ...viewportProps, position: [0, 0, 0] });
101
+ const oldCameraPos = oldViewport.cameraPosition;
102
+ const centerZOffset = altitude * oldViewport.distanceScales.unitsPerMeter[2];
103
+ const cameraHeightAboveOldCenter = oldCameraPos[2];
104
+ const newCameraHeightAboveCenter = cameraHeightAboveOldCenter - centerZOffset;
105
+ if (newCameraHeightAboveCenter <= 0) {
106
+ return null;
107
+ }
108
+ const zoomDelta = Math.log2(cameraHeightAboveOldCenter / newCameraHeightAboveCenter);
109
+ const newZoom = viewportProps.zoom + zoomDelta;
110
+ const newViewport = this.makeViewport({
111
+ ...viewportProps,
112
+ zoom: newZoom,
113
+ position: [0, 0, altitude]
114
+ });
115
+ const { width, height } = viewportProps;
116
+ const screenCenter = [width / 2, height / 2];
117
+ const worldPoint = oldViewport.unproject(screenCenter, { targetZ: altitude });
118
+ if (worldPoint &&
119
+ 'panByPosition3D' in newViewport &&
120
+ typeof newViewport.panByPosition3D === 'function') {
121
+ const adjusted = newViewport.panByPosition3D(worldPoint, screenCenter);
122
+ return { position: [0, 0, altitude], zoom: newZoom, ...adjusted };
123
+ }
124
+ return null;
125
+ }
126
+ }
127
+ //# 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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"}