@yhsoft/model-viewer
Version:
基于 ThreeJS 开发的三维模型查看器,支持多种 3D 格式的模型浏览,支持对模型的旋转、平移、缩放等操作
783 lines • 278 kB
JavaScript
(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,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";
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: