@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
85 lines (84 loc) • 2.33 kB
JavaScript
"use strict";
import { EventDispatcher } from "three";
export var CameraControlsEvent = /* @__PURE__ */ ((CameraControlsEvent2) => {
CameraControlsEvent2["start"] = "start";
CameraControlsEvent2["end"] = "end";
return CameraControlsEvent2;
})(CameraControlsEvent || {});
export const CAMERA_CONTROLS_EVENTS = ["start" /* start */, "end" /* end */];
const START_EVENT = { type: "start" /* start */ };
const END_EVENT = { type: "end" /* end */ };
export class ViewerControlsController extends EventDispatcher {
constructor(viewer) {
super();
this.viewer = viewer;
this._active = false;
this._mounted = false;
this._boundEventHandler = {
["start" /* start */]: () => this.dispatchEvent(START_EVENT),
["end" /* end */]: () => this.dispatchEvent(END_EVENT)
};
}
controls() {
return this._controls;
}
mount() {
if (this._mounted) {
return;
}
this._mounted = true;
const controlsNode = this.viewer.controlsNode();
const camera = this.viewer.camera();
if (!(controlsNode && camera)) {
return;
}
controlsNode.applyControls(camera, this.viewer).then((controls) => {
this._controls = controls;
this._updateControlsFunc = controls ? (delta) => controls.update(delta) : void 0;
for (const eventName of CAMERA_CONTROLS_EVENTS) {
controls.addEventListener(eventName, this._boundEventHandler[eventName]);
}
if (!this._mounted) {
this._disposeControls();
}
});
}
unmount() {
if (!this._mounted) {
return;
}
this._mounted = false;
this._disposeControls();
}
_disposeControls() {
if (this._controls) {
for (const eventName of CAMERA_CONTROLS_EVENTS) {
this._controls.removeEventListener(eventName, this._boundEventHandler[eventName]);
}
this._controls.dispose();
}
this._updateControlsFunc = void 0;
}
update(delta) {
if (this._updateControlsFunc) {
this._updateControlsFunc(delta);
}
}
setActive(active) {
if (active) {
this.mount();
} else {
this.unmount();
}
}
setTarget(target) {
if (!this._controls) {
return;
}
const orbitControls = this._controls;
if (!orbitControls.target) {
return;
}
orbitControls.target.copy(target);
}
}