s2maps-gpu
Version:
S2 Maps GPU - An open source, high-performance, and GPU-accelerated map engine for rendering large-scale, interactive maps.
415 lines (414 loc) • 14.8 kB
TypeScript
import type { BBox } from 'gis-tools/index.js';
import type { Projector } from 'ui/camera/projector/index.js';
import type S2MapUI from 'ui/s2mapUI.js';
import type { SensorTextureDefinition } from 'ui/camera/timeCache.js';
import type { TileGPU as Tile } from 'source/tile.spec.js';
import type TimeCache from 'ui/camera/timeCache.js';
import type { UrlMap } from 'util/index.js';
import type { WebGPUContext } from '../context/index.js';
import type { FillData, GlyphData, HeatmapData, HillshadeData, LineData, PainterData, PointData, RasterData, SensorData } from 'workers/worker.spec.js';
import type { FillDefinition, FillStyle, FillWorkflowLayerGuideGPU, GlyphDefinition, GlyphStyle, GlyphWorkflowLayerGuideGPU, HeatmapDefinition, HeatmapStyle, HeatmapWorkflowLayerGuideGPU, HillshadeDefinition, HillshadeStyle, HillshadeWorkflowLayerGuideGPU, LayerDefinitionBase, LineDefinition, LineStyle, LineWorkflowLayerGuideGPU, PointDefinition, PointStyle, PointWorkflowLayerGuideGPU, RasterDefinition, RasterStyle, RasterWorkflowLayerGuideGPU, SensorDefinition, SensorStyle, SensorWorkflowLayerGuideGPU, ShadeDefinition, ShadeStyle, ShadeWorkflowLayerGuideGPU, StyleDefinition } from 'style/style.spec.js';
/** Mask Source */
export interface MaskSource {
type: 'mask';
vertexBuffer: GPUBuffer;
indexBuffer: GPUBuffer;
codeTypeBuffer: GPUBuffer;
count: number;
offset: number;
}
/** Tile Mask Source */
export interface TileMaskSource extends MaskSource {
bindGroup: GPUBindGroup;
fillPatternBindGroup: GPUBindGroup;
uniformBuffer: GPUBuffer;
positionBuffer: GPUBuffer;
draw: () => void;
destroy: () => void;
}
/** Fill Source */
export interface FillSource {
type: 'fill';
vertexBuffer: GPUBuffer;
indexBuffer: GPUBuffer;
idBuffer: GPUBuffer;
codeTypeBuffer: GPUBuffer;
destroy: () => void;
}
/** Glyph Source */
export interface GlyphSource {
type: 'glyph';
glyphFilterBuffer: GPUBuffer;
glyphQuadBuffer: GPUBuffer;
glyphQuadIndexBuffer: GPUBuffer;
glyphColorBuffer: GPUBuffer;
indexOffset: number;
filterLength: number;
destroy: () => void;
}
/** Heatmap Source */
export interface HeatmapSource {
type: 'heatmap';
vertexBuffer: GPUBuffer;
weightBuffer: GPUBuffer;
destroy: () => void;
}
/** Line Source */
export interface LineSource {
type: 'line';
vertexBuffer: GPUBuffer;
lengthSoFarBuffer: GPUBuffer;
destroy: () => void;
}
/** Point Source */
export interface PointSource {
type: 'point';
vertexBuffer: GPUBuffer;
idBuffer: GPUBuffer;
destroy: () => void;
}
/** Raster Source */
export interface RasterSource {
type: 'raster';
texture: GPUTexture;
vertexBuffer: GPUBuffer;
indexBuffer: GPUBuffer;
count: number;
offset: number;
destroy: () => void;
}
/** Sensor Source */
export interface SensorSource {
texture?: GPUTexture;
delete?: undefined;
destroy: () => void;
}
/** All possible feature Sources */
export type FeatureSource = MaskSource | FillSource | LineSource | PointSource | HeatmapSource | RasterSource | GlyphSource;
/** All possible Layer Guides */
export type LayerGuides = FillWorkflowLayerGuideGPU | GlyphWorkflowLayerGuideGPU | HeatmapWorkflowLayerGuideGPU | HillshadeWorkflowLayerGuideGPU | LineWorkflowLayerGuideGPU | PointWorkflowLayerGuideGPU | RasterWorkflowLayerGuideGPU | SensorWorkflowLayerGuideGPU | ShadeWorkflowLayerGuideGPU;
/** Base Feature used by all features */
export interface FeatureBase {
tile: Tile;
parent?: Tile;
layerGuide: LayerGuides;
featureCode: number[];
bindGroup: GPUBindGroup;
bounds?: BBox;
draw: () => void;
destroy: () => void;
duplicate?: (tile: Tile, parent?: Tile, bounds?: BBox) => FeatureBase;
compute?: () => void;
updateSharedTexture?: () => void;
}
/** Fill Feature */
export interface FillFeature extends FeatureBase {
workflow: FillWorkflow;
type: 'fill';
maskLayer: boolean;
source: FillSource | MaskSource;
layerGuide: FillWorkflowLayerGuideGPU;
count: number;
offset: number;
featureCodeBuffer: GPUBuffer;
fillTexturePositions: GPUBuffer;
fillPatternBindGroup: GPUBindGroup;
fillInteractiveBindGroup?: GPUBindGroup;
duplicate: (tile: Tile, parent?: Tile) => FillFeature;
}
/** Glyph Type */
export type GlyphType = 'text' | 'icon';
/** Glyph Feature */
export interface GlyphFeature extends FeatureBase {
type: 'glyph';
source: GlyphSource;
layerGuide: GlyphWorkflowLayerGuideGPU;
count: number;
offset: number;
filterCount: number;
filterOffset: number;
isPath: boolean;
isIcon: boolean;
glyphBindGroup: GPUBindGroup;
glyphStrokeBindGroup: GPUBindGroup;
glyphFilterBindGroup: GPUBindGroup;
glyphInteractiveBindGroup: GPUBindGroup;
glyphUniformBuffer: GPUBuffer;
duplicate: (tile: Tile, parent?: Tile, bounds?: BBox) => GlyphFeature;
}
/** Heatmap Feature */
export interface HeatmapFeature extends FeatureBase {
type: 'heatmap';
source: HeatmapSource;
layerGuide: HeatmapWorkflowLayerGuideGPU;
count: number;
offset: number;
heatmapBindGroup: GPUBindGroup;
duplicate: (tile: Tile, parent?: Tile, bounds?: BBox) => HeatmapFeature;
}
/** Line Feature */
export interface LineFeature extends FeatureBase {
type: 'line';
source: LineSource;
layerGuide: LineWorkflowLayerGuideGPU;
count: number;
offset: number;
cap: number;
lineBindGroup: GPUBindGroup;
duplicate: (tile: Tile, parent?: Tile) => LineFeature;
}
/** Point Feature */
export interface PointFeature extends FeatureBase {
type: 'point';
source: PointSource;
layerGuide: PointWorkflowLayerGuideGPU;
count: number;
offset: number;
pointBindGroup: GPUBindGroup;
pointInteractiveBindGroup: GPUBindGroup;
duplicate: (tile: Tile, parent?: Tile, bounds?: BBox) => PointFeature;
}
/** Raster Feature */
export interface RasterFeature extends FeatureBase {
type: 'raster';
source: RasterSource;
layerGuide: RasterWorkflowLayerGuideGPU;
fadeStartTime: number;
rasterBindGroup: GPUBindGroup;
duplicate: (tile: Tile, parent?: Tile) => RasterFeature;
}
/** Sensor Feature */
export interface SensorFeature extends FeatureBase {
type: 'sensor';
layerGuide: SensorWorkflowLayerGuideGPU;
fadeStartTime: number;
colorRamp: WebGLTexture;
getTextures: () => SensorTextureDefinition;
duplicate: (tile: Tile, parent?: Tile) => SensorFeature;
}
/** Hillshade Feature */
export interface HillshadeFeature extends FeatureBase {
type: 'hillshade';
source: RasterSource;
layerGuide: HillshadeWorkflowLayerGuideGPU;
fadeStartTime: number;
hillshadeBindGroup: GPUBindGroup;
duplicate: (tile: Tile, parent?: Tile) => HillshadeFeature;
}
/** Shade Feature */
export interface ShadeFeature extends FeatureBase {
tile: Tile;
type: 'shade';
maskLayer: boolean;
source: MaskSource;
layerGuide: ShadeWorkflowLayerGuideGPU;
count: number;
offset: number;
}
/** List of all features that can be rendered */
export type Features = FillFeature | GlyphFeature | HeatmapFeature | LineFeature | PointFeature | RasterFeature | SensorFeature | ShadeFeature | HillshadeFeature;
/** List of all workflows that can draw features */
export interface Workflows {
fill?: FillWorkflow;
glyph?: GlyphWorkflow;
heatmap?: HeatmapWorkflow;
line?: LineWorkflow;
point?: PointWorkflow;
raster?: RasterWorkflow;
hillshade?: HillshadeWorkflow;
sensor?: SensorWorkflow;
shade?: ShadeWorkflow;
wallpaper?: WallpaperWorkflow;
skybox?: SkyboxWorkflow;
background?: WallpaperWorkflow | SkyboxWorkflow;
}
/** Import tool for workflows that can be loaded dynamically */
export interface WorkflowImports {
fill: () => FillWorkflow;
glyph: () => GlyphWorkflow;
heatmap: () => HeatmapWorkflow;
line: () => LineWorkflow;
point: () => PointWorkflow;
raster: () => RasterWorkflow;
hillshade: () => HillshadeWorkflow;
sensor: () => RasterWorkflow;
shade: () => ShadeWorkflow;
wallpaper: () => WallpaperWorkflow;
skybox: () => SkyboxWorkflow;
}
/** Workflow keys */
export type WorkflowKey = keyof Workflow<PainterData>;
/** Workflow types */
export type WorkflowType = 'fill' | 'glyph' | 'heatmap' | 'line' | 'point' | 'raster' | 'hillshade' | 'sensor' | 'shade' | 'skybox' | 'wallpaper';
/** Global workflow wrapper. All workflows share this interface. */
export interface Workflow<T = PainterData> {
context: WebGPUContext;
setup: () => Promise<void>;
buildSource?: (data: T, tile: Tile) => void;
destroy: () => void;
resize?: (width: number, height: number) => void;
}
/**
* Fill Workflow
*
* Draws fills, masks for WebGPU
* Computes interactive features
*/
export interface FillWorkflow extends Workflow<FillData> {
layerGuides: Map<number, FillWorkflowLayerGuideGPU>;
interactivePipeline: GPUComputePipeline;
maskPipeline: GPURenderPipeline;
fillPipeline: GPURenderPipeline;
maskFillPipeline: GPURenderPipeline;
invertPipeline: GPURenderPipeline;
fillInteractiveBindGroupLayout: GPUBindGroupLayout;
draw: (feature: FillFeature) => void;
drawMask: (maskSource: TileMaskSource, feature?: FillFeature) => void;
buildSource: (fillData: FillData, tile: Tile) => void;
buildMaskFeature: (maskLayer: FillDefinition, tile: Tile) => void;
buildLayerDefinition: (layerBase: LayerDefinitionBase, layer: FillStyle) => FillDefinition;
computeInteractive: (feature: FillFeature) => void;
}
/**
* Glyph Workflow
*
* Draws glyphs for WebGPU
* Computes interactive features
*/
export interface GlyphWorkflow extends Workflow<GlyphData> {
module: GPUShaderModule;
layerGuides: Map<number, GlyphWorkflowLayerGuideGPU>;
pipeline: GPURenderPipeline;
testRenderPipeline: GPURenderPipeline;
bboxPipeline: GPUComputePipeline;
testFiltersPipeline: GPUComputePipeline;
interactivePipeline: GPUComputePipeline;
glyphBindGroupLayout: GPUBindGroupLayout;
glyphPipelineLayout: GPUPipelineLayout;
glyphFilterBindGroupLayout: GPUBindGroupLayout;
glyphFilterPipelineLayout: GPUPipelineLayout;
glyphInteractiveBindGroupLayout: GPUBindGroupLayout;
glyphInteractivePiplineLayout: GPUPipelineLayout;
glyphBBoxesBuffer: GPUBuffer;
glyphFilterResultBuffer: GPUBuffer;
buildSource: (glyphData: GlyphData, tile: Tile) => void;
buildLayerDefinition: (layerBase: LayerDefinitionBase, layer: GlyphStyle) => GlyphDefinition;
computeInteractive: (feature: GlyphFeature) => void;
computeFilters: (features: GlyphFeature[]) => void;
draw: (feature: GlyphFeature) => void;
}
/**
* Heatmap Workflow
*
* Draws heatmaps for WebGPU
*/
export interface HeatmapWorkflow extends Workflow<HeatmapData> {
layerGuides: Map<number, HeatmapWorkflowLayerGuideGPU>;
pipeline: GPURenderPipeline;
module: GPUShaderModule;
texturePipeline: GPURenderPipeline;
heatmapBindGroupLayout: GPUBindGroupLayout;
heatmapTextureBindGroupLayout: GPUBindGroupLayout;
buildSource: (heatmapData: HeatmapData, tile: Tile) => void;
buildLayerDefinition: (layerBase: LayerDefinitionBase, layer: HeatmapStyle) => HeatmapDefinition;
textureDraw: (features: HeatmapFeature[]) => HeatmapFeature[] | undefined;
draw: (feature: HeatmapFeature) => void;
}
/**
* Line Workflow
*
* Draws lines for WebGPU
*/
export interface LineWorkflow extends Workflow<LineData> {
layerGuides: Map<number, LineWorkflowLayerGuideGPU>;
pipeline: GPURenderPipeline;
lineBindGroupLayout: GPUBindGroupLayout;
buildSource: (lineData: LineData, tile: Tile) => void;
buildLayerDefinition: (layerBase: LayerDefinitionBase, layer: LineStyle) => LineDefinition;
draw: (feature: LineFeature) => void;
}
/**
* Point Workflow
*
* Draws points for WebGPU
*/
export interface PointWorkflow extends Workflow<PointData> {
layerGuides: Map<number, PointWorkflowLayerGuideGPU>;
pipeline: GPURenderPipeline;
interactivePipeline: GPUComputePipeline;
pointInteractiveBindGroupLayout: GPUBindGroupLayout;
pointBindGroupLayout: GPUBindGroupLayout;
module: GPUShaderModule;
buildSource: (pointData: PointData, tile: Tile) => void;
buildLayerDefinition: (layerBase: LayerDefinitionBase, layer: PointStyle) => PointDefinition;
computeInteractive: (feature: PointFeature) => void;
draw: (feature: PointFeature) => void;
}
/**
* Raster Workflow
*
* Draws rasters for WebGPU
*/
export interface RasterWorkflow extends Workflow<RasterData> {
layerGuides: Map<number, RasterWorkflowLayerGuideGPU>;
pipeline: GPURenderPipeline;
rasterBindGroupLayout: GPUBindGroupLayout;
buildSource: (rasterData: RasterData, tile: Tile) => void;
buildLayerDefinition: (layerBase: LayerDefinitionBase, layer: RasterStyle) => RasterDefinition;
draw: (feature: RasterFeature) => void;
}
/**
* Hillshade Workflow
*
* Draws hillshades for WebGPU
*/
export interface HillshadeWorkflow extends Workflow<HillshadeData> {
layerGuides: Map<number, HillshadeWorkflowLayerGuideGPU>;
pipeline: GPURenderPipeline;
hillshadeBindGroupLayout: GPUBindGroupLayout;
buildSource: (rasterData: HillshadeData, tile: Tile) => void;
buildLayerDefinition: (layerBase: LayerDefinitionBase, layer: HillshadeStyle) => HillshadeDefinition;
draw: (feature: HillshadeFeature) => void;
}
/**
* Sensor Workflow
*
* Draws sensors for WebGPU
*/
export interface SensorWorkflow extends Workflow<SensorData> {
buildSource: (sensorData: SensorData, tile: Tile) => void;
injectTimeCache: (timeCache: TimeCache) => void;
buildLayerDefinition: (layerBase: LayerDefinitionBase, layer: SensorStyle) => SensorDefinition;
draw: (feature: SensorFeature) => void;
}
/**
* Shade Workflow
*
* Draws shadings for WebGPU
*/
export interface ShadeWorkflow extends Workflow<unknown> {
layerGuide?: ShadeWorkflowLayerGuideGPU;
pipeline: GPURenderPipeline;
buildLayerDefinition: (layerBase: LayerDefinitionBase, layer: ShadeStyle) => ShadeDefinition;
buildMaskFeature: (maskLayer: ShadeDefinition, tile: Tile) => void;
draw: (feature: ShadeFeature) => void;
}
/**
* Wallpaper Workflow
*
* Draws wallpapers for WebGPU
*/
export interface WallpaperWorkflow extends Workflow<unknown> {
draw: (feature: Projector) => void;
}
/**
* Skybox Workflow
*
* Draws skyboxes for WebGPU
*/
export interface SkyboxWorkflow extends Workflow<unknown> {
facesReady: number;
ready: boolean;
updateStyle: (style: StyleDefinition, s2mapGL: S2MapUI, urlMap?: UrlMap) => void;
draw: (feature: Projector) => void;
}