import { type AnyNode, type WallPaintRole as CoreWallPaintRole, type PaintCapability, type WallFace, type WallNode, type WallSurfaceSlotId, wallRegionRole, wallRoomFaceRole, wallRoomFinishRole } from '@pascal-app/core'; import { type BufferGeometry, type Ray } from 'three'; type ResolvedWallPaintRole = { kind: 'slot'; slotId: WallSurfaceSlotId | CurtainWallRole; } | Exclude; declare const CURTAIN_WALL_ROLES: readonly ['curtain-frame', 'curtain-glass', 'curtain-solid']; type CurtainWallRole = (typeof CURTAIN_WALL_ROLES)[number]; export { wallRegionRole, wallRoomFaceRole, wallRoomFinishRole }; export declare function parseWallPaintRole(role: string): ResolvedWallPaintRole | null; /** * Resolve which wall surface the user clicked: a trim slot, a paint region, * the room finish on that face, or the face slot itself. Returns null when the * click is too oblique (or lands on the wall's end-cap, etc.) to pick a face. */ export declare function resolveWallRole(args: { node: WallNode; hitObject?: { userData?: { slotId?: unknown; }; }; materialIndex: number | null; normal: readonly [number, number, number] | undefined; localPosition: readonly [number, number, number] | undefined; ray?: Ray; nodes?: Readonly>; }): string | null; /** * The wall's face triangles regrouped by the material index `indexFor` gives * each (the face and station its centre lies at); caps keep theirs. Null when * nothing moves. */ export declare function regroupWallFaces(geometry: BufferGeometry, wall: WallNode, indexFor: (face: WallFace, u: number, v: number) => number | null): BufferGeometry['groups'] | null; /** * Capability binding for the wall kind on the unified slot model. Face and trim * slots write `node.slots[slotId]` like every other kind; regions write the * region's finish and room roles write the zone, because a room's wall finish * belongs to the room, not to one of its walls. */ export declare const wallPaint: PaintCapability; //# sourceMappingURL=paint.d.ts.map