import type { MaterialDiagnostic } from "./materialAsset.js"; /** Tangents follow card width (UV U); strand length follows UV V. Angles are radians. */ export declare const HAIR_CARD_STRAND_ROTATION: number; /** An authored centreline, in model-local metres, with root-to-tip points. */ export interface HairCardGuide { id: string; points: readonly (readonly [number, number, number])[]; width: number; tipWidth?: number; /** Desired front-facing normal; must not be parallel to the strand direction. */ facing: readonly [number, number, number]; /** Atlas rectangle [uMin,vMin,uMax,vMax]; U is width and V is root to tip. */ uvRect?: readonly [number, number, number, number]; } /** Serializable geometry authoring, independent of materials, grooming physics and collisions. */ export interface HairCardAuthoring { guides: readonly HairCardGuide[]; subdivisionsPerSegment?: number; /** Allocation ceiling for offline/editor generation; default 65,536 vertices. */ maxVertices?: number; } /** Renderer-neutral indexed ribbons with an explicit tangent frame and guide ranges. */ export interface HairCardMesh { positions: number[]; normals: number[]; tangents: number[]; uvs: number[]; indices: number[]; bounds: { min: [number, number, number]; max: [number, number, number]; }; guides: { id: string; vertexStart: number; vertexCount: number; indexStart: number; indexCount: number; }[]; } /** * Validate finite guides, tangent frames and bounded generation; crossing/collision is not solved. * @capability hair-card-geometry validate authored ribbon guides and their vertex allocation ceiling */ export declare function validateHairCardAuthoring(value: unknown): MaterialDiagnostic[]; /** Build deterministic model-local ribbon geometry; guides remain separately editable source data. */ export declare function buildHairCards(input: HairCardAuthoring): HairCardMesh;