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';
import { MeasurementData, MeasurementOptions } from '@speckle/shared/viewer/state';
export declare enum MeasurementEvent {
    CountChanged = "measurement-count-changed",
    MeasurementsChanged = "measurements-changed"
}
export interface MeasurementEventPayload {
    [MeasurementEvent.CountChanged]: number;
    [MeasurementEvent.MeasurementsChanged]: Measurement[];
}
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 _options: MeasurementOptions;
    private _frameLock;
    private _paused;
    private _sceneHit;
    protected raycaster: Raycaster;
    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;
    get measurementCount(): number;
    get mesurements(): Measurement[];
    private emitMeasurementCountChanged;
    constructor(viewer: IViewer, cameraProvider: CameraController);
    on<T extends MeasurementEvent>(eventType: T, listener: (arg: MeasurementEventPayload[T]) => void): void;
    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;
    protected pushMeasurement(measurement: Measurement): void;
    protected findMeasurementFromData(measurementData: MeasurementData): Measurement | undefined;
    removeMeasurement(measurementData?: MeasurementData): void;
    /**
     * Idempotent way of setting measurements
     */
    setMeasurements(measurements: MeasurementData[]): 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;
    addMeasurement(measurementData: MeasurementData): void;
    toMeasurementData(): MeasurementData[];
}
