import type { Aabb } from "./geometry.js"; import type { RegionField, RegionSample } from "./regions.js"; /** One placeable class. `item` is an opaque id the caller maps to a mesh/entity. */ export interface ScatterLayer { item: string; density: number; minScale?: number; maxScale?: number; maxSlope?: number; aboveWaterOnly?: boolean; } export interface ScatterInstance { id: string; item: string; x: number; z: number; y: number; scale: number; rotation: number; regionId: string; } /** * Deterministically place opaque items across `area`, grounded on a region field. * For each grid cell it asks `layersFor` which items may appear in that region and * rolls one against their densities. The engine never interprets `item` — a game * maps it to a mesh or entity. Content scatter (region-driven density) as opposed to * `scatter` in `./scatter`, which is renderer-free geometric point distribution. */ export declare function scatterItems(field: RegionField, area: Aabb, layersFor: (sample: RegionSample) => readonly ScatterLayer[], options?: { cell?: number; max?: number; saltKey?: number; }): ScatterInstance[]; /** Weighted pick from opaque entries; `roll` in [0, 1). Returns null when empty. */ export declare function pickWeighted(entries: readonly { value: T; weight: number; }[], roll: number): T | null;