import type { WebGLRenderer } from "three";
import { Color, type Vector2, type WebGLRenderTarget } from "three";
import { Pass } from "three/examples/jsm/postprocessing/Pass";
/**
 * Stencil-Based Selection Outline Pass (FAST)
 *
 * This is a MUCH faster alternative to geometry-based selection outline.
 * Instead of copying vertex data, it reads from a selection mask texture
 * that's been written to during the main render pass.
 *
 * Performance: O(pixels) instead of O(selected_vertices)
 * - 1000 selected elements = same cost as 1 selected element
 * - No geometry copying
 * - No extra mesh rendering
 *
 * Requirements:
 * - Selection mask must be written by ViralBatchedMesh/ViralInstancedMesh during render
 * - Main renderer must call updateSelectionMask() before this pass runs
 */
export interface StencilSelectionOutlineOptions {
    /** Outline color (default: accent color) */
    outlineColor: Color;
    /** Outline opacity 0-1 (default: 1.0) */
    outlineOpacity: number;
    /** Outline thickness in pixels (default: 2.0) */
    outlineThickness: number;
}
export declare class StencilSelectionOutlinePass extends Pass {
    private resolution;
    private options;
    private selectionMaskTarget;
    private outlineMaterial;
    private copyMaterial;
    private fsQuad;
    bypass: boolean;
    private hasSelection;
    constructor(resolution: Vector2, options?: Partial<StencilSelectionOutlineOptions>);
    /**
     * Set the selection mask render target
     * This should be called by the renderer after writing selection mask
     */
    setSelectionMaskTarget(target: WebGLRenderTarget | null): void;
    /**
     * Set whether there's an active selection
     */
    setHasSelection(value: boolean): void;
    /**
     * Update outline options
     */
    setOptions(options: Partial<StencilSelectionOutlineOptions>): void;
    render(renderer: WebGLRenderer, writeBuffer: WebGLRenderTarget, readBuffer: WebGLRenderTarget, _deltaTime?: number, _maskActive?: boolean): void;
    setSize(width: number, height: number): void;
    dispose(): void;
}
