Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions modules/core/src/viewports/first-person-viewport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,12 @@ export type FirstPersonViewportOptions = {
};

export default class FirstPersonViewport extends Viewport {
static displayName = 'FirstPersonViewport';

longitude?: number;
latitude?: number;
pitch: number;
bearing: number;

constructor(props: FirstPersonViewportOptions) {
// TODO - push direction handling into Matrix4.lookAt
Expand Down Expand Up @@ -75,5 +79,7 @@ export default class FirstPersonViewport extends Viewport {

this.latitude = latitude;
this.longitude = longitude;
this.pitch = pitch;
this.bearing = bearing;
}
}
10 changes: 7 additions & 3 deletions modules/core/src/viewports/globe-viewport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,12 @@ export type GlobeViewportOptions = {
};

export default class GlobeViewport extends Viewport {
longitude!: number;
latitude!: number;
resolution!: number;
static displayName = 'GlobeViewport';

longitude: number;
latitude: number;
fovy: number;
resolution: number;

constructor(opts: GlobeViewportOptions = {}) {
const {
Expand Down Expand Up @@ -129,6 +132,7 @@ export default class GlobeViewport extends Viewport {
this.scale = scale;
this.latitude = latitude;
this.longitude = longitude;
this.fovy = fovy;
this.resolution = resolution;
}

Expand Down
10 changes: 10 additions & 0 deletions modules/core/src/viewports/orbit-viewport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,13 @@ export type OrbitViewportOptions = {
};

export default class OrbitViewport extends Viewport {
static displayName = 'OrbitViewport';

projectedCenter: number[];
orbitAxis: 'Y' | 'Z';
rotationOrbit: number;
rotationX: number;
target: [number, number, number];

constructor(props: OrbitViewportOptions) {
const {
Expand Down Expand Up @@ -125,6 +131,10 @@ export default class OrbitViewport extends Viewport {
zoom
});

this.target = target;
this.orbitAxis = orbitAxis;
this.rotationX = rotationX;
this.rotationOrbit = rotationOrbit;
this.projectedCenter = this.project(this.center);
}

Expand Down
18 changes: 16 additions & 2 deletions modules/core/src/viewports/orthographic-viewport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,10 @@ export type OrthographicViewportOptions = {
/** The zoom level of the viewport. `zoom: 0` maps one unit distance to one pixel on screen, and increasing `zoom` by `1` scales the same object to twice as large.
* To apply independent zoom levels to the X and Y axes, supply an array `[zoomX, zoomY]`. Default `0`. */
zoom?: number | [number, number];
/** Independent zoom along the X axis. Overrides `zoom`. */
zoomX?: number;
/** Independent zoom along the Y axis. Overrides `zoom`. */
zoomY?: number;
/** Padding around the viewport, in pixels. */
padding?: Padding | null;
/** Distance of near clipping plane. Default `0.1`. */
Expand All @@ -75,6 +79,12 @@ export type OrthographicViewportOptions = {
};

export default class OrthographicViewport extends Viewport {
static displayName = 'OrthographicViewport';

target: [number, number, number] | [number, number];
zoomX: number;
zoomY: number;

constructor(props: OrthographicViewportOptions) {
const {
width,
Expand All @@ -86,8 +96,8 @@ export default class OrthographicViewport extends Viewport {
padding = null,
flipY = true
} = props;
const zoomX = Array.isArray(zoom) ? zoom[0] : zoom;
const zoomY = Array.isArray(zoom) ? zoom[1] : zoom;
const zoomX = props.zoomX ?? (Array.isArray(zoom) ? zoom[0] : zoom);
const zoomY = props.zoomY ?? (Array.isArray(zoom) ? zoom[1] : zoom);
const zoom_ = Math.min(zoomX, zoomY);
const scale = Math.pow(2, zoom_);

Expand Down Expand Up @@ -119,6 +129,10 @@ export default class OrthographicViewport extends Viewport {
zoom: zoom_,
distanceScales
});

this.target = target;
this.zoomX = zoomX;
this.zoomY = zoomY;
}

projectFlat([X, Y]: number[]): [number, number] {
Expand Down
92 changes: 92 additions & 0 deletions test/modules/core/viewports/conformance.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import test from 'tape-promise/tape';
import {
type Viewport,
WebMercatorViewport,
OrthographicViewport,
OrbitViewport,
_GlobeViewport as GlobeViewport,
FirstPersonViewport
} from '@deck.gl/core';

test('Viewport#recreate', t => {
const TEST_CASES = [
new WebMercatorViewport({
width: 100,
height: 100
}),
new WebMercatorViewport({
width: 400,
height: 300,
longitude: -122.4,
latitude: 37.8,
fovy: 50,
zoom: 12,
pitch: 24,
bearing: -160,
position: [0, 0, 2]
}),
new WebMercatorViewport({
width: 400,
height: 300,
longitude: -122.4,
latitude: 37.8,
zoom: 12,
nearZ: 0.01,
farZMultiplier: 10
}),
new OrbitViewport({
width: 100,
height: 100
}),
new OrbitViewport({
width: 400,
height: 300,
target: [-10.24, 2833, 47.2],
orbitAxis: 'Y',
rotationX: 45,
rotationOrbit: -111,
zoom: -3
}),
new OrthographicViewport({
width: 100,
height: 100
}),
new OrthographicViewport({
width: 400,
height: 300,
target: [100, 500],
zoom: [1, -4]
}),
new GlobeViewport({
width: 100,
height: 100
}),
new GlobeViewport({
width: 400,
height: 300,
longitude: -122.4,
latitude: 37.8,
fovy: 50,
zoom: 12
}),
new FirstPersonViewport({
width: 100,
height: 100
}),
new FirstPersonViewport({
width: 400,
height: 300,
longitude: -122.4,
latitude: 37.8,
pitch: 35,
bearing: -140,
focalDistance: 2
})
];
for (const viewport of TEST_CASES) {
const ViewportType = viewport.constructor as {new (props: unknown): Viewport};
const clone = new ViewportType({...viewport});
t.ok(viewport.equals(clone), String(viewport.id));
}
t.end();
});
1 change: 1 addition & 0 deletions test/modules/core/viewports/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ import './viewport.spec';
import './globe-viewport.spec';
import './web-mercator-project-unproject.spec';
import './web-mercator-viewport.spec';
import './conformance.spec';
Loading