lingo3d
Version:
Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor
108 lines • 4.36 kB
JavaScript
import { Reactive } from "@lincode/reactivity";
import { orbitCameraDefaults, orbitCameraSchema } from "../../interface/IOrbitCamera";
import { getTransformControlsDragging } from "../../states/useTransformControlsDragging";
import { onKeyClear } from "../../events/onKeyClear";
import { getCameraRendered } from "../../states/useCameraRendered";
import { Cancellable } from "@lincode/promiselikes";
import { PerspectiveCamera } from "three";
import { FAR, NEAR } from "../../globals";
import MeshAppendable from "../core/MeshAppendable";
import CameraBase from "../core/CameraBase";
import { getHotKeysEnabled } from "../../states/useHotKeysEnabled";
import { container } from "../../engine/renderLoop/containers";
import { cameraRenderedPtr } from "../../pointers/cameraRenderedPtr";
import { gyrateSystem } from "../../systems/gyrateSystem";
import { flySystem } from "../../systems/flySystem";
import { orbitCameraPlaceAtSystem } from "../../systems/orbitCameraPlaceAtSystem";
class OrbitCamera extends CameraBase {
static componentName = "orbitCamera";
static defaults = orbitCameraDefaults;
static schema = orbitCameraSchema;
constructor(camera = new PerspectiveCamera(75, 1, NEAR, FAR)) {
super(camera);
this.innerZ = 500;
this.orbitMode = true;
this.mouseControl = "drag";
this.$camera.rotation.y = 0;
this.createEffect(() => {
const found = this.firstChildState.get();
if (!(found instanceof MeshAppendable))
return;
orbitCameraPlaceAtSystem.add(this, { target: found });
return () => {
orbitCameraPlaceAtSystem.delete(this);
};
}, [this.firstChildState.get]);
this.createEffect(() => {
if (!getHotKeysEnabled() ||
getTransformControlsDragging() ||
cameraRenderedPtr[0] !== camera ||
!this.mouseControlState.get())
return;
const handle = new Cancellable();
if (this.enableZoomState.get()) {
const cb = (e) => {
e.preventDefault();
this.innerZ += e.deltaY;
if (this.innerZ < 0)
this.innerZ = 0;
};
container.addEventListener("wheel", cb);
handle.then(() => container.removeEventListener("wheel", cb));
}
if (this.enableFlyState.get()) {
const downSet = new Set();
flySystem.add(this, { downSet });
const handleKeyDown = (e) => {
downSet.add(e.key.length === 1 ? e.key.toLocaleLowerCase() : e.key);
};
const handleKeyUp = (e) => {
downSet.delete(e.key.length === 1 ? e.key.toLocaleLowerCase() : e.key);
};
document.addEventListener("keydown", handleKeyDown);
document.addEventListener("keyup", handleKeyUp);
handle.watch(onKeyClear(() => downSet.clear()));
handle.then(() => {
flySystem.delete(this);
document.removeEventListener("keydown", handleKeyDown);
document.removeEventListener("keyup", handleKeyUp);
});
}
return () => {
handle.cancel();
};
}, [
getHotKeysEnabled,
getCameraRendered,
getTransformControlsDragging,
this.enableZoomState.get,
this.enableFlyState.get,
this.mouseControlState.get
]);
}
enableZoomState = new Reactive(false);
get enableZoom() {
return this.enableZoomState.get();
}
set enableZoom(val) {
this.enableZoomState.set(val);
}
enableFlyState = new Reactive(false);
get enableFly() {
return this.enableFlyState.get();
}
set enableFly(val) {
this.enableFlyState.set(val);
}
_autoRotate = false;
get autoRotate() {
return this._autoRotate;
}
set autoRotate(val) {
this._autoRotate = val;
val ? gyrateSystem.add(this) : gyrateSystem.delete(this);
}
autoRotateSpeed = 2;
}
export default OrbitCamera;
//# sourceMappingURL=OrbitCamera.js.map