/**
 * Copyright (c) 2018-2021 mol* contributors, licensed under MIT, See LICENSE file for more info.
 *
 * @author Alexander Rose <alexander.rose@weirdbyte.de>
 */
import { ValueCell } from '../../mol-util';
import { AttributeItemSize, ElementsKind, AttributeValues, AttributeKind, DataTypeArrayType } from '../webgl/buffer';
import { UniformKind, UniformValues, UniformKindValue } from '../webgl/uniform';
import { DefineKind, DefineValues } from '../shader-code';
import { Mat4 } from '../../mol-math/linear-algebra';
import { TextureValues, TextureType, TextureFormat, TextureFilter, TextureKind, TextureKindValue } from '../webgl/texture';
import { Sphere3D } from '../../mol-math/geometry';
export declare type ValueKindType = {
    'number': number;
    'string': string;
    'boolean': boolean;
    'any': any;
    'unknown': unknown;
    'm4': Mat4;
    'float32': Float32Array;
    'sphere': Sphere3D;
};
export declare type ValueKind = keyof ValueKindType;
export declare type KindValue = UniformKindValue & DataTypeArrayType & TextureKindValue & ValueKindType;
export declare type Values<S extends RenderableSchema> = {
    readonly [k in keyof S]: ValueCell<KindValue[S[k]['kind']]>;
};
export declare type UnboxedValues<S extends RenderableSchema> = {
    readonly [k in keyof S]: KindValue[S[k]['kind']];
};
export declare function splitValues(schema: RenderableSchema, values: RenderableValues): {
    attributeValues: AttributeValues;
    defineValues: DefineValues;
    textureValues: TextureValues;
    uniformValues: UniformValues;
    materialUniformValues: UniformValues;
    bufferedUniformValues: UniformValues;
};
export declare type Versions<T extends RenderableValues> = {
    [k in keyof T]: number;
};
export declare function getValueVersions<T extends RenderableValues>(values: T): Versions<T>;
export declare type AttributeSpec<K extends AttributeKind> = {
    type: 'attribute';
    kind: K;
    itemSize: AttributeItemSize;
    divisor: number;
};
export declare function AttributeSpec<K extends AttributeKind>(kind: K, itemSize: AttributeItemSize, divisor: number): AttributeSpec<K>;
export declare type UniformSpec<K extends UniformKind> = {
    type: 'uniform';
    kind: K;
    variant?: 'material' | 'buffered';
};
export declare function UniformSpec<K extends UniformKind>(kind: K, variant?: 'material' | 'buffered'): UniformSpec<K>;
export declare type TextureSpec<K extends TextureKind> = {
    type: 'texture';
    kind: K;
    format: TextureFormat;
    dataType: TextureType;
    filter: TextureFilter;
};
export declare function TextureSpec<K extends TextureKind>(kind: K, format: TextureFormat, dataType: TextureType, filter: TextureFilter): TextureSpec<K>;
export declare type ElementsSpec<K extends ElementsKind> = {
    type: 'elements';
    kind: K;
};
export declare function ElementsSpec<K extends ElementsKind>(kind: K): ElementsSpec<K>;
export declare type DefineSpec<K extends DefineKind> = {
    type: 'define';
    kind: K;
    options?: string[];
};
export declare function DefineSpec<K extends DefineKind>(kind: K, options?: string[]): DefineSpec<K>;
export declare type ValueSpec<K extends ValueKind> = {
    type: 'value';
    kind: K;
};
export declare function ValueSpec<K extends ValueKind>(kind: K): ValueSpec<K>;
export declare type RenderableSchema = {
    readonly [k: string]: (AttributeSpec<AttributeKind> | UniformSpec<UniformKind> | TextureSpec<TextureKind> | ValueSpec<ValueKind> | DefineSpec<DefineKind> | ElementsSpec<ElementsKind>);
};
export declare type RenderableValues = {
    readonly [k: string]: ValueCell<any>;
};
export declare const GlobalUniformSchema: {
    readonly uModel: UniformSpec<"m4">;
    readonly uView: UniformSpec<"m4">;
    readonly uInvView: UniformSpec<"m4">;
    readonly uModelView: UniformSpec<"m4">;
    readonly uInvModelView: UniformSpec<"m4">;
    readonly uProjection: UniformSpec<"m4">;
    readonly uInvProjection: UniformSpec<"m4">;
    readonly uModelViewProjection: UniformSpec<"m4">;
    readonly uInvModelViewProjection: UniformSpec<"m4">;
    readonly uIsOrtho: UniformSpec<"f">;
    readonly uPixelRatio: UniformSpec<"f">;
    readonly uViewport: UniformSpec<"v4">;
    readonly uViewOffset: UniformSpec<"v2">;
    readonly uDrawingBufferSize: UniformSpec<"v2">;
    readonly uCameraPosition: UniformSpec<"v3">;
    readonly uCameraDir: UniformSpec<"v3">;
    readonly uNear: UniformSpec<"f">;
    readonly uFar: UniformSpec<"f">;
    readonly uFogNear: UniformSpec<"f">;
    readonly uFogFar: UniformSpec<"f">;
    readonly uFogColor: UniformSpec<"v3">;
    readonly uTransparentBackground: UniformSpec<"b">;
    readonly uClipObjectType: UniformSpec<"i[]">;
    readonly uClipObjectInvert: UniformSpec<"b[]">;
    readonly uClipObjectPosition: UniformSpec<"v3[]">;
    readonly uClipObjectRotation: UniformSpec<"v4[]">;
    readonly uClipObjectScale: UniformSpec<"v3[]">;
    readonly uLightIntensity: UniformSpec<"f">;
    readonly uAmbientIntensity: UniformSpec<"f">;
    readonly uMetalness: UniformSpec<"f">;
    readonly uRoughness: UniformSpec<"f">;
    readonly uReflectivity: UniformSpec<"f">;
    readonly uPickingAlphaThreshold: UniformSpec<"f">;
    readonly uInteriorDarkening: UniformSpec<"f">;
    readonly uInteriorColorFlag: UniformSpec<"b">;
    readonly uInteriorColor: UniformSpec<"v3">;
    readonly uHighlightColor: UniformSpec<"v3">;
    readonly uSelectColor: UniformSpec<"v3">;
    readonly uHighlightStrength: UniformSpec<"f">;
    readonly uSelectStrength: UniformSpec<"f">;
    readonly uMarkerPriority: UniformSpec<"i">;
    readonly uXrayEdgeFalloff: UniformSpec<"f">;
    readonly uRenderWboit: UniformSpec<"b">;
    readonly uMarkingDepthTest: UniformSpec<"b">;
};
export declare type GlobalUniformSchema = typeof GlobalUniformSchema;
export declare type GlobalUniformValues = Values<GlobalUniformSchema>;
export declare const GlobalTextureSchema: {
    readonly tDepth: TextureSpec<"texture">;
};
export declare type GlobalTextureSchema = typeof GlobalTextureSchema;
export declare type GlobalTextureValues = Values<GlobalTextureSchema>;
export declare const InternalSchema: {
    readonly uObjectId: UniformSpec<"i">;
};
export declare type InternalSchema = typeof InternalSchema;
export declare type InternalValues = Values<InternalSchema>;
export declare const ColorSchema: {
    readonly uColor: UniformSpec<"v3">;
    readonly uColorTexDim: UniformSpec<"v2">;
    readonly uColorGridDim: UniformSpec<"v3">;
    readonly uColorGridTransform: UniformSpec<"v4">;
    readonly tColor: TextureSpec<"image-uint8">;
    readonly tPalette: TextureSpec<"image-uint8">;
    readonly tColorGrid: TextureSpec<"texture">;
    readonly dColorType: DefineSpec<"string">;
    readonly dUsePalette: DefineSpec<"boolean">;
};
export declare type ColorSchema = typeof ColorSchema;
export declare type ColorValues = Values<ColorSchema>;
export declare const SizeSchema: {
    readonly uSize: UniformSpec<"f">;
    readonly uSizeTexDim: UniformSpec<"v2">;
    readonly tSize: TextureSpec<"image-uint8">;
    readonly dSizeType: DefineSpec<"string">;
    readonly uSizeFactor: UniformSpec<"f">;
};
export declare type SizeSchema = typeof SizeSchema;
export declare type SizeValues = Values<SizeSchema>;
export declare const MarkerSchema: {
    readonly uMarker: UniformSpec<"f">;
    readonly uMarkerTexDim: UniformSpec<"v2">;
    readonly tMarker: TextureSpec<"image-uint8">;
    readonly dMarkerType: DefineSpec<"string">;
    readonly markerAverage: ValueSpec<"number">;
    readonly markerStatus: ValueSpec<"number">;
};
export declare type MarkerSchema = typeof MarkerSchema;
export declare type MarkerValues = Values<MarkerSchema>;
export declare const OverpaintSchema: {
    readonly uOverpaintTexDim: UniformSpec<"v2">;
    readonly tOverpaint: TextureSpec<"image-uint8">;
    readonly dOverpaint: DefineSpec<"boolean">;
};
export declare type OverpaintSchema = typeof OverpaintSchema;
export declare type OverpaintValues = Values<OverpaintSchema>;
export declare const TransparencySchema: {
    readonly uTransparencyTexDim: UniformSpec<"v2">;
    readonly tTransparency: TextureSpec<"image-uint8">;
    readonly dTransparency: DefineSpec<"boolean">;
    readonly transparencyAverage: ValueSpec<"number">;
};
export declare type TransparencySchema = typeof TransparencySchema;
export declare type TransparencyValues = Values<TransparencySchema>;
export declare const ClippingSchema: {
    readonly dClipObjectCount: DefineSpec<"number">;
    readonly dClipVariant: DefineSpec<"string">;
    readonly uClippingTexDim: UniformSpec<"v2">;
    readonly tClipping: TextureSpec<"image-uint8">;
    readonly dClipping: DefineSpec<"boolean">;
};
export declare type ClippingSchema = typeof ClippingSchema;
export declare type ClippingValues = Values<ClippingSchema>;
export declare const BaseSchema: {
    readonly aInstance: AttributeSpec<"float32">;
    /**
     * final per-instance transform calculated for instance `i` as
     * `aTransform[i] = matrix * transform[i] * extraTransform[i]`
     */
    readonly aTransform: AttributeSpec<"float32">;
    /**
     * final alpha, calculated as `values.alpha * state.alpha`
     */
    readonly uAlpha: UniformSpec<"f">;
    readonly uVertexCount: UniformSpec<"i">;
    readonly uInstanceCount: UniformSpec<"i">;
    readonly uGroupCount: UniformSpec<"i">;
    readonly uInvariantBoundingSphere: UniformSpec<"v4">;
    readonly drawCount: ValueSpec<"number">;
    readonly instanceCount: ValueSpec<"number">;
    /** base alpha, see uAlpha  */
    readonly alpha: ValueSpec<"number">;
    /** global transform, see aTransform */
    readonly matrix: ValueSpec<"m4">;
    /** base per-instance transform, see aTransform */
    readonly transform: ValueSpec<"float32">;
    /** additional per-instance transform, see aTransform */
    readonly extraTransform: ValueSpec<"float32">;
    /** denotes reflection in transform */
    readonly hasReflection: ValueSpec<"boolean">;
    /** bounding sphere taking aTransform into account and encompases all instances */
    readonly boundingSphere: ValueSpec<"sphere">;
    /** bounding sphere NOT taking aTransform into account */
    readonly invariantBoundingSphere: ValueSpec<"sphere">;
    readonly dClipObjectCount: DefineSpec<"number">;
    readonly dClipVariant: DefineSpec<"string">;
    readonly uClippingTexDim: UniformSpec<"v2">;
    readonly tClipping: TextureSpec<"image-uint8">;
    readonly dClipping: DefineSpec<"boolean">;
    readonly uTransparencyTexDim: UniformSpec<"v2">;
    readonly tTransparency: TextureSpec<"image-uint8">;
    readonly dTransparency: DefineSpec<"boolean">;
    readonly transparencyAverage: ValueSpec<"number">;
    readonly uOverpaintTexDim: UniformSpec<"v2">;
    readonly tOverpaint: TextureSpec<"image-uint8">;
    readonly dOverpaint: DefineSpec<"boolean">;
    readonly uMarker: UniformSpec<"f">;
    readonly uMarkerTexDim: UniformSpec<"v2">;
    readonly tMarker: TextureSpec<"image-uint8">;
    readonly dMarkerType: DefineSpec<"string">;
    readonly markerAverage: ValueSpec<"number">;
    readonly markerStatus: ValueSpec<"number">;
    readonly uColor: UniformSpec<"v3">;
    readonly uColorTexDim: UniformSpec<"v2">;
    readonly uColorGridDim: UniformSpec<"v3">;
    readonly uColorGridTransform: UniformSpec<"v4">;
    readonly tColor: TextureSpec<"image-uint8">;
    readonly tPalette: TextureSpec<"image-uint8">;
    readonly tColorGrid: TextureSpec<"texture">;
    readonly dColorType: DefineSpec<"string">;
    readonly dUsePalette: DefineSpec<"boolean">;
};
export declare type BaseSchema = typeof BaseSchema;
export declare type BaseValues = Values<BaseSchema>;
