import { Color3, Engine, Scene, WebGPUEngine } from "@babylonjs/core"; import { DefaultScene } from "../defaultScene"; import log from "loglevel"; export interface EngineInitializerParams { canvas: HTMLCanvasElement; useWebGpu: boolean; onSceneReady: (scene: Scene) => Promise; } export async function initializeEngine(params: EngineInitializerParams): Promise { const logger = log.getLogger('EngineInitializer'); if (!params.canvas) { logger.error('Canvas not found'); return null; } let engine = null; if (params.useWebGpu) { engine = new WebGPUEngine(params.canvas); await (engine as WebGPUEngine).initAsync(); } else { engine = new Engine(params.canvas, true); } engine.setHardwareScalingLevel(1 / window.devicePixelRatio); const scene = new Scene(engine); DefaultScene.Scene = scene; scene.ambientColor = new Color3(.1, .1, .1); // Disable material dirty flagging for performance // This prevents expensive material validation when animating texture offsets // Safe for this app since we use unlit materials without complex dynamic properties // // scene.blockMaterialDirtyMechanism = true; await params.onSceneReady(scene); engine.runRenderLoop(() => { scene.render(); }); return engine; }