UNPKG

polygonjs-engine

Version:

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

102 lines (90 loc) 3.26 kB
import {PolyScene} from '../scene/PolyScene'; import {BaseCameraObjNodeType} from '../nodes/obj/_BaseCamera'; // import {CameraMixin} from './concerns/Camera'; // import {Capturer} from './concerns/Capturer'; // import {ContainerClass} from './concerns/ContainerClass'; // import {Controls} from './concerns/Controls'; // import {PickerForViewer} from './concerns/Picker'; import {ViewerCamerasController} from './utils/CamerasController'; import {ViewerControlsController} from './utils/ControlsController'; import {ViewerEventsController} from './utils/EventsController'; import {WebGLController} from './utils/WebglController'; import {ThreejsCameraControlsController} from '../nodes/obj/utils/cameras/ControlsController'; // class AbstractViewer {} const HOVERED_CLASS_NAME = 'hovered'; export abstract class TypedViewer<C extends BaseCameraObjNodeType> { // protected _display_scene: Scene; protected _canvas: HTMLCanvasElement | undefined; protected _active: boolean = false; private static _next_viewer_id = 0; private _id: Readonly<number>; active() { return this._active; } activate() { this._active = true; } deactivate() { this._active = false; } protected _cameras_controller: ViewerCamerasController | undefined; get camerasController(): ViewerCamerasController { return (this._cameras_controller = this._cameras_controller || new ViewerCamerasController(this)); } protected _controls_controller: ViewerControlsController | undefined; get controlsController() { return this._controls_controller; } protected _events_controller: ViewerEventsController | undefined; get eventsController(): ViewerEventsController { return (this._events_controller = this._events_controller || new ViewerEventsController(this)); } protected _webgl_controller: WebGLController | undefined; get webglController(): WebGLController { return (this._webgl_controller = this._webgl_controller || new WebGLController(this)); } constructor(protected _container: HTMLElement, protected _scene: PolyScene, protected _camera_node: C) { this._id = TypedViewer._next_viewer_id++; this._scene.viewersRegister.registerViewer(this); } container() { return this._container; } scene() { return this._scene; } canvas() { return this._canvas; } cameraNode() { return this._camera_node; } get cameraControlsController(): ThreejsCameraControlsController | undefined { return undefined; } id() { return this._id; } // private async _init_from_scene(camera_node: BaseCameraObjNodeType) { // // camera_node || this._scene.cameras_controller.masterCameraNode // await this.con_controller?.set_camera_node(camera_node); // // await this.update_picker_nodes(); // TODO: typescript // } // protected abstract _build(): void; dispose() { this._scene.viewersRegister.unregisterViewer(this); this.eventsController.dispose(); let child: Element; while ((child = this._container.children[0])) { this._container.removeChild(child); } } // html container class resetContainerClass() { this.container().classList.remove(HOVERED_CLASS_NAME); } setContainerClassHovered() { this.container().classList.add(HOVERED_CLASS_NAME); } } export type BaseViewerType = TypedViewer<BaseCameraObjNodeType>;