import * as THREE from "three";
import { NetworkResponse, NetWorkMeta } from "../utils/ajax";
import { ModelScene, PBMPanoPicture } from "../model";
import { Works, WorkObserver } from "../work";
import { type EasingFunction } from "../utils/easing";
import { Pano, PanoId } from "../utils/pano";
import { TextureLoader } from "../texture/loader";
import { MovePanoOptions } from "../types/movePanoOptions";
import { MovePanoEffect } from "../types/movePanoEffect";
import { BaseControllerInitArgs } from "./base";
import { PanoramaLikeController, PanoramaLikeControllerCustomInitArgs } from "./panoramaLike";
import { State } from "../types/state";
import { GestureEvent } from "../utils/event";
import { PanoCircleMeshInterface } from "../types/panoCircleMeshInterface";
import { Motion } from "../utils/motion";
import { Tiling } from "../core/tiling";
import { PanoVideo } from "../core/panoVideo";
declare const defaultEffectEase: EasingFunction;
type PanoResource = {
    panoId: PanoId;
    effect: MovePanoEffect;
    effectEasing: EasingFunction;
    panoPicture: PBMPanoPicture | null;
    position: THREE.Vector3;
    fixCameraTransform: THREE.Matrix4;
};
type LocationMotion = Motion<"count" | "distance">;
type PerspToOrthoMotion = Motion<"perspToOrtho">;
type ModelAlphaMotion = Motion<"modelAlpha">;
declare const adjustPanoCircleMeshVectors: THREE.Vector3[];
interface PanoramaControllerCustomInitArgs extends PanoramaLikeControllerCustomInitArgs {
    /** 最远可移动观察点距离 */
    maxAccessibleDistance?: number;
    /**
     * 点击地面观察点标识的判定范围
     * @description
     * 如果在判定范围内则确定去到目标点，
     * 否则寻找点击位置方向最适合的点（可能会走到一个离相机更近的点）。
     */
    panoTapTriggerRadius?: number;
    /** 地面观察点标识自定义创建器 */
    panoCircleMeshCreator?: (observer: WorkObserver, options: {
        aerialObserverMinHeight: number;
    }) => PanoCircleMeshInterface;
    /** 基于模型调整 地面观察点 的位置 */
    adjustPanoCircleMeshPositionBasedOnModel?: boolean;
    /**
     * 全景瓦片登记
     * @param fov - 当前 fov
     * @param viewSize - 当前绘制区域大小
     * @returns 返回瓦片等级
     */
    tileLevelForFov?: false | ((fov: number, viewSize: THREE.Vector2) => number);
    /** 全景进入渐变时长 单位秒 */
    tileAppearDuration?: number;
    /** 全景瓦片并发数 */
    tileMaxRequest?: number;
    /** 是否使用深度信息干预全景图着色 */
    flyEffectUseDepthBuffer?: boolean;
}
declare const defaultPanoramaControllerCustomInitArgs: Required<PanoramaControllerCustomInitArgs>;
type PanoramaControllerInitArgs = BaseControllerInitArgs & PanoramaControllerCustomInitArgs;
declare class PanoramaController extends PanoramaLikeController implements Required<PanoramaControllerInitArgs> {
    maxAccessibleDistance: number;
    panoTapTriggerRadius: number;
    panoCircleMeshCreator: (observer: WorkObserver, options: {
        aerialObserverMinHeight: number;
    }) => PanoCircleMeshInterface;
    adjustPanoCircleMeshPositionBasedOnModel: boolean;
    adjustPanoCircleMeshPositionFix: Map<PanoId, THREE.Vector4>;
    tileLevelForFov: false | ((fov: number, viewSize: THREE.Vector2) => number);
    tileAppearDuration: number;
    tileMaxRequest: number;
    flyEffectUseDepthBuffer: boolean;
    locationMotion: LocationMotion;
    perspToOrthoMotion: PerspToOrthoMotion;
    modelAlphaMotion: ModelAlphaMotion;
    tiling: Tiling;
    protected textureLoader: TextureLoader;
    protected panoMeshes: Map<PanoId, PanoCircleMeshInterface>;
    protected initAnimationed: boolean;
    protected accessibleObserverFloorCheckCount: number;
    protected pano0DepthCubeRenderTarget?: THREE.WebGLCubeRenderTarget;
    protected pano1DepthCubeRenderTarget?: THREE.WebGLCubeRenderTarget;
    protected pendingPanoTask?: {
        panoId: PanoId;
        hash: string;
        onLoad(colorResponse: NetworkResponse<THREE.Texture, NetWorkMeta[]>): void;
        onError(error: Error): void;
    };
    protected panoVideo: PanoVideo;
    protected panoResources: {
        [key: string]: PanoResource;
    };
    protected panoPictureObserverMap: WeakMap<PBMPanoPicture, WorkObserver>;
    static parseArgs(args: PanoramaControllerInitArgs): Required<PanoramaControllerInitArgs>;
    static initAnimationEndState(args: PanoramaControllerInitArgs): State;
    constructor(args: PanoramaControllerInitArgs);
    get tileLevel(): number;
    updateConfiguration(args: PanoramaControllerCustomInitArgs): boolean;
    /** controller 销毁 */
    destroy(): void;
    /** 是否准备好，即不在用户操作中，并且不再动画中 */
    isReady(): boolean;
    isTileReady(): boolean;
    /** 动态更新 work */
    updateWork(works: Works, state: Partial<State>, options: {
        duration: number;
        effect: MovePanoEffect;
    }, userAction: boolean): boolean;
    /** 更新模型 */
    updateModel(modelScene: ModelScene): void;
    /** 时间迭代 */
    updateTime(time: number, deltaTime: number, ...args: any[]): void;
    /** 获取目标姿态 */
    getTargetState(): State;
    /** 移动点位 */
    moveToPano(pano: Pano, options: MovePanoOptions, userAction: boolean): void;
    /** 初始化动画 */
    protected initAnimation(): Promise<void>;
    /**
     * 获取 locationMotion.keyframe 中存储的 panoResource
     * @param keyframe
     * @returns
     */
    protected panoResourceFromLocationMotionKeyframe(keyframe: LocationMotion["keyframes"][number]): PanoResource;
    /**
     * 计算 locationMotion.keyframes 中的整体距离总合的长度
     * @param keyframes
     * @returns
     */
    protected locationMotionKeyframesLength(keyframes: LocationMotion["keyframes"]): number;
    /** 移动相机 */
    protected doMoveToPano(pano: Pano, panoResource: PanoResource, options?: MovePanoOptions): void;
    /**
     * 方向射线上寻找下一个目标点位
     * @param raycaster - 方向射线
     * @returns 方向射线上寻找下一个目标点位
     */
    protected getForwardObserverOrNot(camera: THREE.Camera, raycaster?: THREE.Raycaster): WorkObserver | null;
    /** 触摸 点击屏幕 */
    protected onTapGesture(event: GestureEvent): void;
}
export { LocationMotion, ModelAlphaMotion, PerspToOrthoMotion, PanoramaController, PanoramaControllerInitArgs, PanoramaControllerCustomInitArgs, defaultPanoramaControllerCustomInitArgs, defaultEffectEase, adjustPanoCircleMeshVectors, };
