s2maps-gpu
Version:
S2 Maps GPU - An open source, high-performance, and GPU-accelerated map engine for rendering large-scale, interactive maps.
166 lines (165 loc) • 6.93 kB
TypeScript
/** STYLE */
import Style from 'style/index.js';
import { Projector } from './projector/index.js';
/** SOURCES */
import Animator from './animator.js';
import Cache from './cache.js';
import DragPan from './dragPan.js';
import TimeCache from './timeCache.js';
/** PAINT */
import type { Painter as GLPainter } from 'gl/painter.spec.js';
import type { Painter as GPUPainter } from 'gpu/painter.spec.js';
import type { MapOptions } from '../s2mapUI.js';
import type S2Map from 's2/s2Map.js';
import type { TileInView } from './projector/index.js';
import type { Combine, TileShared as Tile } from 'source/tile.spec.js';
import type { InteractiveObject, SourceFlushMessage, TileRequest, TileWorkerMessage } from 'workers/worker.spec.js';
import type { S2CellId, VectorPoint } from 'gis-tools/index.js';
import type { StyleDefinition, TimeSeriesStyle } from 'style/style.spec.js';
/** Resize dimensions */
export interface ResizeDimensions {
width: number;
height: number;
}
/** A Shared painter helps with type inference. We essentially don't care which painter we are using for most calls in Camera */
export type SharedPainter = Combine<GLPainter | GPUPainter>;
/**
* # Camera
*
* The camera of the map. Maintains local cache, manages the painter, projector, and handles
* the rendering of the map.
*
* The Camera also handles user interactions, map states, each frame,
* along with any animations that might be in progress.
*
* Any updates that are required are sent to the Style container and any data that shipped here is
* forwarded to the Painter.
*/
export default class Camera<P extends SharedPainter = SharedPainter> {
#private;
readonly parent?: S2Map;
id: string;
_canDraw: boolean;
_interactive: boolean;
style: Style;
projector: Projector;
painter: P;
tileCache: Cache<bigint, Tile>;
timeCache?: TimeCache;
tilesInView: Tile[];
lastTileViewState: number[];
requestQueue: Tile[];
wasDirtyLastFrame: boolean;
/** Denote this mapUI is running in a separate thread */
webworker: boolean;
canMove: boolean;
canZoom: boolean;
dragPan: DragPan;
mouseMoved: boolean;
mousePosition: VectorPoint;
currAnimFunction?: (now: number) => void;
resizeQueued?: ResizeDimensions;
currFeatures: Map<number, InteractiveObject>;
/**
* Initialize the mapUI
* @param options - Map options
* @param canvas - Canvas element we are rendering to
* @param id - Unique identifier for the mapUI
* @param parent - Parent mapUI means this is running on the main thread so we can make direct calls to the parent
*/
constructor(options: MapOptions, canvas: HTMLCanvasElement, id: string, parent?: S2Map);
/**
* Locally called but managed by parent class S2MapsUI
* @param _deltaZ - change in zoom
* @param _deltaX - change in x
* @param _deltaY - change in y
*/
onZoom(_deltaZ: number, _deltaX?: number, _deltaY?: number): void;
/** Locally called but managed by parent class S2MapsUI */
render(): void;
/**
* Given an user defined time series, build the time cache
* @param timeSeries - the time series to build the cache for
*/
buildTimeCache(timeSeries: TimeSeriesStyle): void;
/**
* Set the style for the map
* @param style - the style to use for the painter
* @param ignorePosition - whether to ignore the position set in the style (keep the map where it is)
*/
_setStyle(style: string | StyleDefinition, ignorePosition: boolean): Promise<void>;
/**
* Update the compass position if camera changes were made internally, like an animation or functional update
* @param bearing - The bearing angle in degrees.
* @param pitch - The pitch angle in degrees.
*/
_updateCompass(bearing: number, pitch: number): void;
/**
* Reset the tile cache for the given sources.
* @param sourceNames - The names of the sources to reset the tile cache for.
* @param keepCache - Whether to keep the cache or not. don't delete any tiles, request replacements for all (for s2json since it's locally cached and fast)
* @param awaitReplace - Whether to await the replacement of tiles or not. to avoid flickering (i.e. adding/removing markers), we can wait for an update (from source+tile workers) on how the tile should look
* @returns An array of tile requests that need to be processed to complete the reset for the tile cache for the given sources.
*/
_resetTileCache(sourceNames: string[], keepCache: boolean, awaitReplace: boolean): TileRequest[];
/** Resize the camera and canvas, cleaning up animations */
_resize(): void;
/**
* Set the new mouse position
* @param posX - The x-coordinate of the mouse position
* @param posY - The y-coordinate of the mouse position
*/
_setMousePosition(posX: number, posY: number): void;
/**
* Handle a navigation event
* @param ctrl - The navigation control
* @param lon - The longitude change if provided
* @param lat - The latitude change if provided
*/
_navEvent(ctrl: 'zoomIn' | 'zoomOut', lon?: number, lat?: number): void;
/** Handle a view change */
_onViewUpdate(): void;
/** Handle a mouse move event that occurs on the canvas */
_onCanvasMouseMove(): Promise<void>;
/**
* Animation function for a frame
* @param animator - The animator we pull the current position from
* @param curTime - The current time
*/
_animate(animator: Animator, curTime: number): void;
/** Signal to the painter that it needs to be updated */
_updatePainter(): void;
/**
* Inject data into the painter
* @param data - The data to inject
*/
_injectData(data: TileWorkerMessage | SourceFlushMessage): void;
/**
* Add a time series source
* @param sourceName - the name of the temporal source
* @param interval - the interval position in the source
*/
_addTimeSource(sourceName: string, interval: number): void;
/**
* Get a tile from the cache given an S2CellId
* @param tileID - the id of the tile
* @returns the tile if the cache has it
*/
getTile(tileID: S2CellId): undefined | Tile;
/** @returns the tiles in the current view */
getTiles(): Tile[];
/**
* Given a list of S2CellIDs, create the tiles necessary to render those IDs for future requests
* @param tileIDs - the list of S2CellIDs
*/
createFutureTiles(tileIDs: TileInView[]): void;
/**
* Internal Draw handler.
* - Get the tiles needed for the current frame
* - If any state changes happened since last frame, update the style, painter, and projector as needed
* - Paint the scene
* - If there was movement/zoom change, compute the interactive elements
* - cleanup for the next frame
*/
_draw(): void;
}