import SpeckleRenderer from '../../SpeckleRenderer.js';
import { type IViewer } from '../../../IViewer.js';
import { Plane, Raycaster, Vector2, Vector3 } from 'three';
import { Measurement } from './Measurement.js';
import { ExtendedMeshIntersection } from '../../objects/SpeckleRaycaster.js';
import { Extension } from '../Extension.js';
import { CameraController } from '../CameraController.js';
export declare enum MeasurementType {
    PERPENDICULAR = 0,
    POINTTOPOINT = 1,
    AREA = 2,
    POINT = 3
}
export interface MeasurementOptions {
    visible: boolean;
    type?: MeasurementType;
    vertexSnap?: boolean;
    units?: string;
    precision?: number;
    chain?: boolean;
}
export declare class MeasurementsExtension extends Extension {
    protected cameraProvider: CameraController;
    get inject(): (typeof CameraController)[];
    protected renderer: SpeckleRenderer;
    protected measurements: Measurement[];
    protected _activeMeasurement: Measurement | null;
    protected _selectedMeasurement: Measurement | null;
    protected raycaster: Raycaster;
    protected _options: MeasurementOptions;
    private _frameLock;
    private _paused;
    private _sceneHit;
    private pointBuff;
    private normalBuff;
    private screenBuff0;
    private screenBuff1;
    get enabled(): boolean;
    set enabled(value: boolean);
    get options(): MeasurementOptions;
    set options(options: MeasurementOptions);
    get selectedMeasurement(): Measurement | null;
    get activeMeasurement(): Measurement | null;
    constructor(viewer: IViewer, cameraProvider: CameraController);
    onLateUpdate(): void;
    onResize(): void;
    protected onPointerMove(data: Vector2 & {
        event: Event;
    }): void;
    protected onPointerClick(data: {
        event: PointerEvent;
        multiSelect: boolean;
    } & Vector2): void;
    protected onPointerDoubleClick(data: Vector2 & {
        event: PointerEvent;
        multiSelect: boolean;
    }): void;
    protected autoLazerMeasure(data: Vector2): void;
    protected startMeasurement(): Measurement;
    protected cancelMeasurement(): void;
    protected finishMeasurement(): void;
    removeMeasurement(): void;
    clearMeasurements(): void;
    protected flashMeasurement(): void;
    protected pickMeasurement(data: Vector2): Measurement | null;
    protected selectMeasurement(measurement: Measurement, value: boolean): void;
    protected snap(intersection: ExtendedMeshIntersection, outPoint: Vector3, outNormal: Vector3): void;
    protected updateClippingPlanes(planes: Plane[]): void;
    protected applyOptions(): void;
    fromMeasurementData(startPoint: Vector3, endPoint: Vector3): Promise<void>;
}
