UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

128 lines (127 loc) 4.12 kB
"use strict"; import { Poly } from "../../Poly"; import { CoreGraphNode } from "../../../core/graph/CoreGraphNode"; const _cameras = []; export class SceneCamerasController { constructor(scene) { this.scene = scene; this._cameraObjectsRecentlyUpdated = []; // async mainCameraObjectPath() { // return this._mainCameraObjectPath; // } this._errorMessageDisplayed = false; this._onCameraObjectsUpdatedCallbacks = []; this._coreGraphNode = new CoreGraphNode(this.scene, "SceneCamerasController"); } coreGraphNode() { return this._coreGraphNode; } dispose() { this._coreGraphNode.dispose(); } updateFromChangeInObject(object) { this._cameraObjects(object, this._cameraObjectsRecentlyUpdated); if (this._cameraObjectsRecentlyUpdated.length > 0) { this._coreGraphNode.setDirty(); } for (const callback of this._onCameraObjectsUpdatedCallbacks) { callback(); } } cameraObjects(target) { this._cameraObjects(this.scene.threejsScene(), target); return target; } _cameraObjects(parent, cameraObjects) { cameraObjects.splice(0, cameraObjects.length); parent.traverse((object) => { if (Poly.camerasRegister.objectRegistered(object)) { cameraObjects.push(object); } }); } cameraObjectsRecentlyUpdated() { return this._cameraObjectsRecentlyUpdated; } // _mainCameraObjectPath: string | null = null; setMainCamera(camera) { this.scene.root().mainCameraController.setCamera(camera); } setMainCameraPath(path) { this.scene.root().mainCameraController.setCameraPath(path); } mainCameraPath() { return this.scene.root().mainCameraController.rawCameraPath(); } async mainCamera(options) { if (this.scene.disposed()) { return null; } let printCameraNotFoundError = true; if ((options == null ? void 0 : options.printCameraNotFoundError) != null) { printCameraNotFoundError = options.printCameraNotFoundError; } const cameraMaskOverride = options == null ? void 0 : options.cameraMaskOverride; if (cameraMaskOverride != null) { this.scene.root().mainCameraController.setCameraPath(cameraMaskOverride); } const _printWarningMessage = (warningMessage2) => { if (this._errorMessageDisplayed == true) { return; } if (printCameraNotFoundError) { console.error(warningMessage2); this._errorMessageDisplayed = true; } }; const camera = await this.scene.root().mainCameraController.camera(); if (camera) { return camera; } let findAnyCamera = true; if ((options == null ? void 0 : options.findAnyCamera) != null) { findAnyCamera = options.findAnyCamera; } const cameraPath = await this.scene.root().mainCameraController.cameraPath(); const warningMessage = `No camera found at path '${cameraPath}'. Make sure to set the root parameter 'mainCameraPath' to match a camera (from the top menu Windows->Root Node Params)`; if (findAnyCamera) { const firstAnyCamera = this._findAnyCameraObject(); if (firstAnyCamera) { _printWarningMessage(warningMessage); return firstAnyCamera; } } _printWarningMessage(warningMessage); return null; } _findAnyCameraObject() { this.cameraObjects(_cameras); return _cameras[0]; } async createMainViewer(options) { const camera = await this.mainCamera({ cameraMaskOverride: options == null ? void 0 : options.cameraMaskOverride }); if (!camera) { return; } return Poly.camerasRegister.createViewer({ ...options, camera, scene: this.scene }); } onCameraObjectsUpdated(callback) { const index = this._onCameraObjectsUpdatedCallbacks.indexOf(callback); if (index >= 0) { return; } this._onCameraObjectsUpdatedCallbacks.push(callback); } removeOnCameraObjectsUpdated(callback) { const index = this._onCameraObjectsUpdatedCallbacks.indexOf(callback); if (index >= 0) { this._onCameraObjectsUpdatedCallbacks.splice(index, 1); } } }