import * as THREE from 'three';
import { Model } from "../model";
import { MovePanoOptions } from "../types/movePanoOptions";
import { State } from "../types/state";
import { Pose } from "../types/pose";
import { Intersection } from "../model/intersection";
import { NetworkState, NetworkType } from "../utils/ajax";
import { NetWorkMeta } from "../utils/ajax";
import { Work, WorkModel } from "../work";
import { Mode } from "./mode";
import { XRGestureEvent } from '../utils/event';
import type { Five } from './five';
export type GestureTypes = "pan" | "tap" | "dbltap" | "pinch" | "press" | "mouseWheel" | "mouseMove";
export type WebXRControllerType = 'tap' | 'press' | 'axes' | 'buttonUp' | 'buttonDown';
export type WebXRControllerKey = XRGestureEvent['buttons'];
export interface WebXRControllerParams {
    raycaster: {
        leftRay: THREE.Raycaster;
        rightRay: THREE.Raycaster;
    };
}
export interface WebXRAxesParams {
    raycaster: {
        leftRay?: THREE.Raycaster;
        rightRay?: THREE.Raycaster;
    };
    axesState: {
        up: number;
        down: number;
        left: number;
        right: number;
    };
    deltaTime: number;
}
/**
 * 过时的事件列表
 */
export type LegacyEventType = {
    /**
     * 模态间切换动画开始
     * @param panoIndex - 当前点位
     * @param pose - 相机姿态
     * @param userAction - 是否用户触发
     */
    initAnimationWillStart(panoIndex: number, pose: Pose, userAction: boolean): void;
    /**
     * 模态间切换动画结束
     * @param panoIndex - 当前点位
     * @param pose - 相机姿态
     * @param userAction - 是否用户触发
     */
    initAnimationEnded(panoIndex: number, pose: Pose, userAction: boolean): void;
    /**
     * 意图要触发手势， 可以通过 `return false` 阻止
     * @param type - 手势类型
     * @param pointers - 手指位置
     * @param final - 是否手势结束
     * @returns 可以通过 `return false` 阻止
     */
    wantsGesture(type: GestureTypes, pointers: {
        x: number;
        y: number;
        delta?: number;
    }[], final: boolean): void | false;
    /**
     * 手势 触发
     * @param type - 手势类型
     * @param pointers - 手指位置
     * @param final - 是否手势结束
     */
    gesture(type: GestureTypes, pointers: {
        x: number;
        y: number;
        delta?: number;
    }[], final: boolean): void;
    /**
     * 意图要触发 pan 手势(滑动屏幕)， 可以通过 `return false` 阻止
     * @param pose - 意图的相机姿态
     * @param final - 是否手势结束
     * @returns 可以通过 `return false` 阻止
     */
    wantsPanGesture(pose: Pose, final: boolean): void | false;
    /**
     * pan 手势(滑动屏幕) 被触发
     * @param pose - 相机姿态
     * @param final - 是否手势结束
     */
    panGesture(pose: Pose, final: boolean): void;
    /**
     * 意图要触发 tap 手势(点击屏幕)， 可以通过 `return false` 阻止
     * @param raycaster - 点击对应的三维射线
     * @param tapPosition - 点击对应的屏幕位置
     * @param final - 是否手势结束
     * @returns 可以通过 `return false` 阻止
     */
    wantsTapGesture(raycaster: THREE.Raycaster, tapPosition: THREE.Vector2, final: boolean): void | false;
    /**
     * tap 手势(点击屏幕) 被触发
     * @param raycaster - 点击对应的三维射线
     * @param tapPosition - 点击对应的屏幕位置
     * @param final - 是否手势结束
     */
    tapGesture(raycaster: THREE.Raycaster, tapPosition: THREE.Vector2, final: boolean): void;
    /**
     * 意图要触发 dlbtap 手势(点击屏幕)， 可以通过 `return false` 阻止
     * @param raycaster - 点击对应的三维射线
     * @param tapPosition - 点击对应的屏幕位置
     * @param final - 是否手势结束
     * @returns 可以通过 `return false` 阻止
     */
    wantsDblTapGesture(raycaster: THREE.Raycaster, tapPosition: THREE.Vector2, final: boolean): void | false;
    /**
     * dbltap 手势(点击屏幕) 被触发
     * @param raycaster - 点击对应的三维射线
     * @param tapPosition - 点击对应的屏幕位置
     * @param final - 是否手势结束
     */
    dblTapGesture(raycaster: THREE.Raycaster, tapPosition: THREE.Vector2, final: boolean): void;
    /**
     * 意图要触发 pinch 手势(双指缩放)，可以通过 `return false` 阻止
     * @param scale - 缩放数值
     * @param nextFov - 意图的fov变更
     * @param final - 是否手势结束
     * @returns 可以通过 `return false` 阻止
     */
    wantsPinchGesture(scale: number, nextFov: number, final: boolean): void | false;
    /**
     * 意图要触发 press 手势(长按屏幕)， 可以通过 `return false` 阻止
     * @param raycaster - 长按对应的三维射线
     * @param tapPosition - 长按对应的屏幕位置
     * @param duration - 长按持续时间
     * @param final - 是否手势结束
     * @returns 可以通过 `return false` 阻止
     */
    wantsPressGesture(raycaster: THREE.Raycaster, tapPosition: THREE.Vector2, duration: number, final: boolean): void | false;
    /**
     * tap 手势(点击屏幕) 被触发
     * @param raycaster - 点击对应的三维射线
     * @param tapPosition - 点击对应的屏幕位置
     * @param duration - 长按持续时间
     * @param final - 是否手势结束
     */
    pressGesture(raycaster: THREE.Raycaster, tapPosition: THREE.Vector2, duration: number, final: boolean): void;
    /**
     * pinch 手势(双指缩放) 被触发
     * @param scale - 缩放数值
     * @param fov - 意图的fov变更
     * @param final - 是否手势结束
     */
    pinchGesture(scale: number, fov: number, final: boolean): void;
    /**
     * 意图要触发 鼠标滚轮 可以通过 `return false` 阻止
     * @param delta - 滚轮数值
     * @param nextFov - 意图的fov变更
     * @param final - 是否手势结束
     * @returns 可以通过 `return false` 阻止
     */
    wantsMouseWheel(delta: number, nextFov: number, final: boolean): void | false;
    /**
     * 鼠标滚轮被触发
     * @param delta - 滚轮数值
     * @param fov - 意图的fov变更
     * @param final - 是否手势结束
     */
    mouseWheel(delta: number, fov: number, final: boolean): void;
    /**
     * 意图要触发 pan 手势(滑动屏幕) 的惯性运动, 可以通过 `return false` 阻止
     * @param pose - 意图的相机姿态
     * @returns 可以通过 `return false` 阻止
     */
    wantsInteriaPan(pose: Pose): void | false;
    /**
     * pan 手势(滑动屏幕) 的惯性运动
     * @param pose - 意图的相机姿态
     * @param final - 是否手势结束
     */
    interiaPan(pose: Pose, final: boolean): void;
    /**
     * 意图要变化相机的可视角度 可以通过 `return false` 阻止
     * @deprecated
     * 建议通过 初始化设置的 `defaultFov`, `maxFov`, `minFov` 来限制
     * @param fov - 意图要变化相机的可视角度
     * @returns 可以通过 `return false` 阻止
     */
    wantsChangeCameraFov(fov: number): void | false;
    /**
     * 相机姿态变化
     * @param pose - 相机姿态
     * @param userAction - 是否用户触发
     */
    cameraUpdate(pose: Pose, userAction: boolean): void;
    /**
     * 相机姿态中可视角度变化
     * @param fov - 相机的可视角度
     * @param userAction - 是否用户触发
     */
    cameraFovUpdate(fov: Pose["fov"], userAction: boolean): void;
    /**
     * 相机姿态中相机位置变化
     * @param offset - 相机位置
     * @param userAction - 是否用户触发
     */
    cameraPositionUpdate(offset: Pose["offset"], userAction: boolean): void;
    /**
     * 相机姿态中相机方向变化
     * @param coordinates - 相机姿态的俯仰角和偏航角
     * @param userAction - 是否用户触发
     */
    cameraDirectionUpdate(coordinates: Pick<Pose, "longitude" | "latitude">, userAction: boolean): void;
    /**
     * 鼠标焦点环位置被重新计算
     * @param intersection - 焦点碰撞结果
     * @param mesh - 焦点环 mesh
     */
    intersectionOnModelUpdate(intersection: Intersection, mesh: THREE.Object3D): void;
    /**
     * 意图要展示鼠标焦点环，可以通过 `return false` 阻止
     * @param raycaster - 射线
     * @returns 可以通过 `return false` 阻止
     */
    wantsShowIntersectionOnModel(raycaster: THREE.Raycaster): void | false;
    /** 鼠标焦点环被隐藏 */
    intersectionHidden(): void;
    /**
     * 意图要移动到某个点时, 可以通过 return false 阻止
     * @param panoIndex - 意图要移动到点位
     * @param options - 移动参数
     * @param userAction - 是否用户触发
     * @returns 可以通过 return false 阻止
     */
    wantsMoveToPano(panoIndex: number, options: MovePanoOptions, userAction: boolean): void | false;
    /**
     * 同 wantsMoveToPano
     * @description
     * @param panoIndex - 意图要移动到点位
     * @param options - 移动参数
     * @param userAction - 是否用户触发
     * @returns 可以通过 return false 阻止
     */
    wantsToMoveToPano(panoIndex: number, options: MovePanoOptions, userAction: boolean): void;
    /**
     * 观察点位被选择
     * @param panoIndex - 选择的点位
     */
    panoSelected(panoIndex: number | null): void;
    /**
     * 开始加载并移动到某个观察点位
     * @description
     * 可 panoWillArrive 相比
     * - moveToPano 在加载全景图资源前触发
     * - panoWillArrive 在加载全景图资源后触发
     * @param panoIndex - 移动到的点位
     * @param userAction - 是否用户触发
     */
    moveToPano(panoIndex: number, userAction: boolean): void;
    /**
     * 移动中， 会告知移动状态（耗时百分比）
     * @param panoIndex - 将要移动到的点位下标
     * @param prevPanoIndex - 上一个点位下标
     * @param progress - 整个过程经度 [0-1]
     */
    movingToPano(panoIndex: number, prevPanoIndex: number, progress: number): void;
    /**
     * 开始加载某个观察点的全景资源
     * @param panoIndex - 移动到的点位
     */
    panoWillLoad(panoIndex: number): void;
    /**
     * 某个观察点的全景资源加载完成
     * @param panoIndex - 对应的点位
     */
    panoLoaded(panoIndex: number): void;
    /**
     * 开始移动到某个观察点位
     * @description
     * 和 moveToPano 相比
     * - moveToPano 在加载全景图资源前触发
     * - panoWillArrive 在加载全景图资源后触发
     * @param panoIndex - 移动到点位
     * @param pose - 相机姿态
     * @param userAction - 是否用户触发
     */
    panoWillArrive(panoIndex: number, pose: Pose, userAction: boolean): void;
    /**
     * 移动到某个观察点位
     * @param panoIndex - 移动到点位
     * @param pose - 相机姿态
     * @param userAction - 是否用户触发
     */
    panoArrived(panoIndex: number, pose: Pose, userAction: boolean): void;
    /**
     * 某个观察点的全景资源加载失败
     * @param error - 错误对象
     * @param panoIndex - 对应的点位
     */
    panoLoadError(error: Error, panoIndex: number): void;
    /**
     * 移动到某个观察点位被取消
     * @description
     * 这个有一些情况会导致
     * - 移动过程中切换模态
     * - 移动过程中 five 被析构
     * - 移动过程点击切换到另一个点位
     * @param panoIndex - 对应的点位
     */
    moveToPanoCanceled(panoIndex: number): void;
    /**
     * 观察点的全景资源开始加载
     * @param panoIndex - 加载点位
     */
    textureStartLoad(panoIndex: number): void;
    /**
     * 观察点的全景资源加载中，可获取到进度
     * @param progress - 加载进度 [0-1]
     * @param panoIndex - 加载点位下标
     */
    textureLoading(progress: number, panoIndex: number): void;
    /**
     * 观察点的全景资源加载被中止
     * @param panoIndex - 加载点位
     */
    textureAbort(panoIndex: number): void;
    /**
     * 观察点的全景资源加载失败
     * @param error - 错误对象
     * @param panoIndex - 加载点位
     */
    textureError(error: Error, panoIndex: number): void;
    /**
     * 观察点的全景资源加载完成
     * @param panoIndex - 加载点位
     */
    textureLoaded(panoIndex: number, meta: (NetWorkMeta | null)[]): void;
    /**
   * webXR模式开始，webxr session完成坐标系矫正
   */
    webXRSessionStart(): void;
    /**
     * webXR模式结束,webxr session销毁
     */
    webXRSessionEnd(): void;
    /**
       * axes代表控制杆，axes数组的0-1元素分别代表左控制器的左（-1）右（1）,左控制器的上（-1）下（1），axes数组的2-3元素同理
     */
    webXRControllerEvent(type: WebXRControllerType, key: WebXRControllerKey, params: WebXRControllerParams): void;
    /**
       * xr控制器的Axes原始实时数据状态
     */
    webXRAxesUpdate(type: 'left' | 'right', param: WebXRAxesParams): void;
    /**
     * xr控制器的控制器射线更新
     */
    webXRControllerRayUpdate(raycaster: {
        leftRay?: THREE.Raycaster;
        rightRay?: THREE.Raycaster;
    }): void;
    /**
     * 准备加载 Work 数据
     * @param input - 输入的 work
     * @param work - 归一化的标准 work
     * @param state - 加载时的姿态
     */
    willLoad(input: any, work: Work, state: Partial<State>): void;
    /**
     * 开始加载 Work 数据
     * @param input - 输入的 work
     * @param work - 归一化的标准 work
     * @param state - 加载时的姿态
     */
    load(input: any, work: Work, state: Partial<State>): void;
    /**
     * 加载完 Work 数据
     * @param input - 输入的 work
     * @param work - 归一化的标准 work
     */
    loaded(input: any, work: Work): void;
    /**
     * 当目标 state 变化时
     * @param state - 当前姿态状态
     * @param userAction - 是否用户触发
     */
    stateChange(state: State, userAction: boolean): void;
    /**
     * 当前实时 state 变化时
     * @param state - 当前姿态状态
     * @param userAction - 是否用户触发
     */
    currentStateChange(state: State, userAction: boolean): void;
    /**
     * 当 setState 方法被调用
     * @param state - 当前姿态状态
     */
    setState(state: State): void;
    /**
     * 当 state 被同步完成时
     * @param state - 当前姿态状态
     */
    stateSynced(state: State): void;
    /**
     * 模型开始加载
     * @param workModel - 归一化的标准 work 中的 model 值
     */
    modelWillLoad(workModel: WorkModel): void;
    /**
     * 模型加载错误
     * @param error - 错误对象
     * @param model - 加载完的 model
     */
    modelLoadError(error: Error, model: Model): void;
    /**
     * 模型加载完成
     * @param model - 加载完的 model
     */
    modelLoaded(model: Model): void;
    /**
     * 模型楼层切换
     * @param shownFloor - 模型楼层
     */
    modelShownFloorChange(shownFloor: number | null, floorLength: number): void;
    /**
     * 渲染循环
     * @param rendered - 是否渲染了
     */
    renderFrame(rendered: boolean): void;
    /**
     * 意图要切换到某个模态， 可以通过 return false 阻止
     * @param mode - 意图要切换到的模态
     * @param prevMode - 当前模态
     * @returns 可以通过 return false 阻止
     */
    wantsChangeMode(mode: Mode, prevMode: Mode): void | false;
    /**
     * 模态切换完成
     * @param mode - 切换到的模态
     * @param prevMode - 上本质是一个模态
     * @param panoIndex - 初始化动画结束后的点位下标
     * @param toPose - 初始化动画结束后的状态
     * @param userAction - 是否用户触发
     */
    modeChange(mode: Mode, prevMode: Mode, panoIndex: number, toPose: Pose, userAction: boolean): void;
    /**
     * 帮助元素显应的变换
     * @param visible - 帮助元素的是否开启
     */
    helpersVisibleChange(visible: boolean): void;
    /**
     * 网络资源分析
     * @param source - 资源地址
     * @param state - 状态
     * @param detail - 详情
     */
    network(source: string, type: NetworkType, state: NetworkState, detail: string): void;
};
export declare function initLegacyEvent(five: Five): void;
