UNPKG

@realsee/dnalogel

Version:
924 lines (923 loc) 42 kB
var w = Object.defineProperty, F = Object.defineProperties; var _ = Object.getOwnPropertyDescriptors; var S = Object.getOwnPropertySymbols; var L = Object.prototype.hasOwnProperty, B = Object.prototype.propertyIsEnumerable; var b = (l, p, e) => p in l ? w(l, p, { enumerable: !0, configurable: !0, writable: !0, value: e }) : l[p] = e, g = (l, p) => { for (var e in p || (p = {})) L.call(p, e) && b(l, e, p[e]); if (S) for (var e of S(p)) B.call(p, e) && b(l, e, p[e]); return l; }, C = (l, p) => F(l, _(p)); var m = (l, p, e) => (b(l, typeof p != "symbol" ? p + "" : p, e), e); var d = (l, p, e) => new Promise((t, i) => { var o = (s) => { try { a(e.next(s)); } catch (r) { i(r); } }, n = (s) => { try { a(e.throw(s)); } catch (r) { i(r); } }, a = (s) => s.done ? t(s.value) : Promise.resolve(s.value).then(o, n); a((e = e.apply(l, p)).next()); }); import * as P from "three"; import { objectAssignDeepExports as v } from "../../vendor/object-assign-deep/objectAssignDeep.js"; import { arrayPositionToVector3 as k } from "../../shared-utils/positionToVector3.js"; import { isModelTag as R, isMediaModelTag as G } from "../utils/tag/tagCheck.js"; import { debounce as D } from "../utils/debounce.js"; import { throttle as O } from "../utils/throttle.js"; import x, { getTagStickType as N } from "../utils/tag/format.js"; import { generateBlankAudio as V, AudioNamespace as z } from "../../shared-utils/audio.js"; import { resizeObserver as M } from "../../shared-utils/dom/resizeObserver.js"; import { TagRender as $ } from "./TagRender.js"; import "../../shared-utils/tag.js"; import { isModelLike as A } from "../../shared-utils/five/mode.js"; import "../../vendor/hammerjs/hammer.js"; import "../../shared-utils/three/PointSelector/index.js"; import "../../shared-utils/three/CSS3DRenderer/index.js"; import { waitFiveModelLoaded as j } from "../../shared-utils/five/fiveModelLoad.js"; import "../../CSS3DRenderPlugin/utils/generateBehindFiveElement.js"; import "@realsee/five/line"; import "../../shared-utils/three/core/Five_LineMaterial2.js"; import "../../shared-utils/three/core/Sphere.js"; import "../../shared-utils/three/blink.js"; import { getFiveModel as Q } from "../../shared-utils/five/getFiveModel.js"; import "../../vendor/@tweenjs/tween/dist/tween.esm.js.js"; import "../../CSS3DRenderPlugin/utils/three/CSS3DRender.js"; import "../../vendor/earcut/src/earcut.js"; import { nextFrame as H } from "../../shared-utils/animationFrame/index.js"; import "../../shared-utils/five/FivePuppet.js"; import { DebugUtil as W } from "../utils/DebugUtil.js"; import { safeObj as E } from "../../shared-utils/safeObj.js"; import { PointTag as q } from "./Tag/PointTag.js"; import { ModelTag as J } from "./Tag/ModelTag.js"; import { PlaneTag as Z } from "./Tag/PlaneTag.js"; import { BoxTag as Y } from "./Tag/BoxTag.js"; import { PolygonTag as K } from "./Tag/PolygonTag.js"; import { MaskTag as c } from "./Tag/MaskTag.js"; import X from "../Components/TagContainer.js"; import { fiveEveryReadyListener as ee } from "../../shared-utils/five/fiveEveryReadyListener.js"; import { vector3ToArray as U } from "../../shared-utils/three/vector3ToArray.js"; import { tweenProgress as te } from "../../shared-utils/animationFrame/BetterTween.js"; import "../../shared-utils/url/defaultUrls.js"; import "./TagUtil.js"; import "../typings/tag/TagConfig.js"; import "../tag.config.js"; import "../utils/normalPositionToPositions.js"; import "../../vendor/svelte/store/index.js"; import "../../vendor/svelte/internal/index.js"; import "../../shared-utils/device.js"; import "@realsee/five"; import "../utils/model/mediaPlane.js"; import "../../shared-utils/three/centerPoint.js"; import "../../shared-utils/three/loadTexture.js"; import "../../shared-utils/three/Quadrangle.js"; import "../../shared-utils/math/pointsIsRectangle.js"; import "../../shared-utils/three/loadVideoTexture.js"; import "../Assets/Icon.js"; import "../../shared-utils/three/getPositionsByObjectFit.js"; import "../../shared-utils/three/FragmentTransparencyMaterial.js"; import "../../shared-utils/three/getNormal.js"; import "../../shared-utils/constants.js"; import "../../shared-utils/five/FiveDomEvents.js"; import "../../shared-utils/three/getObjectVisible.js"; import "../../shared-utils/five/calculateThreeMouse.js"; import "../../shared-utils/three/core/Raycaster.js"; import "../utils/Cache.js"; import "../../base/BasePlugin.js"; import "../../shared-utils/Subscribe.js"; import "../../shared-utils/Utils/FiveUtil.js"; import "../../shared-utils/Utils/BaseUtil.js"; import "../../shared-utils/Utils/WorkUtil.js"; import "../../shared-utils/five/transformPosition.js"; import "../../shared-utils/typescript/entries.js"; import "../utils/tag/adaptConfig.js"; import "../../shared-utils/five/vector3ToScreen.js"; import "../../shared-utils/three/temp.js"; import "../../shared-utils/throttle.js"; import "../../shared-utils/three/PointSelector/utils/PointSelectorHelper.js"; import "../../shared-utils/three/Magnifier.js"; import "../../shared-utils/three/PointSelector/utils/PointHelper.js"; import "../../shared-utils/three/Assets/index.js"; import "../../CSS3DRenderPlugin/utils/three/CSS3DObject.js"; import "../../shared-utils/even.js"; import "../../shared-utils/CSS3DRender/OpacityMesh.js"; import "../../shared-utils/isNil.js"; import "../../shared-utils/three/PointSelector/utils/html.js"; import "../../shared-utils/CSS3DRender/index.js"; import "../../shared-utils/CSS3DRender/CSS3DRenderer.js"; import "../../shared-utils/createResizeObserver.js"; import "../../shared-utils/three/PointSelector/utils/PointHelper2.js"; import "../../Sculpt/Meshes/Line.js"; import "../../Sculpt/typings/style.js"; import "../../shared-utils/three/IObject3D.js"; import "../../Sculpt/utils/Meshes/getLengthHTML.js"; import "../../shared-utils/three/applyObjectMatrixWorld.js"; import "../../shared-utils/util.js"; import "../../shared-utils/five/getFiveFromParentChain.js"; import "../../shared-utils/three/core/LineGeometry.js"; import "../../shared-utils/three/core/LineMaterial.js"; import "../../shared-utils/three/core/Line2.js"; import "../../shared-utils/three/core/LineMaterial2.js"; import "../../Sculpt/utils/unit.js"; import "../../Sculpt/utils/renderDom.js"; import "../../CSS3DRenderPlugin/utils/three/CSS3DSprite.js"; import "../../shared-utils/isTouchDevice.js"; import "../../shared-utils/five/getPosition.js"; import "../../shared-utils/five/getRaycasterByNdcPosition.js"; import "../../shared-utils/three/PointSelector/utils/contents.js"; import "../../Sculpt/utils/three/rayOnLine.js"; import "../../vendor/animejs/lib/anime.es.js"; import "../../CSS3DRenderPlugin/utils/three/CSS3DScene.js"; import "../../CSS3DRenderPlugin/utils/getAllCSS3DObject.js"; import "../../CSS3DRenderPlugin/utils/three/CSS3DGroup.js"; import "../utils/addDebugPoints.js"; import "./Tag/BaseTag.js"; import "../utils/tag/calculateTagConfig.js"; import "../../shared-utils/vectorToCoordinate.js"; import "../../shared-utils/formatRad.js"; import "../../shared-utils/five/lookPoint.js"; import "../../shared-utils/uuid.js"; import "../utils/tagPosition.js"; import "../utils/checkRange.js"; import "../../shared-utils/url/getUrl.js"; import "../../shared-utils/five/getFloorIndex.js"; import "../../shared-utils/promise/withResolvers.js"; import "../../shared-utils/CSS3DRender/CSS3DObject.js"; import "../../shared-utils/three/GLTFLoader.js"; import "@realsee/five/gltf-loader"; import "../utils/planeNormal.js"; import "../Components/Tag/index.js"; import "../Components/Tag/TextTag/index.js"; import "../Components/Tag/TextTag/TextTag.js"; import "../Components/Common/Line/Straight.js"; import "../../vendor/svelte/transition/index.js"; import "../../vendor/svelte/easing/index.js"; import "../Components/Common/Shadow.js"; import "../Components/Common/Text/FlyMText.js"; import "../Components/Common/Text/FlyText.js"; import "../utils/search.js"; import "../utils/constants.js"; import "../Components/Common/Arrow.js"; import "../utils/doUtil.js"; import "../../shared-utils/svelte/resizeObserver.js"; import "../../vendor/resize-observer-polyfill/dist/ResizeObserver.es.js"; import "../Components/Tag/TextTag/TextPlaneTag.js"; import "../Components/Common/Text/MText.js"; import "../utils/px2rem.js"; import "../Components/Tag/ImageTextTag.js"; import "../Components/Common/Line/Polyline.js"; import "../Components/Common/Media.js"; import "../../vendor/svelte-carousel/src/components/Carousel/Carousel.js"; import "../../vendor/svelte-carousel/src/components/Dots/Dots.js"; import "../../vendor/svelte-carousel/src/components/Dot/Dot.js"; import "../../vendor/svelte-carousel/src/components/Arrow/Arrow.js"; import "../../vendor/svelte-carousel/src/direction.js"; import "../../vendor/svelte-carousel/src/components/Progress/Progress.js"; import "../../vendor/svelte-carousel/src/actions/swipeable/swipeable.js"; import "../../vendor/svelte-carousel/src/actions/swipeable/event.js"; import "../../vendor/svelte-carousel/src/utils/event.js"; import "../../vendor/svelte-carousel/src/units.js"; import "../../vendor/svelte-carousel/src/actions/hoverable/hoverable.js"; import "../../vendor/svelte-carousel/src/actions/hoverable/event.js"; import "../../vendor/svelte-carousel/src/actions/tappable/tappable.js"; import "../../vendor/svelte-carousel/src/utils/math.js"; import "../../vendor/svelte-carousel/src/actions/tappable/event.js"; import "../../vendor/svelte-carousel/src/utils/page.js"; import "../../vendor/svelte-carousel/src/utils/clones.js"; import "../../vendor/svelte-carousel/src/utils/object.js"; import "../../vendor/svelte-carousel/src/components/Carousel/createCarousel.js"; import "../../vendor/easy-reactive/src/simply-reactive.js"; import "../../vendor/lodash.get/index.js"; import "../../_commonjsHelpers.js"; import "../../vendor/lodash.clonedeep/index.js"; import "../../vendor/easy-reactive/src/utils/subscription.js"; import "../../vendor/easy-reactive/src/utils/object.js"; import "../../vendor/lodash.isequal/index.js"; import "../../vendor/easy-reactive/src/utils/watcher.js"; import "../../vendor/svelte-carousel/src/utils/lazy.js"; import "../../vendor/svelte-carousel/src/utils/ProgressManager.js"; import "../../vendor/svelte-carousel/src/utils/interval.js"; import "../Components/Common/MediaItem.js"; import "../Components/Tag/MarketingTag.js"; import "../Components/Tag/Assets/marketingIcon.js"; import "../utils/noTypecheck.js"; import "../Components/Tag/AudioTag/index.js"; import "../Components/Tag/AudioTag/AudioTag.js"; import "../Components/Common/Audio.js"; import "../utils/audio/SharedAudio.js"; import "../utils/audio/AudioDiagnostics.js"; import "../Components/Common/Icon/audioIcon.js"; import "../Components/Tag/AudioTag/AudioPlaneTag.js"; import "../Components/Tag/MediaPlane.js"; import "../Components/Tag/LinkTag.js"; import "../Components/Common/Icon/Icon.js"; import "../utils/getImageInfo.js"; import "../Components/Common/Icon/animationUtils.js"; import "../Components/Tag/PanoramaTag.js"; import "../Components/Common/Icon/PanoramaIcon.js"; import "../Components/Tag/CustomTag.js"; import "../../vendor/classnames/index.js"; import "../../Sculpt/index.js"; import "../../Sculpt/utils/Modules/Global.js"; import "../../Sculpt/utils/Modules/Cursor.js"; import "../../Sculpt/utils/Modules/DeleteButtonBgBorder.js"; import "../../Sculpt/utils/Modules/DeleteIconSVG.js"; import "../../Object3DHelperPlugin/Controller.js"; import "../../shared-utils/Object3DHelper/Helper/MoveHelper.js"; import "../../shared-utils/Object3DHelper/Base/BaseHelper.js"; import "../../shared-utils/Object3DHelper/utils/setObjectQuaternion.js"; import "../../shared-utils/three/boundingBox.js"; import "../../shared-utils/Object3DHelper/Helper/Objects/ArrowGroup.js"; import "../../shared-utils/Object3DHelper/utils/direction.js"; import "../../shared-utils/Object3DHelper/Constants/RenderOrder.js"; import "../../shared-utils/Object3DHelper/Helper/Objects/CenterHandle.js"; import "../../shared-utils/Object3DHelper/Constants/color.js"; import "../../shared-utils/Object3DHelper/utils/calculateScaleByCamera.js"; import "../../shared-utils/Object3DHelper/utils/getPoseFromCamera.js"; import "../../shared-utils/clamp.js"; import "../../shared-utils/Object3DHelper/utils/getOrthographicCameraDirection.js"; import "../../shared-utils/Object3DHelper/Helper/RotateHelper.js"; import "../../shared-utils/Object3DHelper/Helper/HTML/tipsDom.js"; import "../../shared-utils/Object3DHelper/Helper/HTML/utils/createElement.js"; import "../../shared-utils/Object3DHelper/Helper/CSS3DScaleHelper.js"; import "../../shared-utils/Object3DHelper/Helper/HTML/rectangleScaleDom.js"; import "../../shared-utils/Object3DHelper/utils/cameraHooks.js"; import "../../shared-utils/Object3DHelper/Helper/BoundingBoxHelper.js"; import "../../shared-utils/Object3DHelper/Controller/MoveController.js"; import "../../shared-utils/Object3DHelper/Base/BaseController.js"; import "../../shared-utils/Object3DHelper/utils/solidGuide.js"; import "../../shared-utils/Object3DHelper/utils/getMouseRaycaster.js"; import "../../shared-utils/Object3DHelper/utils/calculateThreeMouse.js"; import "../../Object3DHelperPlugin/FiveControllerWrapper.js"; import "../../shared-utils/Object3DHelper/index.js"; import "../../shared-utils/Object3DHelper/Controller/RotateController.js"; import "../../shared-utils/math/rad2Deg.js"; import "../../shared-utils/math/deg2Rad.js"; import "../../shared-utils/Object3DHelper/Controller/CSS3DScaleController.js"; import "../../shared-utils/Object3DHelper/Controller/RectangleScaleController.js"; import "../../shared-utils/three/vectorIsEqual.js"; import "../../shared-utils/Object3DHelper/Controller/BoundingBoxController.js"; import "../../shared-utils/Object3DHelper/Helper/ScaleHelper.js"; import "../../shared-utils/Object3DHelper/Controller/ScaleController.js"; import "../../shared-utils/threex/domevents/index.js"; import "../../shared-utils/three/recurveFindObject.js"; import "../../Sculpt/Objects/Polyline/index.js"; import "../../Sculpt/Meshes/Polyline.js"; import "../../Sculpt/Meshes/LineWithDots.js"; import "../../Sculpt/Meshes/Point.js"; import "../../shared-utils/three/closeVectors.js"; import "../../Sculpt/Objects/Base/index.js"; import "../../vendor/hotkeys-js/dist/hotkeys.esm.js"; import "../../Sculpt/Objects/Polyline/Editor.js"; import "../../Sculpt/Objects/Line/Editor.js"; import "../../Sculpt/Objects/Base/Editor.js"; import "../../Sculpt/Objects/Point/index.js"; import "../../Sculpt/Objects/Point/Editor.js"; import "../../Sculpt/Objects/Polygon/index.js"; import "../../Sculpt/Meshes/Area.js"; import "../../Sculpt/Meshes/PolygonWithEdge.js"; import "../../Sculpt/Meshes/Polygon.js"; import "../../shared-utils/three/generatePolygonGeometry.js"; import "../../shared-utils/three/earcut3D.js"; import "../../PanoMeasurePlugin/utils/isIntersecting.js"; import "../../Sculpt/utils/three/ColoredMesh.js"; import "../../shared-utils/three/geometryUtil.js"; import "../../Sculpt/Objects/Polygon/Editor.js"; import "../../Sculpt/Objects/Prism/index.js"; import "../../Sculpt/Meshes/Prism.js"; import "../../shared-utils/three/core/PrismGeometry.js"; import "../../shared-utils/three/core/polygonVertex.js"; import "../../shared-utils/three/core/PrismAnimationGeometry.js"; import "../../Sculpt/Editors/PrismMeshEditor.js"; import "../../Sculpt/Objects/Rectangle/index.js"; import "../../Sculpt/Editors/RectangleMeshEditor.js"; import "../../Sculpt/Meshes/Rectangle.js"; import "../../Sculpt/utils/three/RectangleGeometry.js"; import "../../Sculpt/Meshes/RectangleWithEdge.js"; import "../../Sculpt/utils/sortPositionsByCameraPosition.js"; import "../../Sculpt/Objects/Circle/index.js"; import "../../Sculpt/Editors/CircleMeshEditor.js"; import "../../Sculpt/Meshes/CircleWithEdge.js"; import "../../Sculpt/Meshes/Circle.js"; import "../../Sculpt/utils/radiusToSegments.js"; import "../../Sculpt/Objects/Cylinder/index.js"; import "../../Sculpt/Meshes/Cylinder.js"; import "../../Sculpt/Editors/CylinderMeshEditor.js"; import "../../Sculpt/Objects/Box/index.js"; import "../../Sculpt/Editors/BoxMeshEditor.js"; import "../../Sculpt/Meshes/Box.js"; import "../../shared-utils/forReverseEach.js"; import "../../Sculpt/Objects/Line/index.js"; import "../../shared-utils/five/getFloorMesh.js"; import "../utils/sculptDataToBoxPosition.js"; import "./Tag/MaskTag.shaders.js"; import "../Components/TagItem.js"; import "../Components/Common/TagPoint.js"; import "../Components/Tag/AudioTag/AudioPoint.js"; import "../Components/Common/TagPopover/index.js"; import "../Components/Common/TagPopover/PopoverContent.js"; import "../Components/Common/TagPopover/TagPopoverArrow.js"; import "../Components/Common/Icon/tag-popover-arrow-base64.js"; import "../Components/Common/TagPopover/TagPopup.js"; import "../Components/Common/VideoIcon.js"; import "../Components/Common/TagPopover/PanoramaIcon.js"; import "../utils/videoHelper.js"; import "../Components/Common/AudioPlayer.js"; import "../Components/Common/TagPopover/TagPopoverToolBar.js"; import "../Components/Common/TagPopover/ArrowRightIcon.js"; import "../Components/Common/TagPopover/ShareIcon.js"; import "../utils/popoverContainer.js"; const I = "Dnalogel-PanoTagPlugin", Vs = (l) => `${I}--${l}`; class zs extends $ { constructor(e, t) { super(e); /** state */ m(this, "state", { enabled: !0, visible: !0 }); /** debug */ m(this, "debug"); m(this, "debugUtil", new W(this)); /** 全局 hover 启用状态,默认 true */ m(this, "globalHoverEnabled", !0); /** 更改 tag 模型 */ m(this, "changeTagModel", (e, t) => d(this, null, function* () { var i; e.data = v({}, e.data, t), yield (i = e.loadModel) == null ? void 0 : i.call(e); })); m(this, "handleFiveModeChange", (e) => { const t = () => { this.filter2DPointTag.forEach((i) => { i.state.visible = !1, i.applyVisible(); }), this.five.ready().then(() => { this.tagsDo(this.tags, (i) => { i.updateVisible(), G(i) && e !== "Panorama" && this.changeTagMode(i, "behind"); }), e === "Panorama" ? this.updateMaskTagsForCurrentPano() : this.filterMaskTag.forEach((i) => { i.state.visible = !1, i.applyVisible(); }); }); }; this.tags.length < 500 ? t() : this.five.ready().then(() => t()); }); m(this, "handleFiveWantsMoveToPano", () => { if (this.tags.length > 500) { this.temporaryState.visible = !1, this.addRenderQueue({ type: "TagContainerSvelte", keys: ["temporaryState"] }); return; } else this.temporaryState.visible = !0, this.tags.forEach((e) => { e.temporaryState.visible = !0; }), this.addRenderQueue({ type: "TagContainerSvelte", keys: ["tags"] }), this.tags.forEach((e) => e.applyVisible()); }); m(this, "clickhandler", (e) => { e.tag.onClick(e); }); m(this, "handleFiveCameraUpdate", () => { this.filterPointTag.forEach((e) => e.updateScreenPosition()); }); m(this, "handleFiveCameraFovUpdate", () => { this.handleFiveCameraUpdate(), this.five.off("render.prepare", this.handleFiveCameraUpdate), this.five.on("render.prepare", this.handleFiveCameraUpdate), setTimeout(() => { this.five.off("render.prepare", this.handleFiveCameraUpdate); }, 1e3); }); m(this, "handleFivePanoArrived", () => d(this, null, function* () { this.filter2DPointTag.forEach((e) => { e.state.visible = !1, e.applyVisible(); }), this.tagsDo(this.tags, (e) => { e.updateVisible(); }), this.updateMaskTagsForCurrentPano(), this.temporaryState.visible = !0, this.addRenderQueue({ type: "TagContainerSvelte", keys: ["temporaryState"] }), yield this.setUnfolded(), this.tags.filter(R).filter((e) => { var t; return (t = e.getConfig().modelConfig) == null ? void 0 : t.autoLookAtEnabled; }).forEach((e) => { var r; const t = new P.Mesh(new P.BoxGeometry(), new P.MeshBasicMaterial()), i = (r = e.model) == null ? void 0 : r.object; if (!i) return; t.position.copy(i.position), t.quaternion.copy(i.quaternion); const o = this.five.camera.position; t.lookAt(o.clone().setY(t.position.y)); const n = i.quaternion.clone(), a = t.quaternion.clone(), s = te(); s.onUpdate(({ progress: h }) => { i.quaternion.copy(n.clone().slerp(a, h)); }), s.play(); }); })); /** 楼层切换时,需要更新标签可见性 */ m(this, "handleFiveModelShownFloorChange", () => { this.tagsDo(this.tags, (e) => e.updateVisible()); }); m(this, "onFiveRefined", D(() => { A(this.five.getCurrentState().mode) ? this.setUnfoldedByCamera() : this.tags.forEach((e) => e.cache.clear()), this.tagsDo(this.tags, (e) => e.updateVisible()); })); m(this, "onFiveEveryReady", () => { this.setUnfoldedByCamera(), A(this.five.getCurrentState().mode) && this.tagsDo(this.tags, (e) => e.updateVisible()); }); m(this, "render", () => { this.renderQueue.forEach((e, t) => { const { keys: i } = e; if (t === "TagContainerSvelte") { const n = this.filterPointTag.filter((s) => s.screenPosition), a = { hooks: this.hooks, tags: n, state: this.state, temporaryState: this.temporaryState, mediaStore: this.mediaStore, rendererMap: this.rendererMap, contentTypeMap: this.contentTypeMap, zIndex: this.params.containerZIndex }; if (this.TagContainerSvelte) { let s = {}; if (i.length === 0) s = a; else for (const r of i) s[r] = a[r]; this.TagContainerSvelte.$set(s); } else { if (!this.container) return console.error("updateRenderPlaneTag: tag2DContainer not found"); this.TagContainerSvelte = new X({ target: this.container, props: C(g({}, a), { state: C(g({}, this.state), { enabled: !1 }) }) }), H(() => { var s; (s = this.TagContainerSvelte) == null || s.$set({ state: this.state }); }); } } }), this.renderQueue.clear(); }); this.params = v({}, { debug: !1, config: this.config }, g({}, t)), this.debug = this.params.debug, this.config = this.params.config, this.debug && this.debugUtil.bindLog(), V(1, { namespace: z.PlayAudio }); try { Array.isArray(window.__PANOTAGPLUGIN_DEBUG_LIST__) || (window.__PANOTAGPLUGIN_DEBUG_LIST__ = []), this.NAME = I + "-" + window.__PANOTAGPLUGIN_DEBUG_LIST__.length, window.__PANOTAGPLUGIN_DEBUG_LIST__.push(this), window.__PANOTAGPLUGIN_DEBUG__ || Object.defineProperty(window, "__PANOTAGPLUGIN_DEBUG__", { get: function() { return window.__PANOTAGPLUGIN_DEBUG_LIST__.sort((i, o) => o.tags.length - i.tags.length)[0]; } }); } catch (i) { } } appendTo(e) { var i, o, n; this.container = e; const t = (o = (i = this.TagContainerSvelte) == null ? void 0 : i.$$) == null ? void 0 : o.root; t && t !== this.container && ((n = this.TagContainerSvelte) == null || n.$destroy(), this.TagContainerSvelte = void 0); } /** * @description 加载数据 */ load(e) { return d(this, null, function* () { var o, n; c.clearSharedMeshRegistry(), this.clearTags(); try { console.debug(this.NAME, " load:", { data: JSON.parse(JSON.stringify(e)) }); } catch (a) { } const t = Q(this.five); e.tagList.forEach((a) => { if (a.enu_position && this.isValidArrayPosition(a.enu_position)) try { const s = k(a.enu_position), r = t.viewLayers[0].scene.enuToWorld(s); a.position = U(r); } catch (s) { } if (a.enu_normal && this.isValidArrayPosition(a.enu_normal)) try { const s = k(a.enu_normal), r = t.viewLayers[0].scene.enuToWorld(s); a.normal = U(r); } catch (s) { } }), this.config = v({}, this.config, { globalConfig: (o = e.globalConfig) != null ? o : {}, contentTypeConfig: (n = e.contentTypeConfig) != null ? n : {} }); const i = yield this.addTag(e.tagList); return this.five.state.mode === "Panorama" && this.updateMaskTagsForCurrentPano(), this.hooks.emit("loaded"), i; }); } /** * @description 添加标签 * @param tag 标签或标签数组 * @param options 可选配置 * @param options.updateMaskUrl 是否更新 mask。若为 true 且该 panoIndex 已有 Mask 标签,仅更新其 maskUrl(不变 color、style),并添加新标签 */ addTag(e, t) { return d(this, null, function* () { var a, s; const o = (Array.isArray(e) ? e : [e]).filter((r) => r.stickType === "3DBox" || r.stickType === "Mask" || r.position); if (t != null && t.updateMaskUrl && o.length === 1 && o[0].stickType === "Mask") { const r = o[0], h = (a = r.maskUrl) != null ? a : r.mask, f = (s = r.fiveState) == null ? void 0 : s.panoIndex; h && typeof f == "number" && this.tags.filter((u) => { var T; return u instanceof c && ((T = u.fiveState) == null ? void 0 : T.panoIndex) === f; }).forEach((u) => u.set({ mask: h })); } const n = o.map((r) => { const h = N(r); return h === "2DPoint" || h === "3DPoint" ? new q(this, r) : h === "Model" ? new J(this, r) : h === "Plane" ? new Z(this, r) : h === "3DBox" ? new Y(this, r) : h === "Polygon" ? new K(this, r) : h === "Mask" ? new c(this, r) : null; }); return n.forEach((r) => x(r)), this.tags.push(...n), this.tagsLengthWillUpdate = !0, j(this.five).then(() => d(this, null, function* () { var r, h; this.store.eventListenerDisposer && ((h = (r = this.store).eventListenerDisposer) == null || h.call(r)), this.state.enabled && this.handleEnable(), this.addResizeListener(), this.clearUnusedPanelTag(), this.tagsDo(n, (f) => { this.tags.includes(f) && (f.updateVisible(), f.updateZIndex()); }), this.setUnfolded(), this.addRenderQueue({ type: "TagContainerSvelte" }), this.hooks.emit("tagsLengthChange"); })); }); } /** * @description 改变配置 */ changeConfig(e, t = !0) { t ? this.config = v({}, this.config, e) : this.config = e, this.tags.forEach((i) => { i.updateConfig(); }), this.tagsDo(this.tags, (i) => i.updateVisible()); } /** * @description 改变全局配置 */ changeGlobalConfig(e, t = !0) { t ? this.config.globalConfig = v({}, this.config.globalConfig, e) : this.config.globalConfig = e, this.tags.forEach((i) => { i.updateConfig(); }), this.tagsDo(this.tags, (i) => { i.updateVisible(); }); } /** * @description 改变类型配置 */ changeContentTypeConfig(e, t, i = !0) { this.config.contentTypeConfig || (this.config.contentTypeConfig = {}), i ? this.config.contentTypeConfig[e] = v({}, this.config.contentTypeConfig[e], t) : this.config.contentTypeConfig[e] = t, this.tags.forEach((o) => { o.updateConfig(); }), this.tagsDo(this.tags, (o) => { o.updateVisible(); }); } show(e) { return d(this, null, function* () { if (this.checkDisposed()) return; const { userAction: t = !0 } = e != null ? e : {}; this.setState({ visible: !0 }, { userAction: t }), this.hooks.emit("show", { userAction: t }); }); } hide(e) { return d(this, null, function* () { if (this.checkDisposed()) return; const { userAction: t = !0 } = e != null ? e : {}; this.setState({ visible: !1 }, { userAction: t }), this.hooks.emit("hide", { userAction: t }); }); } enable(e) { if (this.checkDisposed()) return; const { userAction: t = !0 } = e != null ? e : {}; this.setState({ enabled: !0 }, { userAction: t }), this.hooks.emit("enable", { userAction: t }); } disable(e) { if (this.checkDisposed()) return; const { userAction: t = !0 } = e != null ? e : {}; this.setState({ enabled: !1 }, { userAction: t }), this.hooks.emit("disable", { userAction: t }); } setState(e, t) { if (this.checkDisposed()) return; const { userAction: i = !0 } = t != null ? t : {}, o = g({}, this.state); this.state = Object.assign(this.state, e), o.visible !== this.state.visible && (e.visible ? this.handleShow() : this.handleHide()), o.enabled !== this.state.enabled && (e.enabled ? this.handleEnable() : this.handleDisable()), this.hooks.emit("stateChange", { state: this.state, prevState: o, userAction: i }); } /** * @description 销毁 */ dispose() { var e, t, i, o, n, a; this.pauseCurrentMedia(), this.disposeAllCSS3DContainer(), (e = this.TagContainerSvelte) == null || e.$destroy(), this.filterCSS3DTag.forEach((s) => { var r; return (r = s.tag3DContentSvelte) == null ? void 0 : r.svelteApp.$destroy(); }), this.tags.forEach((s) => { var r; (r = s.rectanglePlane) == null || r.editor.disable(), s.cache.clear(); }), this.tags = [], this.tagsLengthWillUpdate = !0, this.hooks.emit("tagsLengthChange"), (t = this.store.disposers) == null || t.forEach((s) => s == null ? void 0 : s()), this.store.disposers = [], (o = (i = this.store).eventListenerDisposer) == null || o.call(i), this.store.eventListenerDisposer = void 0, (a = (n = this.store).resizeObserverDisposer) == null || a.call(n), this.store.resizeObserverDisposer = void 0, this.store.resizeObserverDisposerAdding = !1, this.five.scene.remove(this.group), this.group.remove(...this.group.children), this.gltfObjectGroup.remove(...this.gltfObjectGroup.children), this.imagePlaneGroup.remove(...this.imagePlaneGroup.children), this.five.needsRender = !0, this.store.disposed = !0, this.hooks.emit("dispose"); } /** * @description 闪烁标签 * @param {TagId} id * @param {Partial<anime.AnimeParams>} animeConfig */ blinkTagById(e, t) { return d(this, null, function* () { var i; return (i = this.getTagById(e)) == null ? void 0 : i.blink(t); }); } /** * @description 展开/收起指定id的标签 * @param {TagId} id * @param {boolean} unfolded */ changeUnfoldedById(e, t) { const i = this.getTagById(e); t ? i == null || i.unfold() : i == null || i.fold(); } /** * @description 启用/停用指定id的标签 * @param {TagId} id * @param {boolean} enabled */ changeEnabledById(e, t) { var o; const i = this.getTagById(e); i && (i.enabled = t, (o = i.hooks) == null || o.emit(t ? "enable" : "disable")); } /** * @description 修改3D标签normal * @param {TagId} id * @param {ArrayPosition} normal */ changeTagNormalById(e, t) { const i = this.getTagById(e); i && i.tag3DContentSvelte && (i.tag3DContentSvelte.currentNormal = k(t)); } /** * @description 改变data */ changePositionById(e, t) { const i = this.getTagById(e); i && i.setPosition(t); } /** * @description 改变data */ changeDataById(e, t, i = !0) { const o = this.getTagById(e); o && (o.setData(t, i), this.clearUnusedPanelTag(), o.hooks.emit("dataChanged", o.data)); } /** * @description 改变tag的stickType */ changeStickTypeById(e, t, i = !0) { this.changeTagById(e, t, i); } /** * @description 改变tag任意属性 */ changeTagById(e, t, i = !0) { const o = this.getTagById(e); if (o) { if (t.stickType && t.stickType !== o.stickType) { console.log(`[PanoTagPlugin] stickType changed from ${o.stickType} to ${t.stickType}, recreating tag`); const n = g({}, o); this.destroyTagById(e), this.five.ready().then(() => { this.addTag(g(g({}, n), t)); }); return; } o.set(t), o instanceof c && o.updateMaskStyle(), o.updateVisible(), this.clearUnusedPanelTag(), o.hooks.emit("dataChanged", o.data); } } /** * @description 批量更新指定点位的 Mask 图 * @param maskUpdates 包含点位索引和对应 mask 的数组 * @example * changeMask([ * { index: 0, mask: 'https://example.com/mask1.png' }, * { index: 1, mask: canvasElement } * ]) */ changeMask(e) { if (!Array.isArray(e) || e.length === 0) { console.warn("[PanoTagPlugin] changeMask: invalid or empty maskUpdates"); return; } e.forEach(({ index: t, mask: i }) => { if (typeof t != "number") { console.warn("[PanoTagPlugin] changeMask: invalid index", t); return; } if (!i) { console.warn("[PanoTagPlugin] changeMask: invalid mask for index", t); return; } const o = this.tags.filter((n) => { var a; return n instanceof c && ((a = n.fiveState) == null ? void 0 : a.panoIndex) === t; }); if (o.length === 0) { console.debug(`[PanoTagPlugin] changeMask: no MaskTag found at panoIndex ${t}`); return; } o.forEach((n) => { n.set({ mask: i }), console.log(`[PanoTagPlugin] Updated mask for tag ${n.id} at panoIndex ${t}`); }); }), this.five.needsRender = !0; } /** * @description 销毁tag */ destroyTagById(e) { (Array.isArray(e) ? e : [e]).forEach((i) => { var o; return (o = this.getTagById(i)) == null ? void 0 : o.destroy(); }); } /** * @deprecated */ updateRenderAllTags() { this.tagsDo(this.tags, (e) => e.updateVisible()), this.five.needsRender = !0; } /** * @description 清除所有标签 */ clearTags() { var e; this.tags.length && (this.tags.forEach((t) => { var i, o, n, a, s, r, h, f, y, u, T; (i = t.tag3DContentSvelte) == null || i.dispose(), (n = (o = t.mediaPlane) == null ? void 0 : o.parent) == null || n.remove(t.mediaPlane), (r = (s = (a = t.model) == null ? void 0 : a.object) == null ? void 0 : s.parent) == null || r.remove(t.model.object), (f = (h = t.rectanglePlane) == null ? void 0 : h.parent) == null || f.remove(t.rectanglePlane), (y = t.boxShape) != null && y.parent && t.boxShape.parent.remove(t.boxShape), (T = (u = t.polygonShape) == null ? void 0 : u.parent) == null || T.remove(t.polygonShape), t != null && t.tagNormalLine && (t == null || t.removeTagNormalLine()), t instanceof c && t.dispose(); }), this.tags = [], this.tagsLengthWillUpdate = !0, this.hooks.emit("tagsLengthChange"), (e = this.TagContainerSvelte) == null || e.$destroy(), this.TagContainerSvelte = void 0, this.disposeAllCSS3DContainer()), this.enabledModelTagSet.clear(), this.cache.clear(); } /** * @description 设置 unfolded */ setUnfolded() { return d(this, null, function* () { return new Promise((e) => { setTimeout(() => { this.setUnfoldedByCamera(), e(); }, 100); }); }); } handleShow() { this.state.visible = !0, this.group.visible = !0, this.addRenderQueue({ type: "TagContainerSvelte", keys: ["state"] }), this.updateRenderAllTags(), this.five.needsRender = !0; } handleHide() { this.pauseCurrentMedia(), this.state.visible = !1, this.group.visible = !1, this.addRenderQueue({ type: "TagContainerSvelte", keys: ["state"] }), this.five.needsRender = !0; } handleEnable() { this.state.enabled = !0, this.store.eventListenerDisposer = this.addEventListener(), this.five.scene.children.includes(this.group) || this.five.scene.add(this.group), this.five.needsRender = !0; } handleDisable() { var e, t, i; this.pauseCurrentMedia(), this.tags.forEach((o) => { var n; return (n = o.rectanglePlane) == null ? void 0 : n.delete(); }), this.state.enabled = !1, (t = (e = this.store).eventListenerDisposer) == null || t.call(e), this.five.scene.remove(this.group), (i = this.TagContainerSvelte) == null || i.$set({ tags: [] }), this.five.needsRender = !0; } addResizeListener() { if (!this.store.resizeObserverDisposer && !this.store.resizeObserverDisposerAdding) { const e = this.addResizeObserver(); this.store.resizeObserverDisposerAdding = !0, setTimeout(() => { this.store.resizeObserverDisposer = e, this.store.resizeObserverDisposerAdding = !1; }, 200); } } addResizeObserver() { if (this.store.disposed) return; const e = this.five.getElement(), t = () => { this.state.enabled && (this.filterPointTag.forEach((r) => r.updateScreenPosition({ force: !0 })), this.temporaryState.visible = !0, this.addRenderQueue({ type: "TagContainerSvelte", keys: ["temporaryState"] })); }, i = () => { this.state.enabled && (this.temporaryState.visible = !1, this.addRenderQueue({ type: "TagContainerSvelte", keys: ["temporaryState"] })); }, { observe: o, unobserve: n } = M( O(() => { this.store.resizeObserverDisposer && i(); }, 500), e ), { observe: a, unobserve: s } = M( D(() => t(), 400), e ); return o(), a(), () => { n(), s(); }; } setUnfoldedByCamera() { let e = !1; this.filterPointTag.forEach((t) => { const i = t.getUnfoldedByCamera(); if (t.state && i !== void 0) { if (i === !0 && t.screenPosition) { const o = t.getConfig().unfoldedConfig; E(o).keep !== "unfolded" && (e = !0); } t.state.unfolded = i; } }), e && this.filterPointTag.forEach((t) => { const i = t.getConfig().unfoldedConfig; typeof i == "object" && (i.autoUnfold || i.autoUnfold === !1 || E(i.autoUnfold).enable === !1 || i.keep) || t.state && (t.state.unfolded = !1); }); } changeTagMode(e, t) { var i; (i = e.tag3DContentSvelte) != null && i.css3DInstance && (e.tag3DContentSvelte.css3DInstance.mode = t); } /** * @description 添加 cameraUpdate, panoArrived 等事件监听 */ addEventListener() { const { five: e, hooks: t } = this, i = ee(this.five, this.onFiveEveryReady); return this.handleFivePanoArrived(), e.on("wantsMoveToPano", this.handleFiveWantsMoveToPano), e.on("models.refined", this.onFiveRefined), e.on("modeChange", this.handleFiveModeChange), e.on("modelShownFloorChange", this.handleFiveModelShownFloorChange), e.on("cameraUpdate", this.handleFiveCameraUpdate), e.on("cameraFovUpdate", this.handleFiveCameraFovUpdate), e.on("panoArrived", this.handleFivePanoArrived), e.on("panoArrived", this.loadVideoFirstFrame), e.on("render.prepare", this.render), t.on("click", this.clickhandler), () => { i(), e.off("wantsMoveToPano", this.handleFiveWantsMoveToPano), e.off("models.refined", this.onFiveRefined), e.off("modeChange", this.handleFiveModeChange), e.off("modelShownFloorChange", this.handleFiveModelShownFloorChange), e.off("cameraUpdate", this.handleFiveCameraUpdate), e.off("cameraFovUpdate", this.handleFiveCameraFovUpdate), e.off("panoArrived", this.handleFivePanoArrived), e.off("panoArrived", this.loadVideoFirstFrame), e.off("render.prepare", this.render), t.off("click", this.clickhandler), this.store.eventListenerDisposer = void 0; }; } /** * @description 设置标签 hover 启用状态 */ setTagHoverEnabled(e, t) { const i = this.getTagById(e); i && (i.hoverEnabled = t); } /** * @description 获取标签 hover 启用状态 */ getTagHoverEnabled(e) { const t = this.getTagById(e); return t == null ? void 0 : t.hoverEnabled; } /** * 设置全局 hover 启用状态 */ setGlobalHoverEnabled(e) { this.globalHoverEnabled = e; } /** * 获取全局 hover 启用状态 */ getGlobalHoverEnabled() { return this.globalHoverEnabled; } /** * 验证 ArrayPosition 是否为有效格式 * @param value 待验证的值 * @returns 是否为有效的 ArrayPosition */ isValidArrayPosition(e) { return !Array.isArray(e) || e.length !== 3 ? !1 : e.every((t) => typeof t == "number" && !isNaN(t) && isFinite(t)); } /** * 更新当前点位的 Mask 标签 * Mask 标签仅在当前点位可见 */ updateMaskTagsForCurrentPano() { const e = this.five.getCurrentState().panoIndex; console.log( "[PanoTagPlugin] updateMaskTagsForCurrentPano, current panoIndex:", e, "mask tags count:", this.filterMaskTag.length ), this.filterMaskTag.forEach((t) => { var o; const i = (o = t.fiveState) == null ? void 0 : o.panoIndex; console.log( "[PanoTagPlugin] Processing mask tag:", t.id, "tagPanoIndex:", i, "matches current:", i === e ), i === e ? (console.log("[PanoTagPlugin] Tag matches current pano, updating visibility..."), t.updateVisible(), t.applyVisible()) : t.visible && (console.log("[PanoTagPlugin] Tag is from different pano, hiding..."), t.state.visible = !1, t.applyVisible()); }); } /** * 获取所有 Mask 类型的标签 */ get filterMaskTag() { return this.tags.filter((e) => e.stickType === "Mask"); } /** * 获取 MaskTag 性能统计信息(用于性能监控和调试) * @returns 性能统计信息 */ getMaskTagPerformanceStats() { const e = c.getCacheStats(), t = this.filterMaskTag.length, i = this.filterMaskTag.filter((o) => o.visible).length; return { // 标签统计 totalMaskTags: t, visibleMaskTags: i, // 纹理缓存统计 textureCache: e, // 当前点位 currentPanoIndex: this.five.state.panoIndex }; } /** * 清理所有 MaskTag 纹理缓存(用于内存管理) * 注意:这会释放所有纹理缓存,谨慎使用 */ clearMaskTagCache() { c.clearAllCache(); } } export { zs as PanoTagPluginController, zs as default, Vs as pluginFlag };