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; type PanoramaControllerInitArgs = BaseControllerInitArgs & PanoramaControllerCustomInitArgs; declare class PanoramaController extends PanoramaLikeController implements Required { maxAccessibleDistance: number; panoTapTriggerRadius: number; panoCircleMeshCreator: (observer: WorkObserver, options: { aerialObserverMinHeight: number; }) => PanoCircleMeshInterface; adjustPanoCircleMeshPositionBasedOnModel: boolean; adjustPanoCircleMeshPositionFix: Map; 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; protected initAnimationed: boolean; protected accessibleObserverFloorCheckCount: number; protected pano0DepthCubeRenderTarget?: THREE.WebGLCubeRenderTarget; protected pano1DepthCubeRenderTarget?: THREE.WebGLCubeRenderTarget; protected pendingPanoTask?: { panoId: PanoId; hash: string; onLoad(colorResponse: NetworkResponse): void; onError(error: Error): void; }; protected panoVideo: PanoVideo; protected panoResources: { [key: string]: PanoResource; }; protected panoPictureObserverMap: WeakMap; static parseArgs(args: PanoramaControllerInitArgs): Required; 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, 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; /** * 获取 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, };