/**
 * Copyright (c) 2018-2025 mol* contributors, licensed under MIT, See LICENSE file for more info.
 *
 * @author Alexander Rose <alexander.rose@weirdbyte.de>
 * @author Gianluca Tomasello <giagitom@gmail.com>
 */
import { ValueCell } from '../../mol-util/index.js';
import { AttributeItemSize, ElementsKind, AttributeValues, AttributeKind, DataTypeArrayType } from '../webgl/buffer.js';
import { UniformKind, UniformValues, UniformKindValue } from '../webgl/uniform.js';
import { DefineKind, DefineValues } from '../shader-code.js';
import { Mat4 } from '../../mol-math/linear-algebra.js';
import { TextureValues, TextureType, TextureFormat, TextureFilter, TextureKind, TextureKindValue } from '../webgl/texture.js';
import { Sphere3D } from '../../mol-math/geometry.js';
import { InstanceGrid } from '../../mol-math/geometry/instance-grid.js';
export type ValueKindType = {
    'number': number;
    'string': string;
    'boolean': boolean;
    'any': any;
    'unknown': unknown;
    'm4': Mat4;
    'float32': Float32Array;
    'uint32': Uint32Array;
    'sphere': Sphere3D;
    'instanceGrid': InstanceGrid;
};
export type ValueKind = keyof ValueKindType;
export type KindValue = UniformKindValue & DataTypeArrayType & TextureKindValue & ValueKindType;
export type Values<S extends RenderableSchema> = {
    readonly [k in keyof S]: ValueCell<KindValue[S[k]['kind']]>;
};
export 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;
    materialTextureValues: TextureValues;
    uniformValues: UniformValues;
    materialUniformValues: UniformValues;
    bufferedUniformValues: UniformValues;
};
export type Versions<T extends RenderableValues> = {
    -readonly [k in keyof T]: number;
};
export declare function getValueVersions<T extends RenderableValues>(values: T): Versions<T>;
export 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>;
type UniformVariant = 'material' | 'buffered';
export type UniformSpec<K extends UniformKind> = {
    type: 'uniform';
    kind: K;
    variant?: UniformVariant;
};
export declare function UniformSpec<K extends UniformKind>(kind: K, variant?: UniformVariant): UniformSpec<K>;
type TextureVariant = 'material';
export type TextureSpec<K extends TextureKind> = {
    type: 'texture';
    kind: K;
    format: TextureFormat;
    dataType: TextureType;
    filter: TextureFilter;
    variant?: TextureVariant;
};
export declare function TextureSpec<K extends TextureKind>(kind: K, format: TextureFormat, dataType: TextureType, filter: TextureFilter, variant?: TextureVariant): TextureSpec<K>;
export type ElementsSpec<K extends ElementsKind> = {
    type: 'elements';
    kind: K;
};
export declare function ElementsSpec<K extends ElementsKind>(kind: K): ElementsSpec<K>;
export 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 type ValueSpec<K extends ValueKind> = {
    type: 'value';
    kind: K;
};
export declare function ValueSpec<K extends ValueKind>(kind: K): ValueSpec<K>;
export type RenderableSchema = {
    readonly [k: string]: (AttributeSpec<AttributeKind> | UniformSpec<UniformKind> | TextureSpec<TextureKind> | ValueSpec<ValueKind> | DefineSpec<DefineKind> | ElementsSpec<ElementsKind>);
};
export type RenderableValues = {
    readonly [k: string]: ValueCell<any>;
};
export declare const GlobalUniformSchema: {
    readonly uDrawId: UniformSpec<"i">;
    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 uHasHeadRotation: UniformSpec<"b">;
    readonly uInvHeadRotation: UniformSpec<"m4">;
    readonly uIsAsymmetricProjection: UniformSpec<"b">;
    readonly uHasEyeCamera: UniformSpec<"b">;
    readonly uModelViewEye: UniformSpec<"m4">;
    readonly uInvModelViewEye: UniformSpec<"m4">;
    readonly uIsOrtho: UniformSpec<"f">;
    readonly uPixelRatio: UniformSpec<"f">;
    readonly uViewport: UniformSpec<"v4">;
    readonly uViewOffset: UniformSpec<"v2">;
    readonly uModelScale: UniformSpec<"f">;
    readonly uDrawingBufferSize: UniformSpec<"v2">;
    readonly uCameraPosition: UniformSpec<"v3">;
    readonly uCameraDir: UniformSpec<"v3">;
    readonly uCameraPlane: UniformSpec<"v4">;
    readonly uNear: UniformSpec<"f">;
    readonly uFar: UniformSpec<"f">;
    readonly uFog: UniformSpec<"b">;
    readonly uFogNear: UniformSpec<"f">;
    readonly uFogFar: UniformSpec<"f">;
    readonly uFogColor: UniformSpec<"v3">;
    readonly uTransparentBackground: UniformSpec<"b">;
    readonly uLightDirection: UniformSpec<"v3[]">;
    readonly uLightColor: UniformSpec<"v3[]">;
    readonly uAmbientColor: UniformSpec<"v3">;
    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 uDimColor: UniformSpec<"v3">;
    readonly uHighlightStrength: UniformSpec<"f">;
    readonly uSelectStrength: UniformSpec<"f">;
    readonly uDimStrength: UniformSpec<"f">;
    readonly uMarkerPriority: UniformSpec<"i">;
    readonly uMarkerAverage: UniformSpec<"f">;
    readonly uXrayEdgeFalloff: UniformSpec<"f">;
    readonly uCelSteps: UniformSpec<"f">;
    readonly uExposure: UniformSpec<"f">;
    readonly uRenderMask: UniformSpec<"i">;
    readonly uMarkingDepthTest: UniformSpec<"b">;
    readonly uMarkingType: UniformSpec<"i">;
    readonly uPickType: UniformSpec<"i">;
};
export type GlobalUniformSchema = typeof GlobalUniformSchema;
export type GlobalUniformValues = Values<GlobalUniformSchema>;
export declare const GlobalTextureSchema: {
    readonly tDepth: TextureSpec<"texture">;
    readonly tDpoitDepth: TextureSpec<"texture">;
    readonly tDpoitFrontColor: TextureSpec<"texture">;
    readonly tDpoitBackColor: TextureSpec<"texture">;
};
export type GlobalTextureSchema = typeof GlobalTextureSchema;
export type GlobalTextureValues = Values<GlobalTextureSchema>;
export declare const GlobalDefineSchema: {
    readonly dLightCount: DefineSpec<"number">;
    readonly dColorMarker: DefineSpec<"boolean">;
};
export type GlobalDefineSchema = typeof GlobalDefineSchema;
export type GlobalDefineValues = Values<GlobalDefineSchema>;
export type GlobalDefines = UnboxedValues<GlobalDefineSchema>;
export declare const InternalSchema: {
    readonly uObjectId: UniformSpec<"i">;
};
export type InternalSchema = typeof InternalSchema;
export 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 uPaletteDomain: UniformSpec<"v2">;
    readonly uPaletteDefault: UniformSpec<"v3">;
    readonly tColor: TextureSpec<"image-uint8">;
    readonly tPalette: TextureSpec<"image-uint8">;
    readonly tColorGrid: TextureSpec<"texture">;
    readonly dColorType: DefineSpec<"string">;
    readonly dUsePalette: DefineSpec<"boolean">;
};
export type ColorSchema = typeof ColorSchema;
export 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 type SizeSchema = typeof SizeSchema;
export type SizeValues = Values<SizeSchema>;
export declare const MarkerSchema: {
    readonly uMarker: UniformSpec<"f">;
    readonly uMarkerTexDim: UniformSpec<"v2">;
    readonly tMarker: TextureSpec<"image-uint8">;
    readonly markerAverage: ValueSpec<"number">;
    readonly markerStatus: ValueSpec<"number">;
    readonly dMarkerType: DefineSpec<"string">;
};
export type MarkerSchema = typeof MarkerSchema;
export type MarkerValues = Values<MarkerSchema>;
export declare const OverpaintSchema: {
    readonly uOverpaintTexDim: UniformSpec<"v2">;
    readonly tOverpaint: TextureSpec<"image-uint8">;
    readonly dOverpaint: DefineSpec<"boolean">;
    readonly uOverpaintGridDim: UniformSpec<"v3">;
    readonly uOverpaintGridTransform: UniformSpec<"v4">;
    readonly tOverpaintGrid: TextureSpec<"texture">;
    readonly dOverpaintType: DefineSpec<"string">;
    readonly uOverpaintStrength: UniformSpec<"f">;
};
export type OverpaintSchema = typeof OverpaintSchema;
export 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">;
    readonly transparencyMin: ValueSpec<"number">;
    readonly uTransparencyGridDim: UniformSpec<"v3">;
    readonly uTransparencyGridTransform: UniformSpec<"v4">;
    readonly tTransparencyGrid: TextureSpec<"texture">;
    readonly dTransparencyType: DefineSpec<"string">;
    readonly uTransparencyStrength: UniformSpec<"f">;
};
export type TransparencySchema = typeof TransparencySchema;
export type TransparencyValues = Values<TransparencySchema>;
export declare const EmissiveSchema: {
    readonly uEmissiveTexDim: UniformSpec<"v2">;
    readonly tEmissive: TextureSpec<"image-uint8">;
    readonly dEmissive: DefineSpec<"boolean">;
    readonly emissiveAverage: ValueSpec<"number">;
    readonly uEmissiveGridDim: UniformSpec<"v3">;
    readonly uEmissiveGridTransform: UniformSpec<"v4">;
    readonly tEmissiveGrid: TextureSpec<"texture">;
    readonly dEmissiveType: DefineSpec<"string">;
    readonly uEmissiveStrength: UniformSpec<"f">;
};
export type EmissiveSchema = typeof EmissiveSchema;
export type EmissiveValues = Values<EmissiveSchema>;
export declare const SubstanceSchema: {
    readonly uSubstanceTexDim: UniformSpec<"v2">;
    readonly tSubstance: TextureSpec<"image-uint8">;
    readonly dSubstance: DefineSpec<"boolean">;
    readonly uSubstanceGridDim: UniformSpec<"v3">;
    readonly uSubstanceGridTransform: UniformSpec<"v4">;
    readonly tSubstanceGrid: TextureSpec<"texture">;
    readonly dSubstanceType: DefineSpec<"string">;
    readonly uSubstanceStrength: UniformSpec<"f">;
};
export type SubstanceSchema = typeof SubstanceSchema;
export type SubstanceValues = Values<SubstanceSchema>;
export declare const ClippingSchema: {
    readonly uClippingTexDim: UniformSpec<"v2">;
    readonly tClipping: TextureSpec<"image-uint8">;
    readonly dClipping: DefineSpec<"boolean">;
    readonly dClippingType: DefineSpec<"string">;
};
export type ClippingSchema = typeof ClippingSchema;
export type ClippingValues = Values<ClippingSchema>;
export declare const BaseSchema: {
    readonly dClipObjectCount: DefineSpec<"number">;
    readonly dClipVariant: DefineSpec<"string">;
    readonly uClipObjectType: UniformSpec<"i[]">;
    readonly uClipObjectInvert: UniformSpec<"b[]">;
    readonly uClipObjectPosition: UniformSpec<"v3[]">;
    readonly uClipObjectRotation: UniformSpec<"v4[]">;
    readonly uClipObjectScale: UniformSpec<"v3[]">;
    readonly uClipObjectTransform: UniformSpec<"m4[]">;
    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 uMetalness: UniformSpec<"f">;
    readonly uRoughness: UniformSpec<"f">;
    readonly uBumpiness: UniformSpec<"f">;
    readonly uEmissive: UniformSpec<"f">;
    /** density value to estimate object thickness */
    readonly uDensity: UniformSpec<"f">;
    readonly uVertexCount: UniformSpec<"i">;
    readonly uInstanceCount: UniformSpec<"i">;
    readonly uGroupCount: UniformSpec<"i">;
    readonly uInvariantBoundingSphere: UniformSpec<"v4">;
    readonly uLod: 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">;
    /** use instance granularity for marker, transparency, clipping, overpaint, substance */
    readonly instanceGranularity: 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 instanceGrid: ValueSpec<"instanceGrid">;
    readonly uClippingTexDim: UniformSpec<"v2">;
    readonly tClipping: TextureSpec<"image-uint8">;
    readonly dClipping: DefineSpec<"boolean">;
    readonly dClippingType: DefineSpec<"string">;
    readonly uSubstanceTexDim: UniformSpec<"v2">;
    readonly tSubstance: TextureSpec<"image-uint8">;
    readonly dSubstance: DefineSpec<"boolean">;
    readonly uSubstanceGridDim: UniformSpec<"v3">;
    readonly uSubstanceGridTransform: UniformSpec<"v4">;
    readonly tSubstanceGrid: TextureSpec<"texture">;
    readonly dSubstanceType: DefineSpec<"string">;
    readonly uSubstanceStrength: UniformSpec<"f">;
    readonly uEmissiveTexDim: UniformSpec<"v2">;
    readonly tEmissive: TextureSpec<"image-uint8">;
    readonly dEmissive: DefineSpec<"boolean">;
    readonly emissiveAverage: ValueSpec<"number">;
    readonly uEmissiveGridDim: UniformSpec<"v3">;
    readonly uEmissiveGridTransform: UniformSpec<"v4">;
    readonly tEmissiveGrid: TextureSpec<"texture">;
    readonly dEmissiveType: DefineSpec<"string">;
    readonly uEmissiveStrength: UniformSpec<"f">;
    readonly uTransparencyTexDim: UniformSpec<"v2">;
    readonly tTransparency: TextureSpec<"image-uint8">;
    readonly dTransparency: DefineSpec<"boolean">;
    readonly transparencyAverage: ValueSpec<"number">;
    readonly transparencyMin: ValueSpec<"number">;
    readonly uTransparencyGridDim: UniformSpec<"v3">;
    readonly uTransparencyGridTransform: UniformSpec<"v4">;
    readonly tTransparencyGrid: TextureSpec<"texture">;
    readonly dTransparencyType: DefineSpec<"string">;
    readonly uTransparencyStrength: UniformSpec<"f">;
    readonly uOverpaintTexDim: UniformSpec<"v2">;
    readonly tOverpaint: TextureSpec<"image-uint8">;
    readonly dOverpaint: DefineSpec<"boolean">;
    readonly uOverpaintGridDim: UniformSpec<"v3">;
    readonly uOverpaintGridTransform: UniformSpec<"v4">;
    readonly tOverpaintGrid: TextureSpec<"texture">;
    readonly dOverpaintType: DefineSpec<"string">;
    readonly uOverpaintStrength: UniformSpec<"f">;
    readonly uMarker: UniformSpec<"f">;
    readonly uMarkerTexDim: UniformSpec<"v2">;
    readonly tMarker: TextureSpec<"image-uint8">;
    readonly markerAverage: ValueSpec<"number">;
    readonly markerStatus: ValueSpec<"number">;
    readonly dMarkerType: DefineSpec<"string">;
    readonly uColor: UniformSpec<"v3">;
    readonly uColorTexDim: UniformSpec<"v2">;
    readonly uColorGridDim: UniformSpec<"v3">;
    readonly uColorGridTransform: UniformSpec<"v4">;
    readonly uPaletteDomain: UniformSpec<"v2">;
    readonly uPaletteDefault: UniformSpec<"v3">;
    readonly tColor: TextureSpec<"image-uint8">;
    readonly tPalette: TextureSpec<"image-uint8">;
    readonly tColorGrid: TextureSpec<"texture">;
    readonly dColorType: DefineSpec<"string">;
    readonly dUsePalette: DefineSpec<"boolean">;
    readonly dGeometryType: DefineSpec<"string">;
};
export type BaseSchema = typeof BaseSchema;
export type BaseValues = Values<BaseSchema>;
export {};
