UNPKG

s2maps-gpu

Version:

S2 Maps GPU - An open source, high-performance, and GPU-accelerated map engine for rendering large-scale, interactive maps.

542 lines (541 loc) 19.9 kB
import type { AnimationDirections } from 'ui/camera/animator.js'; import type { ColorMode } from 's2/s2Map.js'; import type { Glyph } from 'workers/process/glyph/familySource.js'; import type { ImageSourceMetadata } from './source/imageSource.js'; import type { MapOptions } from 'ui/s2mapUI.js'; import type { MarkerDefinition } from './source/markerSource.js'; import type { UrlMap } from 'util/index.js'; import type { UserTouchEvent } from 'ui/camera/dragPan.js'; import type { View } from 'ui/camera/projector/index.js'; import type { Analytics, Attributions, LayerDefinition, Projection, Source, StyleDefinition, StylePackage } from 'style/style.spec.js'; import type { BBox, Face, Properties, S2CellId } from 'gis-tools/index.js'; import type { GlyphImages, GlyphMetadata } from './source/glyphSource.js'; /** S2CellIDs of tiles e.g. ['204n', '1003n', '1245n', ...] */ export type CancelTileRequest = number[]; /** Tracks the map who made the request */ export interface MapID { mapID: string; } /** Parent Layer Information. Layer indexes effected by this parent tile */ export interface ParentLayer { face: Face; zoom: number; i: number; j: number; id: S2CellId; layerIndexes: number[]; time?: number; } /** Parent Layer Information. Layer indexes effected by this parent tile */ export type ParentLayers = Record<string | number, ParentLayer>; /** Tile Request */ export interface TileRequest { id: S2CellId; face: Face; zoom: number; i: number; j: number; type: Projection; bbox: BBox; division: number; time?: number; parent?: ParentLayer; layerIndexes?: number[]; } /** Interactive Object sub properties */ export interface InteractiveObject extends Properties { __id: number; __cursor: string; __name: string; __source: string; __layer: string; } /** Canvas message shipping the canvas element from the front end to the map worker */ export interface CanvasMessage { type: 'canvas'; options: MapOptions; canvas: HTMLCanvasElement; id: string; } /** Resize message sent from the front end to the map worker */ export interface ResizeMessage { type: 'resize'; width: number; height: number; } /** Scroll message sent from the front end to the map worker */ export interface ScrollMessage { type: 'scroll'; deltaY: number; clientX: number; clientY: number; rect: { left: number; top: number; width: number; height: number; }; } /** Mouse down message sent from the front end to the map worker */ export interface MousedownMessage { type: 'mousedown'; } /** Mouse up message sent from the front end to the map worker */ export interface MouseupMessage { type: 'mouseup'; clientX: number; clientY: number; rect: { left: number; top: number; width: number; height: number; }; } /** Mouse move message sent from the front end to the map worker */ export interface MousemoveMessage { type: 'mousemove'; movementX: number; movementY: number; } /** Canvas mouse move message sent from the front end to the map worker */ export interface CanvasMousemoveMessage { type: 'canvasmousemove'; x: number; y: number; } /** Touch start message sent from the front end to the map worker */ export interface TouchstartMessage { type: 'touchstart'; touchEvent: UserTouchEvent; } /** Touch end message sent from the front end to the map worker */ export interface TouchendMessage { type: 'touchend'; touchEvent: UserTouchEvent; } /** Touch move message sent from the front end to the map worker */ export interface TouchmoveMessage { type: 'touchmove'; touchEvent: UserTouchEvent; } /** Navigation message sent from the front end to the map worker */ export interface NavMessage { type: 'nav'; ctrl: 'zoomIn' | 'zoomOut'; lon?: number; lat?: number; } /** Mouse up compass message sent from the front end to the map worker */ export interface MouseupCompassMessage { type: 'mouseupCompass'; } /** Reset compass message sent from the front end to the map worker */ export interface ResetCompassMessage { type: 'resetCompass'; } /** Color mode message sent from the front end to the map worker */ export interface ColorModeMessage { type: 'colorMode'; mode: ColorMode; } /** Set style message sent from the front end to the map worker */ export interface SetStyleMessage { type: 'setStyle'; style: StyleDefinition; ignorePosition: boolean; } /** Update style message sent from the front end to the map worker */ export interface UpdateStyleMessage { type: 'updateStyle'; style: StyleDefinition; } /** Jump to message sent from the front end to the map worker */ export interface JumpToMessage { type: 'jumpTo'; view: View; } /** Ease to message sent from the front end to the map worker */ export interface EaseToMessage { type: 'easeTo'; directions?: AnimationDirections; } /** Fly to message sent from the front end to the map worker */ export interface FlyToMessage { type: 'flyTo'; directions?: AnimationDirections; } /** Move state message sent from the front end to the map worker */ export interface MoveStateMessage { type: 'moveState'; state: boolean; } /** Zoom state message sent from the front end to the map worker */ export interface ZoomStateMessage { type: 'zoomState'; state: boolean; } /** Screenshot request message sent from the front end to the map worker */ export interface ScreenshotMessage { type: 'screenshot'; } /** Await rendered message sent from the front end to the map worker */ export interface AwaitRenderedMessage { type: 'awaitRendered'; } /** Reset source message sent from the front end to the map worker */ export interface ResetSourceMessage { type: 'resetSource'; sourceNames: Array<[sourceName: string, href: string | undefined]>; keepCache: boolean; awaitReplace: boolean; } /** Clear source message sent from the front end to the map worker */ export interface ClearSourceMessage { type: 'clearSource'; sourceNames: string[]; } /** Add layer message sent from the front end to the map worker */ export interface AddLayerMessage { type: 'addLayer'; layer: LayerDefinition; nameIndex?: number | string; } /** Update layer message sent from the front end to the map worker */ export interface UpdateLayerMessage { type: 'updateLayer'; layer: LayerDefinition; nameIndex: number | string; fullUpdate: boolean; } /** Delete layer message sent from the front end to the map worker */ export interface DeleteLayerMessage { type: 'deleteLayer'; nameIndex: number | string; } /** Reorder layers message sent from the front end to the map worker */ export interface ReorderLayersMessage { type: 'reorderLayers'; layerChanges: Record<number, number>; } /** Delete message sent from the front end to the map worker */ export interface DeleteMessage { type: 'delete'; } /** Message sent from the front end to the map worker */ export type S2MapMessage = CanvasMessage | ResizeMessage | ScrollMessage | MousedownMessage | MouseupMessage | MousemoveMessage | CanvasMousemoveMessage | TouchstartMessage | TouchendMessage | TouchmoveMessage | NavMessage | UpdateCompassMessage | MouseupCompassMessage | ResetCompassMessage | ColorModeMessage | SetStyleMessage | UpdateStyleMessage | JumpToMessage | EaseToMessage | FlyToMessage | MoveStateMessage | ZoomStateMessage | ScreenshotMessage | AwaitRenderedMessage | ResetSourceMessage | ClearSourceMessage | AddLayerMessage | UpdateLayerMessage | DeleteLayerMessage | ReorderLayersMessage | DeleteMessage; /** Add markers message sent from the front end to the source worker */ export interface AddMarkersMessage extends MapID { type: 'addMarkers'; markers: MarkerDefinition[]; sourceName: string; } /** Delete markers message sent from the front end to the source worker */ export interface DeleteMarkersMessage extends MapID { type: 'deleteMarkers'; ids: number[]; sourceName: string; } /** Add source message sent from the front end to the source worker */ export interface AddSourceMessage extends MapID { type: 'addSource'; sourceName: string; source: Source; tileRequest: TileRequest[]; } /** Delete source message sent from the front end to the source worker */ export interface DeleteSourceMessage extends MapID { type: 'deleteSource'; sourceNames: string[]; } /** Messages sent from the front end to the source worker */ export type S2MapToSourceMessage = AddMarkersMessage | DeleteMarkersMessage | DeleteSourceMessage; /** Tile request message sent from the map worker to the source worker */ export interface TileRequestMessage extends MapID { type: 'tilerequest'; tiles: TileRequest[]; sources: Array<[sourceName: string, href: string | undefined]>; } /** Time request message sent from the map worker to the source worker */ export interface TimeRequestMessage extends MapID { type: 'timerequest'; tiles: TileRequest[]; sourceNames: string[]; } /** Messages sent from the map worker to the source worker */ export interface MouseEnterMessage extends MapID { type: 'mouseenter'; /** The features that the mouse just "entered" into */ features: InteractiveObject[]; /** All features including features "entered" in previous frames */ currentFeatures: InteractiveObject[]; } /** Messages sent from the map worker to the source worker */ export interface MouseLeaveMessage extends MapID { type: 'mouseleave'; /** The features that the mouse just "left" */ features: InteractiveObject[]; /** All features including features "left" in previous frames */ currentFeatures: InteractiveObject[]; } /** Messages sent from the map worker to the source worker */ export interface MouseClickMessage extends MapID { type: 'click'; features: InteractiveObject[]; lon: number; lat: number; } /** View message sent from the map worker to the front end */ export interface ViewMessage extends MapID { type: 'view'; view: Required<View>; } /** Requesting a style from the map worker to the source worker */ export interface RequestStyleMessage extends MapID { type: 'requestStyle'; style: string; analytics: Analytics; apiKey?: string; urlMap?: UrlMap; } /** Style request message sent from the map worker to the front end */ export interface StyleMessage extends MapID { type: 'style'; style: StylePackage; } /** Update compass message sent from the map worker to the front end */ export interface UpdateCompassMessage extends MapID { type: 'updateCompass'; bearing: number; pitch: number; } /** Add layer message sent from the map worker to the source worker */ export interface AddLayerMessageGL extends MapID { type: 'addLayer'; layer: LayerDefinition; index?: number; tileRequest: TileRequest[]; } /** Delete layer message sent from the map worker to the source worker */ export interface DeleteLayerMessageGL extends MapID { type: 'deleteLayer'; index: number; } /** Reorder layers message sent from the map worker to the source worker */ export interface ReorderLayersMessageGL extends MapID { type: 'reorderLayers'; layerChanges: Record<number, number>; } /** Screenshot message sent from the map worker to the front end */ export interface ScreenshotMessageGL extends MapID { type: 'screenshot'; screen: ArrayBufferLike; } /** Rendered message sent from the map worker to the front end */ export interface RenderedMessageGL extends MapID { type: 'rendered'; } /** Ready message sent from the map worker to the front end */ export interface ReadyMessageGL extends MapID { type: 'ready'; } /** Collection of messages that can be sent from the map worker to the front end */ export type MapGLMessage = TileRequestMessage | TimeRequestMessage | MouseEnterMessage | MouseLeaveMessage | MouseClickMessage | ViewMessage | RequestStyleMessage | StyleMessage | UpdateCompassMessage | AddLayerMessageGL | DeleteLayerMessageGL | ReorderLayersMessageGL | ScreenshotMessageGL | RenderedMessageGL | ReadyMessageGL; /** Collection of messages that can be sent from the map worker to the source worker */ export type MapGLToSourceMessage = RequestStyleMessage | StyleMessage | TileRequestMessage | TimeRequestMessage | AddLayerMessageGL | DeleteLayerMessageGL | ReorderLayersMessageGL; /** Attribution message sent from the source worker to the front-end */ export interface AttributionsMessage extends MapID { type: 'attributions'; attributions: Attributions; } /** Style message sent from the source worker to the front-end */ export interface SourceSetStyleMessage extends MapID { type: 'setStyle'; style: StyleDefinition; ignorePosition: boolean; } /** Sprite image message sent from the source worker to the front-end */ export interface SpriteImageMessage extends MapID { type: 'spriteimage'; name: string; offsetX: number; offsetY: number; width: number; height: number; maxHeight: number; image: ImageBitmap; } /** Flush message sent from the source worker to the front-end */ export interface SourceFlushMessage extends MapID { type: 'flush'; from: 'source'; tileID: S2CellId; layersToBeLoaded: Set<number>; } /** Collection of messages that can be sent from the source worker to the front-end */ export type SourceWorkerMessage = AttributionsMessage | SourceSetStyleMessage | SpriteImageMessage | SourceFlushMessage; /** Worker message base. Used in most messages from the tile worker to the source worker or front-end */ export interface WorkerMessageBase extends MapID { tileID: S2CellId; sourceName: string; } /** Fill render data from the Tile Worker to the front-end */ export interface FillData extends WorkerMessageBase { type: 'fill'; vertexBuffer: ArrayBuffer; indexBuffer: ArrayBuffer; idBuffer: ArrayBuffer; codeTypeBuffer: ArrayBuffer; featureGuideBuffer: ArrayBuffer; } /** Line render data from the Tile Worker to the front-end */ export interface LineData extends WorkerMessageBase { type: 'line'; vertexBuffer: ArrayBuffer; lengthSoFarBuffer: ArrayBuffer; featureGuideBuffer: ArrayBuffer; } /** Glyph render data from the Tile Worker to the front-end */ export interface GlyphData extends WorkerMessageBase { type: 'glyph'; glyphFilterBuffer: ArrayBuffer; glyphFilterIDBuffer: ArrayBuffer; glyphQuadBuffer: ArrayBuffer; glyphQuadIDBuffer: ArrayBuffer; glyphColorBuffer: ArrayBuffer; featureGuideBuffer: ArrayBuffer; } /** Glyph image data from the Tile Worker to the front-end */ export interface GlyphImageData extends MapID { type: 'glyphimages'; maxHeight: number; images: GlyphImages; } /** Raster data guide shipped from the Tile Worker to the front-end */ export interface RasterDataGuide { code: number[]; layerIndex: number; } /** Raster data shipped from the Tile Worker to the front-end */ export interface RasterData extends WorkerMessageBase { type: 'raster'; image: ImageBitmap; size: number; featureGuides: RasterDataGuide[]; } /** Hillshade data shipped from the Tile Worker to the front-end */ export interface HillshadeData extends WorkerMessageBase { type: 'hillshade'; image: ImageBitmap; size: number; featureGuides: RasterDataGuide[]; } /** Sensor data shipped from the Tile Worker to the front-end */ export interface SensorData extends WorkerMessageBase { type: 'sensor'; image: ImageBitmap; size: number; featureGuides: RasterDataGuide[]; time: number; } /** Point data shipped from the Tile Worker to the front-end */ export interface PointData extends WorkerMessageBase { type: 'point'; vertexBuffer: ArrayBuffer; idBuffer: ArrayBuffer; featureGuideBuffer: ArrayBuffer; } /** Heatmap data shipped from the Tile Worker to the front-end */ export interface HeatmapData extends WorkerMessageBase { type: 'heatmap'; vertexBuffer: ArrayBuffer; weightBuffer: ArrayBuffer; idBuffer: ArrayBuffer; featureGuideBuffer: ArrayBuffer; } /** Interactive data shipped from the Tile Worker to the front-end */ export interface InteractiveData extends WorkerMessageBase { type: 'interactive'; interactiveGuideBuffer: ArrayBuffer; interactiveDataBuffer: ArrayBuffer; } /** Tile Flush message shipped from the Tile Worker to the front-end */ export interface TileFlushMessage extends MapID { type: 'flush'; from: 'tile'; tileID: S2CellId; sourceName: string; deadLayers: number[]; } /** Temporal source data shipped from the Tile Worker to the front-end */ export interface TimeSourceData extends WorkerMessageBase { type: 'timesource'; interval: number; } /** All rendering type data grouped */ export type PainterData = RasterData | HillshadeData | SensorData | FillData | LineData | PointData | HeatmapData | GlyphData; /** Tile worker messages that are shipped from a Tile Worker to the front end */ export type TileWorkerMessage = FillData | LineData | GlyphData | GlyphImageData | SpriteImageMessage | RasterData | HillshadeData | SensorData | PointData | HeatmapData | InteractiveData | TileFlushMessage | TimeSourceData; /** TILE WORKER TO SOURCE WORKER MESSAGES */ /** Glyph Request asked by the Tile Worker to the Source Worker */ export interface GlyphRequestMessage extends MapID { type: 'glyphrequest'; workerID: number; reqID: string; glyphList: Record<string, string[]>; } /** Messages the Tile Worker's ship to the Source Worker */ export type TileWorkerToSourceWorkerMessage = GlyphRequestMessage; /** Add layer message sent from the Source Worker to the Tile Worker */ export interface AddLayerMessageTileWorker extends MapID { type: 'addLayer'; layer: LayerDefinition; index: number; } /** Vector tile message sent from the Source Worker to the Tile Worker */ export interface VectorMessage extends MapID { type: 'vector'; tile: TileRequest; sourceName: string; data: ArrayBuffer; } /** Raster tile message sent from the Source Worker to the Tile Worker */ export interface RasterMessage extends MapID { type: 'raster'; tile: TileRequest; sourceName: string; data: ArrayBuffer; size: number; } /** JSON data message sent from the Source Worker to the Tile Worker */ export interface JSONDataMessage extends MapID { type: 'jsondata'; tile: TileRequest; sourceName: string; data: ArrayBuffer; } /** Glyph metadata message sent from the Source Worker to the Tile Worker */ export interface GlyphMetadataMessage extends MapID { type: 'glyphmetadata'; glyphMetadata: GlyphMetadata[]; imageMetadata: ImageSourceMetadata[]; } /** Glyph response message sent from the Source Worker to the Tile Worker */ export interface GlyphResponseMessage extends MapID { type: 'glyphresponse'; reqID: string; glyphMetadata: Glyph[]; familyName: string; } /** Message from the worker pool to the tile workers so they can track their own id and total tile worker count */ export interface WorkerPoolPortMessage { type: 'port'; id: number; totalWorkers: number; } /** List of messages that are sent from the WorkerPool */ export type WorkerPoolMessage = WorkerPoolPortMessage; /** List of messages that are sent from the SourceWorker */ export type SourceWorkerMessages = TileWorkerToSourceWorkerMessage | S2MapToSourceMessage | WorkerPoolMessage | MapGLToSourceMessage; /** List of messages that are sent from the TileWorker */ export type TileWorkerMessages = WorkerPoolMessage | StyleMessage | VectorMessage | RasterMessage | JSONDataMessage | GlyphResponseMessage | GlyphMetadataMessage | AddLayerMessageTileWorker | DeleteLayerMessageGL | ReorderLayersMessageGL;