import * as THREE from 'three'; import { State } from '../types/state'; import { Pano } from './pano'; import { Mode } from '../application/mode'; import { NetWorkMeta, NetworkType, NetworkState } from './ajax'; import { Works, Work } from '../work'; import { ModelScene, Model } from '../model'; import { type Tile } from '../model/tile3d/tile'; import { Intersection } from '../model/intersection'; import { MovePanoOptions } from '../types/movePanoOptions'; /** 所有事件的基础接口 */ export interface BaseEvent { /** 事件类型名称 */ type: string; /** 事件触发时的时间戳 */ timeStamp: number; /** 阻止事件的默认行为 */ preventDefault(): void; /** 是否已调用过 preventDefault */ readonly defaultPrevented: boolean; } export interface BaseExtendableEvent extends BaseEvent { waitUntil(f: Promise): void; } /** 射线检测事件 */ export interface IntersectEvent extends BaseEvent { /** 被检测到的 3D 对象 */ object: THREE.Object3D; /** 发出射线的 Raycaster */ raycaster: THREE.Raycaster; /** 射线与对象的交点信息,未命中时为 null */ intersection: Intersection | null; } /** 状态变更事件 */ export interface StateEvent extends BaseEvent { /** 当前的 Five 状态 */ state: State; /** 是否由用户交互触发 */ userAction: boolean; } /** 全景图切换事件 */ export interface PanoEvent extends StateEvent { /** 切换前的全景图 */ prevPano: Pano; /** 新的全景图 */ pano: Pano; /** 切换动画进度(0-1) */ progress: number; /** 切换时传入的选项 */ options: MovePanoOptions; /** 切换过程中发生的错误 */ error: Error | null; } /** 全景图准备事件 */ export interface PanoPrepareEvent extends BaseExtendableEvent { /** 切换时选项 */ options: MovePanoOptions; /** 切换前模态 */ prevMode: Mode; /** 切换前的全景图 */ prevPano: Pano; /** 全景图 */ pano: Pano; } /** 全景图纹理加载事件 */ export interface PanoTextureEvent extends BaseEvent { /** 对应的全景图 */ pano: Pano; /** 纹理加载进度(0-1) */ progress: number; /** 网络请求元信息 */ meta: NetWorkMeta[] | null; /** 加载过程中发生的错误 */ error: Error | null; } /** 单个触控点 / 鼠标指针的信息 */ export interface GesturePointer { /** 指针在屏幕上的 x 坐标(像素) */ x: number; /** 指针在屏幕上的 y 坐标(像素) */ y: number; /** 相对上一帧的位移量 */ delta: number; /** 当前按下的鼠标键(单键编号) */ button: number; /** 当前按下的所有鼠标键(位掩码) */ buttons: number; shiftKey: boolean; ctrlKey: boolean; altKey: boolean; metaKey: boolean; /** 归一化设备坐标(NDC) */ coords: THREE.Vector2; /** 从该指针位置发出的射线 */ raycaster: THREE.Raycaster; } /** 手势事件,涵盖触摸、鼠标、笔等输入方式 */ export interface GestureEvent extends StateEvent { /** 事件的原始 DOM 目标 */ target: EventTarget | null; /** 输入设备类型 */ pointerType: 'touch' | 'pen' | 'mouse' | 'kinect'; /** 原始 DOM 事件 */ srcEvent: MouseEvent | TouchEvent | PointerEvent; /** 所有活跃指针的信息列表 */ pointers: GesturePointer[]; /** 是否为该手势序列的第一个事件 */ isFirst: boolean; /** 是否为该手势序列的最后一个事件 */ isFinal: boolean; /** 多指缩放比例 */ scale: number; /** 所有活跃指针的中心点信息 */ center: GesturePointer; /** 当前 x 方向速度 */ velocityX: number; /** 当前 y 方向速度 */ velocityY: number; /** 整个手势序列的 x 方向平均速度 */ overallVelocityX: number; /** 整个手势序列的 y 方向平均速度 */ overallVelocityY: number; } /** XR 会话事件(进入/退出 XR 模式时触发) */ export interface XRSessionEvent extends BaseEvent { /** 当前 XR 会话 */ session: XRSession | null; /** XR 设备类型 */ machineType: 'Pico' | 'Oculus'; } /** XR 控制器状态 */ export interface XRControllerState { /** 摇杆轴输入(0-1) */ axes: Record<'up' | 'down' | 'left' | 'right', number>; /** 左手控制器射线 */ raycaster: THREE.Raycaster; /** 距上一帧的时间间隔 */ deltaTime: number; } /** XR 控制器输入事件 */ export interface XRControllerEvent extends BaseEvent { /** 左手控制器状态 */ left: XRControllerState; /** 右手控制器状态 */ right: XRControllerState; /** 各按键的按下状态 */ buttons: { X: boolean; Y: boolean; LeftTrigger: boolean; LeftPinch: boolean; A: boolean; B: boolean; RightTrigger: boolean; RightPinch: boolean; }; } /** XR 手势事件(按键、摇杆方向等离散输入) */ export interface XRGestureEvent extends BaseEvent { /** 当前 XR 会话 */ session: XRSession | null; /** 触发该手势的按键或摇杆方向 */ buttons: 'A' | 'B' | 'X' | 'Y' | 'RightTrigger' | 'RightPinch' | 'LeftTrigger' | 'LeftPinch' | 'LeftAxesLeft' | 'LeftAxesRight' | 'LeftAxesUp' | 'LeftAxesDown' | 'RightAxesLeft' | 'RightAxesRight' | 'RightAxesUp' | 'RightAxesDown'; /** XR 设备类型 */ machineType: 'Pico' | 'Oculus'; /** 是否为该手势序列的第一个事件 */ isFirst: boolean; /** 是否为该手势序列的最后一个事件 */ isFinal: boolean; /** 控制器射线信息 */ controllers: { raycaster: { leftRay: THREE.Raycaster; rightRay: THREE.Raycaster; }; }; } export interface WorksEvent extends BaseEvent { input: any; works: Works; userAction: boolean; } export interface ModelSceneEvent extends BaseEvent { modelScene: ModelScene; } export interface ModelEvent extends BaseEvent { model: Model; work: Work; error: Error | null; } export interface ModelTileEvent extends BaseEvent { model: Model; work: Work; tile: Tile; } export interface ModeChangeEvent extends StateEvent { prevMode: Mode; mode: Mode; } export interface RenderEvent extends BaseEvent { needsRender: boolean; } export interface ObjectEvent extends BaseEvent { object: THREE.Object3D; } export interface NetworkResourceEvent extends BaseEvent { source: string; requestType: NetworkType; requestState: NetworkState; detail: string; } export declare function createEvent(type: string, eventArgs: Omit): T; export declare function createExtendableEvent(type: string, eventArgs: Omit): T; export declare function waitForExtendableEvent(event: BaseExtendableEvent): Promise;