UNPKG

lingo3d

Version:

Lingo3D is a React/Vue 3d game development framework that ships with a complete visual editor

108 lines 4.36 kB
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