@realsee/dnalogel 4.0.0-webgpu.3 → 4.0.0-webgpu.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/floorplan.js +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +270 -35
- package/dist/index.js.map +1 -0
- package/dist/internal/{BasePlugin-CT5K8m36.js → BasePlugin-DC5m72La.js} +3 -3
- package/dist/internal/{BasePlugin-CT5K8m36.js.map → BasePlugin-DC5m72La.js.map} +1 -1
- package/dist/internal/BasePluginWithData-D_0W46_q.js +7 -0
- package/dist/internal/{BasePluginWithData-9z4tpAT4.js.map → BasePluginWithData-D_0W46_q.js.map} +1 -1
- package/dist/internal/{BetterTween-BX0aTvP1.js → BetterTween-DmptqE8m.js} +2 -2
- package/dist/internal/{BetterTween-BX0aTvP1.js.map → BetterTween-DmptqE8m.js.map} +1 -1
- package/dist/internal/{CSS3DRenderPlugin-ccSpcvwd.js → CSS3DRenderPlugin-CEatgl0m.js} +3 -3
- package/dist/internal/CSS3DRenderPlugin-CEatgl0m.js.map +1 -0
- package/dist/internal/{Controller-Csut_kcH.js → Controller-D6o4OGWJ.js} +8 -8
- package/dist/internal/{Controller-Csut_kcH.js.map → Controller-D6o4OGWJ.js.map} +1 -1
- package/dist/internal/{FiveDomEvents-3H9NvDOz.js → FiveDomEvents-BUBLFzti.js} +2 -2
- package/dist/internal/{FiveDomEvents-3H9NvDOz.js.map → FiveDomEvents-BUBLFzti.js.map} +1 -1
- package/dist/internal/FivePuppet-C6QmVY70.js +67 -0
- package/dist/internal/FivePuppet-C6QmVY70.js.map +1 -0
- package/dist/internal/{PointHelper-D565h9b_.js → PointHelper-DIhgdjY2.js} +48 -48
- package/dist/internal/{PointHelper-D565h9b_.js.map → PointHelper-DIhgdjY2.js.map} +1 -1
- package/dist/internal/{Polygon-CBGvYUfJ.js → Polygon-D3xIL1Pl.js} +30 -30
- package/dist/internal/{Polygon-CBGvYUfJ.js.map → Polygon-D3xIL1Pl.js.map} +1 -1
- package/dist/internal/{Prism-Dm5ESkgg.js → Prism-CJlyAEAU.js} +13 -13
- package/dist/internal/{Prism-Dm5ESkgg.js.map → Prism-CJlyAEAU.js.map} +1 -1
- package/dist/internal/{Rectangle-D-zkDycu.js → Rectangle-BpL9lNKU.js} +118 -129
- package/dist/internal/Rectangle-BpL9lNKU.js.map +1 -0
- package/dist/internal/{Work-DF8j5GnL.js → Work-BE4AgdwH.js} +9 -9
- package/dist/internal/{Work-DF8j5GnL.js.map → Work-BE4AgdwH.js.map} +1 -1
- package/dist/internal/{animationFrame-XGKHIeQK.js → animationFrame-CacKXN8l.js} +14 -3
- package/dist/internal/animationFrame-CacKXN8l.js.map +1 -0
- package/dist/internal/{area-maker-Bd9l2pIp.js → area-maker-Bnhx4SkH.js} +4 -4
- package/dist/internal/{area-maker-Bd9l2pIp.js.map → area-maker-Bnhx4SkH.js.map} +1 -1
- package/dist/internal/{boundingBox-DvCor5Hd.js → boundingBox-CIqXgNXW.js} +2 -2
- package/dist/internal/{boundingBox-DvCor5Hd.js.map → boundingBox-CIqXgNXW.js.map} +1 -1
- package/dist/internal/{camera-movement-CwI7UqUk.js → camera-movement-C1pwfMk_.js} +2 -2
- package/dist/internal/camera-movement-C1pwfMk_.js.map +1 -0
- package/dist/internal/{changeMode-BVGYCoqu.js → changeMode-D_I2AOjH.js} +2 -2
- package/dist/internal/{changeMode-BVGYCoqu.js.map → changeMode-D_I2AOjH.js.map} +1 -1
- package/dist/internal/{controller-BWkZT0l1.js → controller-DIDtFrBE.js} +1991 -2050
- package/dist/internal/controller-DIDtFrBE.js.map +1 -0
- package/dist/internal/{cruise-C3F0eNQ-.js → cruise-B50Tcq66.js} +2 -2
- package/dist/internal/{cruise-C3F0eNQ-.js.map → cruise-B50Tcq66.js.map} +1 -1
- package/dist/internal/{current-pano-image-DKUWluR-.js → current-pano-image-BCFr6njt.js} +4 -4
- package/dist/internal/{current-pano-image-DKUWluR-.js.map → current-pano-image-BCFr6njt.js.map} +1 -1
- package/dist/internal/{defaultUrls-CjKkS9k9.js → defaultUrls-CfMtGzqM.js} +14 -3
- package/dist/internal/defaultUrls-CfMtGzqM.js.map +1 -0
- package/dist/internal/{fire-scene-CczaBz2_.js → fire-scene-BzZGvyh_.js} +9 -4
- package/dist/internal/fire-scene-BzZGvyh_.js.map +1 -0
- package/dist/internal/{fiveModelLoad-mg-TnpnM.js → fiveModelLoad-BUIBYxzp.js} +2 -2
- package/dist/internal/{fiveModelLoad-mg-TnpnM.js.map → fiveModelLoad-BUIBYxzp.js.map} +1 -1
- package/dist/internal/{floorplan-KWlIsTvO.js → floorplan-C8BGw87S.js} +5 -5
- package/dist/internal/{floorplan-KWlIsTvO.js.map → floorplan-C8BGw87S.js.map} +1 -1
- package/dist/internal/{generatePolygonGeometry-B_5JFq8y.js → generatePolygonGeometry-BOnzdCaG.js} +181 -178
- package/dist/internal/generatePolygonGeometry-BOnzdCaG.js.map +1 -0
- package/dist/internal/{lookObject-wesf8xt6.js → lookObject-DuRab5wf.js} +2 -2
- package/dist/internal/{lookObject-wesf8xt6.js.map → lookObject-DuRab5wf.js.map} +1 -1
- package/dist/internal/{measure-BX6boAC7.js → measure-B4jFwdQ6.js} +5 -5
- package/dist/internal/{measure-BX6boAC7.js.map → measure-B4jFwdQ6.js.map} +1 -1
- package/dist/internal/{model-chassis-compass-InVNmOAQ.js → model-chassis-compass-C6NTVMLo.js} +2 -2
- package/dist/internal/{model-chassis-compass-InVNmOAQ.js.map → model-chassis-compass-C6NTVMLo.js.map} +1 -1
- package/dist/internal/{model-entry-door-guide-wZbyY77a.js → model-entry-door-guide-DnGTLY2s.js} +2 -2
- package/dist/internal/{model-entry-door-guide-wZbyY77a.js.map → model-entry-door-guide-DnGTLY2s.js.map} +1 -1
- package/dist/internal/{model-maker-uO8xlTuO.js → model-maker-B1mnDdKY.js} +15 -15
- package/dist/internal/{model-maker-uO8xlTuO.js.map → model-maker-B1mnDdKY.js.map} +1 -1
- package/dist/internal/{model-tv-video-DzXb2JRf.js → model-tv-video-BP-7HoDC.js} +2 -2
- package/dist/internal/{model-tv-video-DzXb2JRf.js.map → model-tv-video-BP-7HoDC.js.map} +1 -1
- package/dist/internal/{model-view-CBeeMM98.js → model-view-BWUU0-uq.js} +2 -2
- package/dist/internal/{model-view-CBeeMM98.js.map → model-view-BWUU0-uq.js.map} +1 -1
- package/dist/internal/object3d-helper-CbRRhnLV.js +7 -0
- package/dist/internal/{object3d-helper-DDYsVPN6.js.map → object3d-helper-CbRRhnLV.js.map} +1 -1
- package/dist/internal/{pano-compass-jSr629BP.js → pano-compass-BRTM0dCc.js} +7 -7
- package/dist/internal/{pano-compass-jSr629BP.js.map → pano-compass-BRTM0dCc.js.map} +1 -1
- package/dist/internal/{pano-door-label-DKoYIKLa.js → pano-door-label-BLjYGZrr.js} +3 -3
- package/dist/internal/{pano-door-label-DKoYIKLa.js.map → pano-door-label-BLjYGZrr.js.map} +1 -1
- package/dist/internal/{pano-measure-DW9mdx1O.js → pano-measure-BIgCWkVJ.js} +14 -14
- package/dist/internal/{pano-measure-DW9mdx1O.js.map → pano-measure-BIgCWkVJ.js.map} +1 -1
- package/dist/internal/{pano-ruler-pro-D7q0Ob21.js → pano-ruler-pro-D9yTbHJz.js} +2 -2
- package/dist/internal/{pano-ruler-pro-D7q0Ob21.js.map → pano-ruler-pro-D9yTbHJz.js.map} +1 -1
- package/dist/internal/{pano-spatial-tag-D0qn-__S.js → pano-spatial-tag-B7Gxn3BS.js} +3 -3
- package/dist/internal/{pano-spatial-tag-D0qn-__S.js.map → pano-spatial-tag-B7Gxn3BS.js.map} +1 -1
- package/dist/internal/{pano-tag-BW5MXXws.js → pano-tag-Bchz-jED.js} +2 -2
- package/dist/internal/{pano-tag-BW5MXXws.js.map → pano-tag-Bchz-jED.js.map} +1 -1
- package/dist/internal/{pano-video-Bmud_CAn.js → pano-video-BufYQMqo.js} +3 -3
- package/dist/internal/{pano-video-Bmud_CAn.js.map → pano-video-BufYQMqo.js.map} +1 -1
- package/dist/internal/{pipeline-DDqgb1gw.js → pipeline-t_3IMXKB.js} +4 -4
- package/dist/internal/{pipeline-DDqgb1gw.js.map → pipeline-t_3IMXKB.js.map} +1 -1
- package/dist/internal/{sculpt-BNkLJR6p.js → sculpt-BCK4PMwL.js} +64 -63
- package/dist/internal/{sculpt-BNkLJR6p.js.map → sculpt-BCK4PMwL.js.map} +1 -1
- package/dist/internal/tagPosition-DA9YguT8.js +176 -0
- package/dist/internal/tagPosition-DA9YguT8.js.map +1 -0
- package/dist/internal/withResolvers-DVr4bnnk.js +15 -0
- package/dist/internal/withResolvers-DVr4bnnk.js.map +1 -0
- package/dist/plugins/area-maker.js +1 -1
- package/dist/plugins/camera-movement.js +1 -1
- package/dist/plugins/cruise.js +2 -2
- package/dist/plugins/css3d-render.js +1 -1
- package/dist/plugins/current-pano-image.js +1 -1
- package/dist/plugins/digital-performance.d.ts +1 -1
- package/dist/plugins/digital-performance.js +1 -1
- package/dist/plugins/fire-scene.d.ts +1 -1
- package/dist/plugins/fire-scene.js +1 -1
- package/dist/plugins/guide-line.js +1 -1
- package/dist/plugins/measure.js +1 -1
- package/dist/plugins/model-chassis-compass.js +1 -1
- package/dist/plugins/model-entry-door-guide.js +1 -1
- package/dist/plugins/model-maker.d.ts +1 -1
- package/dist/plugins/model-maker.js +1 -1
- package/dist/plugins/model-tv-video.js +1 -1
- package/dist/plugins/model-view.js +1 -1
- package/dist/plugins/object3d-helper.d.ts +1 -1
- package/dist/plugins/object3d-helper.js +3 -1
- package/dist/plugins/pano-compass.js +1 -1
- package/dist/plugins/pano-door-label.js +1 -1
- package/dist/plugins/pano-measure.js +1 -1
- package/dist/plugins/pano-ruler-pro.js +1 -1
- package/dist/plugins/pano-spatial-tag.js +1 -1
- package/dist/plugins/pano-tag.d.ts +1 -1
- package/dist/plugins/pano-tag.js +4 -1
- package/dist/plugins/pano-video.js +1 -1
- package/dist/plugins/pipeline.js +1 -1
- package/dist/plugins/sculpt.d.ts +1 -1
- package/dist/plugins/sculpt.js +7 -1
- package/dist/types/public/index.d.ts +2 -0
- package/dist/types/public/plugins/digital-performance.d.ts +1 -0
- package/dist/types/public/plugins/fire-scene.d.ts +1 -0
- package/dist/types/public/plugins/model-maker.d.ts +1 -0
- package/dist/types/public/plugins/object3d-helper.d.ts +1 -0
- package/dist/types/public/plugins/pano-tag.d.ts +2 -0
- package/dist/types/public/plugins/sculpt.d.ts +8 -0
- package/dist/types/public/utils.d.ts +5 -0
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +16 -50
- package/package.json +1 -1
- package/dist/internal/BasePluginWithData-9z4tpAT4.js +0 -7
- package/dist/internal/CSS3DRenderPlugin-ccSpcvwd.js.map +0 -1
- package/dist/internal/Rectangle-D-zkDycu.js.map +0 -1
- package/dist/internal/animationFrame-XGKHIeQK.js.map +0 -1
- package/dist/internal/blink-DD_0mH-m.js +0 -113
- package/dist/internal/blink-DD_0mH-m.js.map +0 -1
- package/dist/internal/camera-movement-CwI7UqUk.js.map +0 -1
- package/dist/internal/controller-BWkZT0l1.js.map +0 -1
- package/dist/internal/defaultUrls-CjKkS9k9.js.map +0 -1
- package/dist/internal/fire-scene-CczaBz2_.js.map +0 -1
- package/dist/internal/generatePolygonGeometry-B_5JFq8y.js.map +0 -1
- package/dist/internal/object3d-helper-DDYsVPN6.js +0 -7
- package/dist/utils.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-maker-uO8xlTuO.js","names":["Subscribe","$.from_html","$.prop","$.comment","$.first_child","$.only_child","$.set_text","TextSvelte","BasePlugin.Controller","defaultTagRendererMap","Subscribe$1","tag","setObjectOriginSortBounds","fiveEveryReadyListener","waitFiveModelLoaded","anyPositionToVector3","notNil","isNil","FiveDomEvents","LineMaterial","boxVertex","boundingBox","Controller$1","if_block","template_effect","only_child","append","comment","from_html","set_text","prop","first_child","mountComponent","LabelItem","getCurrentFontSize","getGlobalResponsiveFontSize","CONST","PolygonWithEdgeMesh","PrismMesh","sleep","THREE","addIfNotExists","target","parent","object","getTagOcclusionObjects","scope","model","group","ModelMakerBaseItem","params","position","Vector3","click","dispose","v","ModelMakerBoxItem","args","root","Text","text","$$props","fragment","node","consequent","div","text_1","$$anchor","$$render","textRender","app","container","item","tagRendererMap","currentFontSize","fontSizeManager","unsubscribe","fontSize","ModelMakerPrismItem","box","topCenter","fiveCurrentfloor","modelFloor","ModelMakerPolygonItem","panoIndex","mode","setModelSortBounds","ModelMakerPolygonMesh","points","line","ModelMakerPrismMesh","EncodedLineMaterial","output","vec4","workingToColorSpace","SRGBColorSpace","hasHDRContribution","material","progress","slot","capacityMin","capacityMax","hasHDROutput","renderer","configuration","managers","sourceKind","mesh","source","effective","basic","collectSources","sources","models","owned","SavedAnnotationColor","texture","screenUV","manager","nativeRender","previous","scene","camera","positionGeometry","after","before","decoded","colorSpaceToWorking","key","disposed","clear","owner","next","count","host","original","cached","kind","materialColor","materialOpacity","resource","onDispose","copy","active","hdr","encodedThisFrame","tailSeen","drawQuad","flush","registered","actual","createSavedAnnotationColorOwner","Controller","Group","five","config","dom","serverData","setItemStyle","color","Color","occlusionVisibility","occlusionMode","originalOpacity","bottomPoints","p","height","heightPoint","startVertex","start","endVertex","end","euler","Euler","rotation","quaternion","Quaternion","invertedQuaternion","center","negatedPositionTransform","originStartVertex","originEndVertex","box3","Box3","targetState","id","map","targetItems","restoreLabels","animationToken","hideLabels","animationPromises","stop","geometries","materials","colored","geometry","options","itemTypes","type","isRestoringOpacity","opacityPercent","itemId","currentOpacity","newOpacity","itemTypesArray","condition","visible","targetElement","computedStyle","currentColor","originalOpacityData","highlightColor","originalStyles","originalModelColors","allTags","tags","cameraPosition","sortedTags","a","b","canShowTags","domRectIsIntersect","mainDom","domRect","items","startTime","frame","finish","resolve","animate","elapsed","duration","easeProgress","ModelMakerPlugin"],"sources":["../../src/shared-utils/three/addIfNotExists.ts","../../src/ModelMakerPlugin/utils/getTagOcclusionObjects.ts","../../src/ModelMakerPlugin/item/baseItem.ts","../../src/ModelMakerPlugin/item/boxItem.ts","../../src/ModelMakerPlugin/utils/Text.svelte","../../src/ModelMakerPlugin/utils/tagRenderer.ts","../../src/ModelMakerPlugin/item/prismItem.ts","../../src/ModelMakerPlugin/item/polygonItem.ts","../../src/ModelMakerPlugin/utils/setModelSortBounds.ts","../../src/ModelMakerPlugin/utils/ModelMakerPolygonMesh.ts","../../src/ModelMakerPlugin/utils/ModelMakerPrismMesh.ts","../../src/ModelMakerPlugin/rendering/EncodedLineMaterial.ts","../../src/ModelMakerPlugin/rendering/hdrContribution.ts","../../src/ModelMakerPlugin/rendering/SavedAnnotationColor.ts","../../src/ModelMakerPlugin/Controller.ts","../../src/ModelMakerPlugin/index.ts"],"sourcesContent":["import type * as THREE from 'three/webgpu'\n\nexport default function addIfNotExists(parent: THREE.Object3D, ...target: THREE.Object3D[]) {\n target.forEach((object) => {\n if (parent.children.includes(object)) return\n if (object) parent.add(object)\n })\n}\n","import type { Object3D } from 'three/webgpu'\nimport type { TagOcclusionScope } from '../typings/config'\n\n/** 根据标签遮挡范围返回需要参与额外射线检测的 ModelMaker 对象。 */\nexport function getTagOcclusionObjects(scope: TagOcclusionScope = 'group', group: Object3D, model: Object3D): Object3D[] {\n switch (scope) {\n case 'self':\n return [model]\n case 'none':\n return []\n case 'group':\n default:\n return [group]\n }\n}\n","import type { Five, Mode } from '@realsee/five-webgpu'\nimport type { Object3D } from 'three/webgpu'\nimport { Vector3 } from 'three/webgpu'\nimport addIfNotExists from '../../shared-utils/three/addIfNotExists'\nimport { Subscribe } from '../../shared-utils/Subscribe'\nimport type { LightTag } from '../../shared-utils/tag'\nimport { tag } from '../../shared-utils/tag'\nimport { boundingBox } from '../../shared-utils/three/boundingBox'\nimport type { FiveDomEvents } from '../../shared-utils/five/FiveDomEvents'\nimport type { ServerItem, ItemType } from '../typings'\nimport type { TagOcclusionScope } from '../typings/config'\nimport { getTagOcclusionObjects } from '../utils/getTagOcclusionObjects'\n\n// 模型中心点可能存在的接口,继承自Object3D\ninterface ModelWithCenter extends Object3D {\n /** 模型中心点 */\n center?: Vector3\n}\n\n/**\n * @description 模型标注的事件类型\n */\ntype ModelMakerEvent<ServerData extends ServerItem> = {\n /** 启用 */\n enable: () => void\n /** 禁用 */\n disable: () => void\n /** 显示 */\n show: () => void\n /** 隐藏 */\n hide: () => void\n /** 点击 */\n click: (item: ModelMakerBaseItem<ServerData>) => void | boolean\n}\n\n/**\n * @description 模型标注的基类\n */\nexport class ModelMakerBaseItem<ServerData extends ServerItem> extends Subscribe<ModelMakerEvent<ServerData>> {\n public get container() {\n return this.tag.container\n }\n public type: ItemType\n public tag: LightTag\n public rawData: ServerData\n public model: ModelWithCenter\n public get state() {\n return {\n visible: this.model.visible,\n enabled: this.group.children.includes(this.model),\n }\n }\n public visibles: boolean[] = []\n protected five: Five\n protected group: Object3D\n protected fiveDomEvents: FiveDomEvents\n protected disposers: (() => void)[] = []\n\n public constructor(params: {\n five: Five\n model: ModelWithCenter\n group: Object3D\n type: ItemType\n fiveDomEvents: FiveDomEvents\n rawData?: ServerData\n tagWrapper?: HTMLElement\n visibleMode?: Mode[]\n position?: Vector3\n tagContainerZIndex?: number\n tagOcclusionScope?: TagOcclusionScope\n }) {\n super()\n this.five = params.five\n this.model = params.model\n this.group = params.group\n this.type = params.type\n this.rawData = params.rawData\n this.fiveDomEvents = params.fiveDomEvents\n\n // 获取模型中心点的位置\n const position = params.position ?? this.model.center ?? boundingBox(this.model).getCenter(new Vector3())\n\n this.tag = tag(this.five, position, { wrapper: params.tagWrapper, disableOpacityTransition: this.type === 'prism' })\n this.tag.extraObjectsForIntersectCheck.push(...getTagOcclusionObjects(params.tagOcclusionScope, this.group, this.model))\n }\n\n public show() {\n this.visibles[0] = true\n this.updateVisible()\n this.emit('show')\n }\n\n public hide() {\n this.visibles[0] = false\n this.updateVisible()\n this.emit('hide')\n }\n\n public enable() {\n addIfNotExists(this.group, this.model)\n this.five.needsRender = true\n\n this.model.updateMatrixWorld(true)\n this.tag.setTransformMatrix(this.model.matrixWorld)\n this.tag.enable()\n\n const click = this.onClick.bind(this)\n this.fiveDomEvents.removeEventListener(this.model, 'click')\n this.fiveDomEvents.addEventListener(this.model, 'click', click, { skipPano: true })\n\n this.disposers.push(() => {\n this.fiveDomEvents.removeEventListener(this.model, 'click')\n })\n\n this.updateVisible()\n\n this.emit('enable')\n }\n\n public disable() {\n this.group.remove(this.model)\n this.five.needsRender = true\n\n this.tag.disable()\n this.disposers.forEach((dispose) => dispose())\n this.disposers = []\n this.emit('disable')\n }\n\n public updateVisible() {\n const visible = !this.visibles.some((v) => v === false)\n\n if (visible) {\n this.tag.show()\n this.model.visible = true\n } else {\n this.tag.hide()\n this.model.visible = false\n }\n\n this.five.needsRender = true\n }\n\n protected onClick() {\n return this.emit('click', this)\n }\n}\n","import { ModelMakerBaseItem } from './baseItem'\nimport type { ServerBoxItem } from '../typings'\n\n/**\n * @description 模型标注的盒子类型标注的构造参数类型\n */\ntype ModelMakerBoxItemArgs = ConstructorParameters<typeof ModelMakerBaseItem<ServerBoxItem>>\n\n/**\n * @description 模型标注的盒子类型标注,即长方体\n * @extends ModelMakerBaseItem\n */\nexport class ModelMakerBoxItem extends ModelMakerBaseItem<ServerBoxItem> {\n public constructor(...args: ModelMakerBoxItemArgs) {\n super(...args)\n this.enable()\n this.tag.hide()\n this.updateVisible()\n }\n\n public enable() {\n super.enable()\n this.five.on('mode.change.request', this.hideTag)\n this.five.on('pano.request', this.hideTag)\n }\n\n public disable() {\n super.disable()\n this.five.needsRender = true\n this.five.off('mode.change.request', this.hideTag)\n this.five.off('pano.request', this.hideTag)\n }\n\n public show() {\n super.show()\n this.tag.hide()\n }\n\n public updateVisible() {\n const visible = !this.visibles.some((v) => v === false)\n\n if (visible) {\n this.model.visible = true\n } else {\n this.tag.hide()\n this.model.visible = false\n }\n\n this.five.needsRender = true\n }\n\n protected onClick() {\n this.tag.visible ? this.tag.hide() : this.tag.show({ force: true })\n super.onClick()\n return true\n }\n\n private hideTag = () => {\n this.tag.hide()\n }\n}\n","<script lang=\"ts\">\n export let text: string\n</script>\n\n{#if text}\n <div class=\"model-maker-tag\">\n {text}\n </div>\n{/if}\n\n<style lang=\"scss\">\n .model-maker-tag {\n position: absolute;\n width: max-content;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n color: #fff;\n font-size: 14px;\n font-weight: bold;\n text-shadow: 2px 0 8px rgba(0, 0, 0, 0.15);\n }\n</style>\n","import type * as PluginType from '../typings'\nimport TextSvelte from './Text.svelte'\nimport LabelItem from '../../components/AreaLabel/LabelItem.svelte'\nimport { getCurrentFontSize, getGlobalResponsiveFontSize } from '../../shared-utils/fontSize'\n\nimport { mountComponent, type MountedComponent } from '../../shared-utils/svelte/component.svelte'\nconst textRender: PluginType.ElementRenderer = (container, item) => {\n const app = mountComponent(TextSvelte, container, { text: item.rawData?.name })\n return () => app.destroy()\n}\n\nconst labelRender: PluginType.ElementRenderer = (container, item, five?) => {\n let currentFontSize = getCurrentFontSize()\n const app = mountComponent(LabelItem, container, { content: item.rawData?.name, five, fontSize: currentFontSize })\n\n // 使用全局单例字体大小管理器\n const fontSizeManager = getGlobalResponsiveFontSize()\n let unsubscribe: (() => void) | null = null\n\n // 监听字体大小变化\n if (typeof fontSizeManager === 'object' && 'subscribe' in fontSizeManager) {\n unsubscribe = fontSizeManager.subscribe((fontSize) => {\n currentFontSize = fontSize\n app.update({ fontSize: currentFontSize })\n })\n }\n\n return () => {\n unsubscribe?.()\n app.destroy()\n }\n}\n\nconst tagRendererMap: Record<PluginType.ItemType, PluginType.ElementRenderer> = {\n box: textRender,\n triangles: textRender,\n prism: labelRender,\n}\n\nexport { tagRendererMap }\n","import { isNil } from '../../shared-utils'\nimport { boxVertex, boundingBox } from '../../shared-utils/three/boundingBox'\nimport type { ServerPrismItem } from '../typings'\nimport { ModelMakerBaseItem } from './baseItem'\nimport * as THREE from 'three/webgpu'\n\n/**\n * @description 模型标注的棱柱类型标注的构造参数类型\n */\ntype ModelMakerPrismItemArgs = ConstructorParameters<typeof ModelMakerBaseItem<ServerPrismItem>>\n\n/**\n * @description 模型标注的棱柱类型标注\n * @extends ModelMakerBaseItem\n */\nexport class ModelMakerPrismItem extends ModelMakerBaseItem<ServerPrismItem> {\n public constructor(...args: ModelMakerPrismItemArgs) {\n const params = args[0]\n const box = boundingBox(params.model)\n const topCenter = new THREE.Vector3().lerpVectors(boxVertex(box, 0), boxVertex(box, 5), 0.5)\n super({ ...params, position: topCenter })\n this.enable()\n this.updateVisible()\n\n this.five.on('modelShownFloorChange', this.onModelShownFloorChange)\n this.disposers.push(() => {\n this.five.off('modelShownFloorChange', this.onModelShownFloorChange)\n })\n }\n\n public onModelShownFloorChange = (fiveCurrentfloor: number | null) => {\n this.updateFiveCurrentFloorState(fiveCurrentfloor)\n this.updateVisible()\n }\n\n public show() {\n this.updateFiveCurrentFloorState(this.five.model.shownFloor)\n super.show()\n }\n\n public hide() {\n super.hide()\n }\n\n private updateFiveCurrentFloorState = (fiveCurrentfloor: number | null) => {\n const modelFloor = this.rawData?.object_data?.floorIndex\n if (isNil(modelFloor)) {\n this.visibles[1] = true\n } else {\n this.visibles[1] = fiveCurrentfloor === null ? true : modelFloor === fiveCurrentfloor\n }\n }\n}\n","import type { Mode } from '@realsee/five-webgpu'\nimport type { ServerTrianglesItem } from '../typings'\nimport { ModelMakerBaseItem } from './baseItem'\n\n/**\n * @description 模型标注的多边形类型标注的构造参数类型\n */\ntype ModelMakerPolygonItemArgs = ConstructorParameters<typeof ModelMakerBaseItem<ServerTrianglesItem>>\n\n/**\n * @description 模型标注的多边形类型标注,即多边形\n * @extends ModelMakerBaseItem\n */\nexport class ModelMakerPolygonItem extends ModelMakerBaseItem<ServerTrianglesItem> {\n public constructor(...args: ModelMakerPolygonItemArgs) {\n super(...args)\n\n this.updatePanoIndex(this.five.state.panoIndex)\n this.updateMode(this.five.state.mode)\n this.enable()\n this.updateVisible()\n\n this.five.on('panoArrived', this.onPanoArrived)\n this.five.on('modeChange', this.onModeChange)\n this.disposers.push(() => {\n this.five.off('panoArrived', this.onPanoArrived)\n this.five.off('modeChange', this.onModeChange)\n })\n }\n\n public show() {\n this.updatePanoIndex(this.five.state.panoIndex)\n this.updateMode(this.five.state.mode)\n super.show()\n }\n\n private onPanoArrived = (panoIndex: number) => {\n this.updatePanoIndex(panoIndex)\n this.updateVisible()\n }\n\n private onModeChange = (mode: Mode) => {\n this.updateMode(mode)\n this.updateVisible()\n }\n\n private updatePanoIndex = (panoIndex: number) => {\n this.visibles[1] = this.rawData?.object_data?.panoIndex === panoIndex\n }\n\n private updateMode = (mode: Mode) => {\n this.visibles[2] = mode === 'Panorama'\n }\n}\n","import type ColoredMesh from '../../Sculpt/utils/three/ColoredMesh'\nimport { setObjectOriginSortBounds } from '../../shared-utils/three/setObjectOriginSortBounds'\n\n/** Keep saved ModelMaker object-origin order while retaining precise culling bounds. */\nexport function setModelSortBounds(model: ColoredMesh): void {\n setObjectOriginSortBounds(model.geometry, [model.meshFont, model.meshBackground])\n}\n","import { PolygonWithEdgeMesh } from '../../Sculpt/Meshes/PolygonWithEdge'\nimport type { AnyPositions } from '../../shared-utils/positionToVector3'\nimport { setModelSortBounds } from './setModelSortBounds'\n\n/** Saved ModelMaker polygons refresh face and edge sort keys after geometry changes. */\nexport class ModelMakerPolygonMesh extends PolygonWithEdgeMesh {\n public onSavedGeometryChange?: () => void\n\n public override setPoints(points: AnyPositions, params?: { closed?: boolean; checkLinesIntersect?: boolean }): void {\n super.setPoints(points, params)\n setModelSortBounds(this)\n this.line.lines.forEach(line => line.enableOriginSort())\n this.onSavedGeometryChange?.()\n }\n}\n","import { PrismMesh, type PrismData } from '../../Sculpt/Meshes/Prism'\nimport { setModelSortBounds } from './setModelSortBounds'\n\n/** Saved ModelMaker solids keep the old object-origin sort after in-place edits. */\nexport class ModelMakerPrismMesh extends PrismMesh {\n public onSavedGeometryChange?: () => void\n\n public override setPoints(params: Partial<PrismData>): void {\n super.setPoints(params)\n setModelSortBounds(this.prismMesh)\n this.edgeMesh.enableOriginSort()\n this.onSavedGeometryChange?.()\n }\n}\n","import { SRGBColorSpace } from 'three/webgpu'\nimport { vec4, workingToColorSpace } from 'three/tsl'\nimport { LineMaterial } from '../../shared-utils/three/core/LineMaterial'\n\n/** Private saved-annotation SDR output; arbitrary Sculpt lines remain linear. */\nexport class EncodedLineMaterial extends LineMaterial {\n public override customProgramCacheKey() {\n return super.customProgramCacheKey() + ':saved-annotation-encoded-sdr-v1'\n }\n\n public override setupOutput(...args: Parameters<LineMaterial['setupOutput']>) {\n const output = vec4(super.setupOutput(...args))\n // Keep Line2's generated coverage, dash/endcap discard and hardware alpha.\n // The old saved hex line wrote its raw sRGB uniform directly (its fragment\n // main did not call linearToOutputTexel). One OETF restores that same value.\n return vec4(vec4(workingToColorSpace(vec4(output.rgb, 1), SRGBColorSpace)).rgb, output.a)\n }\n}\n","import type { Material, Renderer } from 'three/webgpu'\n\n// Mirror the application's drawn PBM contribution contract. The parity test reads\n// the application function so an SDK change cannot silently diverge from it.\nexport type HDRMaterial = Material & {\n useHDR?: boolean\n modelAlpha?: number\n progress?: number\n maxDisplayBoost?: number\n pano0Map?: unknown\n pano1Map?: unknown\n pano0Gainmap?: unknown\n pano1Gainmap?: unknown\n pano0HdrCapacityMin?: number\n pano0HdrCapacityMax?: number\n pano1HdrCapacityMin?: number\n pano1HdrCapacityMax?: number\n pano0HdrMaxContentBoost?: number\n pano1HdrMaxContentBoost?: number\n}\n\nexport function hasHDRContribution(material: HDRMaterial): boolean {\n if (!material.useHDR || !material.pano0Map || !material.pano1Map || (material.modelAlpha ?? 1) >= 1) return false\n const progress = material.progress ?? 0\n return ([0, 1] as const).some((slot) => {\n if ((slot === 0 && progress >= 1) || (slot === 1 && progress <= 0)) return false\n const capacityMin = material[`pano${slot}HdrCapacityMin`] ?? 1\n const capacityMax = material[`pano${slot}HdrCapacityMax`] ?? 1\n return (\n !!material[`pano${slot}Gainmap`] &&\n capacityMin > 0 &&\n capacityMax > capacityMin &&\n (material.maxDisplayBoost ?? 1) > Math.max(1, capacityMin) &&\n (material[`pano${slot}HdrMaxContentBoost`] ?? 1) > 1\n )\n })\n}\n\nexport function hasHDROutput(renderer: Renderer): boolean {\n if ((renderer.backend as { isWebGPUBackend?: boolean }).isWebGPUBackend !== true) return false\n if (typeof window === 'undefined' || !window.matchMedia?.('(dynamic-range: high)').matches) return false\n const context = renderer.getContext() as unknown as {\n getConfiguration?: () => { format?: string; toneMapping?: { mode?: string } } | null\n }\n const configuration = context.getConfiguration?.()\n return configuration?.format === 'rgba16float' && configuration.toneMapping?.mode === 'extended'\n}\n","import * as THREE from 'three/webgpu'\nimport { colorSpaceToWorking, materialColor, materialOpacity, positionGeometry, screenUV, texture, vec4, workingToColorSpace } from 'three/tsl'\nimport { LineMaterial } from '../../shared-utils/three/core/LineMaterial'\nimport { EncodedLineMaterial } from './EncodedLineMaterial'\nimport { hasHDRContribution, hasHDROutput, type HDRMaterial } from './hdrContribution'\n\ntype Source = THREE.Mesh<THREE.BufferGeometry, THREE.MeshBasicMaterial | LineMaterial>\ntype Draw = NonNullable<ReturnType<THREE.Renderer['getRenderObjectFunction']>>\ntype Resource = { before: THREE.FramebufferTexture; after: THREE.FramebufferTexture; detach: () => void }\ntype Replacement = { original: Source['material']; material: THREE.MeshBasicNodeMaterial | EncodedLineMaterial }\n\nconst managers = new WeakMap<THREE.Renderer, SavedAnnotationColor>()\n\nfunction sourceKind(source: THREE.Object3D, effective?: THREE.Material): 'face' | 'line' | undefined {\n const mesh = source as Source\n const material = effective ?? mesh.material\n if (!mesh.isMesh || !material || Array.isArray(material) || material !== mesh.material ||\n material.blending !== THREE.NormalBlending || !material.transparent || material.premultipliedAlpha ||\n material.depthWrite || material.stencilWrite || material.clippingPlanes?.length || material.alphaTest !== 0 ||\n 'isSkinnedMesh' in source || 'isInstancedMesh' in source) return\n if (material instanceof LineMaterial) return 'line'\n const basic = material as THREE.MeshBasicMaterial\n if (basic.isMeshBasicMaterial && !basic.map && !basic.alphaMap && !basic.envMap && !basic.vertexColors && !basic.wireframe) return 'face'\n}\n\nfunction collectSources(models: readonly THREE.Object3D[]): Set<Source> {\n const sources = new Set<Source>()\n for (const model of models) model.traverse((node) => {\n const owned = node as THREE.Object3D & { meshBackground?: Source; line1?: Source; line2?: Source }\n // Background and occlusion-line identities can be detached. Registration\n // never makes them visible or reparents them into a separate render list.\n for (const source of [node, owned.meshBackground, owned.line1, owned.line2]) {\n if (source && sourceKind(source)) sources.add(source as Source)\n }\n })\n return sources\n}\n\nexport interface SavedAnnotationColorOwner {\n setModels(models: readonly THREE.Object3D[]): void\n clear(): void\n dispose(): void\n}\n\n/** One manager per physical renderer. Never exported from an SDK entry point. */\nexport class SavedAnnotationColor {\n readonly observation = {\n copies: 0, brackets: 0, encodedDraws: 0, linearDraws: 0, unsupportedDraws: 0,\n lateHDRDraws: 0, resourceDisposals: 0, materialDisposals: 0, disposed: false,\n }\n private readonly owners = new Map<object, { scene: THREE.Scene; sources: Set<Source> }>()\n private readonly sources = new Map<Source, number>()\n private readonly resources = new Map<THREE.RenderTarget, Resource>()\n private readonly replacements = new Map<Source, Replacement>()\n private readonly beforePlaceholder = new THREE.FramebufferTexture(1, 1)\n private readonly afterPlaceholder = new THREE.FramebufferTexture(1, 1)\n private readonly beforeNode = texture(this.beforePlaceholder, screenUV)\n private readonly afterNode = texture(this.afterPlaceholder, screenUV)\n private readonly encode = new THREE.MeshBasicNodeMaterial({ transparent: true, blending: THREE.NoBlending, depthTest: false, depthWrite: false, toneMapped: false, forceSinglePass: true, fog: false })\n private readonly decode = new THREE.MeshBasicNodeMaterial({ transparent: true, blending: THREE.NoBlending, depthTest: false, depthWrite: false, toneMapped: false, forceSinglePass: true, fog: false })\n private readonly quad = new THREE.Mesh(new THREE.PlaneGeometry(2, 2), this.encode)\n private readonly tail = new THREE.Group()\n private readonly sentinel = new THREE.Mesh(new THREE.PlaneGeometry(2, 2), new THREE.MeshBasicMaterial({ transparent: true, opacity: 0, colorWrite: true, depthWrite: false, depthTest: false, forceSinglePass: true, toneMapped: false }))\n private readonly previousRender: THREE.Renderer['render']\n private readonly wrappedRender: THREE.Renderer['render']\n private rendering = false\n private previousDraw: Draw | null = null\n private pendingDispose = false\n\n constructor(private readonly renderer: THREE.Renderer) {\n this.previousRender = renderer.render\n const manager = this\n this.wrappedRender = function (scene, camera) {\n const args = arguments\n const nativeRender = () => manager.previousRender.apply(this, args as unknown as Parameters<THREE.Renderer['render']>)\n if (manager.rendering) {\n // A callback may draw an unrelated scene into its own target. Do not let\n // that nested render inherit the outer annotation colour hook.\n const previous = renderer.getRenderObjectFunction()\n renderer.setRenderObjectFunction(manager.previousDraw)\n try { return nativeRender() } finally { renderer.setRenderObjectFunction(previous) }\n }\n if (manager.observation.disposed || !manager.hasScene(scene as THREE.Scene)) return nativeRender()\n return manager.render(scene as THREE.Scene, camera, nativeRender)\n }\n renderer.render = this.wrappedRender\n this.quad.frustumCulled = false\n this.quad.name = 'SavedAnnotationColorQuad'\n this.encode.vertexNode = this.decode.vertexNode = vec4(positionGeometry.xy, 0, 1)\n this.encode.fragmentNode = vec4(vec4(workingToColorSpace(vec4(this.beforeNode.rgb, 1), THREE.SRGBColorSpace)).rgb, 0)\n const after = this.afterNode, before = this.beforeNode\n const decoded = vec4(colorSpaceToWorking(vec4(after.rgb, 1), THREE.SRGBColorSpace))\n this.decode.fragmentNode = after.a.equal(0).select(before, vec4(decoded.rgb, after.a.add(before.a.mul(after.a.oneMinus()))))\n this.tail.name = 'SavedAnnotationColorTail'\n this.tail.renderOrder = this.sentinel.renderOrder = Infinity\n this.sentinel.frustumCulled = false\n this.tail.add(this.sentinel)\n }\n\n owner(scene: THREE.Scene): SavedAnnotationColorOwner {\n const key = {}\n this.owners.set(key, { scene, sources: new Set() })\n let disposed = false\n const clear = () => this.replace(key, new Set())\n return {\n setModels: (models) => { if (!disposed) this.replace(key, collectSources(models)) },\n clear: () => { if (!disposed) clear() },\n dispose: () => {\n if (disposed) return\n clear()\n disposed = true\n this.owners.delete(key)\n if (this.owners.size === 0) this.dispose()\n },\n }\n }\n\n private hasScene(scene: THREE.Scene) {\n return this.sources.size > 0 && [...this.owners.values()].some(owner => owner.scene === scene && owner.sources.size > 0)\n }\n\n private replace(key: object, next: Set<Source>) {\n const owner = this.owners.get(key)\n if (!owner) return\n for (const source of owner.sources) {\n if (next.has(source)) continue\n const count = this.sources.get(source)! - 1\n if (count > 0) this.sources.set(source, count)\n else {\n this.sources.delete(source)\n this.releaseMaterial(source)\n }\n }\n for (const source of next) {\n if (!owner.sources.has(source)) this.sources.set(source, (this.sources.get(source) ?? 0) + 1)\n }\n owner.sources = next\n if (this.sources.size === 0 && !this.rendering) for (const host of [...this.resources.keys()]) this.release(host)\n }\n\n private replacement(source: Source, kind: 'face' | 'line') {\n const original = source.material\n let cached = this.replacements.get(source)\n if (cached?.original !== original) {\n this.releaseMaterial(source)\n const material = kind === 'line' ? new EncodedLineMaterial() : new THREE.MeshBasicNodeMaterial({ transparent: true, toneMapped: false, fog: false })\n if (material instanceof EncodedLineMaterial) material.copy(original as LineMaterial)\n else material.fragmentNode = vec4(vec4(workingToColorSpace(vec4(materialColor, 1), THREE.SRGBColorSpace)).rgb, materialOpacity)\n cached = { original, material }\n this.replacements.set(source, cached)\n }\n const material = cached.material\n material.color.copy(original.color)\n material.opacity = original.opacity\n material.depthTest = original.depthTest\n material.depthWrite = original.depthWrite\n material.depthFunc = original.depthFunc\n material.side = original.side\n material.forceSinglePass = original.forceSinglePass\n material.colorWrite = original.colorWrite\n material.polygonOffset = original.polygonOffset\n material.polygonOffsetFactor = original.polygonOffsetFactor\n material.polygonOffsetUnits = original.polygonOffsetUnits\n material.alphaToCoverage = original.alphaToCoverage\n if (material instanceof EncodedLineMaterial && original instanceof LineMaterial) {\n material.linewidth = original.linewidth\n material.dashed = original.dashed\n material.worldUnits = original.worldUnits\n material.dashSize = original.dashSize\n material.gapSize = original.gapSize\n material.dashOffset = original.dashOffset\n material.scale = original.scale\n material.resolution.copy(original.resolution)\n }\n return material\n }\n\n private resource(): Resource | undefined {\n const renderer = this.renderer, host = renderer.getRenderTarget()\n if (!host || 'isRenderTarget3D' in host || 'isRenderTargetArray' in host || 'isWebGLCubeRenderTarget' in host ||\n renderer.getActiveMipmapLevel() !== 0 || renderer.getMRT() !== null || host.textures.length !== 1 ||\n host.texture.format !== THREE.RGBAFormat || host.texture.colorSpace !== THREE.NoColorSpace ||\n ![THREE.UnsignedByteType, THREE.HalfFloatType].includes(host.texture.type as never)) return\n let resource = this.resources.get(host)\n if (!resource) {\n const before = new THREE.FramebufferTexture(host.width, host.height)\n const after = new THREE.FramebufferTexture(host.width, host.height)\n before.source = new THREE.Source({ width: host.width, height: host.height })\n after.source = new THREE.Source({ width: host.width, height: host.height })\n const onDispose = () => this.release(host)\n host.addEventListener('dispose', onDispose)\n resource = { before, after, detach: () => host.removeEventListener('dispose', onDispose) }\n this.resources.set(host, resource)\n }\n for (const copy of [resource.before, resource.after]) {\n if (copy.image.width !== host.width || copy.image.height !== host.height || copy.type !== host.texture.type) {\n copy.source = new THREE.Source({ width: host.width, height: host.height })\n copy.needsUpdate = true\n }\n }\n this.beforeNode.value = resource.before\n this.afterNode.value = resource.after\n return resource\n }\n\n private render(scene: THREE.Scene, camera: THREE.Camera, nativeRender: () => ReturnType<THREE.Renderer['render']>) {\n const renderer = this.renderer\n // A packed depth override has no legacy colour contract.\n if (scene.overrideMaterial) return nativeRender()\n this.rendering = true\n const previous = renderer.getRenderObjectFunction()\n this.previousDraw = previous\n this.tail.layers.mask = this.sentinel.layers.mask = camera.layers.mask\n scene.add(this.tail)\n let active: Resource | undefined\n let hdr = false\n let encodedThisFrame = false\n let tailSeen = false\n const drawQuad = (material: THREE.MeshBasicNodeMaterial, args: Parameters<Draw>) => {\n this.quad.material = material\n renderer.renderObject(this.quad, args[1], args[2], this.quad.geometry, material, null, args[6], args[7], null)\n }\n const flush = (args: Parameters<Draw>) => {\n if (!active) return\n renderer.copyFramebufferToTexture(active.after)\n this.observation.copies++\n drawQuad(this.decode, args)\n active = undefined\n }\n const original = (args: Parameters<Draw>) => previous ? previous.call(renderer, ...args) : renderer.renderObject(...args)\n const hook: Draw = (...args) => {\n const source = args[0] as Source\n if (source === this.sentinel) tailSeen = true\n const registered = args[1] === scene && this.sources.has(source)\n const kind = registered && !scene.overrideMaterial ? sourceKind(source, args[4]) : undefined\n if (kind && !hdr && !tailSeen) {\n if (!active) {\n active = this.resource()\n if (active) {\n renderer.copyFramebufferToTexture(active.before)\n this.observation.copies++\n drawQuad(this.encode, args)\n this.observation.brackets++\n }\n }\n if (active) {\n const actual = [...args] as Parameters<Draw>\n actual[4] = this.replacement(source, kind)\n original(actual)\n this.observation.encodedDraws++\n encodedThisFrame = true\n return\n }\n this.observation.unsupportedDraws++\n }\n // A consumer's custom comparator can ignore native group/renderOrder.\n // Never leave a post-tail cohort encoded with no in-pass end marker.\n if (kind && !hdr && tailSeen) this.observation.unsupportedDraws++\n flush(args)\n original(args)\n if (registered) this.observation.linearDraws++\n // This draw has actually succeeded in this pass. A retained material, a\n // previous React status, query or requested useHDR alone cannot set hdr.\n if (args[1] === scene && !scene.overrideMaterial && hasHDRContribution(args[4] as HDRMaterial) && hasHDROutput(renderer)) {\n if (!hdr && encodedThisFrame) this.observation.lateHDRDraws++\n hdr = true\n }\n }\n renderer.setRenderObjectFunction(hook)\n try {\n return nativeRender()\n } finally {\n // Never submit a nested recovery render or copy outside an active pass.\n // The native tail flush is part of the original sorted render sequence.\n renderer.setRenderObjectFunction(previous)\n this.tail.removeFromParent()\n this.rendering = false\n this.previousDraw = null\n if (this.sources.size === 0) for (const host of [...this.resources.keys()]) this.release(host)\n if (this.pendingDispose) this.dispose()\n }\n }\n\n private releaseMaterial(source: Source) {\n const cached = this.replacements.get(source)\n if (!cached) return\n this.replacements.delete(source)\n cached.material.dispose()\n this.observation.materialDisposals++\n }\n\n private release(host: THREE.RenderTarget) {\n const resource = this.resources.get(host)\n if (!resource) return\n this.resources.delete(host)\n resource.detach()\n resource.before.dispose()\n resource.after.dispose()\n this.observation.resourceDisposals++\n }\n\n private dispose() {\n if (this.observation.disposed) return\n if (this.rendering) { this.pendingDispose = true; return }\n this.observation.disposed = true\n for (const host of [...this.resources.keys()]) this.release(host)\n for (const source of [...this.replacements.keys()]) this.releaseMaterial(source)\n this.beforePlaceholder.dispose()\n this.afterPlaceholder.dispose()\n this.encode.dispose()\n this.decode.dispose()\n this.quad.geometry.dispose()\n this.sentinel.geometry.dispose()\n this.sentinel.material.dispose()\n this.tail.removeFromParent()\n if (this.renderer.render === this.wrappedRender) this.renderer.render = this.previousRender\n if (managers.get(this.renderer) === this) managers.delete(this.renderer)\n }\n}\n\nexport function createSavedAnnotationColorOwner(renderer: THREE.Renderer, scene: THREE.Scene): SavedAnnotationColorOwner {\n let manager = managers.get(renderer)\n if (!manager) { manager = new SavedAnnotationColor(renderer); managers.set(renderer, manager) }\n return manager.owner(scene)\n}\n","import { AnimationFrameLoop, type Five, type Mode as FiveMode } from '@realsee/five-webgpu'\nimport type * as THREE from 'three/webgpu'\nimport * as BasePlugin from '../base/BasePluginWithData'\nimport { Vector3, Group, Color, Euler, Quaternion, Box3 } from 'three/webgpu'\nimport { ModelMakerBoxItem } from './item/boxItem'\nimport { PrismMesh } from '../Sculpt/Meshes/Prism'\nimport { anyPositionToVector3 } from '../shared-utils/positionToVector3'\nimport { PolygonWithEdgeMesh } from '../Sculpt/Meshes/PolygonWithEdge'\nimport type { LightTag } from '../shared-utils'\nimport { notNil } from '../shared-utils'\nimport { tagRendererMap as defaultTagRendererMap } from './utils/tagRenderer'\nimport { FiveDomEvents } from '../shared-utils/five/FiveDomEvents'\nimport { ModelMakerPrismItem } from './item/prismItem'\nimport { ModelMakerPolygonItem } from './item/polygonItem'\nimport { boxVertex } from '../shared-utils/three/boundingBox'\nimport { waitFiveModelLoaded } from '../shared-utils/five/fiveModelLoad'\nimport { fiveEveryReadyListener } from '../shared-utils/five/fiveEveryReadyListener'\nimport { sleep } from '../CruisePlugin/utils/sleep'\nimport { CONST } from '../shared-utils/constants'\nimport { ModelMakerPolygonMesh } from './utils/ModelMakerPolygonMesh'\nimport { ModelMakerPrismMesh } from './utils/ModelMakerPrismMesh'\nimport { createSavedAnnotationColorOwner, type SavedAnnotationColorOwner } from './rendering/SavedAnnotationColor'\nimport type { MarkerItem, State, ServerData, ItemType, ElementRenderer, EventMap, ServerItem } from './typings'\nimport type { ModelMakerPluginConfig, TagOcclusionScopeConfig } from './typings/config'\n\n/**\n * 盒子动画配置选项\n */\nexport interface BoxAnimationConfig {\n /** 动画颜色,默认为 #4DF0FF */\n color?: string\n /** 是否在动画期间隐藏标签并在完成后缓动显示,默认为 false */\n hideLabels?: boolean\n}\n\nexport class Controller extends BasePlugin.Controller<State, EventMap, ServerData, ServerData> {\n public state: State\n\n public items: MarkerItem[] = []\n\n public group = new Group()\n\n protected data?: ServerData\n\n private disposed = false\n\n private readonly onFiveDispose = () => this.dispose()\n\n private savedColorOwner?: SavedAnnotationColorOwner\n\n private readonly syncSavedColorSources = () => {\n const renderer = this.five.renderer\n if (!renderer || this.disposed) return\n this.savedColorOwner ??= createSavedAnnotationColorOwner(renderer, this.five.scene)\n this.savedColorOwner.setModels(this.items.map(item => item.model))\n }\n\n private labelAnimations = new Set<() => void>()\n\n private boxAnimationTokens = new WeakMap<MarkerItem, symbol>()\n\n private tagRendererMap: Partial<Record<ItemType, ElementRenderer>> = {}\n\n private itemRenderers = new WeakMap<MarkerItem, ElementRenderer>()\n\n private itemRendererDisposers = new WeakMap<MarkerItem, () => void>()\n\n private fiveDomEvents: FiveDomEvents\n\n private zFightingOffset = 0\n\n private tagWrapper: HTMLElement\n\n private occlusionVisibility: boolean | FiveMode[]\n\n private occlusionMode: 'translucence' | 'depthTest'\n\n private tagOcclusionScope: TagOcclusionScopeConfig\n\n private fiveEveryReadyListenerDisposer?: () => void\n\n // 存储每个模型的原始透明度\n private originalOpacities: Map<string, { opacity: number; lineOpacity: number }> = new Map()\n // 存储标签原始透明度\n private originalTagOpacities: Map<string, number> = new Map()\n // 存储当前高亮的项目\n private highlightedItem: MarkerItem | null = null\n // 存储标签原始样式用于高亮恢复\n private originalTagStyles: Map<string, { background: string; borderImage: string }> = new Map()\n // 存储模型原始颜色用于高亮恢复(包括表面颜色、线条颜色和透明度)\n private originalModelColors: Map<string, { color: any; lineColor: any; opacity: number; lineOpacity: number }> = new Map()\n\n public constructor(five: Five, config?: ModelMakerPluginConfig) {\n super(five)\n\n this.group.name = 'ModelMakerPluginGroup'\n this.state = { enabled: true, visible: true }\n this.occlusionVisibility = config?.occlusionVisibility ?? false\n this.occlusionMode = config?.occlusionMode ?? 'translucence'\n this.tagOcclusionScope = config?.tagOcclusionScope ?? {}\n this.fiveDomEvents = new FiveDomEvents(five, { noEmitWhenHide: true, noEmitWhenNotInScene: true })\n\n this.tagWrapper = (() => {\n const dom = document.createElement('div')\n dom.style.position = 'absolute'\n dom.style.top = '0'\n dom.style.left = '0'\n dom.style.width = '100%'\n dom.style.height = '100%'\n dom.style.pointerEvents = 'none'\n dom.style.zIndex = `${config?.tagContainerZIndex ?? ''}`\n return dom\n })()\n\n five.scene.add(this.group)\n this.handleEnable()\n five.once('dispose', this.onFiveDispose)\n }\n\n public async load(serverData: ServerData) {\n if (this.disposed) return\n this.clear()\n this.data = serverData\n\n // 清空原始透明度缓存\n this.originalOpacities.clear()\n // 清空高亮状态\n this.resetHighlight()\n\n await waitFiveModelLoaded(this.five)\n\n // 异步后需要检验数据是否发生变化(多次调用load的情况)\n if (this.disposed || this.data !== serverData) return\n\n this.clear()\n\n const setItemStyle = (item: ServerItem) => {\n const color = item.object_data.color ? new Color().setHex(parseInt(item.object_data.color.slice(1), 16)) : new Color(1, 1, 1)\n\n let occlusionVisibility = typeof this.occlusionVisibility === 'boolean' ? this.occlusionVisibility : false\n let occlusionMode = this.occlusionMode\n if (item.type === 'triangles') {\n occlusionVisibility = true\n occlusionMode = 'depthTest'\n }\n\n // 获取原始透明度并存储\n const originalOpacity = (item.object_data.opacity ?? 0.4) / 2\n if (item.id) {\n this.originalOpacities.set(item.id.toString(), {\n opacity: originalOpacity,\n lineOpacity: 1,\n })\n }\n\n return {\n color: color,\n lineColor: color,\n opacity: originalOpacity,\n lineOpacity: 1,\n lineWidth: 1,\n occlusionVisibility,\n occlusionMode,\n }\n }\n\n this.items = serverData.list\n .map((item) => {\n switch (item.type) {\n case 'triangles': {\n const object = new ModelMakerPolygonMesh()\n if (notNil(item.id)) object.uuid = item.id.toString()\n\n object.setPoints(item.object_data.points, { checkLinesIntersect: false })\n object.setStyle(setItemStyle(item))\n\n this.fiveDomEvents.addEventListener(object, 'hover', () => object.highlight())\n this.fiveDomEvents.addEventListener(object, 'unHover', () => object.unhighlight())\n\n const modelMakerItem = new ModelMakerPolygonItem({\n five: this.five,\n tagWrapper: this.tagWrapper,\n model: object,\n group: this.group,\n type: item.type,\n rawData: item,\n fiveDomEvents: this.fiveDomEvents,\n tagOcclusionScope: this.tagOcclusionScope[item.type],\n })\n\n return modelMakerItem\n }\n case 'prism': {\n // ============================ 棱柱 ============================\n const object = new ModelMakerPrismMesh()\n if (notNil(item.id)) object.uuid = item.id.toString()\n\n this.zFightingOffset += CONST.Z_FIGHTING_OFFSET\n const bottomPoints = item.object_data.points.map((p) => [p[0], p[1] + (item.object_data.fixedY ?? 0), p[2]])\n bottomPoints.push(bottomPoints[0])\n // 标注高度\n const height = item.object_data.height + (item.object_data.fixedHeight ?? 0) + this.zFightingOffset\n const heightPoint = anyPositionToVector3(bottomPoints[0]).add(new Vector3().setY(height))\n\n object.setPoints({ points: bottomPoints, heightPoint })\n object.setStyle(setItemStyle(item))\n\n const modelMakerItem = new ModelMakerPrismItem({\n five: this.five,\n tagWrapper: this.tagWrapper,\n model: object,\n group: this.group,\n type: item.type,\n rawData: item,\n fiveDomEvents: this.fiveDomEvents,\n tagOcclusionScope: this.tagOcclusionScope[item.type],\n })\n\n return modelMakerItem\n }\n case 'box': {\n const object = new ModelMakerPrismMesh({ five: this.five })\n if (notNil(item.id)) object.uuid = item.id.toString()\n\n // 抄 saas c 的\n const { start, end, rotation = [0, 0, 0, 'XYZ'] } = item.object_data\n const startVertex = new Vector3().fromArray(start)\n const endVertex = new Vector3().fromArray(end)\n const euler = new Euler().fromArray(rotation as THREE.EulerTuple)\n const quaternion = new Quaternion().setFromEuler(euler)\n const invertedQuaternion = quaternion.clone().invert()\n const center = new Vector3().lerpVectors(startVertex, endVertex, 0.5)\n const negatedPositionTransform = center.clone().negate()\n const originStartVertex = startVertex.clone().add(negatedPositionTransform).applyQuaternion(invertedQuaternion)\n const originEndVertex = endVertex.clone().add(negatedPositionTransform).applyQuaternion(invertedQuaternion)\n const box3 = new Box3(originStartVertex.clone().max(originEndVertex), originStartVertex.clone().min(originEndVertex))\n\n object.setPoints({\n points: [boxVertex(box3, 2), boxVertex(box3, 3), boxVertex(box3, 7), boxVertex(box3, 6)],\n heightPoint: boxVertex(box3, 1),\n })\n object.position.copy(center)\n object.quaternion.copy(quaternion)\n object.setStyle(setItemStyle(item))\n\n const modelMakerItem = new ModelMakerBoxItem({\n five: this.five,\n tagWrapper: this.tagWrapper,\n model: object,\n group: this.group,\n type: item.type,\n rawData: item,\n fiveDomEvents: this.fiveDomEvents,\n tagOcclusionScope: this.tagOcclusionScope[item.type],\n })\n\n return modelMakerItem\n }\n default: {\n return null\n }\n }\n })\n .filter(Boolean)\n\n this.items.forEach(({ model }) => {\n if (model instanceof ModelMakerPolygonMesh || model instanceof ModelMakerPrismMesh) {\n model.onSavedGeometryChange = this.syncSavedColorSources\n }\n })\n this.syncSavedColorSources()\n\n this.state.enabled ? this.handleEnable() : this.handleDisable()\n this.state.visible ? this.handleShow() : this.handleHide()\n this.updateTagRenderer()\n\n this.hooks.emit('dataLoaded', serverData)\n this.five.needsRender = true\n }\n\n public setState(targetState: Partial<State>): void {\n if (this.disposed) return\n if (notNil(targetState.enabled) && this.state.enabled !== targetState.enabled) {\n this.state.enabled = targetState.enabled\n targetState.enabled ? this.handleEnable() : this.handleDisable()\n this.hooks.emit(targetState.enabled ? 'enable' : 'disable', { userAction: '我不知道捏' as unknown as boolean })\n this.hooks.emit('stateChange', { state: this.state, userAction: '我不知道捏' as unknown as boolean })\n }\n\n if (notNil(targetState.visible) && this.state.visible !== targetState.visible) {\n this.state.visible = targetState.visible\n targetState.visible ? this.handleShow() : this.handleHide()\n this.hooks.emit(targetState.visible ? 'show' : 'hide', { userAction: '我不知道捏' as unknown as boolean })\n this.hooks.emit('stateChange', { state: this.state, userAction: '我不知道捏' as unknown as boolean })\n }\n }\n\n public getItemById(id: string | number) {\n return this.items.find((item) => item.rawData.id === id)\n }\n\n public registerTagRenderer(map: Partial<Record<ItemType, ElementRenderer>>) {\n this.tagRendererMap = { ...this.tagRendererMap, ...map }\n this.updateTagRenderer()\n }\n\n public hasCustomTagRenderer(map: ItemType) {\n return Boolean(this.tagRendererMap[map])\n }\n\n /**\n * Force finish all active box animations immediately\n * @param id Optional box item ID. If not provided, finishes all active box animations.\n * @param restoreLabels Whether to restore labels immediately. Defaults to true.\n */\n public forceFinishBoxAnimation(id?: string | number, restoreLabels: boolean = true): void {\n // Find the items that need to be force finished\n let targetItems: MarkerItem[] = []\n \n if (id) {\n // Force finish animation for specific box\n const item = this.getItemById(id)\n if (item && ['box', 'prism'].includes(item.type)) {\n targetItems = [item]\n this.boxAnimationTokens.delete(item)\n const model = item.model as PrismMesh\n model.forceFinishBoxAnimation(id)\n }\n } else {\n // Force finish animations for all box items\n targetItems = this.items.filter((item) => ['box', 'prism'].includes(item.type))\n targetItems.forEach((item) => {\n this.boxAnimationTokens.delete(item)\n const model = item.model as PrismMesh\n model.forceFinishBoxAnimation(item.rawData.id)\n })\n }\n\n // Restore labels immediately when force finishing if requested\n if (restoreLabels) {\n targetItems.forEach((item) => {\n if (item.tag) {\n item.tag.show()\n item.tag.container.style.opacity = '1'\n }\n })\n }\n\n this.five.needsRender = true\n }\n\n /**\n * Play the up-and-down animation for a box mesh\n * @param id Optional box item ID. If not provided, plays animation for all box items.\n * @param config Animation configuration options\n * @returns Promise that resolves when all animations are complete\n */\n public playBoxAnimation(id?: string | number, config: BoxAnimationConfig = {}): Promise<void> {\n // Destructure config with default values\n const { color = '#4DF0FF', hideLabels = false } = config\n\n // Force finish any existing animations first\n this.forceFinishBoxAnimation(id)\n\n // Find the box items to animate\n const targetItems = id ? [this.getItemById(id)].filter(Boolean) : this.items.filter((item) => ['box', 'prism'].includes(item.type))\n\n if (targetItems.length === 0) {\n console.warn('No box items found to animate')\n return Promise.resolve()\n }\n\n const animationToken = Symbol()\n targetItems.forEach((item) => this.boxAnimationTokens.set(item, animationToken))\n\n // Hide labels before starting animation if requested\n if (hideLabels) {\n this.hideItemLabels(targetItems)\n }\n\n // Collect all animation promises\n const animationPromises = targetItems.map((item) => {\n if (!item || !['box', 'prism'].includes(item.type)) return Promise.resolve()\n\n const model = item.model as PrismMesh\n return model.playBoxAnimation(item.rawData.id, color)\n })\n\n // Wait for all animations to complete\n return Promise.all(animationPromises).then(() => {\n // Ease labels back in if they were hidden\n if (hideLabels && targetItems.every((item) => this.items.includes(item) && this.boxAnimationTokens.get(item) === animationToken)) {\n return this.easeInItemLabels(targetItems)\n }\n })\n }\n\n public enable() {\n this.setState({ enabled: true })\n }\n\n public disable() {\n this.setState({ enabled: false })\n }\n\n public show() {\n this.setState({ visible: true })\n }\n\n public hide() {\n this.setState({ visible: false })\n }\n\n public clear() {\n // Remove cache ownership before disposing the original scene resources.\n this.savedColorOwner?.clear()\n // Also invalidate a load waiting for Five's model, without changing enabled/visible state.\n this.data = undefined\n this.labelAnimations.forEach((stop) => stop())\n this.labelAnimations.clear()\n this.zFightingOffset = 0\n this.handleDisable()\n this.items.forEach((item) => {\n if (item.model instanceof ModelMakerPolygonMesh || item.model instanceof ModelMakerPrismMesh) {\n item.model.onSavedGeometryChange = undefined\n }\n this.itemRendererDisposers.get(item)?.()\n item.disable()\n item.tag.destroy()\n if (item.model instanceof PrismMesh) item.model.disposeAnimation()\n this.fiveDomEvents.removeEventListener(item.model)\n // ColoredMesh owns a detached background mesh as well as its visible front.\n const geometries = new Set<THREE.BufferGeometry>()\n const materials = new Set<THREE.Material>()\n item.model.traverse((node) => {\n const colored = node as THREE.Object3D & { meshBackground?: THREE.Mesh }\n for (const mesh of [node as THREE.Mesh, colored.meshBackground]) {\n if (mesh?.geometry && !(mesh.geometry as THREE.BufferGeometry & { isBlank?: boolean }).isBlank) geometries.add(mesh.geometry)\n const ownedMaterials = mesh?.material ? Array.isArray(mesh.material) ? mesh.material : [mesh.material] : []\n ownedMaterials.forEach((material) => materials.add(material))\n }\n })\n geometries.forEach((geometry) => geometry.dispose())\n materials.forEach((material) => material.dispose())\n })\n this.group.clear()\n this.five.needsRender = true\n this.items = []\n this.tagWrapper.innerHTML = ''\n this.fiveDomEvents.clear()\n // 清空所有缓存\n this.originalOpacities.clear()\n this.originalTagOpacities.clear()\n // 清空高亮相关缓存\n this.highlightedItem = null\n this.originalTagStyles.clear()\n this.originalModelColors.clear()\n }\n\n /**\n * 设置所有模型的透明度\n * @param opacityPercent 透明度系数,范围0-1,1表示保持原始透明度,0表示完全透明\n * @param options 可选参数\n * @param options.type 模型类型,可选值为'box'、'prism'、'triangles'\n * @param options.id 模型id\n */\n public setModelsOpacity(opacityPercent: number, options?: { type?: ItemType | ItemType[]; id?: number }): void {\n if (!this.state.enabled) return\n const { type, id } = options || {}\n\n // 如果type存在,则转换为数组;否则设为空数组\n const itemTypes = type ? (Array.isArray(type) ? type : [type]) : []\n\n // 如果传入1的透明度,恢复所有标签原始透明度\n const isRestoringOpacity = opacityPercent === 1\n\n for (const item of this.items) {\n // 如果type为空或者type包含item.type或者id匹配,则处理该模型\n const isMatch = !type || itemTypes.includes(item.type) || item.rawData.id === id\n if (isMatch) {\n switch (item.type) {\n case 'box':\n case 'prism': {\n this.setPrismModelOpacity(item.rawData.id, item.model as PrismMesh, opacityPercent)\n break\n }\n case 'triangles': {\n this.setPolygonModelOpacity(item.rawData.id, item.model as PolygonWithEdgeMesh, opacityPercent)\n break\n }\n }\n\n // 同时设置对应标签的透明度\n if (item.tag) {\n // 只检查标签的visible属性,不检查visibles数组\n // 因为即使visibles数组中有false值,visible为true的标签也应该能调整透明度\n if (!item.tag.visible) {\n continue\n }\n\n const itemId = item.rawData.id.toString()\n\n if (isRestoringOpacity) {\n // 恢复原始透明度(如果有存储)\n const originalOpacity = this.originalTagOpacities.get(itemId)\n if (originalOpacity !== undefined) {\n item.tag.container.style.opacity = originalOpacity.toString()\n }\n // 如果没有存储原始值,保持当前透明度\n } else {\n // 存储原始透明度(如果没有存储过)\n if (!this.originalTagOpacities.has(itemId)) {\n const currentOpacity = parseFloat(item.tag.container.style.opacity) || 1\n this.originalTagOpacities.set(itemId, currentOpacity)\n }\n\n // 计算新的透明度:原始透明度 * 系数\n const originalOpacity = this.originalTagOpacities.get(itemId) || 1\n const newOpacity = originalOpacity * opacityPercent\n\n // 设置新的透明度\n item.tag.container.style.opacity = newOpacity.toString()\n }\n\n // 当透明度接近0时禁用鼠标事件\n const currentOpacity = parseFloat(item.tag.container.style.opacity) || 0\n if (currentOpacity < 0.01) {\n item.tag.container.style.pointerEvents = 'none'\n } else {\n item.tag.container.style.pointerEvents = 'auto'\n }\n }\n }\n }\n\n this.five.needsRender = true\n }\n\n /**\n * 隐藏指定类型的模型\n * @param itemTypes 模型类型数组\n */\n public hideItemsByType(itemTypes: ItemType[] | ItemType) {\n const itemTypesArray = Array.isArray(itemTypes) ? itemTypes : [itemTypes]\n this.items.forEach((item) => {\n if (itemTypesArray.includes(item.type)) {\n item.hide()\n }\n })\n }\n\n /**\n * 显示指定类型的模型\n * @param itemTypes 模型类型数组\n */\n public showItemsByType(itemTypes: ItemType[] | ItemType) {\n const itemTypesArray = Array.isArray(itemTypes) ? itemTypes : [itemTypes]\n this.items.forEach((item) => {\n if (itemTypesArray.includes(item.type)) {\n item.show()\n }\n })\n }\n\n /**\n * 根据条件隐藏模型项目\n * @param condition 判断函数,返回 true 的项目将被隐藏\n * @example\n * // 隐藏所有 ID 大于 10 的项目\n * controller.hideItemsByCondition(item => item.rawData.id > 10)\n * \n * // 隐藏所有红色的盒子\n * controller.hideItemsByCondition(item => \n * item.type === 'box' && item.rawData.object_data.color === '#FF0000'\n * )\n */\n public hideItemsByCondition(condition: (item: MarkerItem) => boolean): void {\n this.items.forEach((item) => {\n if (condition(item)) {\n item.hide()\n item.tag.disable()\n }\n })\n }\n\n /**\n * 根据条件显示模型项目\n * @param condition 判断函数,返回 true 的项目将被显示\n * @example\n * // 显示所有棱柱类型的项目\n * controller.showItemsByCondition(item => item.type === 'prism')\n * \n * // 显示所有透明度大于 0.5 的项目\n * controller.showItemsByCondition(item => \n * (item.rawData.object_data.opacity ?? 0.4) > 0.5\n * )\n */\n public showItemsByCondition(condition: (item: MarkerItem) => boolean): void {\n this.items.forEach((item) => {\n if (condition(item)) {\n item.show()\n item.tag.enable()\n }\n })\n }\n\n /**\n * 根据条件设置模型项目的可见性\n * @param condition 判断函数,返回 true 的项目将应用指定的可见性状态\n * @param visible 是否可见,true 为显示,false 为隐藏\n * @example\n * // 隐藏所有小于指定面积的项目\n * controller.setItemsVisibility(item => getItemArea(item) < 100, false)\n * \n * // 显示所有包含特定标签的项目\n * controller.setItemsVisibility(item => \n * item.rawData.label?.includes('important'), true\n * )\n */\n public setItemsVisibility(condition: (item: MarkerItem) => boolean, visible: boolean): void {\n this.items.forEach((item) => {\n if (condition(item)) {\n visible ? item.show() : item.hide()\n visible ? item.tag.enable() : item.tag.disable()\n }\n })\n }\n\n /**\n * 显示所有模型项目\n * @example\n * // 恢复所有项目的可见性\n * controller.showAllItems()\n */\n public showAllItems(): void {\n this.items.forEach((item) => {\n item.show()\n item.tag.enable()\n })\n }\n\n /**\n * 隐藏所有模型项目\n * @example\n * // 隐藏所有项目\n * controller.hideAllItems()\n */\n public hideAllItems(): void {\n this.items.forEach((item) => {\n item.hide()\n item.tag.disable()\n })\n }\n\n public dispose() {\n if (this.disposed) return\n this.disposed = true\n this.five.off('dispose', this.onFiveDispose)\n this.hooks.emit('dispose')\n this.resetHighlight()\n this.clear()\n this.savedColorOwner?.dispose()\n this.savedColorOwner = undefined\n this.fiveDomEvents.dispose()\n }\n\n protected onWorkCodeChange() {\n this.group.matrix.copy(this.workUtil.transform.clone())\n this.group.matrix.decompose(this.group.position, this.group.quaternion, this.group.scale)\n this.group.updateMatrixWorld()\n }\n\n /**\n * 应用高亮样式到指定项目\n * @param item 要高亮的项目\n * @param color 高亮颜色\n */\n private applyHighlightStyles(item: MarkerItem, color: string): void {\n const itemId = item.rawData.id.toString()\n const container = item.tag.container\n\n // 1. 处理标签样式\n let targetElement: HTMLElement | null = null\n\n if (item.type === 'prism') {\n // 棱柱类型使用 LabelItem 组件,查找 .room-label-item__text 元素\n targetElement = container.querySelector('.room-label-item__text') as HTMLElement\n } else if (item.type === 'box') {\n // 盒子类型使用 Text 组件,查找 .model-maker-tag 元素\n targetElement = container.querySelector('.model-maker-tag') as HTMLElement\n }\n\n if (targetElement) {\n // 存储原始标签样式\n const computedStyle = window.getComputedStyle(targetElement)\n this.originalTagStyles.set(itemId, {\n background: targetElement.style.background || computedStyle.background,\n borderImage: targetElement.style.borderImage || computedStyle.borderImage,\n })\n\n // 应用高亮标签样式\n targetElement.style.background = color\n targetElement.style.borderImage = 'none'\n }\n\n // 2. 处理模型表面和线条样式\n const model = item.model as PrismMesh | PolygonWithEdgeMesh\n if (model && typeof model.setStyle === 'function') {\n // 获取当前颜色(从原始数据或默认值)\n const currentColor = item.rawData.object_data.color \n ? new Color().setHex(parseInt(item.rawData.object_data.color.slice(1), 16))\n : new Color(1, 1, 1)\n\n // 获取当前透明度值\n const originalOpacityData = this.originalOpacities.get(itemId) || { opacity: 0.2, lineOpacity: 1 }\n\n // 存储原始表面颜色、线条颜色和透明度\n this.originalModelColors.set(itemId, {\n color: currentColor.clone(),\n lineColor: currentColor.clone(),\n opacity: originalOpacityData.opacity,\n lineOpacity: originalOpacityData.lineOpacity\n })\n\n // 创建高亮颜色对象\n const highlightColor = new Color(color)\n\n // 应用高亮颜色到表面和线条,并增加表面透明度使其更明显\n model.setStyle({\n color: highlightColor,\n lineColor: highlightColor,\n opacity: originalOpacityData.opacity, // 确保高亮时表面足够可见\n lineOpacity: originalOpacityData.lineOpacity\n })\n }\n\n this.five.needsRender = true\n }\n\n /**\n * 移除指定项目的高亮样式\n * @param item 要移除高亮的项目\n */\n private removeHighlightStyles(item: MarkerItem): void {\n const itemId = item.rawData.id.toString()\n const container = item.tag.container\n\n // 1. 恢复标签样式\n const originalStyles = this.originalTagStyles.get(itemId)\n if (originalStyles) {\n // 根据项目类型查找对应的标签元素\n let targetElement: HTMLElement | null = null\n\n if (item.type === 'prism') {\n targetElement = container.querySelector('.room-label-item__text') as HTMLElement\n } else if (item.type === 'box') {\n targetElement = container.querySelector('.model-maker-tag') as HTMLElement\n }\n\n if (targetElement) {\n // 恢复原始标签样式\n targetElement.style.background = originalStyles.background\n targetElement.style.borderImage = originalStyles.borderImage\n }\n\n // 清除缓存的原始标签样式\n this.originalTagStyles.delete(itemId)\n }\n\n // 2. 恢复模型表面和线条样式\n const originalModelColors = this.originalModelColors.get(itemId)\n if (originalModelColors) {\n const model = item.model as PrismMesh | PolygonWithEdgeMesh\n if (model && typeof model.setStyle === 'function') {\n // 恢复原始表面颜色、线条颜色和透明度\n model.setStyle({\n color: originalModelColors.color,\n lineColor: originalModelColors.lineColor,\n opacity: originalModelColors.opacity,\n lineOpacity: originalModelColors.lineOpacity\n })\n }\n\n // 清除缓存的原始模型颜色\n this.originalModelColors.delete(itemId)\n }\n\n this.five.needsRender = true\n }\n\n /**\n * 设置棱柱体模型的透明度\n * @param id 模型id\n * @param model 模型对象\n * @param opacityPercent 透明度系数,范围0-1\n */\n private setPrismModelOpacity(id: number, model: PrismMesh, opacityPercent: number): void {\n let { opacity, lineOpacity } = this.originalOpacities.get(id.toString()) || { opacity: 0.2, lineOpacity: 1 }\n opacity = opacity * opacityPercent\n lineOpacity = lineOpacity * opacityPercent\n model.setStyle({ opacity, lineOpacity })\n }\n\n /**\n * 设置多边形模型的透明度\n * @param id 模型id\n * @param model 模型对象\n * @param opacityPercent 透明度系数,范围0-1\n */\n private setPolygonModelOpacity(id: number, model: PolygonWithEdgeMesh, opacityPercent: number): void {\n // 设置主体透明度和线框透明度\n let { opacity, lineOpacity } = this.originalOpacities.get(id.toString()) || { opacity: 0.2, lineOpacity: 1 }\n opacity = opacity * opacityPercent\n lineOpacity = lineOpacity * opacityPercent\n model.setStyle({ opacity, lineOpacity })\n }\n\n private onFiveModeChange = (mode: FiveMode) => {\n const occlusionVisibility = this.occlusionVisibility\n\n if (Array.isArray(occlusionVisibility)) {\n const items = [...this.getPrismItems(), ...this.getBoxItems()]\n items.forEach((item) => {\n // 检查模型是否为PrismMesh或PolygonWithEdgeMesh类型,这些类型有setStyle方法\n if (item.model instanceof PrismMesh || item.model instanceof PolygonWithEdgeMesh) {\n item.model.setStyle({ occlusionVisibility: occlusionVisibility.includes(mode) })\n }\n })\n }\n }\n\n private handleShow() {\n this.group.visible = true\n this.tagWrapper.style.display = 'block'\n this.five.needsRender = true\n }\n\n private handleHide() {\n this.group.visible = false\n this.tagWrapper.style.display = 'none'\n this.five.needsRender = true\n }\n\n private handleEnable = () => {\n this.five.scene.add(this.group)\n this.five.getElement()?.parentElement?.appendChild(this.tagWrapper)\n this.five.needsRender = true\n\n this.onFiveModeChange(this.five.getCurrentState().mode)\n this.onFiveEveryReady()\n this.five.on('modeChange', this.onFiveModeChange)\n this.fiveEveryReadyListenerDisposer = fiveEveryReadyListener(this.five, this.onFiveEveryReady)\n }\n\n private handleDisable = () => {\n this.five.scene.remove(this.group)\n this.tagWrapper.remove()\n this.five.needsRender = true\n\n this.five.off('modeChange', this.onFiveModeChange)\n this.fiveEveryReadyListenerDisposer?.()\n this.fiveEveryReadyListenerDisposer = undefined\n }\n\n private onFiveEveryReady = async () => {\n if (this.five.state.mode === 'Panorama') return\n\n const allTags = this.items.filter((item) => item instanceof ModelMakerPrismItem).map((item) => item.tag)\n\n const tags = allTags.filter((tag) => tag.position && tag.visible && tag.enabled)\n\n await sleep(0)\n\n const cameraPosition = this.five.camera.position.clone()\n const sortedTags = tags.sort((a, b) => cameraPosition.distanceTo(a.position) - cameraPosition.distanceTo(b.position))\n\n const canShowTags: { tag: LightTag; boundingClientRect: DOMRect }[] = []\n\n const domRectIsIntersect = (a: DOMRect, b: DOMRect) => {\n const notIntersect = a.right < b.left || a.left > b.right || a.bottom < b.top || a.top > b.bottom\n return !notIntersect\n }\n\n allTags.forEach((tag) => {\n tag.visibles[2] = undefined\n })\n\n sortedTags.forEach((tag) => {\n if (tag.visibles[1] === false) {\n return\n }\n\n const mainDom = tag.container.getElementsByClassName('room-label-item__text')[0]\n\n if (!mainDom) {\n return\n }\n\n const domRect = mainDom.getBoundingClientRect()\n const canShow = canShowTags.every((item) => !domRectIsIntersect(item.boundingClientRect, domRect))\n\n if (canShow) {\n canShowTags.push({ tag, boundingClientRect: domRect })\n tag.visibles[2] = true\n } else {\n tag.visibles[2] = false\n }\n\n tag.needsRender = true\n })\n }\n\n private updateTagRenderer = () => {\n this.items.forEach((item) => {\n const renderer = (this.tagRendererMap[item.type] ?? defaultTagRendererMap[item.type]) as ElementRenderer\n\n if (renderer && this.itemRenderers.get(item) !== renderer) {\n this.itemRenderers.set(item, renderer)\n\n // 销毁上一个 renderer\n this.itemRendererDisposers.get(item)?.()\n item.tag.container.innerHTML = '' // 鞭尸防止复活\n this.itemRendererDisposers.set(item, renderer(item.tag.container, item, this.five))\n }\n })\n }\n\n /**\n * 高亮指定的模型项目\n * @param id 模型项目的ID\n * @param color 高亮颜色,默认为 #FF7700\n */\n public highlightItem(id: string | number, color: string = '#FF7700'): void {\n if (!this.state.enabled) return\n\n // 先重置当前高亮\n this.resetHighlight()\n\n // 查找要高亮的项目\n const item = this.getItemById(id)\n if (!item || !item.tag) return\n\n // 存储当前高亮项目\n this.highlightedItem = item\n\n // 应用高亮样式\n this.applyHighlightStyles(item, color)\n }\n\n /**\n * 重置所有高亮\n */\n public resetHighlight(): void {\n if (this.highlightedItem) {\n this.removeHighlightStyles(this.highlightedItem)\n this.highlightedItem = null\n }\n }\n\n /**\n * 获取当前高亮的项目ID\n */\n public getHighlightedItemId(): string | number | null {\n return this.highlightedItem?.rawData.id ?? null\n }\n\n public getPrismItems() {\n return this.items.filter((item) => item instanceof ModelMakerPrismItem)\n }\n\n public getPolygonItems() {\n return this.items.filter((item) => item instanceof ModelMakerPolygonItem)\n }\n\n public getBoxItems() {\n return this.items.filter((item) => item instanceof ModelMakerBoxItem)\n }\n\n /**\n * 隐藏指定项目的标签\n * @param items 要隐藏标签的项目数组\n */\n private hideItemLabels(items: MarkerItem[]): void {\n items.forEach((item) => {\n if (item.tag) {\n item.tag.hide()\n }\n })\n }\n\n /**\n * 缓动显示指定项目的标签\n * @param items 要显示标签的项目数组\n * @param duration 缓动持续时间(毫秒)\n */\n private easeInItemLabels(items: MarkerItem[], duration: number = 500): Promise<void> {\n return new Promise((resolve) => {\n // 如果没有项目或插件未启用,直接返回\n if (items.length === 0 || !this.state.enabled) {\n resolve()\n return\n }\n\n // 立即显示标签但设置为完全透明\n items.forEach((item) => {\n if (item.tag) {\n item.tag.show()\n item.tag.container.style.opacity = '0'\n }\n })\n\n const startTime = Date.now()\n let frame: number\n const finish = () => {\n cancelAnimationFrame(frame)\n this.labelAnimations.delete(finish)\n resolve()\n }\n this.labelAnimations.add(finish)\n const animate = () => {\n const elapsed = Date.now() - startTime\n const progress = Math.min(elapsed / duration, 1)\n \n // 使用缓动函数(ease-out)\n const easeProgress = 1 - Math.pow(1 - progress, 3)\n\n items.forEach((item) => {\n if (item.tag) {\n item.tag.container.style.opacity = easeProgress.toString()\n }\n })\n\n if (progress < 1) {\n frame = requestAnimationFrame(animate)\n } else {\n // 动画结束,确保最终状态\n items.forEach((item) => {\n if (item.tag) {\n item.tag.container.style.opacity = '1'\n }\n })\n finish()\n }\n }\n\n frame = requestAnimationFrame(animate)\n })\n }\n}\n","import type * as ModelMakerPluginType from './typings'\nimport { Controller } from './Controller'\nimport type { BoxAnimationConfig } from './Controller'\nimport type { ModelMakerPluginConfig, TagOcclusionScope, TagOcclusionScopeConfig } from './typings/config'\n\nexport const ModelMakerPlugin = (...args: ConstructorParameters<typeof Controller>) => new Controller(...args)\n\nexport type { Controller as ModelMakerPluginInstance }\nexport type { ModelMakerPluginType }\nexport type { BoxAnimationConfig }\nexport type { ModelMakerPluginConfig, TagOcclusionScope, TagOcclusionScopeConfig }\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"model-maker-B1mnDdKY.js","names":["Subscribe","$.from_html","$.prop","$.comment","$.first_child","$.only_child","$.set_text","TextSvelte","BasePlugin.Controller","defaultTagRendererMap","Subscribe$1","setObjectOriginSortBounds","tag","fiveEveryReadyListener","waitFiveModelLoaded","anyPositionToVector3","notNil","isNil","FiveDomEvents","LineMaterial","boxVertex","boundingBox","Controller$1","if_block","template_effect","only_child","append","comment","from_html","set_text","prop","first_child","mountComponent","LabelItem","getCurrentFontSize","getGlobalResponsiveFontSize","CONST","PolygonWithEdgeMesh","PrismMesh","sleep","THREE","addIfNotExists","target","parent","object","getTagOcclusionObjects","scope","model","group","ModelMakerBaseItem","params","position","Vector3","click","dispose","v","ModelMakerBoxItem","args","root","Text","text","$$props","fragment","node","consequent","div","text_1","$$anchor","$$render","textRender","app","container","item","tagRendererMap","currentFontSize","fontSizeManager","unsubscribe","fontSize","ModelMakerPrismItem","box","topCenter","fiveCurrentfloor","modelFloor","ModelMakerPolygonItem","panoIndex","mode","setModelSortBounds","ModelMakerPolygonMesh","points","line","ModelMakerPrismMesh","EncodedLineMaterial","output","vec4","workingToColorSpace","SRGBColorSpace","hasHDRContribution","material","progress","slot","capacityMin","capacityMax","hasHDROutput","renderer","configuration","managers","sourceKind","mesh","source","effective","basic","collectSources","sources","models","owned","SavedAnnotationColor","texture","screenUV","manager","nativeRender","previous","scene","camera","positionGeometry","after","before","decoded","colorSpaceToWorking","key","disposed","clear","owner","next","count","host","original","cached","kind","materialColor","materialOpacity","resource","onDispose","copy","active","hdr","encodedThisFrame","tailSeen","drawQuad","flush","registered","actual","createSavedAnnotationColorOwner","Controller","Group","five","config","dom","serverData","setItemStyle","color","Color","occlusionVisibility","occlusionMode","originalOpacity","bottomPoints","p","height","heightPoint","startVertex","start","endVertex","end","euler","Euler","rotation","quaternion","Quaternion","invertedQuaternion","center","negatedPositionTransform","originStartVertex","originEndVertex","box3","Box3","targetState","id","map","targetItems","restoreLabels","animationToken","hideLabels","animationPromises","stop","geometries","materials","colored","geometry","options","itemTypes","type","isRestoringOpacity","opacityPercent","itemId","currentOpacity","newOpacity","itemTypesArray","condition","visible","targetElement","computedStyle","currentColor","originalOpacityData","highlightColor","originalStyles","originalModelColors","allTags","tags","cameraPosition","sortedTags","a","b","canShowTags","domRectIsIntersect","mainDom","domRect","items","startTime","frame","finish","resolve","animate","elapsed","duration","easeProgress","ModelMakerPlugin"],"sources":["../../src/shared-utils/three/addIfNotExists.ts","../../src/ModelMakerPlugin/utils/getTagOcclusionObjects.ts","../../src/ModelMakerPlugin/item/baseItem.ts","../../src/ModelMakerPlugin/item/boxItem.ts","../../src/ModelMakerPlugin/utils/Text.svelte","../../src/ModelMakerPlugin/utils/tagRenderer.ts","../../src/ModelMakerPlugin/item/prismItem.ts","../../src/ModelMakerPlugin/item/polygonItem.ts","../../src/ModelMakerPlugin/utils/setModelSortBounds.ts","../../src/ModelMakerPlugin/utils/ModelMakerPolygonMesh.ts","../../src/ModelMakerPlugin/utils/ModelMakerPrismMesh.ts","../../src/ModelMakerPlugin/rendering/EncodedLineMaterial.ts","../../src/ModelMakerPlugin/rendering/hdrContribution.ts","../../src/ModelMakerPlugin/rendering/SavedAnnotationColor.ts","../../src/ModelMakerPlugin/Controller.ts","../../src/ModelMakerPlugin/index.ts"],"sourcesContent":["import type * as THREE from 'three/webgpu'\n\nexport default function addIfNotExists(parent: THREE.Object3D, ...target: THREE.Object3D[]) {\n target.forEach((object) => {\n if (parent.children.includes(object)) return\n if (object) parent.add(object)\n })\n}\n","import type { Object3D } from 'three/webgpu'\nimport type { TagOcclusionScope } from '../typings/config'\n\n/** 根据标签遮挡范围返回需要参与额外射线检测的 ModelMaker 对象。 */\nexport function getTagOcclusionObjects(scope: TagOcclusionScope = 'group', group: Object3D, model: Object3D): Object3D[] {\n switch (scope) {\n case 'self':\n return [model]\n case 'none':\n return []\n case 'group':\n default:\n return [group]\n }\n}\n","import type { Five, Mode } from '@realsee/five-webgpu'\nimport type { Object3D } from 'three/webgpu'\nimport { Vector3 } from 'three/webgpu'\nimport addIfNotExists from '../../shared-utils/three/addIfNotExists'\nimport { Subscribe } from '../../shared-utils/Subscribe'\nimport type { LightTag } from '../../shared-utils/tag'\nimport { tag } from '../../shared-utils/tag'\nimport { boundingBox } from '../../shared-utils/three/boundingBox'\nimport type { FiveDomEvents } from '../../shared-utils/five/FiveDomEvents'\nimport type { ServerItem, ItemType } from '../typings'\nimport type { TagOcclusionScope } from '../typings/config'\nimport { getTagOcclusionObjects } from '../utils/getTagOcclusionObjects'\n\n// 模型中心点可能存在的接口,继承自Object3D\ninterface ModelWithCenter extends Object3D {\n /** 模型中心点 */\n center?: Vector3\n}\n\n/**\n * @description 模型标注的事件类型\n */\ntype ModelMakerEvent<ServerData extends ServerItem> = {\n /** 启用 */\n enable: () => void\n /** 禁用 */\n disable: () => void\n /** 显示 */\n show: () => void\n /** 隐藏 */\n hide: () => void\n /** 点击 */\n click: (item: ModelMakerBaseItem<ServerData>) => void | boolean\n}\n\n/**\n * @description 模型标注的基类\n */\nexport class ModelMakerBaseItem<ServerData extends ServerItem> extends Subscribe<ModelMakerEvent<ServerData>> {\n public get container() {\n return this.tag.container\n }\n public type: ItemType\n public tag: LightTag\n public rawData: ServerData\n public model: ModelWithCenter\n public get state() {\n return {\n visible: this.model.visible,\n enabled: this.group.children.includes(this.model),\n }\n }\n public visibles: boolean[] = []\n protected five: Five\n protected group: Object3D\n protected fiveDomEvents: FiveDomEvents\n protected disposers: (() => void)[] = []\n\n public constructor(params: {\n five: Five\n model: ModelWithCenter\n group: Object3D\n type: ItemType\n fiveDomEvents: FiveDomEvents\n rawData?: ServerData\n tagWrapper?: HTMLElement\n visibleMode?: Mode[]\n position?: Vector3\n tagContainerZIndex?: number\n tagOcclusionScope?: TagOcclusionScope\n }) {\n super()\n this.five = params.five\n this.model = params.model\n this.group = params.group\n this.type = params.type\n this.rawData = params.rawData\n this.fiveDomEvents = params.fiveDomEvents\n\n // 获取模型中心点的位置\n const position = params.position ?? this.model.center ?? boundingBox(this.model).getCenter(new Vector3())\n\n this.tag = tag(this.five, position, { wrapper: params.tagWrapper, disableOpacityTransition: this.type === 'prism' })\n this.tag.extraObjectsForIntersectCheck.push(...getTagOcclusionObjects(params.tagOcclusionScope, this.group, this.model))\n }\n\n public show() {\n this.visibles[0] = true\n this.updateVisible()\n this.emit('show')\n }\n\n public hide() {\n this.visibles[0] = false\n this.updateVisible()\n this.emit('hide')\n }\n\n public enable() {\n addIfNotExists(this.group, this.model)\n this.five.needsRender = true\n\n this.model.updateMatrixWorld(true)\n this.tag.setTransformMatrix(this.model.matrixWorld)\n this.tag.enable()\n\n const click = this.onClick.bind(this)\n this.fiveDomEvents.removeEventListener(this.model, 'click')\n this.fiveDomEvents.addEventListener(this.model, 'click', click, { skipPano: true })\n\n this.disposers.push(() => {\n this.fiveDomEvents.removeEventListener(this.model, 'click')\n })\n\n this.updateVisible()\n\n this.emit('enable')\n }\n\n public disable() {\n this.group.remove(this.model)\n this.five.needsRender = true\n\n this.tag.disable()\n this.disposers.forEach((dispose) => dispose())\n this.disposers = []\n this.emit('disable')\n }\n\n public updateVisible() {\n const visible = !this.visibles.some((v) => v === false)\n\n if (visible) {\n this.tag.show()\n this.model.visible = true\n } else {\n this.tag.hide()\n this.model.visible = false\n }\n\n this.five.needsRender = true\n }\n\n protected onClick() {\n return this.emit('click', this)\n }\n}\n","import { ModelMakerBaseItem } from './baseItem'\nimport type { ServerBoxItem } from '../typings'\n\n/**\n * @description 模型标注的盒子类型标注的构造参数类型\n */\ntype ModelMakerBoxItemArgs = ConstructorParameters<typeof ModelMakerBaseItem<ServerBoxItem>>\n\n/**\n * @description 模型标注的盒子类型标注,即长方体\n * @extends ModelMakerBaseItem\n */\nexport class ModelMakerBoxItem extends ModelMakerBaseItem<ServerBoxItem> {\n public constructor(...args: ModelMakerBoxItemArgs) {\n super(...args)\n this.enable()\n this.tag.hide()\n this.updateVisible()\n }\n\n public enable() {\n super.enable()\n this.five.on('mode.change.request', this.hideTag)\n this.five.on('pano.request', this.hideTag)\n }\n\n public disable() {\n super.disable()\n this.five.needsRender = true\n this.five.off('mode.change.request', this.hideTag)\n this.five.off('pano.request', this.hideTag)\n }\n\n public show() {\n super.show()\n this.tag.hide()\n }\n\n public updateVisible() {\n const visible = !this.visibles.some((v) => v === false)\n\n if (visible) {\n this.model.visible = true\n } else {\n this.tag.hide()\n this.model.visible = false\n }\n\n this.five.needsRender = true\n }\n\n protected onClick() {\n this.tag.visible ? this.tag.hide() : this.tag.show({ force: true })\n super.onClick()\n return true\n }\n\n private hideTag = () => {\n this.tag.hide()\n }\n}\n","<script lang=\"ts\">\n export let text: string\n</script>\n\n{#if text}\n <div class=\"model-maker-tag\">\n {text}\n </div>\n{/if}\n\n<style lang=\"scss\">\n .model-maker-tag {\n position: absolute;\n width: max-content;\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n color: #fff;\n font-size: 14px;\n font-weight: bold;\n text-shadow: 2px 0 8px rgba(0, 0, 0, 0.15);\n }\n</style>\n","import type * as PluginType from '../typings'\nimport TextSvelte from './Text.svelte'\nimport LabelItem from '../../components/AreaLabel/LabelItem.svelte'\nimport { getCurrentFontSize, getGlobalResponsiveFontSize } from '../../shared-utils/fontSize'\n\nimport { mountComponent, type MountedComponent } from '../../shared-utils/svelte/component.svelte'\nconst textRender: PluginType.ElementRenderer = (container, item) => {\n const app = mountComponent(TextSvelte, container, { text: item.rawData?.name })\n return () => app.destroy()\n}\n\nconst labelRender: PluginType.ElementRenderer = (container, item, five?) => {\n let currentFontSize = getCurrentFontSize()\n const app = mountComponent(LabelItem, container, { content: item.rawData?.name, five, fontSize: currentFontSize })\n\n // 使用全局单例字体大小管理器\n const fontSizeManager = getGlobalResponsiveFontSize()\n let unsubscribe: (() => void) | null = null\n\n // 监听字体大小变化\n if (typeof fontSizeManager === 'object' && 'subscribe' in fontSizeManager) {\n unsubscribe = fontSizeManager.subscribe((fontSize) => {\n currentFontSize = fontSize\n app.update({ fontSize: currentFontSize })\n })\n }\n\n return () => {\n unsubscribe?.()\n app.destroy()\n }\n}\n\nconst tagRendererMap: Record<PluginType.ItemType, PluginType.ElementRenderer> = {\n box: textRender,\n triangles: textRender,\n prism: labelRender,\n}\n\nexport { tagRendererMap }\n","import { isNil } from '../../shared-utils'\nimport { boxVertex, boundingBox } from '../../shared-utils/three/boundingBox'\nimport type { ServerPrismItem } from '../typings'\nimport { ModelMakerBaseItem } from './baseItem'\nimport * as THREE from 'three/webgpu'\n\n/**\n * @description 模型标注的棱柱类型标注的构造参数类型\n */\ntype ModelMakerPrismItemArgs = ConstructorParameters<typeof ModelMakerBaseItem<ServerPrismItem>>\n\n/**\n * @description 模型标注的棱柱类型标注\n * @extends ModelMakerBaseItem\n */\nexport class ModelMakerPrismItem extends ModelMakerBaseItem<ServerPrismItem> {\n public constructor(...args: ModelMakerPrismItemArgs) {\n const params = args[0]\n const box = boundingBox(params.model)\n const topCenter = new THREE.Vector3().lerpVectors(boxVertex(box, 0), boxVertex(box, 5), 0.5)\n super({ ...params, position: topCenter })\n this.enable()\n this.updateVisible()\n\n this.five.on('modelShownFloorChange', this.onModelShownFloorChange)\n this.disposers.push(() => {\n this.five.off('modelShownFloorChange', this.onModelShownFloorChange)\n })\n }\n\n public onModelShownFloorChange = (fiveCurrentfloor: number | null) => {\n this.updateFiveCurrentFloorState(fiveCurrentfloor)\n this.updateVisible()\n }\n\n public show() {\n this.updateFiveCurrentFloorState(this.five.model.shownFloor)\n super.show()\n }\n\n public hide() {\n super.hide()\n }\n\n private updateFiveCurrentFloorState = (fiveCurrentfloor: number | null) => {\n const modelFloor = this.rawData?.object_data?.floorIndex\n if (isNil(modelFloor)) {\n this.visibles[1] = true\n } else {\n this.visibles[1] = fiveCurrentfloor === null ? true : modelFloor === fiveCurrentfloor\n }\n }\n}\n","import type { Mode } from '@realsee/five-webgpu'\nimport type { ServerTrianglesItem } from '../typings'\nimport { ModelMakerBaseItem } from './baseItem'\n\n/**\n * @description 模型标注的多边形类型标注的构造参数类型\n */\ntype ModelMakerPolygonItemArgs = ConstructorParameters<typeof ModelMakerBaseItem<ServerTrianglesItem>>\n\n/**\n * @description 模型标注的多边形类型标注,即多边形\n * @extends ModelMakerBaseItem\n */\nexport class ModelMakerPolygonItem extends ModelMakerBaseItem<ServerTrianglesItem> {\n public constructor(...args: ModelMakerPolygonItemArgs) {\n super(...args)\n\n this.updatePanoIndex(this.five.state.panoIndex)\n this.updateMode(this.five.state.mode)\n this.enable()\n this.updateVisible()\n\n this.five.on('panoArrived', this.onPanoArrived)\n this.five.on('modeChange', this.onModeChange)\n this.disposers.push(() => {\n this.five.off('panoArrived', this.onPanoArrived)\n this.five.off('modeChange', this.onModeChange)\n })\n }\n\n public show() {\n this.updatePanoIndex(this.five.state.panoIndex)\n this.updateMode(this.five.state.mode)\n super.show()\n }\n\n private onPanoArrived = (panoIndex: number) => {\n this.updatePanoIndex(panoIndex)\n this.updateVisible()\n }\n\n private onModeChange = (mode: Mode) => {\n this.updateMode(mode)\n this.updateVisible()\n }\n\n private updatePanoIndex = (panoIndex: number) => {\n this.visibles[1] = this.rawData?.object_data?.panoIndex === panoIndex\n }\n\n private updateMode = (mode: Mode) => {\n this.visibles[2] = mode === 'Panorama'\n }\n}\n","import type ColoredMesh from '../../Sculpt/utils/three/ColoredMesh'\nimport { setObjectOriginSortBounds } from '../../shared-utils/three/setObjectOriginSortBounds'\n\n/** Keep saved ModelMaker object-origin order while retaining precise culling bounds. */\nexport function setModelSortBounds(model: ColoredMesh): void {\n setObjectOriginSortBounds(model.geometry, [model.meshFont, model.meshBackground])\n}\n","import { PolygonWithEdgeMesh } from '../../Sculpt/Meshes/PolygonWithEdge'\nimport type { AnyPositions } from '../../shared-utils/positionToVector3'\nimport { setModelSortBounds } from './setModelSortBounds'\n\n/** Saved ModelMaker polygons refresh face and edge sort keys after geometry changes. */\nexport class ModelMakerPolygonMesh extends PolygonWithEdgeMesh {\n public onSavedGeometryChange?: () => void\n\n public override setPoints(points: AnyPositions, params?: { closed?: boolean; checkLinesIntersect?: boolean }): void {\n super.setPoints(points, params)\n setModelSortBounds(this)\n this.line.lines.forEach(line => line.enableOriginSort())\n this.onSavedGeometryChange?.()\n }\n}\n","import { PrismMesh, type PrismData } from '../../Sculpt/Meshes/Prism'\nimport { setModelSortBounds } from './setModelSortBounds'\n\n/** Saved ModelMaker solids keep the old object-origin sort after in-place edits. */\nexport class ModelMakerPrismMesh extends PrismMesh {\n public onSavedGeometryChange?: () => void\n\n public override setPoints(params: Partial<PrismData>): void {\n super.setPoints(params)\n setModelSortBounds(this.prismMesh)\n this.edgeMesh.enableOriginSort()\n this.onSavedGeometryChange?.()\n }\n}\n","import { SRGBColorSpace } from 'three/webgpu'\nimport { vec4, workingToColorSpace } from 'three/tsl'\nimport { LineMaterial } from '../../shared-utils/three/core/LineMaterial'\n\n/** Private saved-annotation SDR output; arbitrary Sculpt lines remain linear. */\nexport class EncodedLineMaterial extends LineMaterial {\n public override customProgramCacheKey() {\n return super.customProgramCacheKey() + ':saved-annotation-encoded-sdr-v1'\n }\n\n public override setupOutput(...args: Parameters<LineMaterial['setupOutput']>) {\n const output = vec4(super.setupOutput(...args))\n // Keep Line2's generated coverage, dash/endcap discard and hardware alpha.\n // The old saved hex line wrote its raw sRGB uniform directly (its fragment\n // main did not call linearToOutputTexel). One OETF restores that same value.\n return vec4(vec4(workingToColorSpace(vec4(output.rgb, 1), SRGBColorSpace)).rgb, output.a)\n }\n}\n","import type { Material, Renderer } from 'three/webgpu'\n\n// Mirror the application's drawn PBM contribution contract. The parity test reads\n// the application function so an SDK change cannot silently diverge from it.\nexport type HDRMaterial = Material & {\n useHDR?: boolean\n modelAlpha?: number\n progress?: number\n maxDisplayBoost?: number\n pano0Map?: unknown\n pano1Map?: unknown\n pano0Gainmap?: unknown\n pano1Gainmap?: unknown\n pano0HdrCapacityMin?: number\n pano0HdrCapacityMax?: number\n pano1HdrCapacityMin?: number\n pano1HdrCapacityMax?: number\n pano0HdrMaxContentBoost?: number\n pano1HdrMaxContentBoost?: number\n}\n\nexport function hasHDRContribution(material: HDRMaterial): boolean {\n if (!material.useHDR || !material.pano0Map || !material.pano1Map || (material.modelAlpha ?? 1) >= 1) return false\n const progress = material.progress ?? 0\n return ([0, 1] as const).some((slot) => {\n if ((slot === 0 && progress >= 1) || (slot === 1 && progress <= 0)) return false\n const capacityMin = material[`pano${slot}HdrCapacityMin`] ?? 1\n const capacityMax = material[`pano${slot}HdrCapacityMax`] ?? 1\n return (\n !!material[`pano${slot}Gainmap`] &&\n capacityMin > 0 &&\n capacityMax > capacityMin &&\n (material.maxDisplayBoost ?? 1) > Math.max(1, capacityMin) &&\n (material[`pano${slot}HdrMaxContentBoost`] ?? 1) > 1\n )\n })\n}\n\nexport function hasHDROutput(renderer: Renderer): boolean {\n if ((renderer.backend as { isWebGPUBackend?: boolean }).isWebGPUBackend !== true) return false\n if (typeof window === 'undefined' || !window.matchMedia?.('(dynamic-range: high)').matches) return false\n const context = renderer.getContext() as unknown as {\n getConfiguration?: () => { format?: string; toneMapping?: { mode?: string } } | null\n }\n const configuration = context.getConfiguration?.()\n return configuration?.format === 'rgba16float' && configuration.toneMapping?.mode === 'extended'\n}\n","import * as THREE from 'three/webgpu'\nimport { colorSpaceToWorking, materialColor, materialOpacity, positionGeometry, screenUV, texture, vec4, workingToColorSpace } from 'three/tsl'\nimport { LineMaterial } from '../../shared-utils/three/core/LineMaterial'\nimport { EncodedLineMaterial } from './EncodedLineMaterial'\nimport { hasHDRContribution, hasHDROutput, type HDRMaterial } from './hdrContribution'\n\ntype Source = THREE.Mesh<THREE.BufferGeometry, THREE.MeshBasicMaterial | LineMaterial>\ntype Draw = NonNullable<ReturnType<THREE.Renderer['getRenderObjectFunction']>>\ntype Resource = { before: THREE.FramebufferTexture; after: THREE.FramebufferTexture; detach: () => void }\ntype Replacement = { original: Source['material']; material: THREE.MeshBasicNodeMaterial | EncodedLineMaterial }\n\nconst managers = new WeakMap<THREE.Renderer, SavedAnnotationColor>()\n\nfunction sourceKind(source: THREE.Object3D, effective?: THREE.Material): 'face' | 'line' | undefined {\n const mesh = source as Source\n const material = effective ?? mesh.material\n if (!mesh.isMesh || !material || Array.isArray(material) || material !== mesh.material ||\n material.blending !== THREE.NormalBlending || !material.transparent || material.premultipliedAlpha ||\n material.depthWrite || material.stencilWrite || material.clippingPlanes?.length || material.alphaTest !== 0 ||\n 'isSkinnedMesh' in source || 'isInstancedMesh' in source) return\n if (material instanceof LineMaterial) return 'line'\n const basic = material as THREE.MeshBasicMaterial\n if (basic.isMeshBasicMaterial && !basic.map && !basic.alphaMap && !basic.envMap && !basic.vertexColors && !basic.wireframe) return 'face'\n}\n\nfunction collectSources(models: readonly THREE.Object3D[]): Set<Source> {\n const sources = new Set<Source>()\n for (const model of models) model.traverse((node) => {\n const owned = node as THREE.Object3D & { meshBackground?: Source; line1?: Source; line2?: Source }\n // Background and occlusion-line identities can be detached. Registration\n // never makes them visible or reparents them into a separate render list.\n for (const source of [node, owned.meshBackground, owned.line1, owned.line2]) {\n if (source && sourceKind(source)) sources.add(source as Source)\n }\n })\n return sources\n}\n\nexport interface SavedAnnotationColorOwner {\n setModels(models: readonly THREE.Object3D[]): void\n clear(): void\n dispose(): void\n}\n\n/** One manager per physical renderer. Never exported from an SDK entry point. */\nexport class SavedAnnotationColor {\n readonly observation = {\n copies: 0, brackets: 0, encodedDraws: 0, linearDraws: 0, unsupportedDraws: 0,\n lateHDRDraws: 0, resourceDisposals: 0, materialDisposals: 0, disposed: false,\n }\n private readonly owners = new Map<object, { scene: THREE.Scene; sources: Set<Source> }>()\n private readonly sources = new Map<Source, number>()\n private readonly resources = new Map<THREE.RenderTarget, Resource>()\n private readonly replacements = new Map<Source, Replacement>()\n private readonly beforePlaceholder = new THREE.FramebufferTexture(1, 1)\n private readonly afterPlaceholder = new THREE.FramebufferTexture(1, 1)\n private readonly beforeNode = texture(this.beforePlaceholder, screenUV)\n private readonly afterNode = texture(this.afterPlaceholder, screenUV)\n private readonly encode = new THREE.MeshBasicNodeMaterial({ transparent: true, blending: THREE.NoBlending, depthTest: false, depthWrite: false, toneMapped: false, forceSinglePass: true, fog: false })\n private readonly decode = new THREE.MeshBasicNodeMaterial({ transparent: true, blending: THREE.NoBlending, depthTest: false, depthWrite: false, toneMapped: false, forceSinglePass: true, fog: false })\n private readonly quad = new THREE.Mesh(new THREE.PlaneGeometry(2, 2), this.encode)\n private readonly tail = new THREE.Group()\n private readonly sentinel = new THREE.Mesh(new THREE.PlaneGeometry(2, 2), new THREE.MeshBasicMaterial({ transparent: true, opacity: 0, colorWrite: true, depthWrite: false, depthTest: false, forceSinglePass: true, toneMapped: false }))\n private readonly previousRender: THREE.Renderer['render']\n private readonly wrappedRender: THREE.Renderer['render']\n private rendering = false\n private previousDraw: Draw | null = null\n private pendingDispose = false\n\n constructor(private readonly renderer: THREE.Renderer) {\n this.previousRender = renderer.render\n const manager = this\n this.wrappedRender = function (scene, camera) {\n const args = arguments\n const nativeRender = () => manager.previousRender.apply(this, args as unknown as Parameters<THREE.Renderer['render']>)\n if (manager.rendering) {\n // A callback may draw an unrelated scene into its own target. Do not let\n // that nested render inherit the outer annotation colour hook.\n const previous = renderer.getRenderObjectFunction()\n renderer.setRenderObjectFunction(manager.previousDraw)\n try { return nativeRender() } finally { renderer.setRenderObjectFunction(previous) }\n }\n if (manager.observation.disposed || !manager.hasScene(scene as THREE.Scene)) return nativeRender()\n return manager.render(scene as THREE.Scene, camera, nativeRender)\n }\n renderer.render = this.wrappedRender\n this.quad.frustumCulled = false\n this.quad.name = 'SavedAnnotationColorQuad'\n this.encode.vertexNode = this.decode.vertexNode = vec4(positionGeometry.xy, 0, 1)\n this.encode.fragmentNode = vec4(vec4(workingToColorSpace(vec4(this.beforeNode.rgb, 1), THREE.SRGBColorSpace)).rgb, 0)\n const after = this.afterNode, before = this.beforeNode\n const decoded = vec4(colorSpaceToWorking(vec4(after.rgb, 1), THREE.SRGBColorSpace))\n this.decode.fragmentNode = after.a.equal(0).select(before, vec4(decoded.rgb, after.a.add(before.a.mul(after.a.oneMinus()))))\n this.tail.name = 'SavedAnnotationColorTail'\n this.tail.renderOrder = this.sentinel.renderOrder = Infinity\n this.sentinel.frustumCulled = false\n this.tail.add(this.sentinel)\n }\n\n owner(scene: THREE.Scene): SavedAnnotationColorOwner {\n const key = {}\n this.owners.set(key, { scene, sources: new Set() })\n let disposed = false\n const clear = () => this.replace(key, new Set())\n return {\n setModels: (models) => { if (!disposed) this.replace(key, collectSources(models)) },\n clear: () => { if (!disposed) clear() },\n dispose: () => {\n if (disposed) return\n clear()\n disposed = true\n this.owners.delete(key)\n if (this.owners.size === 0) this.dispose()\n },\n }\n }\n\n private hasScene(scene: THREE.Scene) {\n return this.sources.size > 0 && [...this.owners.values()].some(owner => owner.scene === scene && owner.sources.size > 0)\n }\n\n private replace(key: object, next: Set<Source>) {\n const owner = this.owners.get(key)\n if (!owner) return\n for (const source of owner.sources) {\n if (next.has(source)) continue\n const count = this.sources.get(source)! - 1\n if (count > 0) this.sources.set(source, count)\n else {\n this.sources.delete(source)\n this.releaseMaterial(source)\n }\n }\n for (const source of next) {\n if (!owner.sources.has(source)) this.sources.set(source, (this.sources.get(source) ?? 0) + 1)\n }\n owner.sources = next\n if (this.sources.size === 0 && !this.rendering) for (const host of [...this.resources.keys()]) this.release(host)\n }\n\n private replacement(source: Source, kind: 'face' | 'line') {\n const original = source.material\n let cached = this.replacements.get(source)\n if (cached?.original !== original) {\n this.releaseMaterial(source)\n const material = kind === 'line' ? new EncodedLineMaterial() : new THREE.MeshBasicNodeMaterial({ transparent: true, toneMapped: false, fog: false })\n if (material instanceof EncodedLineMaterial) material.copy(original as LineMaterial)\n else material.fragmentNode = vec4(vec4(workingToColorSpace(vec4(materialColor, 1), THREE.SRGBColorSpace)).rgb, materialOpacity)\n cached = { original, material }\n this.replacements.set(source, cached)\n }\n const material = cached.material\n material.color.copy(original.color)\n material.opacity = original.opacity\n material.depthTest = original.depthTest\n material.depthWrite = original.depthWrite\n material.depthFunc = original.depthFunc\n material.side = original.side\n material.forceSinglePass = original.forceSinglePass\n material.colorWrite = original.colorWrite\n material.polygonOffset = original.polygonOffset\n material.polygonOffsetFactor = original.polygonOffsetFactor\n material.polygonOffsetUnits = original.polygonOffsetUnits\n material.alphaToCoverage = original.alphaToCoverage\n if (material instanceof EncodedLineMaterial && original instanceof LineMaterial) {\n material.linewidth = original.linewidth\n material.dashed = original.dashed\n material.worldUnits = original.worldUnits\n material.dashSize = original.dashSize\n material.gapSize = original.gapSize\n material.dashOffset = original.dashOffset\n material.scale = original.scale\n material.resolution.copy(original.resolution)\n }\n return material\n }\n\n private resource(): Resource | undefined {\n const renderer = this.renderer, host = renderer.getRenderTarget()\n if (!host || 'isRenderTarget3D' in host || 'isRenderTargetArray' in host || 'isWebGLCubeRenderTarget' in host ||\n renderer.getActiveMipmapLevel() !== 0 || renderer.getMRT() !== null || host.textures.length !== 1 ||\n host.texture.format !== THREE.RGBAFormat || host.texture.colorSpace !== THREE.NoColorSpace ||\n ![THREE.UnsignedByteType, THREE.HalfFloatType].includes(host.texture.type as never)) return\n let resource = this.resources.get(host)\n if (!resource) {\n const before = new THREE.FramebufferTexture(host.width, host.height)\n const after = new THREE.FramebufferTexture(host.width, host.height)\n before.source = new THREE.Source({ width: host.width, height: host.height })\n after.source = new THREE.Source({ width: host.width, height: host.height })\n const onDispose = () => this.release(host)\n host.addEventListener('dispose', onDispose)\n resource = { before, after, detach: () => host.removeEventListener('dispose', onDispose) }\n this.resources.set(host, resource)\n }\n for (const copy of [resource.before, resource.after]) {\n if (copy.image.width !== host.width || copy.image.height !== host.height || copy.type !== host.texture.type) {\n copy.source = new THREE.Source({ width: host.width, height: host.height })\n copy.needsUpdate = true\n }\n }\n this.beforeNode.value = resource.before\n this.afterNode.value = resource.after\n return resource\n }\n\n private render(scene: THREE.Scene, camera: THREE.Camera, nativeRender: () => ReturnType<THREE.Renderer['render']>) {\n const renderer = this.renderer\n // A packed depth override has no legacy colour contract.\n if (scene.overrideMaterial) return nativeRender()\n this.rendering = true\n const previous = renderer.getRenderObjectFunction()\n this.previousDraw = previous\n this.tail.layers.mask = this.sentinel.layers.mask = camera.layers.mask\n scene.add(this.tail)\n let active: Resource | undefined\n let hdr = false\n let encodedThisFrame = false\n let tailSeen = false\n const drawQuad = (material: THREE.MeshBasicNodeMaterial, args: Parameters<Draw>) => {\n this.quad.material = material\n renderer.renderObject(this.quad, args[1], args[2], this.quad.geometry, material, null, args[6], args[7], null)\n }\n const flush = (args: Parameters<Draw>) => {\n if (!active) return\n renderer.copyFramebufferToTexture(active.after)\n this.observation.copies++\n drawQuad(this.decode, args)\n active = undefined\n }\n const original = (args: Parameters<Draw>) => previous ? previous.call(renderer, ...args) : renderer.renderObject(...args)\n const hook: Draw = (...args) => {\n const source = args[0] as Source\n if (source === this.sentinel) tailSeen = true\n const registered = args[1] === scene && this.sources.has(source)\n const kind = registered && !scene.overrideMaterial ? sourceKind(source, args[4]) : undefined\n if (kind && !hdr && !tailSeen) {\n if (!active) {\n active = this.resource()\n if (active) {\n renderer.copyFramebufferToTexture(active.before)\n this.observation.copies++\n drawQuad(this.encode, args)\n this.observation.brackets++\n }\n }\n if (active) {\n const actual = [...args] as Parameters<Draw>\n actual[4] = this.replacement(source, kind)\n original(actual)\n this.observation.encodedDraws++\n encodedThisFrame = true\n return\n }\n this.observation.unsupportedDraws++\n }\n // A consumer's custom comparator can ignore native group/renderOrder.\n // Never leave a post-tail cohort encoded with no in-pass end marker.\n if (kind && !hdr && tailSeen) this.observation.unsupportedDraws++\n flush(args)\n original(args)\n if (registered) this.observation.linearDraws++\n // This draw has actually succeeded in this pass. A retained material, a\n // previous React status, query or requested useHDR alone cannot set hdr.\n if (args[1] === scene && !scene.overrideMaterial && hasHDRContribution(args[4] as HDRMaterial) && hasHDROutput(renderer)) {\n if (!hdr && encodedThisFrame) this.observation.lateHDRDraws++\n hdr = true\n }\n }\n renderer.setRenderObjectFunction(hook)\n try {\n return nativeRender()\n } finally {\n // Never submit a nested recovery render or copy outside an active pass.\n // The native tail flush is part of the original sorted render sequence.\n renderer.setRenderObjectFunction(previous)\n this.tail.removeFromParent()\n this.rendering = false\n this.previousDraw = null\n if (this.sources.size === 0) for (const host of [...this.resources.keys()]) this.release(host)\n if (this.pendingDispose) this.dispose()\n }\n }\n\n private releaseMaterial(source: Source) {\n const cached = this.replacements.get(source)\n if (!cached) return\n this.replacements.delete(source)\n cached.material.dispose()\n this.observation.materialDisposals++\n }\n\n private release(host: THREE.RenderTarget) {\n const resource = this.resources.get(host)\n if (!resource) return\n this.resources.delete(host)\n resource.detach()\n resource.before.dispose()\n resource.after.dispose()\n this.observation.resourceDisposals++\n }\n\n private dispose() {\n if (this.observation.disposed) return\n if (this.rendering) { this.pendingDispose = true; return }\n this.observation.disposed = true\n for (const host of [...this.resources.keys()]) this.release(host)\n for (const source of [...this.replacements.keys()]) this.releaseMaterial(source)\n this.beforePlaceholder.dispose()\n this.afterPlaceholder.dispose()\n this.encode.dispose()\n this.decode.dispose()\n this.quad.geometry.dispose()\n this.sentinel.geometry.dispose()\n this.sentinel.material.dispose()\n this.tail.removeFromParent()\n if (this.renderer.render === this.wrappedRender) this.renderer.render = this.previousRender\n if (managers.get(this.renderer) === this) managers.delete(this.renderer)\n }\n}\n\nexport function createSavedAnnotationColorOwner(renderer: THREE.Renderer, scene: THREE.Scene): SavedAnnotationColorOwner {\n let manager = managers.get(renderer)\n if (!manager) { manager = new SavedAnnotationColor(renderer); managers.set(renderer, manager) }\n return manager.owner(scene)\n}\n","import { AnimationFrameLoop, type Five, type Mode as FiveMode } from '@realsee/five-webgpu'\nimport type * as THREE from 'three/webgpu'\nimport * as BasePlugin from '../base/BasePluginWithData'\nimport { Vector3, Group, Color, Euler, Quaternion, Box3 } from 'three/webgpu'\nimport { ModelMakerBoxItem } from './item/boxItem'\nimport { PrismMesh } from '../Sculpt/Meshes/Prism'\nimport { anyPositionToVector3 } from '../shared-utils/positionToVector3'\nimport { PolygonWithEdgeMesh } from '../Sculpt/Meshes/PolygonWithEdge'\nimport type { LightTag } from '../shared-utils'\nimport { notNil } from '../shared-utils'\nimport { tagRendererMap as defaultTagRendererMap } from './utils/tagRenderer'\nimport { FiveDomEvents } from '../shared-utils/five/FiveDomEvents'\nimport { ModelMakerPrismItem } from './item/prismItem'\nimport { ModelMakerPolygonItem } from './item/polygonItem'\nimport { boxVertex } from '../shared-utils/three/boundingBox'\nimport { waitFiveModelLoaded } from '../shared-utils/five/fiveModelLoad'\nimport { fiveEveryReadyListener } from '../shared-utils/five/fiveEveryReadyListener'\nimport { sleep } from '../CruisePlugin/utils/sleep'\nimport { CONST } from '../shared-utils/constants'\nimport { ModelMakerPolygonMesh } from './utils/ModelMakerPolygonMesh'\nimport { ModelMakerPrismMesh } from './utils/ModelMakerPrismMesh'\nimport { createSavedAnnotationColorOwner, type SavedAnnotationColorOwner } from './rendering/SavedAnnotationColor'\nimport type { MarkerItem, State, ServerData, ItemType, ElementRenderer, EventMap, ServerItem } from './typings'\nimport type { ModelMakerPluginConfig, TagOcclusionScopeConfig } from './typings/config'\n\n/**\n * 盒子动画配置选项\n */\nexport interface BoxAnimationConfig {\n /** 动画颜色,默认为 #4DF0FF */\n color?: string\n /** 是否在动画期间隐藏标签并在完成后缓动显示,默认为 false */\n hideLabels?: boolean\n}\n\nexport class Controller extends BasePlugin.Controller<State, EventMap, ServerData, ServerData> {\n public state: State\n\n public items: MarkerItem[] = []\n\n public group = new Group()\n\n protected data?: ServerData\n\n private disposed = false\n\n private readonly onFiveDispose = () => this.dispose()\n\n private savedColorOwner?: SavedAnnotationColorOwner\n\n private readonly syncSavedColorSources = () => {\n const renderer = this.five.renderer\n if (!renderer || this.disposed) return\n this.savedColorOwner ??= createSavedAnnotationColorOwner(renderer, this.five.scene)\n this.savedColorOwner.setModels(this.items.map(item => item.model))\n }\n\n private labelAnimations = new Set<() => void>()\n\n private boxAnimationTokens = new WeakMap<MarkerItem, symbol>()\n\n private tagRendererMap: Partial<Record<ItemType, ElementRenderer>> = {}\n\n private itemRenderers = new WeakMap<MarkerItem, ElementRenderer>()\n\n private itemRendererDisposers = new WeakMap<MarkerItem, () => void>()\n\n private fiveDomEvents: FiveDomEvents\n\n private zFightingOffset = 0\n\n private tagWrapper: HTMLElement\n\n private occlusionVisibility: boolean | FiveMode[]\n\n private occlusionMode: 'translucence' | 'depthTest'\n\n private tagOcclusionScope: TagOcclusionScopeConfig\n\n private fiveEveryReadyListenerDisposer?: () => void\n\n // 存储每个模型的原始透明度\n private originalOpacities: Map<string, { opacity: number; lineOpacity: number }> = new Map()\n // 存储标签原始透明度\n private originalTagOpacities: Map<string, number> = new Map()\n // 存储当前高亮的项目\n private highlightedItem: MarkerItem | null = null\n // 存储标签原始样式用于高亮恢复\n private originalTagStyles: Map<string, { background: string; borderImage: string }> = new Map()\n // 存储模型原始颜色用于高亮恢复(包括表面颜色、线条颜色和透明度)\n private originalModelColors: Map<string, { color: any; lineColor: any; opacity: number; lineOpacity: number }> = new Map()\n\n public constructor(five: Five, config?: ModelMakerPluginConfig) {\n super(five)\n\n this.group.name = 'ModelMakerPluginGroup'\n this.state = { enabled: true, visible: true }\n this.occlusionVisibility = config?.occlusionVisibility ?? false\n this.occlusionMode = config?.occlusionMode ?? 'translucence'\n this.tagOcclusionScope = config?.tagOcclusionScope ?? {}\n this.fiveDomEvents = new FiveDomEvents(five, { noEmitWhenHide: true, noEmitWhenNotInScene: true })\n\n this.tagWrapper = (() => {\n const dom = document.createElement('div')\n dom.style.position = 'absolute'\n dom.style.top = '0'\n dom.style.left = '0'\n dom.style.width = '100%'\n dom.style.height = '100%'\n dom.style.pointerEvents = 'none'\n dom.style.zIndex = `${config?.tagContainerZIndex ?? ''}`\n return dom\n })()\n\n five.scene.add(this.group)\n this.handleEnable()\n five.once('dispose', this.onFiveDispose)\n }\n\n public async load(serverData: ServerData) {\n if (this.disposed) return\n this.clear()\n this.data = serverData\n\n // 清空原始透明度缓存\n this.originalOpacities.clear()\n // 清空高亮状态\n this.resetHighlight()\n\n await waitFiveModelLoaded(this.five)\n\n // 异步后需要检验数据是否发生变化(多次调用load的情况)\n if (this.disposed || this.data !== serverData) return\n\n this.clear()\n\n const setItemStyle = (item: ServerItem) => {\n const color = item.object_data.color ? new Color().setHex(parseInt(item.object_data.color.slice(1), 16)) : new Color(1, 1, 1)\n\n let occlusionVisibility = typeof this.occlusionVisibility === 'boolean' ? this.occlusionVisibility : false\n let occlusionMode = this.occlusionMode\n if (item.type === 'triangles') {\n occlusionVisibility = true\n occlusionMode = 'depthTest'\n }\n\n // 获取原始透明度并存储\n const originalOpacity = (item.object_data.opacity ?? 0.4) / 2\n if (item.id) {\n this.originalOpacities.set(item.id.toString(), {\n opacity: originalOpacity,\n lineOpacity: 1,\n })\n }\n\n return {\n color: color,\n lineColor: color,\n opacity: originalOpacity,\n lineOpacity: 1,\n lineWidth: 1,\n occlusionVisibility,\n occlusionMode,\n }\n }\n\n this.items = serverData.list\n .map((item) => {\n switch (item.type) {\n case 'triangles': {\n const object = new ModelMakerPolygonMesh()\n if (notNil(item.id)) object.uuid = item.id.toString()\n\n object.setPoints(item.object_data.points, { checkLinesIntersect: false })\n object.setStyle(setItemStyle(item))\n\n this.fiveDomEvents.addEventListener(object, 'hover', () => object.highlight())\n this.fiveDomEvents.addEventListener(object, 'unHover', () => object.unhighlight())\n\n const modelMakerItem = new ModelMakerPolygonItem({\n five: this.five,\n tagWrapper: this.tagWrapper,\n model: object,\n group: this.group,\n type: item.type,\n rawData: item,\n fiveDomEvents: this.fiveDomEvents,\n tagOcclusionScope: this.tagOcclusionScope[item.type],\n })\n\n return modelMakerItem\n }\n case 'prism': {\n // ============================ 棱柱 ============================\n const object = new ModelMakerPrismMesh()\n if (notNil(item.id)) object.uuid = item.id.toString()\n\n this.zFightingOffset += CONST.Z_FIGHTING_OFFSET\n const bottomPoints = item.object_data.points.map((p) => [p[0], p[1] + (item.object_data.fixedY ?? 0), p[2]])\n bottomPoints.push(bottomPoints[0])\n // 标注高度\n const height = item.object_data.height + (item.object_data.fixedHeight ?? 0) + this.zFightingOffset\n const heightPoint = anyPositionToVector3(bottomPoints[0]).add(new Vector3().setY(height))\n\n object.setPoints({ points: bottomPoints, heightPoint })\n object.setStyle(setItemStyle(item))\n\n const modelMakerItem = new ModelMakerPrismItem({\n five: this.five,\n tagWrapper: this.tagWrapper,\n model: object,\n group: this.group,\n type: item.type,\n rawData: item,\n fiveDomEvents: this.fiveDomEvents,\n tagOcclusionScope: this.tagOcclusionScope[item.type],\n })\n\n return modelMakerItem\n }\n case 'box': {\n const object = new ModelMakerPrismMesh({ five: this.five })\n if (notNil(item.id)) object.uuid = item.id.toString()\n\n // 抄 saas c 的\n const { start, end, rotation = [0, 0, 0, 'XYZ'] } = item.object_data\n const startVertex = new Vector3().fromArray(start)\n const endVertex = new Vector3().fromArray(end)\n const euler = new Euler().fromArray(rotation as THREE.EulerTuple)\n const quaternion = new Quaternion().setFromEuler(euler)\n const invertedQuaternion = quaternion.clone().invert()\n const center = new Vector3().lerpVectors(startVertex, endVertex, 0.5)\n const negatedPositionTransform = center.clone().negate()\n const originStartVertex = startVertex.clone().add(negatedPositionTransform).applyQuaternion(invertedQuaternion)\n const originEndVertex = endVertex.clone().add(negatedPositionTransform).applyQuaternion(invertedQuaternion)\n const box3 = new Box3(originStartVertex.clone().max(originEndVertex), originStartVertex.clone().min(originEndVertex))\n\n object.setPoints({\n points: [boxVertex(box3, 2), boxVertex(box3, 3), boxVertex(box3, 7), boxVertex(box3, 6)],\n heightPoint: boxVertex(box3, 1),\n })\n object.position.copy(center)\n object.quaternion.copy(quaternion)\n object.setStyle(setItemStyle(item))\n\n const modelMakerItem = new ModelMakerBoxItem({\n five: this.five,\n tagWrapper: this.tagWrapper,\n model: object,\n group: this.group,\n type: item.type,\n rawData: item,\n fiveDomEvents: this.fiveDomEvents,\n tagOcclusionScope: this.tagOcclusionScope[item.type],\n })\n\n return modelMakerItem\n }\n default: {\n return null\n }\n }\n })\n .filter(Boolean)\n\n this.items.forEach(({ model }) => {\n if (model instanceof ModelMakerPolygonMesh || model instanceof ModelMakerPrismMesh) {\n model.onSavedGeometryChange = this.syncSavedColorSources\n }\n })\n this.syncSavedColorSources()\n\n this.state.enabled ? this.handleEnable() : this.handleDisable()\n this.state.visible ? this.handleShow() : this.handleHide()\n this.updateTagRenderer()\n\n this.hooks.emit('dataLoaded', serverData)\n this.five.needsRender = true\n }\n\n public setState(targetState: Partial<State>): void {\n if (this.disposed) return\n if (notNil(targetState.enabled) && this.state.enabled !== targetState.enabled) {\n this.state.enabled = targetState.enabled\n targetState.enabled ? this.handleEnable() : this.handleDisable()\n this.hooks.emit(targetState.enabled ? 'enable' : 'disable', { userAction: '我不知道捏' as unknown as boolean })\n this.hooks.emit('stateChange', { state: this.state, userAction: '我不知道捏' as unknown as boolean })\n }\n\n if (notNil(targetState.visible) && this.state.visible !== targetState.visible) {\n this.state.visible = targetState.visible\n targetState.visible ? this.handleShow() : this.handleHide()\n this.hooks.emit(targetState.visible ? 'show' : 'hide', { userAction: '我不知道捏' as unknown as boolean })\n this.hooks.emit('stateChange', { state: this.state, userAction: '我不知道捏' as unknown as boolean })\n }\n }\n\n public getItemById(id: string | number) {\n return this.items.find((item) => item.rawData.id === id)\n }\n\n public registerTagRenderer(map: Partial<Record<ItemType, ElementRenderer>>) {\n this.tagRendererMap = { ...this.tagRendererMap, ...map }\n this.updateTagRenderer()\n }\n\n public hasCustomTagRenderer(map: ItemType) {\n return Boolean(this.tagRendererMap[map])\n }\n\n /**\n * Force finish all active box animations immediately\n * @param id Optional box item ID. If not provided, finishes all active box animations.\n * @param restoreLabels Whether to restore labels immediately. Defaults to true.\n */\n public forceFinishBoxAnimation(id?: string | number, restoreLabels: boolean = true): void {\n // Find the items that need to be force finished\n let targetItems: MarkerItem[] = []\n \n if (id) {\n // Force finish animation for specific box\n const item = this.getItemById(id)\n if (item && ['box', 'prism'].includes(item.type)) {\n targetItems = [item]\n this.boxAnimationTokens.delete(item)\n const model = item.model as PrismMesh\n model.forceFinishBoxAnimation(id)\n }\n } else {\n // Force finish animations for all box items\n targetItems = this.items.filter((item) => ['box', 'prism'].includes(item.type))\n targetItems.forEach((item) => {\n this.boxAnimationTokens.delete(item)\n const model = item.model as PrismMesh\n model.forceFinishBoxAnimation(item.rawData.id)\n })\n }\n\n // Restore labels immediately when force finishing if requested\n if (restoreLabels) {\n targetItems.forEach((item) => {\n if (item.tag) {\n item.tag.show()\n item.tag.container.style.opacity = '1'\n }\n })\n }\n\n this.five.needsRender = true\n }\n\n /**\n * Play the up-and-down animation for a box mesh\n * @param id Optional box item ID. If not provided, plays animation for all box items.\n * @param config Animation configuration options\n * @returns Promise that resolves when all animations are complete\n */\n public playBoxAnimation(id?: string | number, config: BoxAnimationConfig = {}): Promise<void> {\n // Destructure config with default values\n const { color = '#4DF0FF', hideLabels = false } = config\n\n // Force finish any existing animations first\n this.forceFinishBoxAnimation(id)\n\n // Find the box items to animate\n const targetItems = id ? [this.getItemById(id)].filter(Boolean) : this.items.filter((item) => ['box', 'prism'].includes(item.type))\n\n if (targetItems.length === 0) {\n console.warn('No box items found to animate')\n return Promise.resolve()\n }\n\n const animationToken = Symbol()\n targetItems.forEach((item) => this.boxAnimationTokens.set(item, animationToken))\n\n // Hide labels before starting animation if requested\n if (hideLabels) {\n this.hideItemLabels(targetItems)\n }\n\n // Collect all animation promises\n const animationPromises = targetItems.map((item) => {\n if (!item || !['box', 'prism'].includes(item.type)) return Promise.resolve()\n\n const model = item.model as PrismMesh\n return model.playBoxAnimation(item.rawData.id, color)\n })\n\n // Wait for all animations to complete\n return Promise.all(animationPromises).then(() => {\n // Ease labels back in if they were hidden\n if (hideLabels && targetItems.every((item) => this.items.includes(item) && this.boxAnimationTokens.get(item) === animationToken)) {\n return this.easeInItemLabels(targetItems)\n }\n })\n }\n\n public enable() {\n this.setState({ enabled: true })\n }\n\n public disable() {\n this.setState({ enabled: false })\n }\n\n public show() {\n this.setState({ visible: true })\n }\n\n public hide() {\n this.setState({ visible: false })\n }\n\n public clear() {\n // Remove cache ownership before disposing the original scene resources.\n this.savedColorOwner?.clear()\n // Also invalidate a load waiting for Five's model, without changing enabled/visible state.\n this.data = undefined\n this.labelAnimations.forEach((stop) => stop())\n this.labelAnimations.clear()\n this.zFightingOffset = 0\n this.handleDisable()\n this.items.forEach((item) => {\n if (item.model instanceof ModelMakerPolygonMesh || item.model instanceof ModelMakerPrismMesh) {\n item.model.onSavedGeometryChange = undefined\n }\n this.itemRendererDisposers.get(item)?.()\n item.disable()\n item.tag.destroy()\n if (item.model instanceof PrismMesh) item.model.disposeAnimation()\n this.fiveDomEvents.removeEventListener(item.model)\n // ColoredMesh owns a detached background mesh as well as its visible front.\n const geometries = new Set<THREE.BufferGeometry>()\n const materials = new Set<THREE.Material>()\n item.model.traverse((node) => {\n const colored = node as THREE.Object3D & { meshBackground?: THREE.Mesh }\n for (const mesh of [node as THREE.Mesh, colored.meshBackground]) {\n if (mesh?.geometry && !(mesh.geometry as THREE.BufferGeometry & { isBlank?: boolean }).isBlank) geometries.add(mesh.geometry)\n const ownedMaterials = mesh?.material ? Array.isArray(mesh.material) ? mesh.material : [mesh.material] : []\n ownedMaterials.forEach((material) => materials.add(material))\n }\n })\n geometries.forEach((geometry) => geometry.dispose())\n materials.forEach((material) => material.dispose())\n })\n this.group.clear()\n this.five.needsRender = true\n this.items = []\n this.tagWrapper.innerHTML = ''\n this.fiveDomEvents.clear()\n // 清空所有缓存\n this.originalOpacities.clear()\n this.originalTagOpacities.clear()\n // 清空高亮相关缓存\n this.highlightedItem = null\n this.originalTagStyles.clear()\n this.originalModelColors.clear()\n }\n\n /**\n * 设置所有模型的透明度\n * @param opacityPercent 透明度系数,范围0-1,1表示保持原始透明度,0表示完全透明\n * @param options 可选参数\n * @param options.type 模型类型,可选值为'box'、'prism'、'triangles'\n * @param options.id 模型id\n */\n public setModelsOpacity(opacityPercent: number, options?: { type?: ItemType | ItemType[]; id?: number }): void {\n if (!this.state.enabled) return\n const { type, id } = options || {}\n\n // 如果type存在,则转换为数组;否则设为空数组\n const itemTypes = type ? (Array.isArray(type) ? type : [type]) : []\n\n // 如果传入1的透明度,恢复所有标签原始透明度\n const isRestoringOpacity = opacityPercent === 1\n\n for (const item of this.items) {\n // 如果type为空或者type包含item.type或者id匹配,则处理该模型\n const isMatch = !type || itemTypes.includes(item.type) || item.rawData.id === id\n if (isMatch) {\n switch (item.type) {\n case 'box':\n case 'prism': {\n this.setPrismModelOpacity(item.rawData.id, item.model as PrismMesh, opacityPercent)\n break\n }\n case 'triangles': {\n this.setPolygonModelOpacity(item.rawData.id, item.model as PolygonWithEdgeMesh, opacityPercent)\n break\n }\n }\n\n // 同时设置对应标签的透明度\n if (item.tag) {\n // 只检查标签的visible属性,不检查visibles数组\n // 因为即使visibles数组中有false值,visible为true的标签也应该能调整透明度\n if (!item.tag.visible) {\n continue\n }\n\n const itemId = item.rawData.id.toString()\n\n if (isRestoringOpacity) {\n // 恢复原始透明度(如果有存储)\n const originalOpacity = this.originalTagOpacities.get(itemId)\n if (originalOpacity !== undefined) {\n item.tag.container.style.opacity = originalOpacity.toString()\n }\n // 如果没有存储原始值,保持当前透明度\n } else {\n // 存储原始透明度(如果没有存储过)\n if (!this.originalTagOpacities.has(itemId)) {\n const currentOpacity = parseFloat(item.tag.container.style.opacity) || 1\n this.originalTagOpacities.set(itemId, currentOpacity)\n }\n\n // 计算新的透明度:原始透明度 * 系数\n const originalOpacity = this.originalTagOpacities.get(itemId) || 1\n const newOpacity = originalOpacity * opacityPercent\n\n // 设置新的透明度\n item.tag.container.style.opacity = newOpacity.toString()\n }\n\n // 当透明度接近0时禁用鼠标事件\n const currentOpacity = parseFloat(item.tag.container.style.opacity) || 0\n if (currentOpacity < 0.01) {\n item.tag.container.style.pointerEvents = 'none'\n } else {\n item.tag.container.style.pointerEvents = 'auto'\n }\n }\n }\n }\n\n this.five.needsRender = true\n }\n\n /**\n * 隐藏指定类型的模型\n * @param itemTypes 模型类型数组\n */\n public hideItemsByType(itemTypes: ItemType[] | ItemType) {\n const itemTypesArray = Array.isArray(itemTypes) ? itemTypes : [itemTypes]\n this.items.forEach((item) => {\n if (itemTypesArray.includes(item.type)) {\n item.hide()\n }\n })\n }\n\n /**\n * 显示指定类型的模型\n * @param itemTypes 模型类型数组\n */\n public showItemsByType(itemTypes: ItemType[] | ItemType) {\n const itemTypesArray = Array.isArray(itemTypes) ? itemTypes : [itemTypes]\n this.items.forEach((item) => {\n if (itemTypesArray.includes(item.type)) {\n item.show()\n }\n })\n }\n\n /**\n * 根据条件隐藏模型项目\n * @param condition 判断函数,返回 true 的项目将被隐藏\n * @example\n * // 隐藏所有 ID 大于 10 的项目\n * controller.hideItemsByCondition(item => item.rawData.id > 10)\n * \n * // 隐藏所有红色的盒子\n * controller.hideItemsByCondition(item => \n * item.type === 'box' && item.rawData.object_data.color === '#FF0000'\n * )\n */\n public hideItemsByCondition(condition: (item: MarkerItem) => boolean): void {\n this.items.forEach((item) => {\n if (condition(item)) {\n item.hide()\n item.tag.disable()\n }\n })\n }\n\n /**\n * 根据条件显示模型项目\n * @param condition 判断函数,返回 true 的项目将被显示\n * @example\n * // 显示所有棱柱类型的项目\n * controller.showItemsByCondition(item => item.type === 'prism')\n * \n * // 显示所有透明度大于 0.5 的项目\n * controller.showItemsByCondition(item => \n * (item.rawData.object_data.opacity ?? 0.4) > 0.5\n * )\n */\n public showItemsByCondition(condition: (item: MarkerItem) => boolean): void {\n this.items.forEach((item) => {\n if (condition(item)) {\n item.show()\n item.tag.enable()\n }\n })\n }\n\n /**\n * 根据条件设置模型项目的可见性\n * @param condition 判断函数,返回 true 的项目将应用指定的可见性状态\n * @param visible 是否可见,true 为显示,false 为隐藏\n * @example\n * // 隐藏所有小于指定面积的项目\n * controller.setItemsVisibility(item => getItemArea(item) < 100, false)\n * \n * // 显示所有包含特定标签的项目\n * controller.setItemsVisibility(item => \n * item.rawData.label?.includes('important'), true\n * )\n */\n public setItemsVisibility(condition: (item: MarkerItem) => boolean, visible: boolean): void {\n this.items.forEach((item) => {\n if (condition(item)) {\n visible ? item.show() : item.hide()\n visible ? item.tag.enable() : item.tag.disable()\n }\n })\n }\n\n /**\n * 显示所有模型项目\n * @example\n * // 恢复所有项目的可见性\n * controller.showAllItems()\n */\n public showAllItems(): void {\n this.items.forEach((item) => {\n item.show()\n item.tag.enable()\n })\n }\n\n /**\n * 隐藏所有模型项目\n * @example\n * // 隐藏所有项目\n * controller.hideAllItems()\n */\n public hideAllItems(): void {\n this.items.forEach((item) => {\n item.hide()\n item.tag.disable()\n })\n }\n\n public dispose() {\n if (this.disposed) return\n this.disposed = true\n this.five.off('dispose', this.onFiveDispose)\n this.hooks.emit('dispose')\n this.resetHighlight()\n this.clear()\n this.savedColorOwner?.dispose()\n this.savedColorOwner = undefined\n this.fiveDomEvents.dispose()\n }\n\n protected onWorkCodeChange() {\n this.group.matrix.copy(this.workUtil.transform.clone())\n this.group.matrix.decompose(this.group.position, this.group.quaternion, this.group.scale)\n this.group.updateMatrixWorld()\n }\n\n /**\n * 应用高亮样式到指定项目\n * @param item 要高亮的项目\n * @param color 高亮颜色\n */\n private applyHighlightStyles(item: MarkerItem, color: string): void {\n const itemId = item.rawData.id.toString()\n const container = item.tag.container\n\n // 1. 处理标签样式\n let targetElement: HTMLElement | null = null\n\n if (item.type === 'prism') {\n // 棱柱类型使用 LabelItem 组件,查找 .room-label-item__text 元素\n targetElement = container.querySelector('.room-label-item__text') as HTMLElement\n } else if (item.type === 'box') {\n // 盒子类型使用 Text 组件,查找 .model-maker-tag 元素\n targetElement = container.querySelector('.model-maker-tag') as HTMLElement\n }\n\n if (targetElement) {\n // 存储原始标签样式\n const computedStyle = window.getComputedStyle(targetElement)\n this.originalTagStyles.set(itemId, {\n background: targetElement.style.background || computedStyle.background,\n borderImage: targetElement.style.borderImage || computedStyle.borderImage,\n })\n\n // 应用高亮标签样式\n targetElement.style.background = color\n targetElement.style.borderImage = 'none'\n }\n\n // 2. 处理模型表面和线条样式\n const model = item.model as PrismMesh | PolygonWithEdgeMesh\n if (model && typeof model.setStyle === 'function') {\n // 获取当前颜色(从原始数据或默认值)\n const currentColor = item.rawData.object_data.color \n ? new Color().setHex(parseInt(item.rawData.object_data.color.slice(1), 16))\n : new Color(1, 1, 1)\n\n // 获取当前透明度值\n const originalOpacityData = this.originalOpacities.get(itemId) || { opacity: 0.2, lineOpacity: 1 }\n\n // 存储原始表面颜色、线条颜色和透明度\n this.originalModelColors.set(itemId, {\n color: currentColor.clone(),\n lineColor: currentColor.clone(),\n opacity: originalOpacityData.opacity,\n lineOpacity: originalOpacityData.lineOpacity\n })\n\n // 创建高亮颜色对象\n const highlightColor = new Color(color)\n\n // 应用高亮颜色到表面和线条,并增加表面透明度使其更明显\n model.setStyle({\n color: highlightColor,\n lineColor: highlightColor,\n opacity: originalOpacityData.opacity, // 确保高亮时表面足够可见\n lineOpacity: originalOpacityData.lineOpacity\n })\n }\n\n this.five.needsRender = true\n }\n\n /**\n * 移除指定项目的高亮样式\n * @param item 要移除高亮的项目\n */\n private removeHighlightStyles(item: MarkerItem): void {\n const itemId = item.rawData.id.toString()\n const container = item.tag.container\n\n // 1. 恢复标签样式\n const originalStyles = this.originalTagStyles.get(itemId)\n if (originalStyles) {\n // 根据项目类型查找对应的标签元素\n let targetElement: HTMLElement | null = null\n\n if (item.type === 'prism') {\n targetElement = container.querySelector('.room-label-item__text') as HTMLElement\n } else if (item.type === 'box') {\n targetElement = container.querySelector('.model-maker-tag') as HTMLElement\n }\n\n if (targetElement) {\n // 恢复原始标签样式\n targetElement.style.background = originalStyles.background\n targetElement.style.borderImage = originalStyles.borderImage\n }\n\n // 清除缓存的原始标签样式\n this.originalTagStyles.delete(itemId)\n }\n\n // 2. 恢复模型表面和线条样式\n const originalModelColors = this.originalModelColors.get(itemId)\n if (originalModelColors) {\n const model = item.model as PrismMesh | PolygonWithEdgeMesh\n if (model && typeof model.setStyle === 'function') {\n // 恢复原始表面颜色、线条颜色和透明度\n model.setStyle({\n color: originalModelColors.color,\n lineColor: originalModelColors.lineColor,\n opacity: originalModelColors.opacity,\n lineOpacity: originalModelColors.lineOpacity\n })\n }\n\n // 清除缓存的原始模型颜色\n this.originalModelColors.delete(itemId)\n }\n\n this.five.needsRender = true\n }\n\n /**\n * 设置棱柱体模型的透明度\n * @param id 模型id\n * @param model 模型对象\n * @param opacityPercent 透明度系数,范围0-1\n */\n private setPrismModelOpacity(id: number, model: PrismMesh, opacityPercent: number): void {\n let { opacity, lineOpacity } = this.originalOpacities.get(id.toString()) || { opacity: 0.2, lineOpacity: 1 }\n opacity = opacity * opacityPercent\n lineOpacity = lineOpacity * opacityPercent\n model.setStyle({ opacity, lineOpacity })\n }\n\n /**\n * 设置多边形模型的透明度\n * @param id 模型id\n * @param model 模型对象\n * @param opacityPercent 透明度系数,范围0-1\n */\n private setPolygonModelOpacity(id: number, model: PolygonWithEdgeMesh, opacityPercent: number): void {\n // 设置主体透明度和线框透明度\n let { opacity, lineOpacity } = this.originalOpacities.get(id.toString()) || { opacity: 0.2, lineOpacity: 1 }\n opacity = opacity * opacityPercent\n lineOpacity = lineOpacity * opacityPercent\n model.setStyle({ opacity, lineOpacity })\n }\n\n private onFiveModeChange = (mode: FiveMode) => {\n const occlusionVisibility = this.occlusionVisibility\n\n if (Array.isArray(occlusionVisibility)) {\n const items = [...this.getPrismItems(), ...this.getBoxItems()]\n items.forEach((item) => {\n // 检查模型是否为PrismMesh或PolygonWithEdgeMesh类型,这些类型有setStyle方法\n if (item.model instanceof PrismMesh || item.model instanceof PolygonWithEdgeMesh) {\n item.model.setStyle({ occlusionVisibility: occlusionVisibility.includes(mode) })\n }\n })\n }\n }\n\n private handleShow() {\n this.group.visible = true\n this.tagWrapper.style.display = 'block'\n this.five.needsRender = true\n }\n\n private handleHide() {\n this.group.visible = false\n this.tagWrapper.style.display = 'none'\n this.five.needsRender = true\n }\n\n private handleEnable = () => {\n this.five.scene.add(this.group)\n this.five.getElement()?.parentElement?.appendChild(this.tagWrapper)\n this.five.needsRender = true\n\n this.onFiveModeChange(this.five.getCurrentState().mode)\n this.onFiveEveryReady()\n this.five.on('modeChange', this.onFiveModeChange)\n this.fiveEveryReadyListenerDisposer = fiveEveryReadyListener(this.five, this.onFiveEveryReady)\n }\n\n private handleDisable = () => {\n this.five.scene.remove(this.group)\n this.tagWrapper.remove()\n this.five.needsRender = true\n\n this.five.off('modeChange', this.onFiveModeChange)\n this.fiveEveryReadyListenerDisposer?.()\n this.fiveEveryReadyListenerDisposer = undefined\n }\n\n private onFiveEveryReady = async () => {\n if (this.five.state.mode === 'Panorama') return\n\n const allTags = this.items.filter((item) => item instanceof ModelMakerPrismItem).map((item) => item.tag)\n\n const tags = allTags.filter((tag) => tag.position && tag.visible && tag.enabled)\n\n await sleep(0)\n\n const cameraPosition = this.five.camera.position.clone()\n const sortedTags = tags.sort((a, b) => cameraPosition.distanceTo(a.position) - cameraPosition.distanceTo(b.position))\n\n const canShowTags: { tag: LightTag; boundingClientRect: DOMRect }[] = []\n\n const domRectIsIntersect = (a: DOMRect, b: DOMRect) => {\n const notIntersect = a.right < b.left || a.left > b.right || a.bottom < b.top || a.top > b.bottom\n return !notIntersect\n }\n\n allTags.forEach((tag) => {\n tag.visibles[2] = undefined\n })\n\n sortedTags.forEach((tag) => {\n if (tag.visibles[1] === false) {\n return\n }\n\n const mainDom = tag.container.getElementsByClassName('room-label-item__text')[0]\n\n if (!mainDom) {\n return\n }\n\n const domRect = mainDom.getBoundingClientRect()\n const canShow = canShowTags.every((item) => !domRectIsIntersect(item.boundingClientRect, domRect))\n\n if (canShow) {\n canShowTags.push({ tag, boundingClientRect: domRect })\n tag.visibles[2] = true\n } else {\n tag.visibles[2] = false\n }\n\n tag.needsRender = true\n })\n }\n\n private updateTagRenderer = () => {\n this.items.forEach((item) => {\n const renderer = (this.tagRendererMap[item.type] ?? defaultTagRendererMap[item.type]) as ElementRenderer\n\n if (renderer && this.itemRenderers.get(item) !== renderer) {\n this.itemRenderers.set(item, renderer)\n\n // 销毁上一个 renderer\n this.itemRendererDisposers.get(item)?.()\n item.tag.container.innerHTML = '' // 鞭尸防止复活\n this.itemRendererDisposers.set(item, renderer(item.tag.container, item, this.five))\n }\n })\n }\n\n /**\n * 高亮指定的模型项目\n * @param id 模型项目的ID\n * @param color 高亮颜色,默认为 #FF7700\n */\n public highlightItem(id: string | number, color: string = '#FF7700'): void {\n if (!this.state.enabled) return\n\n // 先重置当前高亮\n this.resetHighlight()\n\n // 查找要高亮的项目\n const item = this.getItemById(id)\n if (!item || !item.tag) return\n\n // 存储当前高亮项目\n this.highlightedItem = item\n\n // 应用高亮样式\n this.applyHighlightStyles(item, color)\n }\n\n /**\n * 重置所有高亮\n */\n public resetHighlight(): void {\n if (this.highlightedItem) {\n this.removeHighlightStyles(this.highlightedItem)\n this.highlightedItem = null\n }\n }\n\n /**\n * 获取当前高亮的项目ID\n */\n public getHighlightedItemId(): string | number | null {\n return this.highlightedItem?.rawData.id ?? null\n }\n\n public getPrismItems() {\n return this.items.filter((item) => item instanceof ModelMakerPrismItem)\n }\n\n public getPolygonItems() {\n return this.items.filter((item) => item instanceof ModelMakerPolygonItem)\n }\n\n public getBoxItems() {\n return this.items.filter((item) => item instanceof ModelMakerBoxItem)\n }\n\n /**\n * 隐藏指定项目的标签\n * @param items 要隐藏标签的项目数组\n */\n private hideItemLabels(items: MarkerItem[]): void {\n items.forEach((item) => {\n if (item.tag) {\n item.tag.hide()\n }\n })\n }\n\n /**\n * 缓动显示指定项目的标签\n * @param items 要显示标签的项目数组\n * @param duration 缓动持续时间(毫秒)\n */\n private easeInItemLabels(items: MarkerItem[], duration: number = 500): Promise<void> {\n return new Promise((resolve) => {\n // 如果没有项目或插件未启用,直接返回\n if (items.length === 0 || !this.state.enabled) {\n resolve()\n return\n }\n\n // 立即显示标签但设置为完全透明\n items.forEach((item) => {\n if (item.tag) {\n item.tag.show()\n item.tag.container.style.opacity = '0'\n }\n })\n\n const startTime = Date.now()\n let frame: number\n const finish = () => {\n cancelAnimationFrame(frame)\n this.labelAnimations.delete(finish)\n resolve()\n }\n this.labelAnimations.add(finish)\n const animate = () => {\n const elapsed = Date.now() - startTime\n const progress = Math.min(elapsed / duration, 1)\n \n // 使用缓动函数(ease-out)\n const easeProgress = 1 - Math.pow(1 - progress, 3)\n\n items.forEach((item) => {\n if (item.tag) {\n item.tag.container.style.opacity = easeProgress.toString()\n }\n })\n\n if (progress < 1) {\n frame = requestAnimationFrame(animate)\n } else {\n // 动画结束,确保最终状态\n items.forEach((item) => {\n if (item.tag) {\n item.tag.container.style.opacity = '1'\n }\n })\n finish()\n }\n }\n\n frame = requestAnimationFrame(animate)\n })\n }\n}\n","import type * as ModelMakerPluginType from './typings'\nimport { Controller } from './Controller'\nimport type { BoxAnimationConfig } from './Controller'\nimport type { ModelMakerPluginConfig, TagOcclusionScope, TagOcclusionScopeConfig } from './typings/config'\n\nexport const ModelMakerPlugin = (...args: ConstructorParameters<typeof Controller>) => new Controller(...args)\n\nexport type { Controller as ModelMakerPluginInstance }\nexport type { ModelMakerPluginType }\nexport type { BoxAnimationConfig }\nexport type { ModelMakerPluginConfig, TagOcclusionScope, TagOcclusionScopeConfig }\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as e } from "./CSS3DRenderPlugin-
|
|
1
|
+
import { t as e } from "./CSS3DRenderPlugin-CEatgl0m.js";
|
|
2
2
|
import { t } from "./loadVideoTexture-CWoiMWRg.js";
|
|
3
3
|
import { i as n } from "./Icon-8d4DFYTH.js";
|
|
4
4
|
import * as r from "three/webgpu";
|
|
@@ -210,4 +210,4 @@ var o = (i, { videoElement: o, mediaManager: s }) => {
|
|
|
210
210
|
//#endregion
|
|
211
211
|
export { i as n, o as t };
|
|
212
212
|
|
|
213
|
-
//# sourceMappingURL=model-tv-video-
|
|
213
|
+
//# sourceMappingURL=model-tv-video-BP-7HoDC.js.map
|