import type { BBox } from 'gis-tools/index.js';
import type { GlyphData } from 'workers/worker.spec.js';
import type { TileGPU as Tile } from 'source/tile.spec.js';
import type { WebGPUContext } from '../context/index.js';
import type { GlyphDefinition, GlyphStyle, GlyphWorkflowLayerGuideGPU, LayerDefinitionBase } from 'style/style.spec.js';
import type { GlyphFeature as GlyphFeatureSpec, GlyphSource, GlyphWorkflow as GlyphWorkflowSpec } from './workflow.spec.js';
/** Glyph Feature is a standalone glyph render storage unit that can be drawn to the GPU */
export declare class GlyphFeature implements GlyphFeatureSpec {
    #private;
    workflow: GlyphWorkflowSpec;
    source: GlyphSource;
    tile: Tile;
    layerGuide: GlyphWorkflowLayerGuideGPU;
    count: number;
    offset: number;
    filterCount: number;
    filterOffset: number;
    isPath: boolean;
    isIcon: boolean;
    featureCode: number[];
    glyphUniformBuffer: GPUBuffer;
    glyphBoundsBuffer: GPUBuffer;
    glyphAttributeBuffer: GPUBuffer;
    glyphAttributeNoStrokeBuffer: GPUBuffer;
    featureCodeBuffer: GPUBuffer;
    parent?: Tile | undefined;
    type: "glyph";
    bindGroup: GPUBindGroup;
    glyphBindGroup: GPUBindGroup;
    glyphStrokeBindGroup: GPUBindGroup;
    glyphFilterBindGroup: GPUBindGroup;
    glyphInteractiveBindGroup: GPUBindGroup;
    /**
     * @param workflow - the glyph workflow
     * @param source - the glyph source
     * @param tile - the tile this feature is drawn on
     * @param layerGuide - the layer guide for this feature
     * @param count - the number of glyphs
     * @param offset - the offset of the glyphs
     * @param filterCount - the number of filter glyphs
     * @param filterOffset - the offset of the filter glyphs
     * @param isPath - whether the feature is a path or a point
     * @param isIcon - whether the feature is an icon or a standard glyph
     * @param featureCode - the encoded feature code
     * @param glyphUniformBuffer - the glyph uniform buffer
     * @param glyphBoundsBuffer - the glyph bounds buffer
     * @param glyphAttributeBuffer - the glyph attribute buffer
     * @param glyphAttributeNoStrokeBuffer - the glyph attribute buffer
     * @param featureCodeBuffer - the encoded feature code that tells the GPU how to compute it's properties
     * @param parent - the parent tile if applicable
     */
    constructor(workflow: GlyphWorkflowSpec, source: GlyphSource, tile: Tile, layerGuide: GlyphWorkflowLayerGuideGPU, count: number, offset: number, filterCount: number, filterOffset: number, isPath: boolean, isIcon: boolean, featureCode: number[], glyphUniformBuffer: GPUBuffer, glyphBoundsBuffer: GPUBuffer, glyphAttributeBuffer: GPUBuffer, glyphAttributeNoStrokeBuffer: GPUBuffer, featureCodeBuffer: GPUBuffer, parent?: Tile | undefined);
    /** Draw this feature  */
    draw(): void;
    /** Compute the feature's interactivity with the mouse */
    compute(): void;
    /** Update the shared texture's bind groups */
    updateSharedTexture(): void;
    /** Destroy and cleanup the feature */
    destroy(): void;
    /**
     * Duplicate the feature
     * @param tile - the tile this feature is drawn on
     * @param parent - the parent tile if applicable
     * @param bounds - the bounds of the tile if applicable
     * @returns the duplicated feature
     */
    duplicate(tile: Tile, parent?: Tile, bounds?: BBox): GlyphFeature;
}
/** Glyph Workflow */
export default class GlyphWorkflow implements GlyphWorkflowSpec {
    #private;
    context: WebGPUContext;
    module: GPUShaderModule;
    layerGuides: Map<number, GlyphWorkflowLayerGuideGPU>;
    pipeline: GPURenderPipeline;
    pipelineC: GPURenderPipeline;
    testRenderPipeline: GPURenderPipeline;
    testCircleRenderPipeline: GPURenderPipeline;
    bboxPipeline: GPUComputePipeline;
    circlePipeline: GPUComputePipeline;
    testFiltersPipeline: GPUComputePipeline;
    testCirclePipeline: GPUComputePipeline;
    interactivePipeline: GPUComputePipeline;
    glyphBindGroupLayout: GPUBindGroupLayout;
    glyphPipelineLayout: GPUPipelineLayout;
    glyphFilterBindGroupLayout: GPUBindGroupLayout;
    glyphFilterPipelineLayout: GPUPipelineLayout;
    glyphInteractiveBindGroupLayout: GPUBindGroupLayout;
    glyphInteractivePiplineLayout: GPUPipelineLayout;
    glyphBBoxesBuffer: GPUBuffer;
    glyphFilterResultBuffer: GPUBuffer;
    /** @param context - The WebGPU context */
    constructor(context: WebGPUContext);
    /** Setup the workflow */
    setup(): Promise<void>;
    /** Destroy and cleanup the workflow */
    destroy(): void;
    /**
     * Build the layer definition for this workflow
     * @param layerBase - the common layer attributes
     * @param layer - the user defined layer attributes
     * @returns a built layer definition that's ready to describe how to render a feature
     */
    buildLayerDefinition(layerBase: LayerDefinitionBase, layer: GlyphStyle): GlyphDefinition;
    /**
     * Build the source glyph data into glyph features
     * @param glyphData - the input glyph data
     * @param tile - the tile we are building the features for
     */
    buildSource(glyphData: GlyphData, tile: Tile): void;
    /**
     * Compute the glyph filters to see which glyphs to render
     * @param features - the glyphs filter data to compute
     */
    computeFilters(features: GlyphFeatureSpec[]): void;
    /**
     * Compute the interactive glyph features to see which ones interact with the mouse
     * @param feature - glyph feature guide
     */
    computeInteractive(feature: GlyphFeatureSpec): void;
    /**
     * Draw the glyph feature
     * @param feature - glyph feature guide
     */
    draw(feature: GlyphFeatureSpec): void;
}
