import { type FenceFeatureData, type FenceNode, type FenceWithFeatures } from '@pascal-app/core'; import * as THREE from 'three'; type FencePart = { geometry?: THREE.BufferGeometry; position: [number, number, number]; rotationY?: number; rotationZ?: number; scale: [number, number, number]; shape?: 'box' | 'pyramid' | 'picket'; picketTop?: FenceNode['picketTop']; startT?: number; endT?: number; heightOverride?: number; curveBlock?: { centerY: number; height: number; depth: number; lateralOffset: number; }; endpoint?: 'start' | 'end'; }; export type FenceGateLeafGeometry = { geometry: THREE.BufferGeometry; hinge: { x: number; z: number; }; rotationY: number; openRotationY: number; }; export declare function getFenceFeatureDimensions(fence: FenceNode, feature: FenceFeatureData): { bottom: number; height: number; postBottom: number; postHeight: number; }; export type FenceSlotId = 'posts' | 'infill' | 'base' | 'rail'; export type FenceSlotParts = Record; export type FenceCornerNeighbors = Partial>; export declare function createFenceRailHeightSampler(fence: FenceNode, heightAt: (x: number, z: number) => number): (x: number, z: number) => number; /** * Geometry split by paint slot — posts, infill, base, rail — each a separate * merged BufferGeometry (empty ones included) so the fence renderer can give * each its own material + `userData.slotId`. Slots match the panel's build * options 1:1. */ export declare function generateFenceSlotGeometries(fence: FenceWithFeatures, heightAt?: (x: number, z: number) => number, mode?: 'all' | 'body' | 'features', omitEndpointPosts?: ReadonlySet<'start' | 'end'>, cornerNeighbors?: FenceCornerNeighbors, gateLeafGeometries?: FenceGateLeafGeometry[]): Record; export declare function generateFenceGeometry(fence: FenceNode, heightAt?: (x: number, z: number) => number): THREE.BufferGeometry; export {}; //# sourceMappingURL=geometry-parts.d.ts.map