import { type PickingOptions, type PickingReport, type ThreeCompatPickResult } from "./Picking";
import { type ControlObject3DLike, type ControlPickMetadata, type Vector3Like } from "./NativeControlTypes";
export type PickingAnnotationKind = "hotspot" | "label" | "district" | "building" | "robot" | "entity";
export type PickingAnnotationSource = "imported-gltf" | "procedural" | "screen-space";
export type PickingAnnotationHitPolicy = "nearest" | "priority";
export interface PickingAnnotation<TPayload = unknown> {
    readonly id: string;
    readonly label: string;
    readonly kind: PickingAnnotationKind;
    readonly position: Vector3Like | readonly [number, number, number];
    readonly radius: number;
    readonly priority?: number;
    readonly group?: string;
    readonly routeId?: string;
    readonly source?: PickingAnnotationSource;
    readonly selectable?: boolean;
    readonly highlightable?: boolean;
    readonly targetId?: string;
    readonly payload?: TPayload;
}
export interface PickingAnnotationRoot<TPayload = unknown> extends ControlObject3DLike {
    readonly type: "PickingAnnotationRoot";
    readonly name: string;
    readonly children: readonly PickingAnnotationObject<TPayload>[];
}
export interface PickingAnnotationObject<TPayload = unknown> extends ControlObject3DLike {
    readonly type: "PickingAnnotation";
    readonly name: string;
    readonly picking: ControlPickMetadata;
    readonly userData: {
        readonly a3dPicking: ControlPickMetadata;
        readonly a3dPickingAnnotation: PickingAnnotation<TPayload>;
    };
}
export interface PickingAnnotationReport<TPayload = unknown> extends PickingReport {
    readonly annotation: PickingAnnotation<TPayload> | null;
    readonly annotations: readonly PickingAnnotation<TPayload>[];
}
export interface PickingAnnotationOptions extends PickingOptions {
    readonly hitPolicy?: PickingAnnotationHitPolicy;
}
export interface ImportedGlbHotspotDescriptor<TPayload = unknown> {
    readonly id?: string;
    readonly nodeName?: string;
    readonly label?: string;
    readonly focusId?: string;
    readonly position: Vector3Like | readonly [number, number, number];
    readonly radius?: number;
    readonly priority?: number;
    readonly selectable?: boolean;
    readonly highlightable?: boolean;
    readonly payload?: TPayload;
}
export interface DistrictPickingDescriptor<TPayload = unknown> {
    readonly id: string;
    readonly label?: string;
    readonly center: Vector3Like | readonly [number, number, number];
    readonly radius: number;
    readonly priority?: number;
    readonly routeId?: string;
    readonly payload?: TPayload;
    readonly buildings?: readonly BuildingPickingDescriptor<TPayload>[];
}
export interface BuildingPickingDescriptor<TPayload = unknown> {
    readonly id: string;
    readonly label?: string;
    readonly position: Vector3Like | readonly [number, number, number];
    readonly radius: number;
    readonly priority?: number;
    readonly payload?: TPayload;
}
export interface EntityPickingDescriptor<TPayload = unknown> {
    readonly id: string;
    readonly label?: string;
    readonly kind?: "robot" | "entity";
    readonly position: Vector3Like | readonly [number, number, number];
    readonly radius: number;
    readonly priority?: number;
    readonly group?: string;
    readonly routeId?: string;
    readonly payload?: TPayload;
}
export interface ScreenPickingAnnotation<TPayload = unknown> {
    readonly id: string;
    readonly label: string;
    readonly kind: PickingAnnotationKind;
    readonly x: number;
    readonly y: number;
    readonly radius: number;
    readonly priority?: number;
    readonly group?: string;
    readonly routeId?: string;
    readonly source?: PickingAnnotationSource;
    readonly selectable?: boolean;
    readonly highlightable?: boolean;
    readonly targetId?: string;
    readonly payload?: TPayload;
}
export interface ScreenPickingHit<TPayload = unknown> {
    readonly annotation: ScreenPickingAnnotation<TPayload>;
    readonly distance: number;
}
export interface ScreenPickingReport<TPayload = unknown> {
    readonly hit: ScreenPickingHit<TPayload> | null;
    readonly hits: readonly ScreenPickingHit<TPayload>[];
    readonly diagnostics: {
        readonly testedAnnotations: number;
        readonly candidateAnnotations: number;
        readonly hitCount: number;
        readonly skippedDisabled: number;
        readonly skippedOutOfRadius: number;
        readonly nearestHitLabel: string | null;
    };
}
export interface ScreenPickingOptions {
    readonly tolerance?: number;
    readonly hitPolicy?: PickingAnnotationHitPolicy;
}
export declare function createPickingAnnotationRoot<TPayload = unknown>(name: string, annotations: readonly PickingAnnotation<TPayload>[]): PickingAnnotationRoot<TPayload>;
export declare function createPickingAnnotationObject<TPayload = unknown>(annotation: PickingAnnotation<TPayload>): PickingAnnotationObject<TPayload>;
export declare function pickAnnotation<TPayload = unknown>(root: ControlObject3DLike, origin?: Vector3Like, direction?: Vector3Like, options?: PickingAnnotationOptions): PickingAnnotationReport<TPayload>;
export declare function annotationFromPickHit<TPayload = unknown>(hit: ThreeCompatPickResult | null | undefined): PickingAnnotation<TPayload> | null;
export declare function createImportedGlbHotspotAnnotations<TPayload = unknown>(assetId: string, hotspots: readonly ImportedGlbHotspotDescriptor<TPayload>[], routeId?: string): readonly PickingAnnotation<TPayload>[];
export declare function createDistrictPickingAnnotations<TPayload = unknown>(districts: readonly DistrictPickingDescriptor<TPayload>[]): readonly PickingAnnotation<TPayload>[];
export declare function createRobotPickingAnnotations<TPayload = unknown>(robots: readonly EntityPickingDescriptor<TPayload>[]): readonly PickingAnnotation<TPayload>[];
export declare function createEntityPickingAnnotations<TPayload = unknown>(entities: readonly EntityPickingDescriptor<TPayload>[], options?: {
    readonly defaultGroup?: string;
    readonly defaultPriority?: number;
}): readonly PickingAnnotation<TPayload>[];
export declare function pickScreenSpaceAnnotation<TPayload = unknown>(pointer: {
    readonly x: number;
    readonly y: number;
}, annotations: readonly ScreenPickingAnnotation<TPayload>[], options?: ScreenPickingOptions): ScreenPickingReport<TPayload>;
//# sourceMappingURL=PickingAnnotations.d.ts.map