/** * 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): 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 { 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 { 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(); } }