import { Extension } from './Extension.js';
import { Box3, Camera, OrthographicCamera, PerspectiveCamera, Vector2, Vector3 } from 'three';
import { type CameraEventPayload } from '../objects/SpeckleCamera.js';
import { CameraEvent, type SpeckleCamera } from '../objects/SpeckleCamera.js';
import { FlyControls, FlyControlsOptions } from './controls/FlyControls.js';
import { SpeckleControls } from './controls/SpeckleControls.js';
import { IViewer, SpeckleView } from '../../IViewer.js';
import { SmoothOrbitControlsOptions, SmoothOrbitControls } from './controls/SmoothOrbitControls.js';
export declare enum NearPlaneCalculation {
    EMPIRIC = 0,
    ACCURATE = 1
}
export type CanonicalView = 'front' | 'back' | 'up' | 'top' | 'down' | 'bottom' | 'right' | 'left' | '3d' | '3D';
export type InlineView = {
    position: Vector3;
    target: Vector3;
};
export type PolarView = {
    azimuth: number;
    polar: number;
    radius?: number;
    origin?: Vector3;
};
export type CameraControllerOptions = SmoothOrbitControlsOptions & FlyControlsOptions & {
    nearPlaneCalculation?: NearPlaneCalculation;
};
export declare function isPerspectiveCamera(camera: Camera): camera is PerspectiveCamera;
export declare function isOrthographicCamera(camera: Camera): camera is OrthographicCamera;
export declare function computeOrthographicSize(distance: number, fov: number, aspect: number): Vector2;
export declare const DefaultOrbitControlsOptions: Required<CameraControllerOptions>;
export declare class CameraController extends Extension implements SpeckleCamera {
    protected _renderingCamera: PerspectiveCamera | OrthographicCamera;
    protected perspectiveCamera: PerspectiveCamera;
    protected orthographicCamera: OrthographicCamera;
    protected _lastCameraChanged: boolean;
    protected _options: Required<CameraControllerOptions>;
    protected _activeControls: SpeckleControls;
    protected _orbitControls: SmoothOrbitControls;
    protected _flyControls: FlyControls;
    get renderingCamera(): PerspectiveCamera | OrthographicCamera;
    set renderingCamera(value: PerspectiveCamera | OrthographicCamera);
    get enabled(): boolean;
    set enabled(val: boolean);
    get fieldOfView(): number;
    set fieldOfView(value: number);
    get aspect(): number;
    get controls(): SpeckleControls;
    get options(): Required<CameraControllerOptions>;
    set options(value: CameraControllerOptions);
    constructor(viewer: IViewer);
    default(): void;
    on<T extends CameraEvent>(eventType: T, listener: (arg: CameraEventPayload[T]) => void): void;
    getTarget(): Vector3;
    getPosition(): Vector3;
    toggleControls(): void;
    setCameraView(objectIds: string[] | undefined, transition: boolean | undefined, fit?: number): void;
    setCameraView(view: CanonicalView | SpeckleView | InlineView | PolarView, transition: boolean | undefined, fit?: number): void;
    setCameraView(bounds: Box3, transition: boolean | undefined, fit?: number): void;
    onEarlyUpdate(_delta?: number): void;
    onLateUpdate(): void;
    onResize(): void;
    setPerspectiveCameraOn(): void;
    setOrthoCameraOn(): void;
    toggleCameras(): void;
    protected setupOrthoCamera(): void;
    protected setupPerspectiveCamera(): void;
    disableRotations(): void;
    enableRotations(): void;
    updateCameraPlanes(targetVolume?: Box3, offsetScale?: number): void;
    protected computeNearCameraPlaneEmpiric(targetVolume?: Box3, offsetScale?: number): number | undefined;
    protected computeNearCameraPlaneAccurate(targetVolume?: Box3, offsetScale?: number, fallback?: number): number | undefined;
    protected updateFarCameraPlane(): void;
    protected getClosestGeometryDistance(fallback?: number): number;
    protected zoom(objectIds?: string[], fit?: number, transition?: boolean): void;
    protected zoomExtents(fit?: number, transition?: boolean): void;
    protected zoomToBox(box: Box3, fit?: number, transition?: boolean): void;
    protected fitToRadius(radius: number): number;
    protected isSpeckleView(view: CanonicalView | SpeckleView | InlineView | PolarView): view is SpeckleView;
    protected isCanonicalView(view: CanonicalView | SpeckleView | InlineView | PolarView): view is CanonicalView;
    protected isInlineView(view: CanonicalView | SpeckleView | InlineView | PolarView): view is InlineView;
    protected isPolarView(view: CanonicalView | SpeckleView | InlineView | PolarView): view is PolarView;
    protected isBox3(view: CanonicalView | SpeckleView | InlineView | PolarView | Box3): view is Box3;
    protected setView(view: CanonicalView | SpeckleView | InlineView | PolarView, transition?: boolean): void;
    protected setViewSpeckle(view: SpeckleView, transition?: boolean): void;
    /**
     * Rotates camera to some canonical views
     * @param  {string}  side       Can be any of front, back, up (top), down (bottom), right, left.
     * @param  {Number}  fit        [description]
     * @param  {Boolean} transition [description]
     * @return {[type]}             [description]
     */
    protected setViewCanonical(side: string, transition?: boolean): void;
    protected setViewInline(view: InlineView, transition?: boolean): void;
    private setViewPolar;
}
