@deck.gl/core 9.3.0-alpha.1 → 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.
- package/debug.min.js +1 -1
- package/dist/controllers/controller.d.ts +5 -4
- package/dist/controllers/controller.d.ts.map +1 -1
- package/dist/controllers/controller.js +18 -7
- package/dist/controllers/controller.js.map +1 -1
- package/dist/controllers/first-person-controller.d.ts +3 -2
- package/dist/controllers/first-person-controller.d.ts.map +1 -1
- package/dist/controllers/first-person-controller.js +13 -5
- package/dist/controllers/first-person-controller.js.map +1 -1
- package/dist/controllers/globe-controller.d.ts +1 -0
- package/dist/controllers/globe-controller.d.ts.map +1 -1
- package/dist/controllers/globe-controller.js +66 -5
- package/dist/controllers/globe-controller.js.map +1 -1
- package/dist/controllers/map-controller.d.ts +7 -18
- package/dist/controllers/map-controller.d.ts.map +1 -1
- package/dist/controllers/map-controller.js +94 -50
- package/dist/controllers/map-controller.js.map +1 -1
- package/dist/controllers/orbit-controller.d.ts +12 -4
- package/dist/controllers/orbit-controller.d.ts.map +1 -1
- package/dist/controllers/orbit-controller.js +118 -10
- package/dist/controllers/orbit-controller.js.map +1 -1
- package/dist/controllers/orthographic-controller.d.ts +117 -9
- package/dist/controllers/orthographic-controller.d.ts.map +1 -1
- package/dist/controllers/orthographic-controller.js +302 -37
- package/dist/controllers/orthographic-controller.js.map +1 -1
- package/dist/controllers/view-state.d.ts +2 -1
- package/dist/controllers/view-state.d.ts.map +1 -1
- package/dist/controllers/view-state.js +2 -1
- package/dist/controllers/view-state.js.map +1 -1
- package/dist/debug/loggers.d.ts.map +1 -1
- package/dist/debug/loggers.js +1 -4
- package/dist/debug/loggers.js.map +1 -1
- package/dist/dist.dev.js +3705 -1678
- package/dist/effects/lighting/lighting-effect.d.ts +1 -0
- package/dist/effects/lighting/lighting-effect.d.ts.map +1 -1
- package/dist/effects/lighting/lighting-effect.js +14 -5
- package/dist/effects/lighting/lighting-effect.js.map +1 -1
- package/dist/index.cjs +685 -123
- package/dist/index.cjs.map +4 -4
- package/dist/lib/attribute/attribute-manager.d.ts.map +1 -1
- package/dist/lib/attribute/attribute-manager.js +2 -0
- package/dist/lib/attribute/attribute-manager.js.map +1 -1
- package/dist/lib/deck-picker.d.ts +6 -1
- package/dist/lib/deck-picker.d.ts.map +1 -1
- package/dist/lib/deck-picker.js +15 -3
- package/dist/lib/deck-picker.js.map +1 -1
- package/dist/lib/deck-renderer.d.ts +6 -1
- package/dist/lib/deck-renderer.d.ts.map +1 -1
- package/dist/lib/deck-renderer.js +14 -2
- package/dist/lib/deck-renderer.js.map +1 -1
- package/dist/lib/deck.d.ts +5 -0
- package/dist/lib/deck.d.ts.map +1 -1
- package/dist/lib/deck.js +13 -3
- package/dist/lib/deck.js.map +1 -1
- package/dist/lib/init.js +2 -2
- package/dist/lib/layer.d.ts.map +1 -1
- package/dist/lib/layer.js +1 -0
- package/dist/lib/layer.js.map +1 -1
- package/dist/passes/draw-layers-pass.d.ts +2 -0
- package/dist/passes/draw-layers-pass.d.ts.map +1 -1
- package/dist/passes/draw-layers-pass.js +3 -0
- package/dist/passes/draw-layers-pass.js.map +1 -1
- package/dist/passes/layers-pass.d.ts +2 -1
- package/dist/passes/layers-pass.d.ts.map +1 -1
- package/dist/passes/layers-pass.js +3 -0
- package/dist/passes/layers-pass.js.map +1 -1
- package/dist/passes/pick-layers-pass.d.ts +5 -2
- package/dist/passes/pick-layers-pass.d.ts.map +1 -1
- package/dist/passes/pick-layers-pass.js +3 -2
- package/dist/passes/pick-layers-pass.js.map +1 -1
- package/dist/shaderlib/project/project.glsl.d.ts.map +1 -1
- package/dist/shaderlib/project/project.glsl.js +3 -0
- package/dist/shaderlib/project/project.glsl.js.map +1 -1
- package/dist/utils/deep-merge.d.ts +5 -0
- package/dist/utils/deep-merge.d.ts.map +1 -0
- package/dist/utils/deep-merge.js +31 -0
- package/dist/utils/deep-merge.js.map +1 -0
- package/dist/utils/math-utils.d.ts +4 -0
- package/dist/utils/math-utils.d.ts.map +1 -1
- package/dist/utils/math-utils.js +8 -0
- package/dist/utils/math-utils.js.map +1 -1
- package/dist/viewports/globe-viewport.d.ts +1 -0
- package/dist/viewports/globe-viewport.d.ts.map +1 -1
- package/dist/viewports/globe-viewport.js +1 -1
- package/dist/viewports/globe-viewport.js.map +1 -1
- package/dist/viewports/orbit-viewport.d.ts.map +1 -1
- package/dist/viewports/orbit-viewport.js +7 -2
- package/dist/viewports/orbit-viewport.js.map +1 -1
- package/dist/viewports/orthographic-viewport.d.ts +8 -2
- package/dist/viewports/orthographic-viewport.d.ts.map +1 -1
- package/dist/viewports/orthographic-viewport.js.map +1 -1
- package/dist/views/orthographic-view.d.ts +38 -4
- package/dist/views/orthographic-view.d.ts.map +1 -1
- package/dist/views/orthographic-view.js.map +1 -1
- package/dist/views/view.d.ts.map +1 -1
- package/dist/views/view.js +2 -8
- package/dist/views/view.js.map +1 -1
- package/dist.min.js +220 -144
- package/package.json +9 -9
- package/src/controllers/controller.ts +23 -9
- package/src/controllers/first-person-controller.ts +18 -8
- package/src/controllers/globe-controller.ts +89 -5
- package/src/controllers/map-controller.ts +105 -56
- package/src/controllers/orbit-controller.ts +147 -13
- package/src/controllers/orthographic-controller.ts +417 -41
- package/src/controllers/view-state.ts +8 -1
- package/src/debug/loggers.ts +1 -5
- package/src/effects/lighting/lighting-effect.ts +20 -8
- package/src/lib/attribute/attribute-manager.ts +1 -0
- package/src/lib/deck-picker.ts +18 -4
- package/src/lib/deck-renderer.ts +17 -3
- package/src/lib/deck.ts +19 -3
- package/src/lib/layer.ts +1 -0
- package/src/passes/draw-layers-pass.ts +5 -0
- package/src/passes/layers-pass.ts +5 -1
- package/src/passes/pick-layers-pass.ts +8 -4
- package/src/shaderlib/project/project.glsl.ts +3 -0
- package/src/utils/deep-merge.ts +33 -0
- package/src/utils/math-utils.ts +12 -0
- package/src/viewports/globe-viewport.ts +1 -1
- package/src/viewports/orbit-viewport.ts +8 -2
- package/src/viewports/orthographic-viewport.ts +8 -2
- package/src/views/orthographic-view.ts +38 -4
- 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
|
|
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
|
-
|
|
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.
|
|
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
|
|
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 {
|
|
387
|
+
const {maxRotationX, minRotationX, rotationOrbit} = props;
|
|
380
388
|
|
|
381
|
-
props.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
|
}
|