import { InputSnapshot } from "@aura3d/input";
import { FlyControls } from "./FlyControls";
import { OrbitControls } from "./OrbitControls";
import { Picking, type PickingOptions, type PickingReport, type ThreeCompatPickResult } from "./Picking";
import { type ControlObject3DLike, type Vector3Like } from "./NativeControlTypes";
export type InteractionControlMode = "orbit" | "fly";
export type InteractionControlsEventType = "mode-change" | "hover-enter" | "hover-exit" | "pick" | "hotspot-click";
export interface InteractionRay {
    readonly origin: Vector3Like;
    readonly direction: Vector3Like;
}
export type InteractionRayProvider = (snapshot: InputSnapshot) => InteractionRay;
export type InteractionRootProvider = () => ControlObject3DLike | undefined;
export type InteractionControlsListener = (event: InteractionControlsEvent) => void;
export type HotspotHandler = (event: InteractionControlsEvent & {
    readonly hit: ThreeCompatPickResult;
}) => void;
export interface InteractionControlsOptions {
    readonly mode?: InteractionControlMode;
    readonly orbit?: OrbitControls;
    readonly fly?: FlyControls;
    readonly picking?: Picking;
    readonly root?: ControlObject3DLike | InteractionRootProvider;
    readonly rayProvider?: InteractionRayProvider;
    readonly pickOptions?: PickingOptions;
    readonly rotateButton?: number;
    readonly panButton?: number;
    readonly rotateSpeed?: number;
    readonly panSpeed?: number;
    readonly dollySpeed?: number;
    readonly flyMoveSpeed?: number;
}
export interface InteractionControlsEvent {
    readonly type: InteractionControlsEventType;
    readonly mode: InteractionControlMode;
    readonly snapshot: InputSnapshot;
    readonly hit?: ThreeCompatPickResult;
    readonly previousHit?: ThreeCompatPickResult;
}
export interface InteractionControlsUpdate {
    readonly mode: InteractionControlMode;
    readonly pickReport?: PickingReport;
    readonly hit: ThreeCompatPickResult | null;
}
export declare class InteractionControls {
    readonly orbit: OrbitControls;
    readonly fly: FlyControls;
    readonly picking: Picking;
    enabled: boolean;
    private controlMode;
    private rootRef?;
    private rayProvider?;
    private pickOptions;
    private readonly listeners;
    private readonly hotspotHandlers;
    private hoverHit;
    private disposed;
    private readonly rotateButton;
    private readonly panButton;
    private readonly rotateSpeed;
    private readonly panSpeed;
    private readonly dollySpeed;
    private readonly flyMoveSpeed;
    constructor(options?: InteractionControlsOptions);
    get mode(): InteractionControlMode;
    setMode(mode: InteractionControlMode, snapshot?: InputSnapshot): void;
    setRoot(root: ControlObject3DLike | InteractionRootProvider | undefined): void;
    setRayProvider(provider: InteractionRayProvider | undefined): void;
    setPickOptions(options: PickingOptions): void;
    subscribe(listener: InteractionControlsListener): () => void;
    onHotspot(id: string, handler: HotspotHandler): () => void;
    update(snapshot: InputSnapshot): InteractionControlsUpdate;
    pick(snapshot: InputSnapshot): PickingReport | undefined;
    dispose(): void;
    private updateOrbit;
    private updateFly;
    private updatePicking;
    private emitHotspot;
    private emit;
    private resolveRoot;
    private resolveRay;
}
//# sourceMappingURL=InteractionControls.d.ts.map