immersive2/src/vrApp.ts

112 lines
3.5 KiB
TypeScript

import {Color3, Engine, FreeCamera, Scene, Vector3, WebGPUEngine} from "@babylonjs/core";
import '@babylonjs/loaders';
import {DiagramManager} from "./diagram/diagramManager";
import log, {Logger} from "loglevel";
import {GamepadManager} from "./controllers/gamepadManager";
import {CustomEnvironment} from "./util/customEnvironment";
import {Spinner} from "./objects/spinner";
import {PouchdbPersistenceManager} from "./integration/pouchdbPersistenceManager";
import {addSceneInspector} from "./util/functions/sceneInspector";
import {groundMeshObserver} from "./util/functions/groundMeshObserver";
import {buildQuestLink} from "./util/functions/buildQuestLink";
import {exportGltf} from "./util/functions/exportGltf";
import {DefaultScene} from "./defaultScene";
import {Introduction} from "./tutorial/introduction";
const webGpu = false;
log.setLevel('debug', false);
const canvas = (document.querySelector('#gameCanvas') as HTMLCanvasElement);
export class VrApp {
//preTasks = [havokModule];
private logger: Logger = log.getLogger('App');
constructor() {
this.initializeEngine().then(() => {
this.logger.info('Engine initialized');
});
}
private async initializeEngine() {
let engine: WebGPUEngine | Engine = null;
if (webGpu) {
engine = new WebGPUEngine(canvas);
await (engine as WebGPUEngine).initAsync();
console.log("WebGPU enabled");
} else {
engine = new Engine(canvas, true);
}
engine.setHardwareScalingLevel(1 / window.devicePixelRatio);
console.log(engine.getCaps().multiview);
window.onresize = () => {
engine.resize();
}
const scene = new Scene(engine);
DefaultScene.Scene = scene;
scene.ambientColor = new Color3(.1, .1, .1);
//log.resetLevel();
//log.setDefaultLevel('error');
await this.initialize(scene);
engine.runRenderLoop(() => {
scene.render();
});
}
public async initialize(scene: Scene) {
setMainCamera(scene);
const spinner = new Spinner();
spinner.show();
const diagramManager = new DiagramManager();
await initDb(diagramManager);
initEnvironment(diagramManager, spinner);
const gamepadManager = new GamepadManager(scene);
addSceneInspector();
//const camMenu = new CameraMenu(scene);
const el = document.querySelector('#download');
if (el) {
el.addEventListener('click', () => {
exportGltf();
})
}
if (!localStorage.getItem('tutorialCompleted')) {
this.logger.info('Starting tutorial');
const intro = new Introduction();
}
this.logger.info('Render loop started');
}
}
const vrApp = new VrApp();
buildQuestLink();
function setMainCamera(scene: Scene) {
const CAMERA_NAME = 'Main Camera';
const camera: FreeCamera = new FreeCamera(CAMERA_NAME,
new Vector3(0, 1.6, 0), scene);
scene.setActiveCameraByName(CAMERA_NAME);
}
async function initDb(diagramManager: DiagramManager) {
const db = new PouchdbPersistenceManager();
db.setDiagramManager(diagramManager);
await db.initialize();
}
function initEnvironment(diagramManager: DiagramManager, spinner: Spinner) {
const environment = new CustomEnvironment("default", diagramManager.config);
environment.groundMeshObservable.add((ground) => {
groundMeshObserver(ground, diagramManager, spinner).then(() => {
});
}, -1, false, this);
}