/**
 * Sigma.js WebGL Abstract Node Program
 * =====================================
 *
 * @module
 */
import Sigma from "../../../../sigma";
import { AbstractProgram, Program } from "./program";
import { NodeDisplayData, NonEmptyArray, RenderParams } from "../../../../types";
import { NodeLabelDrawingFunction } from "../../../../utils/node-labels";
import { NodeHoverDrawingFunction } from "../../../../utils/node-hover";
export declare abstract class AbstractNodeProgram extends AbstractProgram {
    static drawLabel: NodeLabelDrawingFunction | undefined;
    static drawHover: NodeHoverDrawingFunction | undefined;
    abstract process(nodeIndex: number, offset: number, data: NodeDisplayData): void;
}
export declare abstract class NodeProgram<Uniform extends string = string> extends Program<Uniform> implements AbstractNodeProgram {
    static drawLabel: NodeLabelDrawingFunction | undefined;
    static drawHover: NodeHoverDrawingFunction | undefined;
    process(nodeIndex: number, offset: number, data: NodeDisplayData): void;
    abstract processVisibleItem(nodeIndex: number, i: number, data: NodeDisplayData): void;
}
declare class NodeImageClass implements AbstractNodeProgram {
    static drawLabel: NodeLabelDrawingFunction | undefined;
    static drawHover: NodeHoverDrawingFunction | undefined;
    constructor(_gl: WebGLRenderingContext, _pickingBuffer: WebGLFramebuffer | null, _renderer: Sigma);
    reallocate(_capacity: number): void;
    process(_nodeIndex: number, _offset: number, _data: NodeDisplayData): void;
    render(_params: RenderParams): void;
}
export type NodeProgramType = typeof NodeImageClass;
/**
 * Helper function combining two or more programs into a single compound one.
 * Note that this is more a quick & easy way to combine program than a really
 * performant option. More performant programs can be written entirely.
 *
 * @param  {array}    programClasses - Program classes to combine.
 * @param  {function} drawLabel - An optional node "draw label" function.
 * @param  {function} drawHover - An optional node "draw hover" function.
 * @return {function}
 */
export declare function createNodeCompoundProgram(programClasses: NonEmptyArray<NodeProgramType>, drawLabel?: NodeLabelDrawingFunction, drawHover?: NodeLabelDrawingFunction): NodeProgramType;
export {};
