131 lines
3.8 KiB
TypeScript
131 lines
3.8 KiB
TypeScript
/**
|
|
* 720 全景引擎管理器
|
|
* 负责管理 720° 全景渲染引擎的初始化、全景加载和生命周期
|
|
*
|
|
* 设计原则:
|
|
* - 镜像 Engine2dManager 的设计模式
|
|
* - Engine720Manager 只暴露面向外部用户的公共 API
|
|
* - 内部管理器通过 getEngine720Component() 直接访问 Engine720 组件
|
|
*/
|
|
import { Engine720, type Engine720Options, type PanoramaLoadOptions } from '../components/engine-720';
|
|
import { BaseManager } from '../core/base-manager';
|
|
import { ManagerRegistry } from '../core/manager-registry';
|
|
|
|
/**
|
|
* 720 全景引擎管理器
|
|
* 封装底层 720 引擎,提供全景加载、视角控制等公共 API
|
|
*/
|
|
export class Engine720Manager extends BaseManager {
|
|
/** 容器元素 */
|
|
private container: HTMLElement;
|
|
/** 720 引擎组件实例 */
|
|
private engineInstance: Engine720 | null = null;
|
|
|
|
constructor(container: HTMLElement, registry: ManagerRegistry) {
|
|
super(registry);
|
|
this.container = container;
|
|
}
|
|
|
|
/**
|
|
* 获取 Engine720 组件实例
|
|
* 内部管理器通过此方法直接访问 Engine720 组件的全部能力
|
|
* @returns Engine720 组件实例,未初始化时返回 null
|
|
*/
|
|
public getEngine720Component(): Engine720 | null {
|
|
return this.engineInstance;
|
|
}
|
|
|
|
/**
|
|
* 初始化 720 引擎
|
|
* @param options 引擎配置选项
|
|
* @returns 是否初始化成功
|
|
*/
|
|
public initialize(options?: Omit<Engine720Options, 'container'>): boolean {
|
|
if (this.engineInstance && this.engineInstance.isInitialized()) {
|
|
console.warn('[Engine720Manager] 720 Engine already initialized. Destroying old instance...');
|
|
this.engineInstance.destroy();
|
|
this.engineInstance = null;
|
|
}
|
|
|
|
try {
|
|
this.engineInstance = new Engine720({
|
|
container: this.container,
|
|
...options,
|
|
}, this.registry);
|
|
|
|
this.engineInstance.init();
|
|
|
|
return this.engineInstance.isInitialized();
|
|
} catch (error) {
|
|
console.error('[Engine720Manager] Failed to initialize 720 engine:', error);
|
|
this.engineInstance = null;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 检查引擎是否已初始化
|
|
* @returns 是否已初始化
|
|
*/
|
|
public isInitialized(): boolean {
|
|
return this.engineInstance !== null && this.engineInstance.isInitialized();
|
|
}
|
|
|
|
/**
|
|
* 加载全景图
|
|
* @param url 全景图片 URL
|
|
* @param options 加载选项
|
|
*/
|
|
public async loadPanorama(url: string, options?: PanoramaLoadOptions): Promise<void> {
|
|
if (!this.engineInstance) {
|
|
console.warn('[Engine720Manager] 720 Engine not initialized.');
|
|
return;
|
|
}
|
|
await this.engineInstance.loadPanorama(url, options);
|
|
}
|
|
|
|
/**
|
|
* 预加载多个全景图
|
|
* @param urls 全景图 URL 列表
|
|
*/
|
|
public async preloadPanoramas(urls: string[]): Promise<void> {
|
|
if (!this.engineInstance) {
|
|
console.warn('[Engine720Manager] 720 Engine not initialized.');
|
|
return;
|
|
}
|
|
await this.engineInstance.preloadPanoramas(urls);
|
|
}
|
|
|
|
/**
|
|
* 设置视场角
|
|
* @param fov 视场角值
|
|
*/
|
|
public setFov(fov: number): void {
|
|
this.engineInstance?.setFov(fov);
|
|
}
|
|
|
|
/**
|
|
* 获取当前视场角
|
|
* @returns 当前视场角值
|
|
*/
|
|
public getFov(): number {
|
|
return this.engineInstance?.getFov() ?? 75;
|
|
}
|
|
|
|
/**
|
|
* 重置视图
|
|
*/
|
|
public resetView(): void {
|
|
this.engineInstance?.resetView();
|
|
}
|
|
|
|
/** 销毁 720 引擎管理器 */
|
|
public destroy(): void {
|
|
if (this.engineInstance) {
|
|
this.engineInstance.destroy();
|
|
this.engineInstance = null;
|
|
}
|
|
super.destroy();
|
|
}
|
|
}
|