UNPKG

@yhsoft/model-viewer

Version:

基于 ThreeJS 开发的三维模型查看器,支持多种 3D 格式的模型浏览,支持对模型的旋转、平移、缩放等操作

783 lines 278 kB
(function(){"use strict";try{if(typeof document<"u"){var A=document.createElement("style");A.appendChild(document.createTextNode('@font-face{font-family:icon-font;src:url(data:application/x-font-woff;charset=utf-8;base64,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) format("woff")}.icon-font[data-v-83a05677]{font-family:icon-font!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-axis[data-v-83a05677]:before{content:""}.icon-model[data-v-83a05677]:before{content:""}.icon-revert-screen[data-v-83a05677]:before{content:""}.icon-full-screen[data-v-83a05677]:before{content:""}.icon-rotate[data-v-83a05677]:before{content:""}.icon-translate[data-v-83a05677]:before{content:""}.icon-scale[data-v-83a05677]:before{content:""}.wrapper{height:100%;width:100%;left:0;top:0;bottom:0;right:0;z-index:999;transition:all .6s}.model-container{height:inherit;width:inherit;position:relative}.model-container .loading{display:flex;justify-content:center;align-items:center;position:absolute;width:inherit;height:inherit;background-color:#ffffff90;color:#0009}.model-container .toolbar{position:absolute;right:16px;top:50%;transform:translateY(-50%)}.model-container .toolbar-item{border-radius:6px;padding:6px 8px;margin:8px auto;cursor:pointer;box-shadow:0 6px 16px #00000014,0 3px 6px -4px #0000001f,0 9px 28px 8px #0000000d;background-color:#fff}.model-container .toolbar-item:hover{transition:all .3s}.model-container .toolbar-item:hover .icon-font{color:#4096ff}.model-container .toolbar-item .icon-font{font-size:20px;color:#000c}.model-container .toolbar-item.active{background-color:#4096ff;border-color:#004ba6}.model-container .toolbar-item.active .icon-font{color:#fff}.model-container .copyright{position:absolute;left:16px;bottom:16px;cursor:pointer}.model-container .copyright img{width:100px;opacity:.85}')),document.head.appendChild(A)}}catch(o){console.error("vite-plugin-css-injected-by-js",o)}})(); import { computed as Ks, ref as zn, reactive as Ws, watch as Xn, onMounted as qs, nextTick as Zs, openBlock as yt, createElementBlock as wt, createElementVNode as vt, createTextVNode as Qs, toDisplayString as Vn, createCommentVNode as cn, Fragment as Js, renderList as $s, normalizeClass as Yn, withDirectives as er, vShow as tr, pushScopeId as nr, popScopeId as sr } from "vue"; import * as pe from "three"; import { Scene as rr, BoxGeometry as Me, MeshStandardMaterial as Bt, BackSide as or, PointLight as nn, Mesh as k, MeshBasicMaterial as ot, Ray as ir, Plane as ar, MathUtils as Te, EventDispatcher as cr, Vector3 as B, MOUSE as At, TOUCH as bt, Quaternion as ge, Spherical as Kn, Vector2 as Re, Raycaster as lr, Object3D as ct, Euler as Be, Matrix4 as oe, LineBasicMaterial as Et, CylinderGeometry as _e, BufferGeometry as Pe, Float32BufferAttribute as we, OctahedronGeometry as Xt, Line as ze, SphereGeometry as ur, TorusGeometry as Lt, PlaneGeometry as hr, DoubleSide as Nn, Loader as Ke, FileLoader as Je, SRGBColorSpace as De, LinearSRGBColorSpace as Ue, BufferAttribute as ft, Color as fe, DataTextureLoader as pr, HalfFloatType as Vt, FloatType as ln, DataUtils as Yt, LinearFilter as it, TrianglesDrawMode as dr, TriangleFanDrawMode as En, TriangleStripDrawMode as ys, LoaderUtils as lt, SpotLight as ws, DirectionalLight as As, MeshPhysicalMaterial as $e, InstancedMesh as fr, InstancedBufferAttribute as mr, TextureLoader as Ut, ImageBitmapLoader as gr, InterleavedBuffer as yr, InterleavedBufferAttribute as wr, LinearMipmapLinearFilter as sn, RepeatWrapping as Ve, PointsMaterial as Ct, Material as Ft, PropertyBinding as jt, SkinnedMesh as bs, LineSegments as Mn, LineLoop as Ar, Points as $t, Group as Ye, PerspectiveCamera as xs, OrthographicCamera as Ts, Skeleton as vs, AnimationClip as Es, Bone as Sn, InterpolateLinear as Ms, ColorManagement as Wn, NearestFilter as Rn, NearestMipmapNearestFilter as br, LinearMipmapNearestFilter as xr, NearestMipmapLinearFilter as Tr, ClampToEdgeWrapping as Ht, MirroredRepeatWrapping as Ln, InterpolateDiscrete as vr, FrontSide as Ss, Texture as Ot, VectorKeyframeTrack as In, NumberKeyframeTrack as _n, QuaternionKeyframeTrack as rn, Box3 as Er, Sphere as Mr, Interpolant as Sr, MeshPhongMaterial as He, DefaultLoadingManager as Rr, AdditiveBlending as Lr, Vector4 as on, Curve as Ir, MeshLambertMaterial as _r, EquirectangularReflectionMapping as Pr, AmbientLight as Cr, Uint16BufferAttribute as Dr, Matrix3 as kr, ShapeUtils as Fr } from "three"; import Or from "lodash.merge"; const Rs = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAAAfCAYAAAAFvjTyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAPh0lEQVR4nO2ce7BeVXnGf886uR5yASEIBASBEBpuAdqKIo7AcB0Yb5QMKFiw4oAapVUEOlwUx0LL1CJWQGkNKtpgHEbCHUEESooGwSgYCAkEJCDXBAKcJOesp3+svb99/c75DsXptJNn5kuy1+Vd71r7Xe9trR3ZZiM24q1G+N9mYCP+f2IMwOrvvB0MsrB4l6zjQW/vof+QFecCL8oAOhj0yWYzPwPMB/7LIY5IVFGAit4yyCjm+8CkPRFxMLLAo90jBR8FDYGc/u4wY0xWX+WywmPB6xAEQwxZn4LX7ijTcamPamX1tqnOIdUV65PPK2bleZ8mv6nYibyozj2j0X19y3wVmPqpZ5NglbC3HC4HZrdz0MaTzgG/mD1+FvhASyuA94M/CjzcK+3/u9joXpQFawaEe4EJvXf3U+Cns4etQS1C1cFs0G1YOwLrsv7dNtF5wPbAG0A/cA/wbyMwM7VnthPW9NBmK+D9oEFgQVGsALoY2KbWfhB0BQ53986G3g18nCSN40C3gue3tAM4BPirNA4mrc1DwMW9j9dBH2mNDwANtI/ZGfsk4LCWijuBy9t6jAFQDB8GPsaohArAnwbWZZM+oIcO28hhL+CXGcNATOajImE6GrRv58n6axzvAiYBM0HbA7MgTMfxK8A7gUtGxbr0I+NTO8KdlMws0GzgvaC/AHbDmigweBzpheam42jQzg2yDn3YIwhW2dSyAetTRYEng+Y3dpwMaDpuuBpPYi5umupWHAXsC9oT2JskWCGb+w1WXFunk1nJ3QVzWuZxDGnDb+hwn5nfXGMdCnpXL5yVRvyq5YXJNwPQzB57ji/+mfwZVfwVAz4DdHu1W3iE5moja1lWPjqNZeZIPtX5kOgi0BldrNjTnX8lnysiTpZ1Vwvh8chbYs0E3gHaA9gBuAq4qdRwOui94O1qc9ocVH2J8gor/koxPNBU8VolcwjVirEkbX8XSYsCnAi6qnV28Dp4QFGngD5DvoEg4HCR5C+ATgUm1vq9SNJ8G2rlHcEyw3uXNfgsK16IjNxxMqf32HmwUVLZJQJY39KvZUt6DfgaYByEOSXfpg+YXGu8jrTYOb6PMsc2CqRThuHZYCXfXhkjqpvBnM0PYR1GMlMlhKnATSUe/xk4tu4sAwdlv9Lo4RXwVMM+LYuwXzKfbVzrTPBF2dNe7fwC6Z0MIg1h9qjVzcIYeJ2mYA1kvwZywRoLDUe+jdNFwPngNJEYykLRN3L/njG+9jwI3AFeCvwBWIr8BLDB+FnBahw367QWW2OtJM0L8Apgp1I92BCV2FdEhCuxTgDaouEhi0HgYNAngG1H0PD9zSL/qrY3th+mfx1TkonS3qPog5I/m+Px4ZoisHxvi0mdBNo//d3AZOBAYDVpzk+QafdMmDSV5g6HpCJvQ9yOuQd4oBzxJBY6YXCr5LZgbI/tyngV4qeBx0plE3G4Ufh+h/gF4eOw9gHWYnamulH6gfNJMfw48CMO/m4xCUOMX4TwD6BlwNtq47+hlPO4DJjRNWwv8BT4t8CzwO+QH8e6IRmFTt+LgL8D9i/1WwP+Nuj1xBRbANOQHwTAOrw5lO8GXiat62zQ1qXK17I2AFcCj4K+DOzXJCPkNq2mzwOf7zLPzUB3lJ5XY2YAL+SLP0TVFG4An4n8I8wz2QCtlJ2/GLNUIy84JJU6EuraczMID2TlY4ANuKOWb015mvDD7uS0FSnS7DAt4iJgaWI99/H0Em2mupj8Gy11dfwUfCzyejp5rDKcU7wW+zkI95TqzkKej9mfZLpvyz1YyzspvbQybgAfVWLzcqAUCOj5Eu2BzNIcCWoKVkIjGBklNpU1jZJglTGI4sHA8JFNpjI7f4qbekjfPGwNPVgvbBHIDS20yqq4zPdg6e8ezHkGM64Yv5P8m0D7acREZFnxE3LfTOwHgQNBlzZayg8D6wsXQWBPBM4BLgOeyhmopWdeQyzD4XFgStbmeohHJ22ilqg7XpOP4RBRDB+q8hLvLc03R1uQM5jxs21L3RLSmuzeUheBpSTNOD5paa2A1hfh64G70zjlSK0KydSOGVcIz29ENAXuhHgcamoEN+n/XPbJwDRgLUUaOv8FkurfYPk7Qpvissb1N4CLM+kPoPXA50BnlMYY6sJnGwLWGMRiiIuz7dTmc5Acd99LcmqzXFM4D9iXFBU+lbUDKEybfL/NUnWECkCZ32qAu8H/AtoEvA54wmJBxSdSvBprz+xpJfg/S5XDzW8daEJLZP8MeC/wGAhraPqOz4H3pLOWefq+IVgCeVVn3ko+QRtLbuHVih9TDCtB7wO2BV4ALwEWghe0ESqOG2p8wO0kx7EfuR8zmbTo/Vn5BGCy7M1JPkYZV4L7QGdnxK4Af68mWG3Ihbat3KrK/xZdaOwDWtilLttUBtgOQqEFzCLJf6hFiUOdIxuzXFGnE4yJyOESOdxOitTWK4azwX9bUQK95bYABsBvo5Q7zAgstyKyRPtGHKyWF+PVBMtgHZJ7Hd0ZUyacDU0zCHwpm9x4Ohn2LlRahQqAC0B/X7A13AJpHPhLNWY2A51OyhgDbAp8fThe8pFoOu6QNgk1n2lcS7te6JO9gN2obE19BPO+WvuDQTdivgzcl0ezQieD5tZIr6bC3qgwBbHWxONk7UbKSxn5J5lG3NCFcizNp1LU5pPMAJ2O3HkRLv2Zv750MEnnALQFVaFK4WztoLRr3z27VdTwGrCI6oktpF38Wun5jwznfynmrAyAzgPNqtb7N1YcJIZOJGxxrcyFoIkkYRxB0Pxypr1zVuumdGeamfyJoCMUtRy4r9g74YPNOWg3Ky7OhUv55u8N/aTc4Q3ZL2NZpIyBd6Z1fp6MvCPWi6XCNdB1sfU1K/4AeL5RVUtmKgrkhp2okutWL6xmXlYwF+vX4LXAetC5wOZZ9VrwAeAHi2S9tqzNxYzCh3In0WuAr3SbAyFC1PZAkHkNfFbhV4xsdqw8u2GAJaAXSUK5ju7HaQOE+IvS8zjMwS3E58nhSIc4h5D5rR7WKpTxR8w2IlwN7FoqzzprEq15Sm2G9Xsq0bIuBc7pdtdkgmLYWzFQ/hUr05hUVt9SN4LQKUU85V9ITqQXA4tJV27KCMBeoMOxjgMdTjK7vaQxmqxXNK7GA33gUPmZPg31BVlfhPAYhGUQVkHYAGEd+MQ0+Vq/4tdHlr9zyNdDj4JnQJwBcSeIs2n6iosg7mh5gbN1dDqIbknAAuhYrJ2JJIvUu8Z6AbQXKb+1aek3NfsNl/weV2o3FcIHoHqkU8ZK8C+rPI/MnRyo3GeqC5W1S8bI76qEK8T3wNw8zMD9oHkFTUD+MGYVsEtWGqieX7X5emX/Zh/QD0iL03acBOm0fMf2qjAPOJfuLyCQYux5ts/NgiSwXqYjTFqV/bs4QcDLEM90tE4KIY7pMkZqYp0J/M1wbVqwBfg3oJ8D+7TUj6WrMPMGxZoZ4nehEKzt6GTefZcVj5e1epTMNZFfnEsYI4fbwHOpCFYDwzr8LRjCrKUQKoAXKL9keQr45VoQ0JeqlAUs/Nkoxy1DlI+MusE6TQ7npoi6c2KRCZkngqZUO+hIrP8APwS+IPN5WrLvlT4ftfw5Sj7mcF5KhmnAKvBByadqML416AGa5vpl8GzQmryh5VegI1i+ArgZ/JDFtZUEw5uPNDLSiYZiuBp4Bymh1tKog6XAEaDsJoCfzpYmT96tBL8BynwBfxZ8G3AhhHdCXAoeB+GEgrzmIM8Dzk4qPz7n4OVZHcj3yXqDtHBth/HOyodz0AdI69ktfzIE/gkY+gxRuwGHArtgTctMUT2FsQUwJ3sJFyQnWlvVWPsxaHeKjTFB1mngfxqG1zqGQJtkc1hTrTLgV0m5wLpgvQo82UYw11jfb6vsXHmt7vQ/JyX2tgEeBX4L3EEX8cvSFieBjs2KGuaixQdb0hlT/Bp7Ap2ssB9BPI5zJ9OPZ2blrBStReSwhOpLmozDv1tDM0VfhdNs6DvBO4H7aXf6M8HS10Efaan+Gvhf6S54gXRZ8EnIHGrrmkb02R3PpjUKxzSXyscanyDC90qzOg2VBKs3xdDSynnx5rTn98aQMu7r6vupawiezlwp79/t5HAprVePvZwUpt5CCv9zJ3RLHE5LITyQ/J619d5VlgwOx3dUpXkMVLqzpLHYj5SeDwRutgxhCMW+b0HYo2WddsH6tvsGT+lyP74eJLThsS7l9wOreuifkFjbboRWAM+Dvwm+LiUQ9PFKrVhujNB1tenuYHEU6RSl5b7+SMzlZmo0pqrIukOLYFVSzAXd/XC4ma6X6bQTMJeUJngFWEFKlu5KNV8TqV8Kyz5WqPHwntLgS6heZeknacm89SxMlgoIB2GdWvT17SQ1f2iiGz5JZKHxwtEtdqdt2w0QaE+qjoRvkvJ1K8EPWgzK+gbV9foFWfojO4DetULBvknpnHYN+BZQ5/qwos4Crn8TfDF6oSr3S2gIVtMsaSaEu+j9ussUun+MMZa6qTFIlZfcTzoSyvEA8MHS8yYkwc0jqL/M78/K4ZrqcD6MZMLKn+T8UMTpiFfS8B4hmaiuDz2UDwOfXXR1fph/PlXBKpnWlu8J5BuLW0u+JLtgmBe8xyHOQjzcQz5rpERct/pGeb5hGzZBUdWfNZ83d4eqDU+Bny92RKY+q2mfHSiSoQZ+D5QPR2eBV4Jzs7SloV+EBaV+IH/LwUOJhstnd5OQFlken5v7/POyJhpr2UVjdzmQ7hkCawIpuCljWtoxgGjccLV8R54Xs3wT8FKFagyXtWyYLVsYmMTIKmqTlrJp3frlUWEXWjogi1beGsj/2BjMDbW7AnQCSUjuA68H/ZQ0sfHgnzl4CHO8zBHAspQ31I4kP8nAEuzTC3Pnz2TR1HRAWP2ISZRSG1Y3zVVJoN4CHElV4tZYvrsumPmR10hIFsIA62UWpDVnABiLfJ0zwVLUIyRrkOrwFbJqx2ZxLg5fJb3XPtJFw9I4IPgZ1rupKBUvAq+u8FU9qntJ0TeTvigqt7o1Oe5NyDZrrtiqrQ7QVRBOLFbof5J78DyHeFKzuM25zMeplI8Dxlh+PX0QqvwjjnLbidnDQJNPQREuD7R9ONubMIQpVcb8ukNsfEzQnJeKilJZWVtmH+rm53ZjkAfcXtdXfqEO7iyDYhhDEppgeaBNEyv21eewprHfQ9tGCTWN3ewHlQ9Wu5rXxShOodPbwgyCRnOXaT3EhcCPm7IyKqyne1Y8x0g3PHu9Pj0cXnkLaAyH/Giq7SbrcHX0UJfjzc5hzchNErTxPwXZiD8FNv6nIBvxJ8F/A9m45OBuNYqwAAAAAElFTkSuQmCC"; class Nr extends rr { constructor(e = null) { super(); const n = new Me(); n.deleteAttribute("uv"); const t = new Bt({ side: or }), s = new Bt(); let r = 5; e !== null && e._useLegacyLights === !1 && (r = 900); const o = new nn(16777215, r, 28, 2); o.position.set(0.418, 16.199, 0.3), this.add(o); const i = new k(n, t); i.position.set(-0.757, 13.219, 0.717), i.scale.set(31.713, 28.305, 28.591), this.add(i); const a = new k(n, s); a.position.set(-10.906, 2.009, 1.846), a.rotation.set(0, -0.195, 0), a.scale.set(2.328, 7.905, 4.651), this.add(a); const c = new k(n, s); c.position.set(-5.607, -0.754, -0.758), c.rotation.set(0, 0.994, 0), c.scale.set(1.97, 1.534, 3.955), this.add(c); const u = new k(n, s); u.position.set(6.167, 0.857, 7.803), u.rotation.set(0, 0.561, 0), u.scale.set(3.927, 6.285, 3.687), this.add(u); const l = new k(n, s); l.position.set(-2.017, 0.018, 6.124), l.rotation.set(0, 0.333, 0), l.scale.set(2.002, 4.566, 2.064), this.add(l); const p = new k(n, s); p.position.set(2.291, -0.756, -2.621), p.rotation.set(0, -0.286, 0), p.scale.set(1.546, 1.552, 1.496), this.add(p); const d = new k(n, s); d.position.set(-2.193, -0.369, -5.547), d.rotation.set(0, 0.516, 0), d.scale.set(3.875, 3.487, 2.986), this.add(d); const m = new k(n, xt(50)); m.position.set(-16.116, 14.37, 8.208), m.scale.set(0.1, 2.428, 2.739), this.add(m); const A = new k(n, xt(50)); A.position.set(-16.109, 18.021, -8.207), A.scale.set(0.1, 2.425, 2.751), this.add(A); const y = new k(n, xt(17)); y.position.set(14.904, 12.198, -1.832), y.scale.set(0.15, 4.265, 6.331), this.add(y); const T = new k(n, xt(43)); T.position.set(-0.462, 8.89, 14.52), T.scale.set(4.38, 5.441, 0.088), this.add(T); const E = new k(n, xt(20)); E.position.set(3.235, 11.486, -12.541), E.scale.set(2.5, 2, 0.1), this.add(E); const I = new k(n, xt(100)); I.position.set(0, 20, 0), I.scale.set(1, 0.1, 1), this.add(I); } dispose() { const e = /* @__PURE__ */ new Set(); this.traverse((n) => { n.isMesh && (e.add(n.geometry), e.add(n.material)); }); for (const n of e) n.dispose(); } } function xt(h) { const e = new ot(); return e.color.setScalar(h), e; } const qn = { type: "change" }, un = { type: "start" }, Zn = { type: "end" }, Kt = new ir(), Qn = new ar(), Br = Math.cos(70 * Te.DEG2RAD); class jr extends cr { constructor(e, n) { super(), this.object = e, this.domElement = n, this.domElement.style.touchAction = "none", this.enabled = !0, this.target = new B(), this.cursor = new B(), 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.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: At.ROTATE, MIDDLE: At.DOLLY, RIGHT: At.PAN }, this.touches = { ONE: bt.ROTATE, TWO: bt.DOLLY_PAN }, this.target0 = this.target.clone(), this.position0 = this.object.position.clone(), this.zoom0 = this.object.zoom, this._domElementKeyEvents = null, this.getPolarAngle = function() { return i.phi; }, this.getAzimuthalAngle = function() { return i.theta; }, this.getDistance = function() { return this.object.position.distanceTo(this.target); }, this.listenToKeyEvents = function(f) { f.addEventListener("keydown", mt), this._domElementKeyEvents = f; }, this.stopListenToKeyEvents = function() { this._domElementKeyEvents.removeEventListener("keydown", mt), this._domElementKeyEvents = null; }, this.saveState = function() { t.target0.copy(t.target), t.position0.copy(t.object.position), t.zoom0 = t.object.zoom; }, this.reset = function() { t.target.copy(t.target0), t.object.position.copy(t.position0), t.object.zoom = t.zoom0, t.object.updateProjectionMatrix(), t.dispatchEvent(qn), t.update(), r = s.NONE; }, this.update = function() { const f = new B(), j = new ge().setFromUnitVectors(e.up, new B(0, 1, 0)), ne = j.clone().invert(), ue = new B(), Le = new ge(), et = new B(), ke = 2 * Math.PI; return function(Ys = null) { const Gn = t.object.position; f.copy(Gn).sub(t.target), f.applyQuaternion(j), i.setFromVector3(f), t.autoRotate && r === s.NONE && J(G(Ys)), t.enableDamping ? (i.theta += a.theta * t.dampingFactor, i.phi += a.phi * t.dampingFactor) : (i.theta += a.theta, i.phi += a.phi); let Ze = t.minAzimuthAngle, Qe = t.maxAzimuthAngle; isFinite(Ze) && isFinite(Qe) && (Ze < -Math.PI ? Ze += ke : Ze > Math.PI && (Ze -= ke), Qe < -Math.PI ? Qe += ke : Qe > Math.PI && (Qe -= ke), Ze <= Qe ? i.theta = Math.max(Ze, Math.min(Qe, i.theta)) : i.theta = i.theta > (Ze + Qe) / 2 ? Math.max(Ze, i.theta) : Math.min(Qe, i.theta)), i.phi = Math.max(t.minPolarAngle, Math.min(t.maxPolarAngle, i.phi)), i.makeSafe(), t.enableDamping === !0 ? t.target.addScaledVector(u, t.dampingFactor) : t.target.add(u), t.target.sub(t.cursor), t.target.clampLength(t.minTargetRadius, t.maxTargetRadius), t.target.add(t.cursor), t.zoomToCursor && O || t.object.isOrthographicCamera ? i.radius = ie(i.radius) : i.radius = ie(i.radius * c), f.setFromSpherical(i), f.applyQuaternion(ne), Gn.copy(t.target).add(f), t.object.lookAt(t.target), t.enableDamping === !0 ? (a.theta *= 1 - t.dampingFactor, a.phi *= 1 - t.dampingFactor, u.multiplyScalar(1 - t.dampingFactor)) : (a.set(0, 0, 0), u.set(0, 0, 0)); let an = !1; if (t.zoomToCursor && O) { let St = null; if (t.object.isPerspectiveCamera) { const Rt = f.length(); St = ie(Rt * c); const zt = Rt - St; t.object.position.addScaledVector(D, zt), t.object.updateMatrixWorld(); } else if (t.object.isOrthographicCamera) { const Rt = new B(z.x, z.y, 0); Rt.unproject(t.object), t.object.zoom = Math.max(t.minZoom, Math.min(t.maxZoom, t.object.zoom / c)), t.object.updateProjectionMatrix(), an = !0; const zt = new B(z.x, z.y, 0); zt.unproject(t.object), t.object.position.sub(zt).add(Rt), t.object.updateMatrixWorld(), St = f.length(); } else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."), t.zoomToCursor = !1; St !== null && (this.screenSpacePanning ? t.target.set(0, 0, -1).transformDirection(t.object.matrix).multiplyScalar(St).add(t.object.position) : (Kt.origin.copy(t.object.position), Kt.direction.set(0, 0, -1).transformDirection(t.object.matrix), Math.abs(t.object.up.dot(Kt.direction)) < Br ? e.lookAt(t.target) : (Qn.setFromNormalAndCoplanarPoint(t.object.up, t.target), Kt.intersectPlane(Qn, t.target)))); } else t.object.isOrthographicCamera && (t.object.zoom = Math.max(t.minZoom, Math.min(t.maxZoom, t.object.zoom / c)), t.object.updateProjectionMatrix(), an = !0); return c = 1, O = !1, an || ue.distanceToSquared(t.object.position) > o || 8 * (1 - Le.dot(t.object.quaternion)) > o || et.distanceToSquared(t.target) > 0 ? (t.dispatchEvent(qn), ue.copy(t.object.position), Le.copy(t.object.quaternion), et.copy(t.target), !0) : !1; }; }(), this.dispose = function() { t.domElement.removeEventListener("contextmenu", Hn), t.domElement.removeEventListener("pointerdown", Z), t.domElement.removeEventListener("pointercancel", ee), t.domElement.removeEventListener("wheel", We), t.domElement.removeEventListener("pointermove", $), t.domElement.removeEventListener("pointerup", ee), t._domElementKeyEvents !== null && (t._domElementKeyEvents.removeEventListener("keydown", mt), t._domElementKeyEvents = null); }; const t = this, s = { NONE: -1, ROTATE: 0, DOLLY: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_PAN: 4, TOUCH_DOLLY_PAN: 5, TOUCH_DOLLY_ROTATE: 6 }; let r = s.NONE; const o = 1e-6, i = new Kn(), a = new Kn(); let c = 1; const u = new B(), l = new Re(), p = new Re(), d = new Re(), m = new Re(), A = new Re(), y = new Re(), T = new Re(), E = new Re(), I = new Re(), D = new B(), z = new Re(); let O = !1; const N = [], C = {}; let U = !1; function G(f) { return f !== null ? 2 * Math.PI / 60 * t.autoRotateSpeed * f : 2 * Math.PI / 60 / 60 * t.autoRotateSpeed; } function W(f) { const j = Math.abs(f * 0.01); return Math.pow(0.95, t.zoomSpeed * j); } function J(f) { a.theta -= f; } function q(f) { a.phi -= f; } const H = function() { const f = new B(); return function(ne, ue) { f.setFromMatrixColumn(ue, 0), f.multiplyScalar(-ne), u.add(f); }; }(), Y = function() { const f = new B(); return function(ne, ue) { t.screenSpacePanning === !0 ? f.setFromMatrixColumn(ue, 1) : (f.setFromMatrixColumn(ue, 0), f.crossVectors(t.object.up, f)), f.multiplyScalar(ne), u.add(f); }; }(), X = function() { const f = new B(); return function(ne, ue) { const Le = t.domElement; if (t.object.isPerspectiveCamera) { const et = t.object.position; f.copy(et).sub(t.target); let ke = f.length(); ke *= Math.tan(t.object.fov / 2 * Math.PI / 180), H(2 * ne * ke / Le.clientHeight, t.object.matrix), Y(2 * ue * ke / Le.clientHeight, t.object.matrix); } else t.object.isOrthographicCamera ? (H(ne * (t.object.right - t.object.left) / t.object.zoom / Le.clientWidth, t.object.matrix), Y(ue * (t.object.top - t.object.bottom) / t.object.zoom / Le.clientHeight, t.object.matrix)) : (console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."), t.enablePan = !1); }; }(); function ae(f) { t.object.isPerspectiveCamera || t.object.isOrthographicCamera ? c /= f : (console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."), t.enableZoom = !1); } function be(f) { t.object.isPerspectiveCamera || t.object.isOrthographicCamera ? c *= f : (console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."), t.enableZoom = !1); } function se(f, j) { if (!t.zoomToCursor) return; O = !0; const ne = t.domElement.getBoundingClientRect(), ue = f - ne.left, Le = j - ne.top, et = ne.width, ke = ne.height; z.x = ue / et * 2 - 1, z.y = -(Le / ke) * 2 + 1, D.set(z.x, z.y, 1).unproject(t.object).sub(t.object.position).normalize(); } function ie(f) { return Math.max(t.minDistance, Math.min(t.maxDistance, f)); } function ve(f) { l.set(f.clientX, f.clientY); } function re(f) { se(f.clientX, f.clientX), T.set(f.clientX, f.clientY); } function me(f) { m.set(f.clientX, f.clientY); } function b(f) { p.set(f.clientX, f.clientY), d.subVectors(p, l).multiplyScalar(t.rotateSpeed); const j = t.domElement; J(2 * Math.PI * d.x / j.clientHeight), q(2 * Math.PI * d.y / j.clientHeight), l.copy(p), t.update(); } function w(f) { E.set(f.clientX, f.clientY), I.subVectors(E, T), I.y > 0 ? ae(W(I.y)) : I.y < 0 && be(W(I.y)), T.copy(E), t.update(); } function S(f) { A.set(f.clientX, f.clientY), y.subVectors(A, m).multiplyScalar(t.panSpeed), X(y.x, y.y), m.copy(A), t.update(); } function _(f) { se(f.clientX, f.clientY), f.deltaY < 0 ? be(W(f.deltaY)) : f.deltaY > 0 && ae(W(f.deltaY)), t.update(); } function R(f) { let j = !1; switch (f.code) { case t.keys.UP: f.ctrlKey || f.metaKey || f.shiftKey ? q(2 * Math.PI * t.rotateSpeed / t.domElement.clientHeight) : X(0, t.keyPanSpeed), j = !0; break; case t.keys.BOTTOM: f.ctrlKey || f.metaKey || f.shiftKey ? q(-2 * Math.PI * t.rotateSpeed / t.domElement.clientHeight) : X(0, -t.keyPanSpeed), j = !0; break; case t.keys.LEFT: f.ctrlKey || f.metaKey || f.shiftKey ? J(2 * Math.PI * t.rotateSpeed / t.domElement.clientHeight) : X(t.keyPanSpeed, 0), j = !0; break; case t.keys.RIGHT: f.ctrlKey || f.metaKey || f.shiftKey ? J(-2 * Math.PI * t.rotateSpeed / t.domElement.clientHeight) : X(-t.keyPanSpeed, 0), j = !0; break; } j && (f.preventDefault(), t.update()); } function L(f) { if (N.length === 1) l.set(f.pageX, f.pageY); else { const j = gt(f), ne = 0.5 * (f.pageX + j.x), ue = 0.5 * (f.pageY + j.y); l.set(ne, ue); } } function P(f) { if (N.length === 1) m.set(f.pageX, f.pageY); else { const j = gt(f), ne = 0.5 * (f.pageX + j.x), ue = 0.5 * (f.pageY + j.y); m.set(ne, ue); } } function F(f) { const j = gt(f), ne = f.pageX - j.x, ue = f.pageY - j.y, Le = Math.sqrt(ne * ne + ue * ue); T.set(0, Le); } function M(f) { t.enableZoom && F(f), t.enablePan && P(f); } function g(f) { t.enableZoom && F(f), t.enableRotate && L(f); } function x(f) { if (N.length == 1) p.set(f.pageX, f.pageY); else { const ne = gt(f), ue = 0.5 * (f.pageX + ne.x), Le = 0.5 * (f.pageY + ne.y); p.set(ue, Le); } d.subVectors(p, l).multiplyScalar(t.rotateSpeed); const j = t.domElement; J(2 * Math.PI * d.x / j.clientHeight), q(2 * Math.PI * d.y / j.clientHeight), l.copy(p); } function v(f) { if (N.length === 1) A.set(f.pageX, f.pageY); else { const j = gt(f), ne = 0.5 * (f.pageX + j.x), ue = 0.5 * (f.pageY + j.y); A.set(ne, ue); } y.subVectors(A, m).multiplyScalar(t.panSpeed), X(y.x, y.y), m.copy(A); } function V(f) { const j = gt(f), ne = f.pageX - j.x, ue = f.pageY - j.y, Le = Math.sqrt(ne * ne + ue * ue); E.set(0, Le), I.set(0, Math.pow(E.y / T.y, t.zoomSpeed)), ae(I.y), T.copy(E); const et = (f.pageX + j.x) * 0.5, ke = (f.pageY + j.y) * 0.5; se(et, ke); } function K(f) { t.enableZoom && V(f), t.enablePan && v(f); } function ce(f) { t.enableZoom && V(f), t.enableRotate && x(f); } function Z(f) { t.enabled !== !1 && (N.length === 0 && (t.domElement.setPointerCapture(f.pointerId), t.domElement.addEventListener("pointermove", $), t.domElement.addEventListener("pointerup", ee)), Xs(f), f.pointerType === "touch" ? Gs(f) : Ae(f)); } function $(f) { t.enabled !== !1 && (f.pointerType === "touch" ? zs(f) : xe(f)); } function ee(f) { Vs(f), N.length === 0 && (t.domElement.releasePointerCapture(f.pointerId), t.domElement.removeEventListener("pointermove", $), t.domElement.removeEventListener("pointerup", ee)), t.dispatchEvent(Zn), r = s.NONE; } function Ae(f) { let j; switch (f.button) { case 0: j = t.mouseButtons.LEFT; break; case 1: j = t.mouseButtons.MIDDLE; break; case 2: j = t.mouseButtons.RIGHT; break; default: j = -1; } switch (j) { case At.DOLLY: if (t.enableZoom === !1) return; re(f), r = s.DOLLY; break; case At.ROTATE: if (f.ctrlKey || f.metaKey || f.shiftKey) { if (t.enablePan === !1) return; me(f), r = s.PAN; } else { if (t.enableRotate === !1) return; ve(f), r = s.ROTATE; } break; case At.PAN: if (f.ctrlKey || f.metaKey || f.shiftKey) { if (t.enableRotate === !1) return; ve(f), r = s.ROTATE; } else { if (t.enablePan === !1) return; me(f), r = s.PAN; } break; default: r = s.NONE; } r !== s.NONE && t.dispatchEvent(un); } function xe(f) { switch (r) { case s.ROTATE: if (t.enableRotate === !1) return; b(f); break; case s.DOLLY: if (t.enableZoom === !1) return; w(f); break; case s.PAN: if (t.enablePan === !1) return; S(f); break; } } function We(f) { t.enabled === !1 || t.enableZoom === !1 || r !== s.NONE || (f.preventDefault(), t.dispatchEvent(un), _(qe(f)), t.dispatchEvent(Zn)); } function qe(f) { const j = f.deltaMode, ne = { clientX: f.clientX, clientY: f.clientY, deltaY: f.deltaY }; switch (j) { case 1: ne.deltaY *= 16; break; case 2: ne.deltaY *= 100; break; } return f.ctrlKey && !U && (ne.deltaY *= 10), ne; } function ut(f) { f.key === "Control" && (U = !0, document.addEventListener("keyup", Ee, { passive: !0, capture: !0 })); } function Ee(f) { f.key === "Control" && (U = !1, document.removeEventListener("keyup", Ee, { passive: !0, capture: !0 })); } function mt(f) { t.enabled === !1 || t.enablePan === !1 || R(f); } function Gs(f) { switch (Un(f), N.length) { case 1: switch (t.touches.ONE) { case bt.ROTATE: if (t.enableRotate === !1) return; L(f), r = s.TOUCH_ROTATE; break; case bt.PAN: if (t.enablePan === !1) return; P(f), r = s.TOUCH_PAN; break; default: r = s.NONE; } break; case 2: switch (t.touches.TWO) { case bt.DOLLY_PAN: if (t.enableZoom === !1 && t.enablePan === !1) return; M(f), r = s.TOUCH_DOLLY_PAN; break; case bt.DOLLY_ROTATE: if (t.enableZoom === !1 && t.enableRotate === !1) return; g(f), r = s.TOUCH_DOLLY_ROTATE; break; default: r = s.NONE; } break; default: r = s.NONE; } r !== s.NONE && t.dispatchEvent(un); } function zs(f) { switch (Un(f), r) { case s.TOUCH_ROTATE: if (t.enableRotate === !1) return; x(f), t.update(); break; case s.TOUCH_PAN: if (t.enablePan === !1) return; v(f), t.update(); break; case s.TOUCH_DOLLY_PAN: if (t.enableZoom === !1 && t.enablePan === !1) return; K(f), t.update(); break; case s.TOUCH_DOLLY_ROTATE: if (t.enableZoom === !1 && t.enableRotate === !1) return; ce(f), t.update(); break; default: r = s.NONE; } } function Hn(f) { t.enabled !== !1 && f.preventDefault(); } function Xs(f) { N.push(f.pointerId); } function Vs(f) { delete C[f.pointerId]; for (let j = 0; j < N.length; j++) if (N[j] == f.pointerId) { N.splice(j, 1); return; } } function Un(f) { let j = C[f.pointerId]; j === void 0 && (j = new Re(), C[f.pointerId] = j), j.set(f.pageX, f.pageY); } function gt(f) { const j = f.pointerId === N[0] ? N[1] : N[0]; return C[j]; } t.domElement.addEventListener("contextmenu", Hn), t.domElement.addEventListener("pointerdown", Z), t.domElement.addEventListener("pointercancel", ee), t.domElement.addEventListener("wheel", We, { passive: !1 }), document.addEventListener("keydown", ut, { passive: !0, capture: !0 }), this.update(); } } const ht = new lr(), Se = new B(), tt = new B(), de = new ge(), Jn = { X: new B(1, 0, 0), Y: new B(0, 1, 0), Z: new B(0, 0, 1) }, hn = { type: "change" }, $n = { type: "mouseDown" }, es = { type: "mouseUp", mode: null }, ts = { type: "objectChange" }; class Hr extends ct { constructor(e, n) { super(), n === void 0 && (console.warn('THREE.TransformControls: The second parameter "domElement" is now mandatory.'), n = document), this.isTransformControls = !0, this.visible = !1, this.domElement = n, this.domElement.style.touchAction = "none"; const t = new Yr(); this._gizmo = t, this.add(t); const s = new Kr(); this._plane = s, this.add(s); const r = this; function o(E, I) { let D = I; Object.defineProperty(r, E, { get: function() { return D !== void 0 ? D : I; }, set: function(z) { D !== z && (D = z, s[E] = z, t[E] = z, r.dispatchEvent({ type: E + "-changed", value: z }), r.dispatchEvent(hn)); } }), r[E] = I, s[E] = I, t[E] = I; } o("camera", e), o("object", void 0), o("enabled", !0), o("axis", null), o("mode", "translate"), o("translationSnap", null), o("rotationSnap", null), o("scaleSnap", null), o("space", "world"), o("size", 1), o("dragging", !1), o("showX", !0), o("showY", !0), o("showZ", !0); const i = new B(), a = new B(), c = new ge(), u = new ge(), l = new B(), p = new ge(), d = new B(), m = new B(), A = new B(), y = 0, T = new B(); o("worldPosition", i), o("worldPositionStart", a), o("worldQuaternion", c), o("worldQuaternionStart", u), o("cameraPosition", l), o("cameraQuaternion", p), o("pointStart", d), o("pointEnd", m), o("rotationAxis", A), o("rotationAngle", y), o("eye", T), this._offset = new B(), this._startNorm = new B(), this._endNorm = new B(), this._cameraScale = new B(), this._parentPosition = new B(), this._parentQuaternion = new ge(), this._parentQuaternionInv = new ge(), this._parentScale = new B(), this._worldScaleStart = new B(), this._worldQuaternionInv = new ge(), this._worldScale = new B(), this._positionStart = new B(), this._quaternionStart = new ge(), this._scaleStart = new B(), this._getPointer = Ur.bind(this), this._onPointerDown = zr.bind(this), this._onPointerHover = Gr.bind(this), this._onPointerMove = Xr.bind(this), this._onPointerUp = Vr.bind(this), this.domElement.addEventListener("pointerdown", this._onPointerDown), this.domElement.addEventListener("pointermove", this._onPointerHover), this.domElement.addEventListener("pointerup", this._onPointerUp); } // updateMatrixWorld updates key transformation variables updateMatrixWorld() { this.object !== void 0 && (this.object.updateMatrixWorld(), this.object.parent === null ? console.error("TransformControls: The attached 3D object must be a part of the scene graph.") : this.object.parent.matrixWorld.decompose(this._parentPosition, this._parentQuaternion, this._parentScale), this.object.matrixWorld.decompose(this.worldPosition, this.worldQuaternion, this._worldScale), this._parentQuaternionInv.copy(this._parentQuaternion).invert(), this._worldQuaternionInv.copy(this.worldQuaternion).invert()), this.camera.updateMatrixWorld(), this.camera.matrixWorld.decompose(this.cameraPosition, this.cameraQuaternion, this._cameraScale), this.camera.isOrthographicCamera ? this.camera.getWorldDirection(this.eye).negate() : this.eye.copy(this.cameraPosition).sub(this.worldPosition).normalize(), super.updateMatrixWorld(this); } pointerHover(e) { if (this.object === void 0 || this.dragging === !0) return; ht.setFromCamera(e, this.camera); const n = pn(this._gizmo.picker[this.mode], ht); n ? this.axis = n.object.name : this.axis = null; } pointerDown(e) { if (!(this.object === void 0 || this.dragging === !0 || e.button !== 0) && this.axis !== null) { ht.setFromCamera(e, this.camera); const n = pn(this._plane, ht, !0); n && (this.object.updateMatrixWorld(), this.object.parent.updateMatrixWorld(), this._positionStart.copy(this.object.position), this._quaternionStart.copy(this.object.quaternion), this._scaleStart.copy(this.object.scale), this.object.matrixWorld.decompose(this.worldPositionStart, this.worldQuaternionStart, this._worldScaleStart), this.pointStart.copy(n.point).sub(this.worldPositionStart)), this.dragging = !0, $n.mode = this.mode, this.dispatchEvent($n); } } pointerMove(e) { const n = this.axis, t = this.mode, s = this.object; let r = this.space; if (t === "scale" ? r = "local" : (n === "E" || n === "XYZE" || n === "XYZ") && (r = "world"), s === void 0 || n === null || this.dragging === !1 || e.button !== -1) return; ht.setFromCamera(e, this.camera); const o = pn(this._plane, ht, !0); if (o) { if (this.pointEnd.copy(o.point).sub(this.worldPositionStart), t === "translate") this._offset.copy(this.pointEnd).sub(this.pointStart), r === "local" && n !== "XYZ" && this._offset.applyQuaternion(this._worldQuaternionInv), n.indexOf("X") === -1 && (this._offset.x = 0), n.indexOf("Y") === -1 && (this._offset.y = 0), n.indexOf("Z") === -1 && (this._offset.z = 0), r === "local" && n !== "XYZ" ? this._offset.applyQuaternion(this._quaternionStart).divide(this._parentScale) : this._offset.applyQuaternion(this._parentQuaternionInv).divide(this._parentScale), s.position.copy(this._offset).add(this._positionStart), this.translationSnap && (r === "local" && (s.position.applyQuaternion(de.copy(this._quaternionStart).invert()), n.search("X") !== -1 && (s.position.x = Math.round(s.position.x / this.translationSnap) * this.translationSnap), n.search("Y") !== -1 && (s.position.y = Math.round(s.position.y / this.translationSnap) * this.translationSnap), n.search("Z") !== -1 && (s.position.z = Math.round(s.position.z / this.translationSnap) * this.translationSnap), s.position.applyQuaternion(this._quaternionStart)), r === "world" && (s.parent && s.position.add(Se.setFromMatrixPosition(s.parent.matrixWorld)), n.search("X") !== -1 && (s.position.x = Math.round(s.position.x / this.translationSnap) * this.translationSnap), n.search("Y") !== -1 && (s.position.y = Math.round(s.position.y / this.translationSnap) * this.translationSnap), n.search("Z") !== -1 && (s.position.z = Math.round(s.position.z / this.translationSnap) * this.translationSnap), s.parent && s.position.sub(Se.setFromMatrixPosition(s.parent.matrixWorld)))); else if (t === "scale") { if (n.search("XYZ") !== -1) { let i = this.pointEnd.length() / this.pointStart.length(); this.pointEnd.dot(this.pointStart) < 0 && (i *= -1), tt.set(i, i, i); } else Se.copy(this.pointStart), tt.copy(this.pointEnd), Se.applyQuaternion(this._worldQuaternionInv), tt.applyQuaternion(this._worldQuaternionInv), tt.divide(Se), n.search("X") === -1 && (tt.x = 1), n.search("Y") === -1 && (tt.y = 1), n.search("Z") === -1 && (tt.z = 1); s.scale.copy(this._scaleStart).multiply(tt), this.scaleSnap && (n.search("X") !== -1 && (s.scale.x = Math.round(s.scale.x / this.scaleSnap) * this.scaleSnap || this.scaleSnap), n.search("Y") !== -1 && (s.scale.y = Math.round(s.scale.y / this.scaleSnap) * this.scaleSnap || this.scaleSnap), n.search("Z") !== -1 && (s.scale.z = Math.round(s.scale.z / this.scaleSnap) * this.scaleSnap || this.scaleSnap)); } else if (t === "rotate") { this._offset.copy(this.pointEnd).sub(this.pointStart); const i = 20 / this.worldPosition.distanceTo(Se.setFromMatrixPosition(this.camera.matrixWorld)); let a = !1; n === "XYZE" ? (this.rotationAxis.copy(this._offset).cross(this.eye).normalize(), this.rotationAngle = this._offset.dot(Se.copy(this.rotationAxis).cross(this.eye)) * i) : (n === "X" || n === "Y" || n === "Z") && (this.rotationAxis.copy(Jn[n]), Se.copy(Jn[n]), r === "local" && Se.applyQuaternion(this.worldQuaternion), Se.cross(this.eye), Se.length() === 0 ? a = !0 : this.rotationAngle = this._offset.dot(Se.normalize()) * i), (n === "E" || a) && (this.rotationAxis.copy(this.eye), this.rotationAngle = this.pointEnd.angleTo(this.pointStart), this._startNorm.copy(this.pointStart).normalize(), this._endNorm.copy(this.pointEnd).normalize(), this.rotationAngle *= this._endNorm.cross(this._startNorm).dot(this.eye) < 0 ? 1 : -1), this.rotationSnap && (this.rotationAngle = Math.round(this.rotationAngle / this.rotationSnap) * this.rotationSnap), r === "local" && n !== "E" && n !== "XYZE" ? (s.quaternion.copy(this._quaternionStart), s.quaternion.multiply(de.setFromAxisAngle(this.rotationAxis, this.rotationAngle)).normalize()) : (this.rotationAxis.applyQuaternion(this._parentQuaternionInv), s.quaternion.copy(de.setFromAxisAngle(this.rotationAxis, this.rotationAngle)), s.quaternion.multiply(this._quaternionStart).normalize()); } this.dispatchEvent(hn), this.dispatchEvent(ts); } } pointerUp(e) { e.button === 0 && (this.dragging && this.axis !== null && (es.mode = this.mode, this.dispatchEvent(es)), this.dragging = !1, this.axis = null); } dispose() { this.domElement.removeEventListener("pointerdown", this._onPointerDown), this.domElement.removeEventListener("pointermove", this._onPointerHover), this.domElement.removeEventListener("pointermove", this._onPointerMove), this.domElement.removeEventListener("pointerup", this._onPointerUp), this.traverse(function(e) { e.geometry && e.geometry.dispose(), e.material && e.material.dispose(); }); } // Set current object attach(e) { return this.object = e, this.visible = !0, this; } // Detach from object detach() { return this.object = void 0, this.visible = !1, this.axis = null, this; } reset() { this.enabled && this.dragging && (this.object.position.copy(this._positionStart), this.object.quaternion.copy(this._quaternionStart), this.object.scale.copy(this._scaleStart), this.dispatchEvent(hn), this.dispatchEvent(ts), this.pointStart.copy(this.pointEnd)); } getRaycaster() { return ht; } // TODO: deprecate getMode() { return this.mode; } setMode(e) { this.mode = e; } setTranslationSnap(e) { this.translationSnap = e; } setRotationSnap(e) { this.rotationSnap = e; } setScaleSnap(e) { this.scaleSnap = e; } setSize(e) { this.size = e; } setSpace(e) { this.space = e; } } function Ur(h) { if (this.domElement.ownerDocument.pointerLockElement) return { x: 0, y: 0, button: h.button }; { const e = this.domElement.getBoundingClientRect(); return { x: (h.clientX - e.left) / e.width * 2 - 1, y: -(h.clientY - e.top) / e.height * 2 + 1, button: h.button }; } } function Gr(h) { if (this.enabled) switch (h.pointerType) { case "mouse": case "pen": this.pointerHover(this._getPointer(h)); break; } } function zr(h) { this.enabled && (document.pointerLockElement || this.domElement.setPointerCapture(h.pointerId), this.domElement.addEventListener("pointermove", this._onPointerMove), this.pointerHover(this._getPointer(h)), this.pointerDown(this._getPointer(h))); } function Xr(h) { this.enabled && this.pointerMove(this._getPointer(h)); } function Vr(h) { this.enabled && (this.domElement.releasePointerCapture(h.pointerId), this.domElement.removeEventListener("pointermove", this._onPointerMove), this.pointerUp(this._getPointer(h))); } function pn(h, e, n) { const t = e.intersectObject(h, !0); for (let s = 0; s < t.length; s++) if (t[s].object.visible || n) return t[s]; return !1; } const Wt = new Be(), le = new B(0, 1, 0), ns = new B(0, 0, 0), ss = new oe(), qt = new ge(), en = new ge(), Ge = new B(), rs = new oe(), Dt = new B(1, 0, 0), dt = new B(0, 1, 0), kt = new B(0, 0, 1), Zt = new B(), It = new B(), _t = new B(); class Yr extends ct { constructor() { super(), this.isTransformControlsGizmo = !0, this.type = "TransformControlsGizmo"; const e = new ot({ depthTest: !1, depthWrite: !1, fog: !1, toneMapped: !1, transparent: !0 }), n = new Et({ depthTest: !1, depthWrite: !1, fog: !1, toneMapped: !1, transparent: !0 }), t = e.clone(); t.opacity = 0.15; const s = n.clone(); s.opacity = 0.5; const r = e.clone(); r.color.setHex(16711680); const o = e.clone(); o.color.setHex(65280); const i = e.clone(); i.color.setHex(255); const a = e.clone(); a.color.setHex(16711680), a.opacity = 0.5; const c = e.clone(); c.color.setHex(65280), c.opacity = 0.5; const u = e.clone(); u.color.setHex(255), u.opacity = 0.5; const l = e.clone(); l.opacity = 0.25; const p = e.clone(); p.color.setHex(16776960), p.opacity = 0.25, e.clone().color.setHex(16776960); const m = e.clone(); m.color.setHex(7895160); const A = new _e(0, 0.04, 0.1, 12); A.translate(0, 0.05, 0); const y = new Me(0.08, 0.08, 0.08); y.translate(0, 0.04, 0); const T = new Pe(); T.setAttribute("position", new we([0, 0, 0, 1, 0, 0], 3)); const E = new _e(75e-4, 75e-4, 0.5, 3); E.translate(0, 0.25, 0); function I(Y, X) { const ae = new Lt(Y, 75e-4, 3, 64, X * Math.PI * 2); return ae.rotateY(Math.PI / 2), ae.rotateX(Math.PI / 2), ae; } function D() { const Y = new Pe(); return Y.setAttribute("position", new we([0, 0, 0, 1, 1, 1], 3)), Y; } const z = { X: [ [new k(A, r), [0.5, 0, 0], [0, 0, -Math.PI / 2]], [new k(A, r), [-0.5, 0, 0], [0, 0, Math.PI / 2]], [new k(E, r), [0, 0, 0], [0, 0, -Math.PI / 2]] ], Y: [ [new k(A, o), [0, 0.5, 0]], [new k(A, o), [0, -0.5, 0], [Math.PI, 0, 0]], [new k(E, o)] ], Z: [ [new k(A, i), [0, 0, 0.5], [Math.PI / 2, 0, 0]], [new k(A, i), [0, 0, -0.5], [-Math.PI / 2, 0, 0]], [new k(E, i), null, [Math.PI / 2, 0, 0]] ], XYZ: [ [new k(new Xt(0.1, 0), l.clone()), [0, 0, 0]] ], XY: [ [new k(new Me(0.15, 0.15, 0.01), u.clone()), [0.15, 0.15, 0]] ], YZ: [ [new k(new Me(0.15, 0.15, 0.01), a.clone()), [0, 0.15, 0.15], [0, Math.PI / 2, 0]] ], XZ: [ [new k(new Me(0.15, 0.15, 0.01), c.clone()), [0.15, 0, 0.15], [-Math.PI / 2, 0, 0]] ] }, O = { X: [ [new k(new _e(0.2, 0, 0.6, 4), t), [0.3, 0, 0], [0, 0, -Math.PI / 2]], [new k(new _e(0.2, 0, 0.6, 4), t), [-0.3, 0, 0], [0, 0, Math.PI / 2]] ], Y: [ [new k(new _e(0.2, 0, 0.6, 4), t), [0, 0.3, 0]], [new k(new _e(0.2, 0, 0.6, 4), t), [0, -0.3, 0], [0, 0, Math.PI]] ], Z: [ [new k(new _e(0.2, 0, 0.6, 4), t), [0, 0, 0.3], [Math.PI / 2, 0, 0]], [new k(new _e(0.2, 0, 0.6, 4), t), [0, 0, -0.3], [-Math.PI / 2, 0, 0]] ], XYZ: [ [new k(new Xt(0.2, 0), t)] ], XY: [ [new k(new Me(0.2, 0.2, 0.01), t), [0.15, 0.15, 0]] ], YZ: [ [new k(new Me(0.2, 0.2, 0.01), t), [0, 0.15, 0.15], [0, Math.PI / 2, 0]] ], XZ: [ [new k(new Me(0.2, 0.2, 0.01), t), [0.15, 0, 0.15], [-Math.PI / 2, 0, 0]] ] }, N = { START: [ [new k(new Xt(0.01, 2), s), null, null, null, "helper"] ], END: [ [new k(new Xt(0.01, 2), s), null, null, null, "helper"] ], DELTA: [ [new ze(D(), s), null, null, null, "helper"] ], X: [ [new ze(T, s.clone()), [-1e3, 0, 0], null, [1e6, 1, 1], "helper"] ], Y: [ [new ze(T, s.clone()), [0, -1e3, 0], [0, 0, Math.PI / 2], [1e6, 1, 1], "helper"] ], Z: [ [new ze(T, s.clone()), [0, 0, -1e3], [0, -Math.PI / 2, 0], [1e6, 1, 1], "helper"] ] }, C = { XYZE: [ [new k(I(0.5, 1), m), null, [0, Math.PI / 2, 0]] ], X: [ [new k(I(0.5, 0.5), r)] ], Y: [ [new k(I(0.5, 0.5), o), null, [0, 0, -Math.PI / 2]] ], Z: [ [new k(I(0.5, 0.5), i), null, [0, Math.PI / 2, 0]] ], E: [ [new k(I(0.75, 1), p), null, [0, Math.PI / 2, 0]] ] }, U = { AXIS: [ [new ze(T, s.clone()), [-1e3, 0, 0], null, [1e6, 1, 1], "helper"] ] }, G = { XYZE: [ [new k(new ur(0.25, 10, 8), t)] ], X: [ [new k(new Lt(0.5, 0.1, 4, 24), t), [0, 0, 0], [0, -Math.PI / 2, -Math.PI / 2]] ], Y: [ [new k(new Lt(0.5, 0.1, 4, 24), t), [0, 0, 0], [Math.PI / 2, 0, 0]] ], Z: [ [new k(new Lt(0.5, 0.1, 4, 24), t), [0, 0, 0], [0, 0, -Math.PI / 2]] ], E: