xl-pano
Version:
一个基于 Typescript 的,同时支持立方体和球体场景的轻量开源库。
207 lines (206 loc) • 6 kB
TypeScript
import Pano from "../Pano";
import Scene, { SceneAngle, SceneAngleChangeCallback, SceneListenerType, VoidFunction } from "./Scene";
import HotSpot from "../HotSpot";
import { TextureSource } from "../../types/index";
/**
* 场景变化的动画参数
* @param {boolean} animation 是否执行动画
* @param {number} duration 动画执行时间
* @param {VoidFunction} callback 执行完动画后的回调函数
* */
interface AnimationOptions {
animation?: boolean;
duration?: number;
callback?: VoidFunction;
}
export default class BaseScene implements Scene {
/**
* @property {number} pitch 俯仰角-绕 x 轴旋转角度
* */
pitch: number;
/**
* @property {number} yaw 偏航角-绕 y 轴旋转角度
* */
yaw: number;
/**
* 视点参数
* position: 视点位置
* target: 视线方向
* up: 上方向
* */
eye: {
position: {
x: number;
y: number;
z: number;
};
target: {
x: number;
y: number;
z: number;
};
up: {
x: number;
y: number;
z: number;
};
};
/**
* @property {[number, number]} yRange 俯仰可视范围角度
* */
yRange: number[];
/**
* @property {number} fovy 静态可视范围角度
* */
fovy: number;
/**
* @property {boolean} dragging 是否正在被拖拽
* 鼠标按下置为 true;鼠标释放置为 false
* */
dragging: boolean;
/**
* @property {{x: number, y: number}} dragStartPoint 开始拖拽的起点
* */
dragStartPoint: {
x: number;
y: number;
};
/**
* @property {boolean} angling 是否正在进行转动
* */
angling: boolean;
/**
* @property {boolean} fovying 是否正在进行移动(fovy 切换)
* */
fovying: boolean;
/**
* 获取 pitch 可移动范围
* */
getPitchRange(): number[];
/**
* @property {Pano} pano 父容器Pano
* */
pano: Pano;
/**
* 计算 mvp 矩阵,并传递到着色器中变量
* */
setMvpMatrix(): void;
/**
* 角度变化回调函数集合
* */
angleChangeCallbacks: SceneAngleChangeCallback[];
/**
* @property {HotSpot[]} hotSpots 热点
* */
hotSpots: HotSpot[];
/**
* 添加回调函数
* @param type {SceneListenerType} 事件类型,预定义好的
* @param callback {SceneAngleChangeCallback} 回调函数
* */
addListener(type: SceneListenerType, callback: SceneAngleChangeCallback): void;
/**
* 移除监听
* @param type {SceneListenerType} 事件类型,预定义好的
* @param callback {SceneAngleChangeCallback} 回调函数
* */
removeListener(type: SceneListenerType, callback: SceneAngleChangeCallback): void;
/**
* 移除所有监听
* */
removeAllListeners(): void;
/**
* 销毁
* */
destroy(): void;
/**
* 获取当前角度
* @return {SceneAngle} 俯仰角/偏航角
* */
getAngle(): SceneAngle;
/**
* 获取视角范围
* @return {number} 视角范围
* */
getFovy(): number;
/**
* 渲染热点
* @param {number} deltaPitch 俯仰角偏移量
* @param {number} deltaYaw 偏航角偏移量
* */
renderHotSpots(deltaPitch?: number, deltaYaw?: number): void;
/**
* 执行角度变化后的回调函数
* */
executeAngleChangeCallbacks(): void;
/**
* 绘制前的准备工作
* 1. 确定最终角度,包括超出范围后的计算
* 2. 设置 mvp 矩阵
* */
beforeDrawElements(deltaPitch?: number, deltaYaw?: number): void;
/**
* 添加热点
* @param {HotSpot | HotSpot[]} hotSpots 待添加的热点
* */
addHotSpots(hotSpots: HotSpot | HotSpot[]): void;
/**
* 绘制变换后的场景和热点
* @param deltaPitch {number} 场景的俯仰角偏移值
* @param deltaYaw {number} 场景的偏航角偏移值
* */
draw(deltaPitch?: number, deltaYaw?: number): void;
/**
* 场景移动到某一点
* @param {number} targetX 移动目标点的X坐标
* @param {number} targetY 移动目标点的X坐标
* */
moveTo(targetX: number, targetY: number): void;
/**
* 移动角度偏移量
* @param deltaPitch {number} 俯仰角偏移量
* @param deltaYaw {number} 偏航角偏移量
* @param options {AnimationOptions} 可选动画参数
* */
move(deltaPitch: number, deltaYaw: number, options?: AnimationOptions): void;
/**
* 设置到某个角度
* @param angle {SceneAngle} 目标角度值
* @param options {AnimationOptions} 可选动画参数
* */
setAngle(angle: SceneAngle, options?: AnimationOptions): void;
/**
* 设置到视角
* @param fovy {number} 目标视角
* @param options {AnimationOptions} 可选动画参数
* */
setFovy(fovy: number, options?: AnimationOptions): void;
/**
* 点击热点回调,执行切换场景前的动画
* @param {HotSpot} hotSpot 目标热点
* */
onHotSpotClick(hotSpot: HotSpot): void;
/**
* PC端和移动端的移动事件绑定
* */
eventBind(): void;
/**
* @property {TextureSource[] | TextureSource} textures 纹理资源:在各个子类中重写
* */
textures: TextureSource[] | TextureSource;
/**
* 渲染模型:在各个子类中重写
* */
drawModel(): void;
/**
* 渲染模型:在各个子类中重写
* @param textures {TextureSource[] | TextureSource} 替换后的纹理资源
* */
replaceTextures(textures: TextureSource[] | TextureSource): void;
/**
* 渲染到 pano:在各个子类中重写
* @param {Pano} pano 父容器
* */
render(pano: Pano): void;
}
export {};