import { SpeckleType } from '../converter/GeometryConverter';
import Materials from '../materials/Materials';
import { NodeRenderView } from '../tree/NodeRenderView';
import { Batch, BatchUpdateRange, GeometryType } from './Batch';
import { Material, WebGLRenderer } from 'three';
import { FilterMaterial } from '../filtering/FilteringManager';
import { RenderTree } from '../tree/RenderTree';
export declare enum TransformStorage {
    VERTEX_TEXTURE = 0,
    UNIFORM_ARRAY = 1
}
export default class Batcher {
    private maxHardwareUniformCount;
    private floatTextures;
    private maxBatchObjects;
    private maxBatchVertices;
    materials: Materials;
    batches: {
        [id: string]: Batch;
    };
    constructor(maxUniformCount: number, floatTextures: boolean);
    makeBatches(renderTree: RenderTree, speckleType: SpeckleType[], batchType?: GeometryType): Promise<void>;
    makeBatchesAsync(renderTree: RenderTree, speckleType: SpeckleType[], batchType?: GeometryType, priority?: number): AsyncGenerator<Batch, void, unknown>;
    private splitBatch;
    private buildBatch;
    update(deltaTime: number): void;
    render(renderer: WebGLRenderer): void;
    saveVisiblity(): Record<string, BatchUpdateRange>;
    applyVisibility(ranges: Record<string, BatchUpdateRange>): void;
    getTransparent(): Record<string, BatchUpdateRange>;
    getStencil(): Record<string, BatchUpdateRange>;
    getOpaque(): Record<string, BatchUpdateRange>;
    overrideMaterial(ranges: Record<string, BatchUpdateRange>, material: Material): void;
    restoreMaterial(ranges: Record<string, BatchUpdateRange>): void;
    getByMaterialUUID(materialUUID: string): {};
    purgeBatches(subtreeId: string): void;
    getBatches(subtreeId?: string, geometryType?: GeometryType): Batch[];
    getBatch(rv: NodeRenderView): Batch;
    getRenderView(batchId: string, index: number): NodeRenderView;
    getRenderViewMaterial(batchId: string, index: number): Material;
    resetBatchesDrawRanges(): void;
    setObjectsFilterMaterial(rvs: NodeRenderView[], filterMaterial: FilterMaterial, uniqueRvsOnly?: boolean): string[];
    setObjectsMaterial(rvs: NodeRenderView[], batchRangeDelegate: (rv: NodeRenderView) => BatchUpdateRange, uniqueRvsOnly?: boolean): string[];
    insertObjectsFilterMaterial(rvs: NodeRenderView[], filterMaterial: FilterMaterial): string;
    removeObjectsMaterial(id: string): void;
    autoFillDrawRanges(batchIds: string[]): void;
    /**
     * Used for debuggin only
     */
    isolateRenderViewBatch(id: string, renderTree: RenderTree): Promise<void>;
    isolateBatch(batchId: string): Promise<void>;
}
