/**
 * Copyright (c) 2018-2020 mol* contributors, licensed under MIT, See LICENSE file for more info.
 *
 * @author Alexander Rose <alexander.rose@weirdbyte.de>
 */
import { WebGLContext } from './context';
import { ValueCell } from '../../mol-util';
import { RenderableSchema } from '../renderable/schema';
import { ValueOf } from '../../mol-util/type-helpers';
import { GLRenderingContext } from './compat';
import { WebGLExtensions } from './extensions';
export declare type UsageHint = 'static' | 'dynamic' | 'stream';
export declare type DataType = 'uint8' | 'int8' | 'uint16' | 'int16' | 'uint32' | 'int32' | 'float32';
export declare type BufferType = 'attribute' | 'elements' | 'uniform';
export declare type DataTypeArrayType = {
    'uint8': Uint8Array;
    'int8': Int8Array;
    'uint16': Uint16Array;
    'int16': Int16Array;
    'uint32': Uint32Array;
    'int32': Int32Array;
    'float32': Float32Array;
};
export declare type ArrayType = ValueOf<DataTypeArrayType>;
export declare type ArrayKind = keyof DataTypeArrayType;
export declare function getUsageHint(gl: GLRenderingContext, usageHint: UsageHint): number;
export declare function getDataType(gl: GLRenderingContext, dataType: DataType): number;
export declare function getBufferType(gl: GLRenderingContext, bufferType: BufferType): number;
export interface Buffer {
    readonly id: number;
    readonly _usageHint: number;
    readonly _bufferType: number;
    readonly _dataType: number;
    readonly _bpe: number;
    readonly length: number;
    getBuffer: () => WebGLBuffer;
    updateData: (array: ArrayType) => void;
    updateSubData: (array: ArrayType, offset: number, count: number) => void;
    reset: () => void;
    destroy: () => void;
}
export declare type AttributeItemSize = 1 | 2 | 3 | 4 | 16;
export declare type AttributeKind = 'float32' | 'int32';
export declare function getAttribType(gl: GLRenderingContext, kind: AttributeKind, itemSize: AttributeItemSize): number;
export declare type AttributeDefs = {
    [k: string]: {
        kind: AttributeKind;
        itemSize: AttributeItemSize;
        divisor: number;
    };
};
export declare type AttributeValues = {
    [k: string]: ValueCell<ArrayType>;
};
export declare type AttributeBuffers = [string, AttributeBuffer][];
export interface AttributeBuffer extends Buffer {
    bind: (location: number) => void;
}
export declare function createAttributeBuffer<T extends ArrayType, S extends AttributeItemSize>(gl: GLRenderingContext, extensions: WebGLExtensions, array: T, itemSize: S, divisor: number, usageHint?: UsageHint): AttributeBuffer;
export declare function createAttributeBuffers(ctx: WebGLContext, schema: RenderableSchema, values: AttributeValues): AttributeBuffers;
export declare type ElementsType = Uint16Array | Uint32Array;
export declare type ElementsKind = 'uint16' | 'uint32';
export interface ElementsBuffer extends Buffer {
    bind: () => void;
}
export declare function createElementsBuffer(gl: GLRenderingContext, array: ElementsType, usageHint?: UsageHint): ElementsBuffer;
