/**
 * Copyright (c) 2018-2022 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 { ICamera } from '../mol-canvas3d/camera';
import { Scene } from './scene';
import { WebGLContext } from './webgl/context';
import { Color } from '../mol-util/color';
import { ParamDefinition as PD } from '../mol-util/param-definition';
import { Texture } from './webgl/texture';
export interface RendererStats {
    programCount: number;
    shaderCount: number;
    attributeCount: number;
    elementsCount: number;
    framebufferCount: number;
    renderbufferCount: number;
    textureCount: number;
    vertexArrayCount: number;
    drawCount: number;
    instanceCount: number;
    instancedDrawCount: number;
}
export declare const enum PickType {
    None = 0,
    Object = 1,
    Instance = 2,
    Group = 3
}
export declare const enum MarkingType {
    None = 0,
    Depth = 1,
    Mask = 2
}
interface Renderer {
    readonly stats: RendererStats;
    readonly props: Readonly<RendererProps>;
    clear: (toBackgroundColor: boolean, ignoreTransparentBackground?: boolean) => void;
    clearDepth: (packed?: boolean) => void;
    update: (camera: ICamera) => void;
    renderPick: (group: Scene.Group, camera: ICamera, variant: 'pick' | 'depth', depthTexture: Texture | null, pickType: PickType) => void;
    renderDepth: (group: Scene.Group, camera: ICamera, depthTexture: Texture | null) => void;
    renderDepthOpaque: (group: Scene.Group, camera: ICamera, depthTexture: Texture | null) => void;
    renderDepthTransparent: (group: Scene.Group, camera: ICamera, depthTexture: Texture | null) => void;
    renderMarkingDepth: (group: Scene.Group, camera: ICamera, depthTexture: Texture | null) => void;
    renderMarkingMask: (group: Scene.Group, camera: ICamera, depthTexture: Texture | null) => void;
    renderBlended: (group: Scene, camera: ICamera) => void;
    renderBlendedOpaque: (group: Scene.Group, camera: ICamera, depthTexture: Texture | null) => void;
    renderBlendedTransparent: (group: Scene.Group, camera: ICamera, depthTexture: Texture | null) => void;
    renderBlendedVolume: (group: Scene.Group, camera: ICamera, depthTexture: Texture | null) => void;
    renderWboitOpaque: (group: Scene.Group, camera: ICamera, depthTexture: Texture | null) => void;
    renderWboitTransparent: (group: Scene.Group, camera: ICamera, depthTexture: Texture | null) => void;
    renderDpoitOpaque: (group: Scene.Group, camera: ICamera, depthTexture: Texture | null) => void;
    renderDpoitTransparent: (group: Scene.Group, camera: ICamera, depthTexture: Texture | null, dpoitTextures: {
        depth: Texture;
        frontColor: Texture;
        backColor: Texture;
    }) => void;
    renderDpoitVolume: (group: Scene.Group, camera: ICamera, depthTexture: Texture | null) => void;
    setProps: (props: Partial<RendererProps>) => void;
    setViewport: (x: number, y: number, width: number, height: number) => void;
    setTransparentBackground: (value: boolean) => void;
    setDrawingBufferSize: (width: number, height: number) => void;
    setPixelRatio: (value: number) => void;
    dispose: () => void;
}
export declare const RendererParams: {
    backgroundColor: PD.Color;
    pickingAlphaThreshold: PD.Numeric;
    interiorDarkening: PD.Numeric;
    interiorColorFlag: PD.BooleanParam;
    interiorColor: PD.Color;
    colorMarker: PD.BooleanParam;
    highlightColor: PD.Color;
    selectColor: PD.Color;
    highlightStrength: PD.Numeric;
    selectStrength: PD.Numeric;
    markerPriority: PD.Select<number>;
    xrayEdgeFalloff: PD.Numeric;
    light: PD.ObjectList<PD.Normalize<{
        inclination: number;
        azimuth: number;
        color: Color;
        intensity: number;
    }>>;
    ambientColor: PD.Color;
    ambientIntensity: PD.Numeric;
};
export declare type RendererProps = PD.Values<typeof RendererParams>;
declare namespace Renderer {
    function create(ctx: WebGLContext, props?: Partial<RendererProps>): Renderer;
}
export { Renderer };
