import { type ShaderName, type ShaderParams } from "./registry.js"; import { type ShaderSourceInput } from "./source.js"; import type { QualityOptions, QualityPreference, QualityState } from "./types.js"; export type RendererStatus = "pending" | "ready" | "unsupported" | "error"; export interface ShaderRendererOptions extends QualityOptions { readonly shader: K; readonly params?: ShaderParams; /** * The layer a source shader reads: an image, a URL, a video, or * `{ shader, params }` to stack it on another shadertown shader. * * Ignored by a generative shader. Omit it and a source shader falls back to * the backdrop its registry entry names, so a preview is never blank. */ readonly source?: ShaderSourceInput; /** Start paused. The first frame is still drawn, so the canvas is never blank. */ readonly paused?: boolean; /** * Seconds to start the clock at. A paused preview at `time = 0` is often the * least interesting frame a shader has, so grids offset each card. */ readonly startTime?: number; readonly onStatus?: (status: RendererStatus, error?: unknown) => void; /** * Called whenever the tier on screen, or the reason for it, changes: once * when the renderer settles, and once more if Auto drops to Low. */ readonly onQuality?: (state: QualityState) => void; } export interface ShaderRenderer { readonly status: RendererStatus; readonly error: unknown; /** Resolves once the first frame is on screen, or rejects if it cannot be. */ readonly ready: Promise; setParams(params: ShaderParams): void; setShader(shader: ShaderName, params?: ShaderParams): void; /** * Swaps the layer a source shader reads, without rebuilding the renderer. * A no-op on a generative shader. */ setSource(source: ShaderSourceInput | undefined): void; setPaused(paused: boolean): void; /** Pointer position in normalised canvas space, top-left origin. */ setPointer(x: number, y: number): void; /** Redraw once without resuming animation. */ requestFrame(): void; /** What was asked for, what is on screen, and why. */ readonly quality: QualityState; /** * Pin a tier for this canvas, or pass nothing to follow the page's setting * again. `auto` starts High and listens for the page's signals; `high` and * `low` pin it. Swapping is a surface rebuild and a uniform, never a * recompile. */ setTier(preference?: QualityPreference): void; destroy(): void; } export declare function createShaderRenderer(canvas: HTMLCanvasElement, options: ShaderRendererOptions): ShaderRenderer; //# sourceMappingURL=renderer.d.ts.map