UNPKG

@megavr/ecsy-babylon

Version:

babylon.js ecsy binding and helpers

57 lines (56 loc) 2.52 kB
import * as BABYLON from "@babylonjs/core"; import { System } from "ecsy"; import { Camera } from "../components/index"; import { getScene, getRenderingCanvas, getSystem, getScenes } from "../utils/gameUtils"; import { updateObjectsTransform, disposeObject } from "../utils/objectUtils"; import { GameSystem } from "./GameSystem"; /** System for Camera component */ export class CameraSystem extends System { constructor() { super(...arguments); /** <BABYLON.Scene.uid, Camera component> */ this._cameras = new Map(); } /** @hidden */ init() { getSystem(this, GameSystem).onSceneSwitched.add(scene => this._updateControl(scene)); this._pointerLock = this._pointerLock.bind(this); } /** @hidden */ execute() { this.queries.camera.added.forEach((entity) => { let camera = entity.getComponent(Camera); let scene = getScene(this, camera.scene); camera.object = new BABYLON.FreeCamera("", BABYLON.Vector3.Zero(), scene); updateObjectsTransform(entity); this._cameras.set(scene.uid, camera); this._updateControl(scene); }); this.queries.camera.removed.forEach((entity) => { let camera = entity.getComponent(Camera); let scene = getScene(this, camera.scene); this._removeControl(scene); this._cameras.has(scene.uid) && this._cameras.delete(scene.uid); disposeObject(camera); }); } _updateControl(targetScene) { if (targetScene.uid === getScene(this).uid) { getScenes(this).forEach(scene => this._removeControl(scene)); let camera = this._cameras.get(targetScene.uid); camera.object.attachControl(getRenderingCanvas(this)); camera.pointerLock ? targetScene.onPointerObservable.add(this._pointerLock) : document.exitPointerLock(); } } _removeControl(scene) { this._cameras.forEach((camera, sceneUID) => sceneUID === scene.uid && camera.object.detachControl(getRenderingCanvas(this))); scene.onPointerObservable.removeCallback(this._pointerLock); } _pointerLock(pointerInfo) { pointerInfo.event.type === "pointerdown" && (document.pointerLockElement || getRenderingCanvas(this).requestPointerLock()); } } /** @hidden */ CameraSystem.queries = { camera: { components: [Camera], listen: { added: true, removed: true } }, };