import type { BufferLike, GeometryAttributeLike, TextureLike } from '../shared';
import type { GlDrawOptions } from './geometry';
import type { GlRenderer } from './GlRenderer';
import { GlBlendMode, GlState } from './state';
import { GlSystem } from './system';
export interface Batchable2D {
    vertices: Float32Array;
    indices: Uint32Array;
    uvs?: Float32Array;
    size?: {
        width: number;
        height: number;
    };
    texture?: TextureLike;
    blendMode?: GlBlendMode;
    roundPixels?: boolean;
    clipOutsideUv?: boolean;
}
interface Shader {
    update: (bufferData: BufferLike['data'], indexBufferData: BufferLike['data']) => void;
    draw: (options?: GlDrawOptions) => void;
}
export declare class GlBatch2DSystem extends GlSystem {
    install(renderer: GlRenderer): void;
    protected _state: GlState;
    protected _batchSize: number;
    protected _batchables: Batchable2D[];
    protected _vertexCount: number;
    protected _indexCount: number;
    protected _attributeBuffer: ArrayBuffer[];
    protected _indexBuffers: Uint32Array<ArrayBuffer>[];
    protected _shaders: Map<number, Shader>;
    protected _attributes: Record<string, Partial<GeometryAttributeLike>>;
    protected _vertexSize: number;
    protected _getShader(maxTextureUnits: number): Shader;
    protected _createShader(maxTextureUnits: number): Shader;
    render(batchable: Batchable2D): void;
    flush(): void;
    protected _getBufferData(size: number): ArrayBuffer;
    protected _getIndexBufferData(size: number): Uint32Array<ArrayBuffer>;
}
export declare function nextPow2(v: number): number;
export declare function log2(v: number): number;
export {};
