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, 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): void; /** * 开始加载 Work 数据 * @param input - 输入的 work * @param work - 归一化的标准 work * @param state - 加载时的姿态 */ load(input: any, work: Work, state: Partial): 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;