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; currentState: State; /** 状态切换动画时长 */ duration: number; /** 动画模式 */ effect: MovePanoEffect; /** 是否是用户触发的 */ userAction: boolean; }; } declare class BaseController extends Subscribe implements BaseControllerInitArgs { mode: Mode; fiveId: string; needsRender: boolean; destroyed: boolean; cameraMotion: CameraMotion; userAction: boolean; /** 资源等待中 */ pending: Set; 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; 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; protected initAnimationIsReady: boolean; private eventUnbinds; static parseArgs(args: BaseControllerInitArgs): Required; 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, options: { duration: number; effect: MovePanoEffect; }, userAction: boolean): boolean; /** 生命周期: 更新当前时间 */ updateTime(time: number, deltaTime: number, ...args: any[]): void; /** 生命周期: 更新渲染 */ render(): boolean; /** 转动摄像头 */ updateCamera(pose: Partial, duration: number, userAction: boolean): Promise; /** 通过帧动画转动摄像头 */ updateCameraWithKeyframes(keyframes: { progress: number; value: Pose; key?: string; }[], duration: number, userAction: boolean): Promise; /** 获取目标姿态 */ getTargetState(): State; /** 初始化动画 */ protected initAnimation(): Promise; /** 改变相机 */ protected setCamera(cameraPose?: Partial): 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 };