import type { WorldBounds } from "./features.js"; import { type TerrainField } from "./terrain.js"; export type Rgb = readonly [number, number, number]; export type ColorInput = string | Rgb; export interface RegionHeight { baseHeight: number; amplitude: number; frequency: number; octaves?: number; lacunarity?: number; persistence?: number; ridged?: boolean; } /** * A content-agnostic region. The engine blends `height` and the visual/physical * knobs (`tint`, `water`, `fog`, `speedMultiplier`, …) across region borders and * selects the dominant region by nearest center in `selector` space. `data` is an * opaque payload the engine never inspects — games hang their own content off it * (spawn tables, prop palettes, structure ids, names, …). */ export interface RegionDef { id: string; selector: readonly number[]; height: RegionHeight; tint?: ColorInput; steepTint?: ColorInput; water?: ColorInput; fog?: ColorInput; fogDensity?: number; speedMultiplier?: number; data?: T; } export interface RegionSample { region: RegionDef; weight: number; selector: readonly number[]; tint: Rgb; steepTint: Rgb; water: Rgb | null; fog: Rgb | null; fogDensity: number; speedMultiplier: number; data: T | undefined; } export interface RegionField extends TerrainField { sampleRegion(x: number, z: number): RegionSample; readonly regions: readonly RegionDef[]; readonly seaLevel: number; readonly seed: number; } export interface RegionFieldConfig { regions: readonly RegionDef[]; seed?: number; bounds?: WorldBounds; seaLevel?: number; /** Noise frequency per selector axis (defaults to 0.004 for every axis). */ selectorFrequencies?: readonly number[]; /** Per-axis distance weight when picking the nearest region (defaults to 1). */ axisWeights?: readonly number[]; /** Border sharpness; higher = tighter blends. */ sharpness?: number; /** Domain-warp distance applied to selector sampling (0 disables). */ warp?: number; } export declare function createRegionField(config: RegionFieldConfig): RegionField; export declare function isRegionField(field: TerrainField): field is RegionField;