import * as THREE from "three";
import { Camera, CameraPose } from "../core/camera";
import { Scene } from "../core/scene";
import { ModelScene } from "../model";
import { Mode } from "../application/mode";
import { Pano } from "../utils/pano";
import { GestureEvent } from '../utils/event';
import { Works } from "../work";
import { State } from "../types/state";
import { Pose } from "../types/pose";
import { Viewport } from "../types/viewport";
import { ImageOptions } from "../types/imageOptions";
import { MovePanoEffect } from "../types/movePanoEffect";
import { Subscribe } from "../utils/subscribe";
import { ControllerEventTypes } from "./events";
import { Motion } from "../utils/motion";
type CameraMotion = Motion<"longitude" | "latitude" | "fov">;
type PostProcessingType = 'edl' | 'hq' | 'luminance' | null;
interface BaseControllerInitArgs {
    fiveId: string;
    works: Works;
    scene: Scene;
    modelScene: ModelScene;
    xrCustomObjectsScene: THREE.Scene;
    helper: THREE.Group;
    camera: Camera;
    renderer: THREE.WebGLRenderer;
    viewport: Viewport;
    element: HTMLElement;
    extraElements: HTMLElement[];
    imageOptions: ImageOptions;
    enableWheel: boolean;
    videoTexture: THREE.VideoTexture;
    initial: {
        /** 初始化状态 */
        state: Partial<State>;
        currentState: State;
        /** 状态切换动画时长 */
        duration: number;
        /** 动画模式 */
        effect: MovePanoEffect;
        /** 是否是用户触发的 */
        userAction: boolean;
    };
}
declare class BaseController extends Subscribe<ControllerEventTypes> implements BaseControllerInitArgs {
    mode: Mode;
    fiveId: string;
    needsRender: boolean;
    destroyed: boolean;
    cameraMotion: CameraMotion;
    userAction: boolean;
    /** 资源等待中 */
    pending: Set<string>;
    scene: Scene;
    modelScene: ModelScene;
    xrCustomObjectsScene: THREE.Scene;
    helper: THREE.Group;
    camera: Camera;
    renderer: THREE.WebGLRenderer;
    viewport: Viewport;
    element: HTMLElement;
    works: Works;
    imageOptions: ImageOptions;
    videoTexture: THREE.VideoTexture;
    extraElements: HTMLElement[];
    enableWheel: boolean;
    initial: {
        state: Partial<State>;
        currentState: State;
        duration: number;
        effect: MovePanoEffect;
        userAction: boolean;
    };
    currentPano: Pano;
    protected panState?: {
        x: number;
        y: number;
        defaultPrevented: boolean;
        pointerLength: number;
    };
    protected pressState?: {
        event: GestureEvent;
        timeStamp: number;
        stop: () => void;
    };
    protected pinchState?: {
        x: number;
        y: number;
    };
    protected mouseWheelState?: {
        timer: any;
    };
    protected mouseMoveState?: {
        event: GestureEvent;
        timeStamp: number;
    };
    /** 相机旋转是否在惯性运动 */
    protected inMomentumMovement: {
        uuid: string;
        event?: GestureEvent;
    } | null;
    protected initAnimationReady: Promise<void>;
    protected initAnimationIsReady: boolean;
    private eventUnbinds;
    static parseArgs(args: BaseControllerInitArgs): Required<BaseControllerInitArgs>;
    static initAnimationEndState(args: BaseControllerInitArgs): State;
    constructor(args: BaseControllerInitArgs);
    /** 动态更新配置 */
    updateConfiguration(args: {}): boolean;
    /** 析构函数 */
    destroy(): void;
    /** 是否准备好，即不在用户操作中，并且不再动画中 */
    isReady(): boolean;
    bindExtraElement(element: HTMLElement): void;
    unbindExtraElement(element: HTMLElement): void;
    /** 生命周期： 更新模型 */
    updateModel(modelScene: ModelScene): void;
    /** 生命周期： 更新 Work */
    updateWork(works: Works, state: Partial<State>, options: {
        duration: number;
        effect: MovePanoEffect;
    }, userAction: boolean): boolean;
    /** 生命周期： 更新当前时间  */
    updateTime(time: number, deltaTime: number, ...args: any[]): void;
    /** 生命周期： 更新渲染  */
    render(): boolean;
    /** 转动摄像头 */
    updateCamera(pose: Partial<Pose>, duration: number, userAction: boolean): Promise<void>;
    /** 通过帧动画转动摄像头 */
    updateCameraWithKeyframes(keyframes: {
        progress: number;
        value: Pose;
        key?: string;
    }[], duration: number, userAction: boolean): Promise<void>;
    /** 获取目标姿态 */
    getTargetState(): State;
    /** 初始化动画 */
    protected initAnimation(): Promise<void>;
    /** 改变相机 */
    protected setCamera(cameraPose?: Partial<CameraPose>): void;
    stopMomentumMovement(): void;
    /** 用户 Pan 事件 */
    protected onPanGesture(event: GestureEvent): void;
    /** 用户 Tap 事件 */
    protected onTapGesture(event: GestureEvent): void;
    /** 用户 DblTap 事件 */
    protected onDblTapGesture(event: GestureEvent): void;
    /** 用户 Tap 事件 */
    protected onPressGesture(event: GestureEvent): void;
    /** 用户 Pinch 事件 */
    protected onPinchGesture(event: GestureEvent): void;
    /** 用户 MouseWheel 事件 */
    protected onMouseWheel(event: GestureEvent): void;
    /** 用户 MouseMove 事件 */
    protected onMouseMove(event: GestureEvent): void;
    /** 计算屏幕坐标位置到屏幕标准空间 x: [-1, 1], y: [-1, 1] */
    protected relativeClientPosition(mouseXY: {
        x: number;
        y: number;
    }): THREE.Vector2;
    /** 从屏幕标准空间 得到 射线 */
    protected createRaycasterFromCamera(coords: THREE.Vector2, camera: Camera): THREE.Raycaster;
    /** 用户事件绑定 */
    private bindEvents;
}
export { BaseController, CameraMotion, PostProcessingType, BaseControllerInitArgs };
