import type { OceanEnvironmentDescriptor } from "./features.js"; export type WaterNormal = readonly [number, number, number]; export interface GerstnerWave { direction: readonly [number, number]; wavelength: number; amplitude: number; steepness: number; speed: number; } export interface WaterSurfaceConfig { level?: number; /** Scheduled base level as a function of time — tides, floods (#284.1). Wins over `level`/`setLevel` whenever set. */ levelAt?: (time: number) => number; waveHeight?: number; waveScale?: number; waveSpeed?: number; waves?: number; choppiness?: number; } export interface WaterSurface { /** The current base level — the initial config value until `setLevel` replaces it. With a `levelAt` schedule, use `levelAtTime` instead. */ readonly level: number; readonly waves: readonly GerstnerWave[]; height(x: number, z: number, time: number): number; normal(x: number, z: number, time: number): WaterNormal; displace(x: number, z: number, time: number): readonly [number, number, number]; /** Raise or drain the water at runtime (#284.1) — every `height`/`displace` consumer (buoyancy included) sees it immediately. Ignored while a `levelAt` schedule is set. */ setLevel(level: number): void; /** The effective base level at `time`: the `levelAt` schedule when set, else the current `level`. */ levelAtTime(time: number): number; } export declare function synthesizeWaves(config?: WaterSurfaceConfig): GerstnerWave[]; export declare function waterSurface(config?: WaterSurfaceConfig): WaterSurface; export declare function waterSurfaceFromDescriptor(descriptor: OceanEnvironmentDescriptor, waves?: number): WaterSurface;