import type { BufferAttribute } from 'three/webgpu'; export type FluidDiagnosticsOptions = Record; export interface FluidMetricSummary { mean: number; minimum: number; maximum: number; } export interface FluidMetrics { density: { meanRatio: number; rmsError: number; maximumRatio: number; maximumPositiveError: number; }; neighbors: FluidMetricSummary; velocity: { maximum: number; mean: number; }; boundaries: { projectedParticles: null; maximumPenetration: null; overlapPairs: number; }; solver: { type: string; pressureAcceleration?: FluidMetricSummary | undefined; viscosityAcceleration?: FluidMetricSummary | undefined; }; } export interface FluidMetricBuffer { value: BufferAttribute; } export interface FluidMetricsSource { particleCount: number; solver: string; particleRadius?: number | undefined; buffers: { positions: FluidMetricBuffer; velocities: FluidMetricBuffer; densities: FluidMetricBuffer; }; solverBuffers?: { pressureAcceleration?: FluidMetricBuffer | null | undefined; viscosityAcceleration?: FluidMetricBuffer | null | undefined; } | undefined; ubos?: { restDensity?: { value: number; } | undefined; h?: { value: number; } | undefined; } | undefined; } export interface FluidMetricsRenderer { readonly backend?: unknown; getArrayBufferAsync(attribute: BufferAttribute): Promise; } /** Explicit, opt-in metrics state for particle-fluid simulations. */ export declare class FluidDiagnostics { options: FluidDiagnosticsOptions; pending: boolean; lastMetrics: TMetrics | null; constructor(options?: FluidDiagnosticsOptions | null); requestReadback(): void; consumeRequest(): boolean; setLastMetrics(metrics: TMetrics): void; } /** Explicitly read and summarize particle-fluid GPU state. */ export declare function readFluidMetrics(renderer: FluidMetricsRenderer, fluid: FluidMetricsSource): Promise;