@realsee/dnalogel
Version:
924 lines (923 loc) • 42 kB
JavaScript
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
};