import { Engine, type EngineOptions, type ModelLoadOptions } from '../components/engine'; import { BimComponent } from '../core/component'; import type { BimEngine } from '../bim-engine'; /** * 3D 引擎管理器 * 负责连接 Engine 组件和 BimEngine,向外部暴露简化的 API * 采用延迟初始化模式,用户需主动调用 initialize() 方法 */ export class EngineManager extends BimComponent { /** 3D 引擎挂载的父容器 */ private container: HTMLElement; /** 3D 引擎组件实例 */ private engineInstance: Engine | null = null; /** * 构造函数 * @param engine 引擎实例 * @param container 3D 引擎挂载的目标容器 */ constructor(engine: BimEngine, container: HTMLElement) { super(engine); this.container = container; } /** * 初始化 3D 引擎 * @param options 引擎配置选项(可选,如果不提供则使用默认配置) * @returns 是否初始化成功 */ public initialize(options?: Omit): boolean { // 如果已经初始化,先销毁旧的实例 if (this.engineInstance && this.engineInstance.isInitialized()) { console.warn('[EngineManager] 3D Engine already initialized. Destroying old instance...'); this.engineInstance.destroy(); this.engineInstance = null; } try { // 创建 Engine 组件实例 // options 中的配置会自动复制给 createEngine 使用 this.engineInstance = new Engine({ container: this.container, ...options, // 合并配置选项 }); // 调用组件的 init 方法初始化引擎 this.engineInstance.init(); return this.engineInstance.isInitialized(); } catch (error) { console.error('[EngineManager] Failed to initialize 3D engine:', error); this.engineInstance = null; return false; } } /** * 检查 3D 引擎是否已初始化 */ public isInitialized(): boolean { return this.engineInstance !== null && this.engineInstance.isInitialized(); } /** * 加载 3D 模型 * @param url 模型文件 URL * @param options 加载选项(位置、旋转、缩放) */ public loadModel(url: string, options?: ModelLoadOptions): void { if (!this.engineInstance || !this.engineInstance.isInitialized()) { console.error('[EngineManager] 3D Engine not initialized. Please call initialize() first.'); return; } this.engineInstance.loadModel(url, options); } /** * 获取原始 3D 引擎实例 * 用于直接调用第三方引擎的其他 API */ public getEngine(): any { if (!this.engineInstance) { console.warn('[EngineManager] 3D Engine not initialized.'); return null; } return this.engineInstance.getEngine(); } /** * 销毁 3D 引擎实例 */ public destroy(): void { if (this.engineInstance) { this.engineInstance.destroy(); this.engineInstance = null; } } }