UNPKG

@laser-tracer/core

Version:

A real-time 3D engine for creating time-decaying volumetric light drawings that mimic phosphor vector monitors.

457 lines 510 kB
import * as a from "three"; import { Ray as K, Plane as q, MathUtils as V, Vector3 as w, Controls as _, MOUSE as Y, TOUCH as D, Quaternion as R, Spherical as C, Vector2 as M } from "three"; const k = { type: "change" }, B = { type: "start" }, J = { type: "end" }, T = new K(), F = new q(), $ = Math.cos(70 * V.DEG2RAD), O = new w(), v = 2 * Math.PI, j = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_PAN: 4, TOUCH_DOLLY_PAN: 5, TOUCH_DOLLY_ROTATE: 6 }, I = 1e-6; class tt extends _ { /** * Constructs a new controls instance. * * @param {Object3D} object - The object that is managed by the controls. * @param {?HTMLDOMElement} domElement - The HTML element used for event listeners. */ constructor(t, e = null) { super(t, e), this.state = j.NONE, this.target = new w(), this.cursor = new w(), this.minDistance = 0, this.maxDistance = 1 / 0, this.minZoom = 0, this.maxZoom = 1 / 0, this.minTargetRadius = 0, this.maxTargetRadius = 1 / 0, this.minPolarAngle = 0, this.maxPolarAngle = Math.PI, this.minAzimuthAngle = -1 / 0, this.maxAzimuthAngle = 1 / 0, this.enableDamping = !1, this.dampingFactor = 0.05, this.enableZoom = !0, this.zoomSpeed = 1, this.enableRotate = !0, this.rotateSpeed = 1, this.keyRotateSpeed = 1, this.enablePan = !0, this.panSpeed = 1, this.screenSpacePanning = !0, this.keyPanSpeed = 7, this.zoomToCursor = !1, this.autoRotate = !1, this.autoRotateSpeed = 2, this.keys = { LEFT: "ArrowLeft", UP: "ArrowUp", RIGHT: "ArrowRight", BOTTOM: "ArrowDown" }, this.mouseButtons = { LEFT: Y.ROTATE, MIDDLE: Y.DOLLY, RIGHT: Y.PAN }, this.touches = { ONE: D.ROTATE, TWO: D.DOLLY_PAN }, this.target0 = this.target.clone(), this.position0 = this.object.position.clone(), this.zoom0 = this.object.zoom, this._domElementKeyEvents = null, this._lastPosition = new w(), this._lastQuaternion = new R(), this._lastTargetPosition = new w(), this._quat = new R().setFromUnitVectors(t.up, new w(0, 1, 0)), this._quatInverse = this._quat.clone().invert(), this._spherical = new C(), this._sphericalDelta = new C(), this._scale = 1, this._panOffset = new w(), this._rotateStart = new M(), this._rotateEnd = new M(), this._rotateDelta = new M(), this._panStart = new M(), this._panEnd = new M(), this._panDelta = new M(), this._dollyStart = new M(), this._dollyEnd = new M(), this._dollyDelta = new M(), this._dollyDirection = new w(), this._mouse = new M(), this._performCursorZoom = !1, this._pointers = [], this._pointerPositions = {}, this._controlActive = !1, this._onPointerMove = st.bind(this), this._onPointerDown = et.bind(this), this._onPointerUp = it.bind(this), this._onContextMenu = zt.bind(this), this._onMouseWheel = xt.bind(this), this._onKeyDown = ft.bind(this), this._onTouchStart = ot.bind(this), this._onTouchMove = at.bind(this), this._onMouseDown = nt.bind(this), this._onMouseMove = ct.bind(this), this._interceptControlDown = jt.bind(this), this._interceptControlUp = Pt.bind(this), this.domElement !== null && this.connect(this.domElement), this.update(); } connect(t) { super.connect(t), this.domElement.addEventListener("pointerdown", this._onPointerDown), this.domElement.addEventListener("pointercancel", this._onPointerUp), this.domElement.addEventListener("contextmenu", this._onContextMenu), this.domElement.addEventListener("wheel", this._onMouseWheel, { passive: !1 }), this.domElement.getRootNode().addEventListener("keydown", this._interceptControlDown, { passive: !0, capture: !0 }), this.domElement.style.touchAction = "none"; } disconnect() { this.domElement.removeEventListener("pointerdown", this._onPointerDown), this.domElement.removeEventListener("pointermove", this._onPointerMove), this.domElement.removeEventListener("pointerup", this._onPointerUp), this.domElement.removeEventListener("pointercancel", this._onPointerUp), this.domElement.removeEventListener("wheel", this._onMouseWheel), this.domElement.removeEventListener("contextmenu", this._onContextMenu), this.stopListenToKeyEvents(), this.domElement.getRootNode().removeEventListener("keydown", this._interceptControlDown, { capture: !0 }), this.domElement.style.touchAction = "auto"; } dispose() { this.disconnect(); } /** * Get the current vertical rotation, in radians. * * @return {number} The current vertical rotation, in radians. */ getPolarAngle() { return this._spherical.phi; } /** * Get the current horizontal rotation, in radians. * * @return {number} The current horizontal rotation, in radians. */ getAzimuthalAngle() { return this._spherical.theta; } /** * Returns the distance from the camera to the target. * * @return {number} The distance from the camera to the target. */ getDistance() { return this.object.position.distanceTo(this.target); } /** * Adds key event listeners to the given DOM element. * `window` is a recommended argument for using this method. * * @param {HTMLDOMElement} domElement - The DOM element */ listenToKeyEvents(t) { t.addEventListener("keydown", this._onKeyDown), this._domElementKeyEvents = t; } /** * Removes the key event listener previously defined with `listenToKeyEvents()`. */ stopListenToKeyEvents() { this._domElementKeyEvents !== null && (this._domElementKeyEvents.removeEventListener("keydown", this._onKeyDown), this._domElementKeyEvents = null); } /** * Save the current state of the controls. This can later be recovered with `reset()`. */ saveState() { this.target0.copy(this.target), this.position0.copy(this.object.position), this.zoom0 = this.object.zoom; } /** * Reset the controls to their state from either the last time the `saveState()` * was called, or the initial state. */ reset() { this.target.copy(this.target0), this.object.position.copy(this.position0), this.object.zoom = this.zoom0, this.object.updateProjectionMatrix(), this.dispatchEvent(k), this.update(), this.state = j.NONE; } update(t = null) { const e = this.object.position; O.copy(e).sub(this.target), O.applyQuaternion(this._quat), this._spherical.setFromVector3(O), this.autoRotate && this.state === j.NONE && this._rotateLeft(this._getAutoRotationAngle(t)), this.enableDamping ? (this._spherical.theta += this._sphericalDelta.theta * this.dampingFactor, this._spherical.phi += this._sphericalDelta.phi * this.dampingFactor) : (this._spherical.theta += this._sphericalDelta.theta, this._spherical.phi += this._sphericalDelta.phi); let n = this.minAzimuthAngle, i = this.maxAzimuthAngle; isFinite(n) && isFinite(i) && (n < -Math.PI ? n += v : n > Math.PI && (n -= v), i < -Math.PI ? i += v : i > Math.PI && (i -= v), n <= i ? this._spherical.theta = Math.max(n, Math.min(i, this._spherical.theta)) : this._spherical.theta = this._spherical.theta > (n + i) / 2 ? Math.max(n, this._spherical.theta) : Math.min(i, this._spherical.theta)), this._spherical.phi = Math.max(this.minPolarAngle, Math.min(this.maxPolarAngle, this._spherical.phi)), this._spherical.makeSafe(), this.enableDamping === !0 ? this.target.addScaledVector(this._panOffset, this.dampingFactor) : this.target.add(this._panOffset), this.target.sub(this.cursor), this.target.clampLength(this.minTargetRadius, this.maxTargetRadius), this.target.add(this.cursor); let c = !1; if (this.zoomToCursor && this._performCursorZoom || this.object.isOrthographicCamera) this._spherical.radius = this._clampDistance(this._spherical.radius); else { const x = this._spherical.radius; this._spherical.radius = this._clampDistance(this._spherical.radius * this._scale), c = x != this._spherical.radius; } if (O.setFromSpherical(this._spherical), O.applyQuaternion(this._quatInverse), e.copy(this.target).add(O), this.object.lookAt(this.target), this.enableDamping === !0 ? (this._sphericalDelta.theta *= 1 - this.dampingFactor, this._sphericalDelta.phi *= 1 - this.dampingFactor, this._panOffset.multiplyScalar(1 - this.dampingFactor)) : (this._sphericalDelta.set(0, 0, 0), this._panOffset.set(0, 0, 0)), this.zoomToCursor && this._performCursorZoom) { let x = null; if (this.object.isPerspectiveCamera) { const f = O.length(); x = this._clampDistance(f * this._scale); const o = f - x; this.object.position.addScaledVector(this._dollyDirection, o), this.object.updateMatrixWorld(), c = !!o; } else if (this.object.isOrthographicCamera) { const f = new w(this._mouse.x, this._mouse.y, 0); f.unproject(this.object); const o = this.object.zoom; this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom / this._scale)), this.object.updateProjectionMatrix(), c = o !== this.object.zoom; const z = new w(this._mouse.x, this._mouse.y, 0); z.unproject(this.object), this.object.position.sub(z).add(f), this.object.updateMatrixWorld(), x = O.length(); } else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."), this.zoomToCursor = !1; x !== null && (this.screenSpacePanning ? this.target.set(0, 0, -1).transformDirection(this.object.matrix).multiplyScalar(x).add(this.object.position) : (T.origin.copy(this.object.position), T.direction.set(0, 0, -1).transformDirection(this.object.matrix), Math.abs(this.object.up.dot(T.direction)) < $ ? this.object.lookAt(this.target) : (F.setFromNormalAndCoplanarPoint(this.object.up, this.target), T.intersectPlane(F, this.target)))); } else if (this.object.isOrthographicCamera) { const x = this.object.zoom; this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom / this._scale)), x !== this.object.zoom && (this.object.updateProjectionMatrix(), c = !0); } return this._scale = 1, this._performCursorZoom = !1, c || this._lastPosition.distanceToSquared(this.object.position) > I || 8 * (1 - this._lastQuaternion.dot(this.object.quaternion)) > I || this._lastTargetPosition.distanceToSquared(this.target) > I ? (this.dispatchEvent(k), this._lastPosition.copy(this.object.position), this._lastQuaternion.copy(this.object.quaternion), this._lastTargetPosition.copy(this.target), !0) : !1; } _getAutoRotationAngle(t) { return t !== null ? v / 60 * this.autoRotateSpeed * t : v / 60 / 60 * this.autoRotateSpeed; } _getZoomScale(t) { const e = Math.abs(t * 0.01); return Math.pow(0.95, this.zoomSpeed * e); } _rotateLeft(t) { this._sphericalDelta.theta -= t; } _rotateUp(t) { this._sphericalDelta.phi -= t; } _panLeft(t, e) { O.setFromMatrixColumn(e, 0), O.multiplyScalar(-t), this._panOffset.add(O); } _panUp(t, e) { this.screenSpacePanning === !0 ? O.setFromMatrixColumn(e, 1) : (O.setFromMatrixColumn(e, 0), O.crossVectors(this.object.up, O)), O.multiplyScalar(t), this._panOffset.add(O); } // deltaX and deltaY are in pixels; right and down are positive _pan(t, e) { const n = this.domElement; if (this.object.isPerspectiveCamera) { const i = this.object.position; O.copy(i).sub(this.target); let c = O.length(); c *= Math.tan(this.object.fov / 2 * Math.PI / 180), this._panLeft(2 * t * c / n.clientHeight, this.object.matrix), this._panUp(2 * e * c / n.clientHeight, this.object.matrix); } else this.object.isOrthographicCamera ? (this._panLeft(t * (this.object.right - this.object.left) / this.object.zoom / n.clientWidth, this.object.matrix), this._panUp(e * (this.object.top - this.object.bottom) / this.object.zoom / n.clientHeight, this.object.matrix)) : (console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."), this.enablePan = !1); } _dollyOut(t) { this.object.isPerspectiveCamera || this.object.isOrthographicCamera ? this._scale /= t : (console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."), this.enableZoom = !1); } _dollyIn(t) { this.object.isPerspectiveCamera || this.object.isOrthographicCamera ? this._scale *= t : (console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."), this.enableZoom = !1); } _updateZoomParameters(t, e) { if (!this.zoomToCursor) return; this._performCursorZoom = !0; const n = this.domElement.getBoundingClientRect(), i = t - n.left, c = e - n.top, x = n.width, f = n.height; this._mouse.x = i / x * 2 - 1, this._mouse.y = -(c / f) * 2 + 1, this._dollyDirection.set(this._mouse.x, this._mouse.y, 1).unproject(this.object).sub(this.object.position).normalize(); } _clampDistance(t) { return Math.max(this.minDistance, Math.min(this.maxDistance, t)); } // // event callbacks - update the object state // _handleMouseDownRotate(t) { this._rotateStart.set(t.clientX, t.clientY); } _handleMouseDownDolly(t) { this._updateZoomParameters(t.clientX, t.clientX), this._dollyStart.set(t.clientX, t.clientY); } _handleMouseDownPan(t) { this._panStart.set(t.clientX, t.clientY); } _handleMouseMoveRotate(t) { this._rotateEnd.set(t.clientX, t.clientY), this._rotateDelta.subVectors(this._rotateEnd, this._rotateStart).multiplyScalar(this.rotateSpeed); const e = this.domElement; this._rotateLeft(v * this._rotateDelta.x / e.clientHeight), this._rotateUp(v * this._rotateDelta.y / e.clientHeight), this._rotateStart.copy(this._rotateEnd), this.update(); } _handleMouseMoveDolly(t) { this._dollyEnd.set(t.clientX, t.clientY), this._dollyDelta.subVectors(this._dollyEnd, this._dollyStart), this._dollyDelta.y > 0 ? this._dollyOut(this._getZoomScale(this._dollyDelta.y)) : this._dollyDelta.y < 0 && this._dollyIn(this._getZoomScale(this._dollyDelta.y)), this._dollyStart.copy(this._dollyEnd), this.update(); } _handleMouseMovePan(t) { this._panEnd.set(t.clientX, t.clientY), this._panDelta.subVectors(this._panEnd, this._panStart).multiplyScalar(this.panSpeed), this._pan(this._panDelta.x, this._panDelta.y), this._panStart.copy(this._panEnd), this.update(); } _handleMouseWheel(t) { this._updateZoomParameters(t.clientX, t.clientY), t.deltaY < 0 ? this._dollyIn(this._getZoomScale(t.deltaY)) : t.deltaY > 0 && this._dollyOut(this._getZoomScale(t.deltaY)), this.update(); } _handleKeyDown(t) { let e = !1; switch (t.code) { case this.keys.UP: t.ctrlKey || t.metaKey || t.shiftKey ? this.enableRotate && this._rotateUp(v * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(0, this.keyPanSpeed), e = !0; break; case this.keys.BOTTOM: t.ctrlKey || t.metaKey || t.shiftKey ? this.enableRotate && this._rotateUp(-v * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(0, -this.keyPanSpeed), e = !0; break; case this.keys.LEFT: t.ctrlKey || t.metaKey || t.shiftKey ? this.enableRotate && this._rotateLeft(v * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(this.keyPanSpeed, 0), e = !0; break; case this.keys.RIGHT: t.ctrlKey || t.metaKey || t.shiftKey ? this.enableRotate && this._rotateLeft(-v * this.keyRotateSpeed / this.domElement.clientHeight) : this.enablePan && this._pan(-this.keyPanSpeed, 0), e = !0; break; } e && (t.preventDefault(), this.update()); } _handleTouchStartRotate(t) { if (this._pointers.length === 1) this._rotateStart.set(t.pageX, t.pageY); else { const e = this._getSecondPointerPosition(t), n = 0.5 * (t.pageX + e.x), i = 0.5 * (t.pageY + e.y); this._rotateStart.set(n, i); } } _handleTouchStartPan(t) { if (this._pointers.length === 1) this._panStart.set(t.pageX, t.pageY); else { const e = this._getSecondPointerPosition(t), n = 0.5 * (t.pageX + e.x), i = 0.5 * (t.pageY + e.y); this._panStart.set(n, i); } } _handleTouchStartDolly(t) { const e = this._getSecondPointerPosition(t), n = t.pageX - e.x, i = t.pageY - e.y, c = Math.sqrt(n * n + i * i); this._dollyStart.set(0, c); } _handleTouchStartDollyPan(t) { this.enableZoom && this._handleTouchStartDolly(t), this.enablePan && this._handleTouchStartPan(t); } _handleTouchStartDollyRotate(t) { this.enableZoom && this._handleTouchStartDolly(t), this.enableRotate && this._handleTouchStartRotate(t); } _handleTouchMoveRotate(t) { if (this._pointers.length == 1) this._rotateEnd.set(t.pageX, t.pageY); else { const n = this._getSecondPointerPosition(t), i = 0.5 * (t.pageX + n.x), c = 0.5 * (t.pageY + n.y); this._rotateEnd.set(i, c); } this._rotateDelta.subVectors(this._rotateEnd, this._rotateStart).multiplyScalar(this.rotateSpeed); const e = this.domElement; this._rotateLeft(v * this._rotateDelta.x / e.clientHeight), this._rotateUp(v * this._rotateDelta.y / e.clientHeight), this._rotateStart.copy(this._rotateEnd); } _handleTouchMovePan(t) { if (this._pointers.length === 1) this._panEnd.set(t.pageX, t.pageY); else { const e = this._getSecondPointerPosition(t), n = 0.5 * (t.pageX + e.x), i = 0.5 * (t.pageY + e.y); this._panEnd.set(n, i); } this._panDelta.subVectors(this._panEnd, this._panStart).multiplyScalar(this.panSpeed), this._pan(this._panDelta.x, this._panDelta.y), this._panStart.copy(this._panEnd); } _handleTouchMoveDolly(t) { const e = this._getSecondPointerPosition(t), n = t.pageX - e.x, i = t.pageY - e.y, c = Math.sqrt(n * n + i * i); this._dollyEnd.set(0, c), this._dollyDelta.set(0, Math.pow(this._dollyEnd.y / this._dollyStart.y, this.zoomSpeed)), this._dollyOut(this._dollyDelta.y), this._dollyStart.copy(this._dollyEnd); const x = (t.pageX + e.x) * 0.5, f = (t.pageY + e.y) * 0.5; this._updateZoomParameters(x, f); } _handleTouchMoveDollyPan(t) { this.enableZoom && this._handleTouchMoveDolly(t), this.enablePan && this._handleTouchMovePan(t); } _handleTouchMoveDollyRotate(t) { this.enableZoom && this._handleTouchMoveDolly(t), this.enableRotate && this._handleTouchMoveRotate(t); } // pointers _addPointer(t) { this._pointers.push(t.pointerId); } _removePointer(t) { delete this._pointerPositions[t.pointerId]; for (let e = 0; e < this._pointers.length; e++) if (this._pointers[e] == t.pointerId) { this._pointers.splice(e, 1); return; } } _isTrackingPointer(t) { for (let e = 0; e < this._pointers.length; e++) if (this._pointers[e] == t.pointerId) return !0; return !1; } _trackPointer(t) { let e = this._pointerPositions[t.pointerId]; e === void 0 && (e = new M(), this._pointerPositions[t.pointerId] = e), e.set(t.pageX, t.pageY); } _getSecondPointerPosition(t) { const e = t.pointerId === this._pointers[0] ? this._pointers[1] : this._pointers[0]; return this._pointerPositions[e]; } // _customWheelEvent(t) { const e = t.deltaMode, n = { clientX: t.clientX, clientY: t.clientY, deltaY: t.deltaY }; switch (e) { case 1: n.deltaY *= 16; break; case 2: n.deltaY *= 100; break; } return t.ctrlKey && !this._controlActive && (n.deltaY *= 10), n; } } function et(s) { this.enabled !== !1 && (this._pointers.length === 0 && (this.domElement.setPointerCapture(s.pointerId), this.domElement.addEventListener("pointermove", this._onPointerMove), this.domElement.addEventListener("pointerup", this._onPointerUp)), !this._isTrackingPointer(s) && (this._addPointer(s), s.pointerType === "touch" ? this._onTouchStart(s) : this._onMouseDown(s))); } function st(s) { this.enabled !== !1 && (s.pointerType === "touch" ? this._onTouchMove(s) : this._onMouseMove(s)); } function it(s) { switch (this._removePointer(s), this._pointers.length) { case 0: this.domElement.releasePointerCapture(s.pointerId), this.domElement.removeEventListener("pointermove", this._onPointerMove), this.domElement.removeEventListener("pointerup", this._onPointerUp), this.dispatchEvent(J), this.state = j.NONE; break; case 1: const t = this._pointers[0], e = this._pointerPositions[t]; this._onTouchStart({ pointerId: t, pageX: e.x, pageY: e.y }); break; } } function nt(s) { let t; switch (s.button) { case 0: t = this.mouseButtons.LEFT; break; case 1: t = this.mouseButtons.MIDDLE; break; case 2: t = this.mouseButtons.RIGHT; break; default: t = -1; } switch (t) { case Y.DOLLY: if (this.enableZoom === !1) return; this._handleMouseDownDolly(s), this.state = j.DOLLY; break; case Y.ROTATE: if (s.ctrlKey || s.metaKey || s.shiftKey) { if (this.enablePan === !1) return; this._handleMouseDownPan(s), this.state = j.PAN; } else { if (this.enableRotate === !1) return; this._handleMouseDownRotate(s), this.state = j.ROTATE; } break; case Y.PAN: if (s.ctrlKey || s.metaKey || s.shiftKey) { if (this.enableRotate === !1) return; this._handleMouseDownRotate(s), this.state = j.ROTATE; } else { if (this.enablePan === !1) return; this._handleMouseDownPan(s), this.state = j.PAN; } break; default: this.state = j.NONE; } this.state !== j.NONE && this.dispatchEvent(B); } function ct(s) { switch (this.state) { case j.ROTATE: if (this.enableRotate === !1) return; this._handleMouseMoveRotate(s); break; case j.DOLLY: if (this.enableZoom === !1) return; this._handleMouseMoveDolly(s); break; case j.PAN: if (this.enablePan === !1) return; this._handleMouseMovePan(s); break; } } function xt(s) { this.enabled === !1 || this.enableZoom === !1 || this.state !== j.NONE || (s.preventDefault(), this.dispatchEvent(B), this._handleMouseWheel(this._customWheelEvent(s)), this.dispatchEvent(J)); } function ft(s) { this.enabled !== !1 && this._handleKeyDown(s); } function ot(s) { switch (this._trackPointer(s), this._pointers.length) { case 1: switch (this.touches.ONE) { case D.ROTATE: if (this.enableRotate === !1) return; this._handleTouchStartRotate(s), this.state = j.TOUCH_ROTATE; break; case D.PAN: if (this.enablePan === !1) return; this._handleTouchStartPan(s), this.state = j.TOUCH_PAN; break; default: this.state = j.NONE; } break; case 2: switch (this.touches.TWO) { case D.DOLLY_PAN: if (this.enableZoom === !1 && this.enablePan === !1) return; this._handleTouchStartDollyPan(s), this.state = j.TOUCH_DOLLY_PAN; break; case D.DOLLY_ROTATE: if (this.enableZoom === !1 && this.enableRotate === !1) return; this._handleTouchStartDollyRotate(s), this.state = j.TOUCH_DOLLY_ROTATE; break; default: this.state = j.NONE; } break; default: this.state = j.NONE; } this.state !== j.NONE && this.dispatchEvent(B); } function at(s) { switch (this._trackPointer(s), this.state) { case j.TOUCH_ROTATE: if (this.enableRotate === !1) return; this._handleTouchMoveRotate(s), this.update(); break; case j.TOUCH_PAN: if (this.enablePan === !1) return; this._handleTouchMovePan(s), this.update(); break; case j.TOUCH_DOLLY_PAN: if (this.enableZoom === !1 && this.enablePan === !1) return; this._handleTouchMoveDollyPan(s), this.update(); break; case j.TOUCH_DOLLY_ROTATE: if (this.enableZoom === !1 && this.enableRotate === !1) return; this._handleTouchMoveDollyRotate(s), this.update(); break; default: this.state = j.NONE; } } function zt(s) { this.enabled !== !1 && s.preventDefault(); } function jt(s) { s.key === "Control" && (this._controlActive = !0, this.domElement.getRootNode().addEventListener("keyup", this._interceptControlUp, { passive: !0, capture: !0 })); } function Pt(s) { s.key === "Control" && (this._controlActive = !1, this.domElement.getRootNode().removeEventListener("keyup", this._interceptControlUp, { passive: !0, capture: !0 })); } const ht = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6REVGODRBRjIyRjU2MTFFNUExM0Y4OUExMTc4QTBCQUMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6REVGODRBRjMyRjU2MTFFNUExM0Y4OUExMTc4QTBCQUMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpERUY4NEFGMDJGNTYxMUU1QTEzRjg5QTExNzhBMEJBQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpERUY4NEFGMTJGNTYxMUU1QTEzRjg5QTExNzhBMEJBQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgDz1z0AAAZeSURBVHja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", rt = "data:image/png;base64,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