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

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 (152) hide show
  1. package/debug.min.js +1 -1
  2. package/dist/controllers/controller.d.ts +10 -0
  3. package/dist/controllers/controller.d.ts.map +1 -1
  4. package/dist/controllers/controller.js +15 -0
  5. package/dist/controllers/controller.js.map +1 -1
  6. package/dist/controllers/first-person-controller.d.ts +3 -2
  7. package/dist/controllers/first-person-controller.d.ts.map +1 -1
  8. package/dist/controllers/first-person-controller.js +13 -5
  9. package/dist/controllers/first-person-controller.js.map +1 -1
  10. package/dist/controllers/globe-controller.d.ts +1 -0
  11. package/dist/controllers/globe-controller.d.ts.map +1 -1
  12. package/dist/controllers/globe-controller.js +66 -5
  13. package/dist/controllers/globe-controller.js.map +1 -1
  14. package/dist/controllers/map-controller.d.ts +21 -3
  15. package/dist/controllers/map-controller.d.ts.map +1 -1
  16. package/dist/controllers/map-controller.js +139 -25
  17. package/dist/controllers/map-controller.js.map +1 -1
  18. package/dist/controllers/orbit-controller.d.ts +12 -4
  19. package/dist/controllers/orbit-controller.d.ts.map +1 -1
  20. package/dist/controllers/orbit-controller.js +118 -10
  21. package/dist/controllers/orbit-controller.js.map +1 -1
  22. package/dist/controllers/orthographic-controller.d.ts +117 -9
  23. package/dist/controllers/orthographic-controller.d.ts.map +1 -1
  24. package/dist/controllers/orthographic-controller.js +302 -37
  25. package/dist/controllers/orthographic-controller.js.map +1 -1
  26. package/dist/controllers/view-state.d.ts +4 -1
  27. package/dist/controllers/view-state.d.ts.map +1 -1
  28. package/dist/controllers/view-state.js +2 -1
  29. package/dist/controllers/view-state.js.map +1 -1
  30. package/dist/debug/loggers.d.ts.map +1 -1
  31. package/dist/debug/loggers.js +1 -4
  32. package/dist/debug/loggers.js.map +1 -1
  33. package/dist/dist.dev.js +7585 -10714
  34. package/dist/effects/lighting/lighting-effect.d.ts +1 -0
  35. package/dist/effects/lighting/lighting-effect.d.ts.map +1 -1
  36. package/dist/effects/lighting/lighting-effect.js +14 -5
  37. package/dist/effects/lighting/lighting-effect.js.map +1 -1
  38. package/dist/index.cjs +812 -120
  39. package/dist/index.cjs.map +4 -4
  40. package/dist/lib/attribute/attribute-manager.d.ts.map +1 -1
  41. package/dist/lib/attribute/attribute-manager.js +2 -0
  42. package/dist/lib/attribute/attribute-manager.js.map +1 -1
  43. package/dist/lib/attribute/data-column.js +2 -2
  44. package/dist/lib/attribute/data-column.js.map +1 -1
  45. package/dist/lib/attribute/gl-utils.d.ts +1 -1
  46. package/dist/lib/attribute/gl-utils.d.ts.map +1 -1
  47. package/dist/lib/attribute/gl-utils.js +4 -0
  48. package/dist/lib/attribute/gl-utils.js.map +1 -1
  49. package/dist/lib/deck-picker.d.ts +14 -1
  50. package/dist/lib/deck-picker.d.ts.map +1 -1
  51. package/dist/lib/deck-picker.js +43 -11
  52. package/dist/lib/deck-picker.js.map +1 -1
  53. package/dist/lib/deck-renderer.d.ts +6 -1
  54. package/dist/lib/deck-renderer.d.ts.map +1 -1
  55. package/dist/lib/deck-renderer.js +14 -2
  56. package/dist/lib/deck-renderer.js.map +1 -1
  57. package/dist/lib/deck.d.ts +10 -0
  58. package/dist/lib/deck.d.ts.map +1 -1
  59. package/dist/lib/deck.js +29 -11
  60. package/dist/lib/deck.js.map +1 -1
  61. package/dist/lib/init.js +2 -2
  62. package/dist/lib/init.js.map +1 -1
  63. package/dist/lib/layer.d.ts.map +1 -1
  64. package/dist/lib/layer.js +7 -3
  65. package/dist/lib/layer.js.map +1 -1
  66. package/dist/lib/view-manager.d.ts +4 -0
  67. package/dist/lib/view-manager.d.ts.map +1 -1
  68. package/dist/lib/view-manager.js +6 -1
  69. package/dist/lib/view-manager.js.map +1 -1
  70. package/dist/lib/widget.d.ts +4 -0
  71. package/dist/lib/widget.d.ts.map +1 -1
  72. package/dist/lib/widget.js +11 -0
  73. package/dist/lib/widget.js.map +1 -1
  74. package/dist/passes/draw-layers-pass.d.ts +2 -0
  75. package/dist/passes/draw-layers-pass.d.ts.map +1 -1
  76. package/dist/passes/draw-layers-pass.js +3 -0
  77. package/dist/passes/draw-layers-pass.js.map +1 -1
  78. package/dist/passes/layers-pass.d.ts +2 -1
  79. package/dist/passes/layers-pass.d.ts.map +1 -1
  80. package/dist/passes/layers-pass.js +7 -3
  81. package/dist/passes/layers-pass.js.map +1 -1
  82. package/dist/passes/pick-layers-pass.d.ts +6 -3
  83. package/dist/passes/pick-layers-pass.d.ts.map +1 -1
  84. package/dist/passes/pick-layers-pass.js +12 -4
  85. package/dist/passes/pick-layers-pass.js.map +1 -1
  86. package/dist/shaderlib/project/project.glsl.d.ts.map +1 -1
  87. package/dist/shaderlib/project/project.glsl.js +3 -0
  88. package/dist/shaderlib/project/project.glsl.js.map +1 -1
  89. package/dist/utils/deep-merge.d.ts +5 -0
  90. package/dist/utils/deep-merge.d.ts.map +1 -0
  91. package/dist/utils/deep-merge.js +31 -0
  92. package/dist/utils/deep-merge.js.map +1 -0
  93. package/dist/utils/math-utils.d.ts +4 -0
  94. package/dist/utils/math-utils.d.ts.map +1 -1
  95. package/dist/utils/math-utils.js +8 -0
  96. package/dist/utils/math-utils.js.map +1 -1
  97. package/dist/utils/texture.d.ts.map +1 -1
  98. package/dist/utils/texture.js +3 -1
  99. package/dist/utils/texture.js.map +1 -1
  100. package/dist/viewports/globe-viewport.d.ts +1 -0
  101. package/dist/viewports/globe-viewport.d.ts.map +1 -1
  102. package/dist/viewports/globe-viewport.js +1 -1
  103. package/dist/viewports/globe-viewport.js.map +1 -1
  104. package/dist/viewports/orbit-viewport.d.ts.map +1 -1
  105. package/dist/viewports/orbit-viewport.js +7 -2
  106. package/dist/viewports/orbit-viewport.js.map +1 -1
  107. package/dist/viewports/orthographic-viewport.d.ts +8 -2
  108. package/dist/viewports/orthographic-viewport.d.ts.map +1 -1
  109. package/dist/viewports/orthographic-viewport.js.map +1 -1
  110. package/dist/viewports/web-mercator-viewport.d.ts +5 -0
  111. package/dist/viewports/web-mercator-viewport.d.ts.map +1 -1
  112. package/dist/viewports/web-mercator-viewport.js +9 -0
  113. package/dist/viewports/web-mercator-viewport.js.map +1 -1
  114. package/dist/views/orthographic-view.d.ts +38 -4
  115. package/dist/views/orthographic-view.d.ts.map +1 -1
  116. package/dist/views/orthographic-view.js.map +1 -1
  117. package/dist/views/view.d.ts.map +1 -1
  118. package/dist/views/view.js +2 -8
  119. package/dist/views/view.js.map +1 -1
  120. package/dist.min.js +226 -154
  121. package/package.json +9 -9
  122. package/src/controllers/controller.ts +25 -2
  123. package/src/controllers/first-person-controller.ts +18 -8
  124. package/src/controllers/globe-controller.ts +89 -5
  125. package/src/controllers/map-controller.ts +174 -32
  126. package/src/controllers/orbit-controller.ts +147 -13
  127. package/src/controllers/orthographic-controller.ts +417 -41
  128. package/src/controllers/view-state.ts +10 -3
  129. package/src/debug/loggers.ts +1 -5
  130. package/src/effects/lighting/lighting-effect.ts +20 -8
  131. package/src/lib/attribute/attribute-manager.ts +1 -0
  132. package/src/lib/attribute/data-column.ts +3 -3
  133. package/src/lib/attribute/gl-utils.ts +5 -1
  134. package/src/lib/deck-picker.ts +47 -12
  135. package/src/lib/deck-renderer.ts +17 -3
  136. package/src/lib/deck.ts +39 -11
  137. package/src/lib/layer.ts +7 -3
  138. package/src/lib/view-manager.ts +9 -1
  139. package/src/lib/widget.ts +14 -0
  140. package/src/passes/draw-layers-pass.ts +5 -0
  141. package/src/passes/layers-pass.ts +9 -4
  142. package/src/passes/pick-layers-pass.ts +18 -6
  143. package/src/shaderlib/project/project.glsl.ts +3 -0
  144. package/src/utils/deep-merge.ts +33 -0
  145. package/src/utils/math-utils.ts +12 -0
  146. package/src/utils/texture.ts +3 -1
  147. package/src/viewports/globe-viewport.ts +1 -1
  148. package/src/viewports/orbit-viewport.ts +8 -2
  149. package/src/viewports/orthographic-viewport.ts +8 -2
  150. package/src/viewports/web-mercator-viewport.ts +10 -0
  151. package/src/views/orthographic-view.ts +38 -4
  152. package/src/views/view.ts +2 -8
@@ -3,7 +3,7 @@
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
5
  import {clamp} from '@math.gl/core';
6
- import Controller from './controller';
6
+ import Controller, {ControllerProps} from './controller';
7
7
  import ViewState from './view-state';
8
8
  import {mod} from '../utils/math-utils';
9
9
 
@@ -13,8 +13,8 @@ import LinearInterpolator from '../transitions/linear-interpolator';
13
13
  export type OrbitStateProps = {
14
14
  width: number;
15
15
  height: number;
16
- target?: number[];
17
- zoom?: number | number[];
16
+ target?: [number, number, number];
17
+ zoom?: number;
18
18
  rotationX?: number;
19
19
  rotationOrbit?: number;
20
20
 
@@ -23,6 +23,8 @@ export type OrbitStateProps = {
23
23
  minZoom?: number;
24
24
  minRotationX?: number;
25
25
  maxRotationX?: number;
26
+
27
+ maxBounds?: ControllerProps['maxBounds'];
26
28
  };
27
29
 
28
30
  type OrbitStateInternal = {
@@ -35,12 +37,13 @@ type OrbitStateInternal = {
35
37
  };
36
38
 
37
39
  export class OrbitState extends ViewState<OrbitState, OrbitStateProps, OrbitStateInternal> {
38
- makeViewport: (props: Record<string, any>) => Viewport;
40
+ unproject3D?: (pos: number[]) => number[] | null;
39
41
 
40
42
  constructor(
41
43
  options: OrbitStateProps &
42
44
  OrbitStateInternal & {
43
45
  makeViewport: (props: Record<string, any>) => Viewport;
46
+ unproject3D?: (pos: number[]) => number[] | null;
44
47
  }
45
48
  ) {
46
49
  const {
@@ -58,6 +61,8 @@ export class OrbitState extends ViewState<OrbitState, OrbitStateProps, OrbitStat
58
61
  minZoom = -Infinity,
59
62
  maxZoom = Infinity,
60
63
 
64
+ maxBounds = null,
65
+
61
66
  /** Interaction states, required to calculate change during transform */
62
67
  // Model state when the pan operation first started
63
68
  startPanPosition,
@@ -81,7 +86,8 @@ export class OrbitState extends ViewState<OrbitState, OrbitStateProps, OrbitStat
81
86
  minRotationX,
82
87
  maxRotationX,
83
88
  minZoom,
84
- maxZoom
89
+ maxZoom,
90
+ maxBounds
85
91
  },
86
92
  {
87
93
  startPanPosition,
@@ -90,10 +96,11 @@ export class OrbitState extends ViewState<OrbitState, OrbitStateProps, OrbitStat
90
96
  startRotationOrbit,
91
97
  startZoomPosition,
92
98
  startZoom
93
- }
99
+ },
100
+ options.makeViewport
94
101
  );
95
102
 
96
- this.makeViewport = options.makeViewport;
103
+ this.unproject3D = options.unproject3D;
97
104
  }
98
105
 
99
106
  /**
@@ -334,6 +341,8 @@ export class OrbitState extends ViewState<OrbitState, OrbitStateProps, OrbitStat
334
341
  return viewport.project(pos);
335
342
  }
336
343
  _unproject(pos: number[]): number[] {
344
+ const p = this.unproject3D?.(pos);
345
+ if (p) return p;
337
346
  const viewport = this.makeViewport(this.getViewportProps());
338
347
  return viewport.unproject(pos);
339
348
  }
@@ -346,12 +355,11 @@ export class OrbitState extends ViewState<OrbitState, OrbitStateProps, OrbitStat
346
355
  scale: number;
347
356
  startZoom?: number | number[];
348
357
  }): number | number[] {
349
- const {maxZoom, minZoom} = this.getViewportProps();
350
358
  if (startZoom === undefined) {
351
359
  startZoom = this.getViewportProps().zoom;
352
360
  }
353
361
  const zoom = (startZoom as number) + Math.log2(scale);
354
- return clamp(zoom, minZoom, maxZoom);
362
+ return this._constrainZoom(zoom);
355
363
  }
356
364
 
357
365
  _panFromCenter(offset) {
@@ -376,19 +384,122 @@ export class OrbitState extends ViewState<OrbitState, OrbitStateProps, OrbitStat
376
384
  // Apply any constraints (mathematical or defined by _viewportProps) to map state
377
385
  applyConstraints(props: Required<OrbitStateProps>): Required<OrbitStateProps> {
378
386
  // Ensure zoom is within specified range
379
- const {maxZoom, minZoom, zoom, maxRotationX, minRotationX, rotationOrbit} = props;
387
+ const {maxRotationX, minRotationX, rotationOrbit} = props;
380
388
 
381
- props.zoom = Array.isArray(zoom)
382
- ? [clamp(zoom[0], minZoom, maxZoom), clamp(zoom[1], minZoom, maxZoom)]
383
- : clamp(zoom, minZoom, maxZoom);
389
+ props.zoom = this._constrainZoom(props.zoom, props);
384
390
 
385
391
  props.rotationX = clamp(props.rotationX, minRotationX, maxRotationX);
386
392
  if (rotationOrbit < -180 || rotationOrbit > 180) {
387
393
  props.rotationOrbit = mod(rotationOrbit + 180, 360) - 180;
388
394
  }
389
395
 
396
+ props.target = this._constrainTarget(props);
397
+
390
398
  return props;
391
399
  }
400
+
401
+ _constrainZoom(zoom: number, props?: Required<OrbitStateProps>) {
402
+ props ||= this.getViewportProps();
403
+ const {maxZoom, maxBounds} = props;
404
+ let {minZoom} = props;
405
+
406
+ if (maxBounds && props.width > 0 && props.height > 0) {
407
+ const dx = maxBounds[1][0] - maxBounds[0][0];
408
+ const dy = maxBounds[1][1] - maxBounds[0][1];
409
+ const dz = (maxBounds[1][2] ?? 0) - (maxBounds[0][2] ?? 0);
410
+ const maxDiameter = Math.sqrt(dx * dx + dy * dy + dz * dz);
411
+ if (maxDiameter > 0) {
412
+ minZoom = Math.max(minZoom, Math.log2(Math.min(props.width, props.height) / maxDiameter));
413
+ if (minZoom > maxZoom) minZoom = maxZoom;
414
+ }
415
+ }
416
+
417
+ return clamp(zoom, minZoom, maxZoom);
418
+ }
419
+
420
+ _constrainTarget(props: Required<OrbitStateProps>): [number, number, number] {
421
+ const {target, maxBounds} = props;
422
+ if (!maxBounds) return target;
423
+ const [[minX, minY, minZ = 0], [maxX, maxY, maxZ = 0]] = maxBounds;
424
+ if (
425
+ target[0] >= minX &&
426
+ target[0] <= maxX &&
427
+ target[1] >= minY &&
428
+ target[1] <= maxY &&
429
+ target[2] >= minZ &&
430
+ target[2] <= maxZ
431
+ ) {
432
+ return target;
433
+ }
434
+
435
+ const vp = this.makeViewport?.(props);
436
+ if (vp) {
437
+ // Given the bounding box and the target plane (defined by target position and distance to near plane)
438
+ // Move target to the closest point on the plane that is also inside the bounding box
439
+ const {cameraPosition} = vp;
440
+ const nx = cameraPosition[0] - target[0];
441
+ const ny = cameraPosition[1] - target[1];
442
+ const nz = cameraPosition[2] - target[2];
443
+ const c = nx * target[0] + ny * target[1] + nz * target[2];
444
+ const minDot =
445
+ nx * (nx >= 0 ? minX : maxX) + ny * (ny >= 0 ? minY : maxY) + nz * (nz >= 0 ? minZ : maxZ);
446
+ const maxDot =
447
+ nx * (nx >= 0 ? maxX : minX) + ny * (ny >= 0 ? maxY : minY) + nz * (nz >= 0 ? maxZ : minZ);
448
+
449
+ if ((nx || ny || nz) && c >= minDot && c <= maxDot) {
450
+ // Target plane intersects the bounding box
451
+ const clampX = (value: number) => clamp(value, minX, maxX);
452
+ const clampY = (value: number) => clamp(value, minY, maxY);
453
+ const clampZ = (value: number) => clamp(value, minZ, maxZ);
454
+ const f = (lambda: number) =>
455
+ nx * clampX(target[0] - lambda * nx) +
456
+ ny * clampY(target[1] - lambda * ny) +
457
+ nz * clampZ(target[2] - lambda * nz) -
458
+ c;
459
+
460
+ let lo = -1;
461
+ let hi = 1;
462
+ let flo = f(lo);
463
+ let fhi = f(hi);
464
+
465
+ while (flo < 0) {
466
+ hi = lo;
467
+ fhi = flo;
468
+ lo *= 2;
469
+ flo = f(lo);
470
+ }
471
+ while (fhi > 0) {
472
+ lo = hi;
473
+ flo = fhi;
474
+ hi *= 2;
475
+ fhi = f(hi);
476
+ }
477
+
478
+ for (let i = 0; i < 30; i++) {
479
+ const mid = (lo + hi) / 2;
480
+ const fm = f(mid);
481
+ if (fm > 0) {
482
+ lo = mid;
483
+ } else {
484
+ hi = mid;
485
+ }
486
+ }
487
+
488
+ const lambda = (lo + hi) / 2;
489
+ return [
490
+ clampX(target[0] - lambda * nx),
491
+ clampY(target[1] - lambda * ny),
492
+ clampZ(target[2] - lambda * nz)
493
+ ];
494
+ }
495
+ }
496
+ // Fallback if the camera vector degenerates or the plane misses the box.
497
+ return [
498
+ clamp(target[0], minX, maxX),
499
+ clamp(target[1], minY, maxY),
500
+ clamp(target[2], minZ, maxZ)
501
+ ];
502
+ }
392
503
  }
393
504
 
394
505
  export default class OrbitController extends Controller<OrbitState> {
@@ -403,4 +514,27 @@ export default class OrbitController extends Controller<OrbitState> {
403
514
  }
404
515
  })
405
516
  };
517
+
518
+ setProps(
519
+ props: ControllerProps &
520
+ OrbitStateProps & {
521
+ unproject3D?: (pos: number[]) => number[] | null;
522
+ }
523
+ ) {
524
+ // this will be passed to OrbitState constructor
525
+ props.unproject3D = this._unproject3D;
526
+
527
+ super.setProps(props);
528
+ }
529
+
530
+ protected _unproject3D = (pos: number[]): number[] | null => {
531
+ if (this.pickPosition) {
532
+ const {x, y} = this.props;
533
+ const pickResult = this.pickPosition(x + pos[0], y + pos[1]);
534
+ if (pickResult && pickResult.coordinate) {
535
+ return pickResult.coordinate;
536
+ }
537
+ }
538
+ return null;
539
+ };
406
540
  }