import { type Aabb, type Vec2 } from "./geometry.js"; export type WallVec3 = readonly [number, number, number]; export interface WallSegment { from: Vec2; to: Vec2; length: number; angle: number; } export interface EnclosedFootprint { polygon: readonly Vec2[]; aabb: Aabb; area: number; perimeter: number; closed: boolean; } export type RoofStyle = "hip" | "gable" | "flat"; export interface RoofPlan { style: RoofStyle; ridge: readonly [Vec2, Vec2]; apexHeight: number; eaveHeight: number; faces: readonly (readonly WallVec3[])[]; } export interface RoofConfig { style?: RoofStyle; eaveHeight?: number; pitch?: number; overhang?: number; } /** @internal */ export declare function wallSegments(points: readonly Vec2[], closed: boolean): WallSegment[]; /** @internal */ export declare function isEnclosed(points: readonly Vec2[], tolerance?: number): boolean; /** @internal */ export declare function enclosePath(points: readonly Vec2[], tolerance?: number): readonly Vec2[]; /** @internal */ export declare function polygonArea(polygon: readonly Vec2[]): number; /** @internal */ export declare function footprintFromWalls(points: readonly Vec2[], tolerance?: number): EnclosedFootprint | null; /** @internal */ export declare function autoRoof(footprint: EnclosedFootprint, config?: RoofConfig): RoofPlan; export type PaintTarget = "floor" | "wall"; export interface SurfacePaintStore { paint(target: PaintTarget, key: string, surface: string): void; clear(target: PaintTarget, key: string): void; get(target: PaintTarget, key: string): string | null; entries(target: PaintTarget): readonly (readonly [string, string])[]; snapshot(): Record>; restore(snapshot: Record>): void; } /** @internal */ export declare function createSurfacePaint(): SurfacePaintStore; /** Plain JSON state of a {@link WallDrawTool}: the drawn points and whether the loop is closed. */ export interface WallDrawToolState { points: Vec2[]; closed: boolean; } export interface WallDrawTool { addPoint(point: Vec2, snap?: number): Vec2; undo(): void; close(): void; clear(): void; points(): readonly Vec2[]; segments(): WallSegment[]; isClosed(): boolean; footprint(): EnclosedFootprint | null; roof(config?: RoofConfig): RoofPlan | null; snapshot(): WallDrawToolState; restore(next: WallDrawToolState): void; } /** @internal */ export declare function createWallDrawTool(config?: { snap?: number; closeTolerance?: number; }): WallDrawTool; /** @internal */ export declare function wallSegmentBounds(segment: WallSegment, thickness: number): Aabb;