import { EventDispatcher, Intersection, Object3D, Raycaster, Vector2 } from 'three';
import { JSUndoManager } from 'ts-browser-helpers';
import { ICamera, IMaterial, IObject3D, ITexture, IGeometry, IWidget } from '../../core';
export type SelectionObject = IObject3D | IMaterial | ITexture | IGeometry | null;
export type SelectionObjectArr = IObject3D[] | IMaterial[] | ITexture[] | IGeometry[];
export type SelectionModeType = 'object' | 'material' | 'texture' | 'geometry';
export type PickingModeType = 'auto' | SelectionModeType;
export interface HitIntersects {
    selectedObject: IObject3D | null;
    intersect: Intersection<IObject3D> | null;
    intersects: Intersection<IObject3D>[];
    mouse: Vector2;
    selectedWidget?: (IWidget & IObject3D) | null;
    selectedHandle?: Object3D | null;
    /** When set to true by a hitObject listener, the picker will skip selection changes for this click. */
    consumed?: boolean;
}
export interface ObjectPickerEventMap {
    hoverObjectChanged: {
        object: IObject3D | null;
        material: IMaterial | null;
        value: SelectionObject;
        intersects?: HitIntersects;
    };
    selectedObjectChanged: {
        object: IObject3D | null;
        objects: SelectionObjectArr;
        material: IMaterial | null;
        value: SelectionObject;
        lastValue: SelectionObject;
        lastValues: SelectionObjectArr;
        intersects?: HitIntersects;
    };
    hitObject: {
        time: number;
        intersects: HitIntersects;
    };
    selectionModeChanged: {
        detail: {
            key: 'selectionMode';
            value: SelectionModeType;
            oldValue: SelectionModeType;
        };
    };
    pickingModeChanged: {
        detail: {
            key: 'pickingMode';
            value: PickingModeType;
            oldValue: PickingModeType;
        };
    };
    multiSelectChanged: {
        detail: {
            key: 'multiSelectEnabled';
            value: boolean;
            oldValue: boolean;
        };
    };
}
export declare class ObjectPicker extends EventDispatcher<ObjectPickerEventMap> {
    private _firstHit;
    hoverEnabled: boolean;
    /** Allow selecting multiple objects with Shift/Ctrl+Click. */
    multiSelectEnabled: boolean;
    selectionMode: SelectionModeType;
    pickingMode: PickingModeType;
    /**
     * Time threshold for a pointer click event
     */
    static PointerClickMaxTime: number;
    /**
     * Distance threshold for a pointer click event
     */
    static PointerClickMaxDistance: number;
    undoManager?: JSUndoManager;
    private _root;
    extraObjects: IObject3D[];
    private _camera;
    private _mouseDownTime;
    private _mouseDownPos;
    private _mouseUpTime;
    private _time;
    selectionCondition: (o: IObject3D) => boolean;
    raycaster: Raycaster;
    mouse: Vector2;
    private _selected;
    private _selectedIntersects;
    private _hovering;
    private _hoveringIntersects;
    cursorStyles: {
        default: string;
        down: string;
    };
    domElement: HTMLElement;
    constructor(root: IObject3D, domElement: HTMLElement, camera: ICamera, selectionCondition?: (o: IObject3D) => boolean);
    dispose(): void;
    get camera(): ICamera<import('../../core').ICameraEventMap>;
    set camera(value: ICamera<import('../../core').ICameraEventMap>);
    get selectedObject(): SelectionObject;
    get selectedObjects(): SelectionObjectArr;
    protected _onSelectedRemoved: (e: {
        target: IObject3D | IMaterial;
    }) => void;
    setSelected(object: SelectionObject, record?: boolean, intersects?: HitIntersects): void;
    get hoverObject(): SelectionObject;
    setHoverObject(object: SelectionObject, _record?: boolean, intersects?: HitIntersects): void;
    get time(): number;
    get isMouseDown(): boolean;
    get mouseDownDeltaTime(): number;
    private _onPointerMove;
    private _onPointerLeave;
    private _onPointerEnter;
    private _onPointerCancel;
    updateMouseFromEvent(event: PointerEvent): void;
    private _onPointerDown;
    private _onPointerUp;
    private _onPointerClick;
    private _hitObject;
    checkIntersection(): HitIntersects | null;
    isHovering(): boolean;
    isSelected(): boolean;
}
//# sourceMappingURL=../../src/three/utils/ObjectPicker.d.ts.map