@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
|
@@ -3,7 +3,12 @@ var e = typeof globalThis.requestAnimationFrame == "function" ? globalThis.reque
|
|
|
3
3
|
function n(t, r = 0) {
|
|
4
4
|
e(r <= 0 ? t : () => n(t, r - 1));
|
|
5
5
|
}
|
|
6
|
-
function r(
|
|
6
|
+
async function r() {
|
|
7
|
+
return new Promise((t) => {
|
|
8
|
+
e(() => t());
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
function i(n, r = 60) {
|
|
7
12
|
let i = -1, a = 0, o = -1, s = 1e3 / r;
|
|
8
13
|
function c(t) {
|
|
9
14
|
o === -1 && (o = t), i = e(c), !(t - a < s) && (a = t, n?.(t - o));
|
|
@@ -12,7 +17,13 @@ function r(n, r = 60) {
|
|
|
12
17
|
t(i);
|
|
13
18
|
};
|
|
14
19
|
}
|
|
20
|
+
function a() {
|
|
21
|
+
let t = Date.now();
|
|
22
|
+
return new Promise((n) => {
|
|
23
|
+
e(() => n(Date.now() - t));
|
|
24
|
+
});
|
|
25
|
+
}
|
|
15
26
|
//#endregion
|
|
16
|
-
export {
|
|
27
|
+
export { i, a as n, n as r, r as t };
|
|
17
28
|
|
|
18
|
-
//# sourceMappingURL=animationFrame-
|
|
29
|
+
//# sourceMappingURL=animationFrame-CacKXN8l.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animationFrame-CacKXN8l.js","names":["requestFrame","callback","cancelFrame","handle","nextFrame","delay","fn","awaitNextFrame","resolve","requestAnimationFrameInterval","index","oldTime","startTime","minDeltaTime","frame","loop","time","getFrameTime","start"],"sources":["../../src/shared-utils/animationFrame/index.ts"],"sourcesContent":["const requestFrame: typeof requestAnimationFrame =\n typeof globalThis.requestAnimationFrame === 'function'\n ? globalThis.requestAnimationFrame.bind(globalThis)\n : (callback) => setTimeout(() => callback(Date.now()), 16) as unknown as number\n\nconst cancelFrame: typeof cancelAnimationFrame =\n typeof globalThis.cancelAnimationFrame === 'function'\n ? globalThis.cancelAnimationFrame.bind(globalThis)\n : (handle) => clearTimeout(handle)\n\nexport default requestFrame\n\nexport function nextFrame(fn: (time: number) => void, delay = 0) {\n if (delay <= 0) requestFrame(fn)\n else requestFrame(() => nextFrame(fn, delay - 1))\n}\n\nexport async function awaitNextFrame() {\n return new Promise<void>((resolve) => {\n requestFrame(() => resolve())\n })\n}\n\n/** Run a callback at most once per requested frame interval. */\nexport function requestAnimationFrameInterval(callback?: (time: number) => unknown, frame = 60) {\n let index = -1\n let oldTime = 0\n let startTime = -1\n const minDeltaTime = 1000 / frame\n function loop(time: number) {\n startTime === -1 && (startTime = time)\n index = requestFrame(loop)\n const deltaTime = time - oldTime\n if (deltaTime < minDeltaTime) return\n oldTime = time\n callback?.(time - startTime)\n }\n index = requestFrame(loop)\n return function stop() {\n cancelFrame(index)\n }\n}\n\n/** Return the elapsed time between two animation frames. */\nexport function getFrameTime() {\n const start = Date.now()\n return new Promise<number>((resolve) => {\n requestFrame(() => resolve(Date.now() - start))\n })\n}\n\nexport { tweenProgress, BetterTween } from './BetterTween'\n"],"mappings":";AAAA,IAAMA,IACJ,OAAO,WAAW,yBAA0B,aACxC,WAAW,sBAAsB,KAAK,UAAU,KAC/C,MAAa,iBAAiBC,EAAS,KAAK,IAAI,CAAC,GAAG,EAAE,GAEvDC,IACJ,OAAO,WAAW,wBAAyB,aACvC,WAAW,qBAAqB,KAAK,UAAU,KAC9C,MAAW,aAAaC,CAAM;AAIrC,SAAgBC,EAAU,GAA4B,IAAQ,GAAG;CAC/D,AAAgBJ,EAAZK,KAAS,IAAgBC,UACLF,EAAUE,GAAID,IAAQ,CAAC,CAAC;AAClD;AAEA,eAAsBE,IAAiB;CACrC,OAAO,IAAI,SAAe,MAAY;EACpC,QAAmBC,EAAQ,CAAC;CAC9B,CAAC;AACH;AAGA,SAAgBC,EAA8B,GAAsC,IAAQ,IAAI;CAC9F,IAAIC,IAAQ,IACRC,IAAU,GACVC,IAAY,IACVC,IAAe,MAAOC;CAC5B,SAASC,EAAK,GAAc;EAI1B,AAHAH,MAAc,OAAO,IAAYI,IACjC,IAAQhB,EAAae,CAAI,GACP,MAAOJ,IACTE,OAChB,IAAUG,GACVf,IAAWe,IAAOJ,CAAS;CAC7B;CAEA,OADA,IAAQZ,EAAae,CAAI,GAClB,WAAgB;EACrB,EAAYL,CAAK;CACnB;AACF;AAGA,SAAgBO,IAAe;CAC7B,IAAMC,IAAQ,KAAK,IAAI;CACvB,OAAO,IAAI,SAAiB,MAAY;EACtC,QAAmBV,EAAQ,KAAK,IAAI,IAAIU,CAAK,CAAC;CAChD,CAAC;AACH"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { t as e } from "./Subscribe-DLlAl88n.js";
|
|
2
2
|
import { n as t, t as n } from "./resizeObserver-AY-35us4.js";
|
|
3
|
-
import { t as r } from "./BetterTween-
|
|
3
|
+
import { t as r } from "./BetterTween-DmptqE8m.js";
|
|
4
4
|
import { t as i } from "./equal-BiDAilPV.js";
|
|
5
|
-
import { t as a } from "./BasePluginWithData-
|
|
5
|
+
import { t as a } from "./BasePluginWithData-D_0W46_q.js";
|
|
6
6
|
import { t as o } from "./component.svelte-D5LYqt50.js";
|
|
7
7
|
import { t as s } from "./LabelItem-Cnys51gZ.js";
|
|
8
8
|
import { n as c, r as l } from "./fontSize-DMhRSrtx.js";
|
|
@@ -441,6 +441,6 @@ var b = class extends a {
|
|
|
441
441
|
}
|
|
442
442
|
}, x = (e, t) => new b(e, t);
|
|
443
443
|
//#endregion
|
|
444
|
-
export { x as t };
|
|
444
|
+
export { m as n, p as r, x as t };
|
|
445
445
|
|
|
446
|
-
//# sourceMappingURL=area-maker-
|
|
446
|
+
//# sourceMappingURL=area-maker-Bnhx4SkH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"area-maker-Bd9l2pIp.js","names":["Object3D","LineSegments","OriginLineSegments","Object3D","LineSegments","BasePlugin.Controller","Subscribe","_raycaster","resizeObserver","BetterTween","equal","Controller$1","mountComponent","LabelItem","getCurrentFontSize","getGlobalResponsiveFontSize","getCenterPointOfPoints","THREE","Object3D$1","intersects","raycaster","LineSegments$1","LineSegments","geometry","material","AreaMakerModelGroup","areaMakerItem","AreaMakerItem","objectData","data","bottomY","height","color","opacity","plugin","createMakerObjectGeometry","createMakerObjectMaterial","format2XOZ","hasTag","tagContainer","fontSize","colorObj","shapePoints","shapeCenterPoint","shapeCenterPoint3","zIndex","duration","options","startMakerObjectOpacity","endMakerObjectOpacity","startOutlineOpacity","endOutlineOpacity","makerObjectOpacity","outlineOpacity","resolve","event","visible","msg","modelGroupVisible","shownFloor","tagNDCPosition","ndcPosition","left","top","tagVisible","five","cameraPosition","intersection","vectorDistance","onResizeEnd","shape","matrix","rotationMatrix","translationMatrix","scaleMatrix","object","Controller","defaultState","params","config","prevData","item","dataItem","userAction","mergedOptions","prevState","state","prevConfig","newConfig","id","isV1","serverData","firstPoint","point","pluginState","mode","result","camera","aDistance","a","b","index","intersectResArray","nearestIntersectRes","prev","curr","fiveModelIntersect","AreaMakerPlugin"],"sources":["../../src/shared-utils/three/core/Object3D.ts","../../src/shared-utils/three/core/LineSegments.ts","../../src/AreaMakerPlugin/utils/Item.ts","../../src/AreaMakerPlugin/Controller.ts","../../src/AreaMakerPlugin/index.ts"],"sourcesContent":["import * as THREE from 'three/webgpu'\n\nexport class Object3D<ChildeItem extends THREE.Object3D = THREE.Object3D> extends THREE.Object3D {\n public children: ChildeItem[] = []\n\n /** 获取 raycaster 与当前物体的交点 */\n public getRaycastIntersects(raycaster: THREE.Raycaster) {\n const intersects: THREE.Intersection[] = []\n this.raycast(raycaster, intersects)\n return intersects\n }\n\n /** 获取 raycaster 与当前物体的第一个交点 */\n public getRaycastIntersection(raycaster: THREE.Raycaster) {\n return this.getRaycastIntersects(raycaster)[0] as THREE.Intersection | undefined\n }\n}\n","/** Typed LineSegments constrained to Three's current BufferGeometry model. */\nimport type { BufferGeometry, Material } from 'three/webgpu'\nimport { LineSegments as OriginLineSegments } from 'three/webgpu'\n\nclass LineSegments<\n TGeometry extends BufferGeometry = BufferGeometry,\n TMaterial extends Material | Material[] = Material | Material[],\n> extends OriginLineSegments<TGeometry, TMaterial> {\n public declare geometry: TGeometry\n public declare material: TMaterial\n\n public constructor(geometry: TGeometry, material: TMaterial) {\n super(geometry, material)\n }\n}\n\nexport { LineSegments }\n","import * as THREE from 'three/webgpu'\nimport { BetterTween, Object3D } from '../../shared-utils'\nimport { LineSegments } from '../../shared-utils'\nimport type { Controller } from '../Controller'\nimport type * as PluginType from '../typing'\nimport LabelItem from '../../components/AreaLabel/LabelItem.svelte'\nimport { getCenterPointOfPoints } from '../../shared-utils/math/planimetry'\nimport type { EventCallback } from '@realsee/five-webgpu'\nimport { Subscribe } from '../../shared-utils/Subscribe'\nimport { resizeObserver } from '../../shared-utils/dom/resizeObserver'\nimport { _raycaster } from '../../shared-utils/three/temp'\nimport { getCurrentFontSize, getGlobalResponsiveFontSize } from '../../shared-utils/fontSize'\n\nimport { mountComponent, type MountedComponent } from '../../shared-utils/svelte/component.svelte'\nclass AreaMakerModelGroup extends Object3D {\n private areaMakerItem: AreaMakerItem\n\n public constructor(areaMakerItem: AreaMakerItem) {\n super()\n this.areaMakerItem = areaMakerItem\n }\n\n public raycast(raycaster: THREE.Raycaster, intersects: THREE.Intersection[]): void {\n const makerObject = this.areaMakerItem.makerObject\n makerObject.raycast(raycaster, intersects)\n }\n}\n\nexport class AreaMakerItem {\n public id: string | number\n /** 标注名称 */\n public name = ''\n /** 标注几何体 */\n public makerObject: THREE.Mesh<THREE.ExtrudeGeometry, THREE.MeshBasicMaterial>\n /** 标注几何体的边框 */\n public outline: LineSegments<THREE.EdgesGeometry, THREE.LineBasicMaterial>\n /** 标注底面 Y 坐标 */\n public bottomY: PluginType.ServerAreaMakerItem['object_data']['bottom_y']\n /** 标注透明度 */\n public opacity: PluginType.ServerAreaMakerItem['object_data']['opacity']\n /** 标注高度 */\n public height: PluginType.ServerAreaMakerItem['object_data']['height']\n /** 标注所在楼层 */\n public floorIndex: PluginType.ServerAreaMakerItem['floor_index']\n /** 标注底面形状 */\n public shape: THREE.Shape\n /** 是否被挂载 */\n public mounted = false\n /** 查询问题使用的调试对象 */\n public checkMsg = {\n /** 当标注没有展示时,可以通过这个字段查看原因 */\n checkVisibleMsg: '',\n /** 当标注标签没有展示时,可以通过这个字段查看原因 */\n checkTagVisibleMsg: '',\n }\n /** 模型容器 */\n public modelGroup: AreaMakerModelGroup\n /** 标注是否可见 */\n public visible = true\n // ==================== 标签相关 ====================\n /** 标注标签实例 */\n public tagApp: MountedComponent<any>\n /** 标注标签是否可见 */\n public tagVisible: boolean | null = null\n /** 标注标签的世界坐标 */\n public tagPosition = new THREE.Vector3()\n /** 标注标签的 NDC 坐标 */\n public tagNDCPosition = new THREE.Vector3()\n /** 标注标签的 transform */\n public tagTransform = { left: 0, top: 0 }\n /** 标注标签的显示层级 */\n public tagZIndex = 0\n /** 标注实例的事件处理器 */\n public hooks = new Subscribe<PluginType.AreaMakerItemEventMap>()\n\n /** 自定义 Dom */\n public itemRenderer?: PluginType.ItemRenderer\n /** 数据 */\n private data: PluginType.ServerAreaMakerItem\n /** Plugin 实例 */\n private plugin: Controller\n /** 标注透明度动画 */\n private opacityAnime?: BetterTween<{ makerObjectOpacity: number; outlineOpacity: number }>\n /** 是否在容器 resize 动画中 */\n private isInContainerResizeAnimation = false\n /** 监听容器 resize 的计时器 id,用于判断 resize 过程是否结束 */\n private containerResizeTimeoutID: NodeJS.Timeout | null = null\n /** 容器大小变化监听器 */\n private resizeObserver?: { observe: () => void; unobserve: () => void }\n /** 响应式字体大小管理器 */\n private fontSizeManager = getGlobalResponsiveFontSize()\n /** 当前字体大小 */\n private currentFontSize = getCurrentFontSize()\n /** 字体大小订阅取消函数 */\n private unsubscribeFontSize: (() => void) | null = null\n\n public constructor(plugin: Controller, data: PluginType.ServerAreaMakerItem) {\n const objectData = data.object_data\n const bottomY = objectData.bottom_y\n const height = objectData.height\n const color = new THREE.Color(objectData.color ?? '#FFFFFF')\n const opacity = objectData.opacity ?? 0.4\n\n this.data = data\n this.id = data.id\n this.name = data.name ?? ''\n this.plugin = plugin\n this.height = height\n this.bottomY = bottomY\n this.opacity = opacity\n this.shape = new THREE.Shape().fromJSON(objectData.shape as THREE.ShapeJSON)\n this.floorIndex = data.floor_index\n // 构造模型\n this.makerObject = new THREE.Mesh(createMakerObjectGeometry(this.shape, height), createMakerObjectMaterial(color, opacity))\n format2XOZ(this.makerObject, bottomY)\n this.makerObject.material.depthTest = this.plugin.config.modelDepthTest\n // 构造 outline\n this.outline = new LineSegments(\n new THREE.EdgesGeometry(this.makerObject.geometry),\n new THREE.LineBasicMaterial({ color, transparent: true }),\n )\n format2XOZ(this.outline, bottomY)\n this.outline.material.depthTest = this.plugin.config.modelDepthTest\n this.setHeight(height)\n\n this.modelGroup = new AreaMakerModelGroup(this)\n // 初始化 modelGroup 的 visible\n this.modelGroup.visible = objectData.visible ?? true\n }\n\n /** 挂载标注 */\n public mount() {\n if (this.mounted) return\n this.mounted = true\n // 更新 visible\n this.updateVisible()\n // 更新 depthTest\n this.makerObject.material.depthTest = this.plugin.config.modelDepthTest\n this.outline.material.depthTest = this.plugin.config.modelDepthTest\n // 添加模型\n this.modelGroup.add(this.makerObject, this.outline)\n // 应用标签\n const hasTag = !!this.name\n const tagContainer = this.plugin.tagDomContainer\n if (hasTag) {\n this.tagApp = mountComponent(LabelItem, tagContainer, {\n fontSize: this.currentFontSize,\n rendererData: this.data,\n content: this.name,\n visible: this.tagVisible,\n rendererIfNeed: this.itemRenderer,\n transform: `translate(${this.tagTransform.left}px, ${this.tagTransform.top}px)`,\n onClick: (e: MouseEvent) => this.hooks.emit('tagClick', { target: this, nativeEvent: e }),\n })\n this.updateTag()\n }\n\n this.plugin.five.needsRender = true\n\n // 添加事件监听\n this.plugin.hooks.on('stateChange', this.onPluginStateChange)\n this.plugin.hooks.on('configChange', this.onPluginConfigChange)\n this.plugin.five.on('modeChange', this.updateVisible)\n this.plugin.five.on('modelShownFloorChange', this.updateVisible)\n this.plugin.five.on('cameraUpdate', this.onFiveCameraUpdate)\n this.resizeObserver = resizeObserver(this.onContainerResize, tagContainer)\n this.resizeObserver.observe()\n\n // 监听字体大小变化\n if (typeof this.fontSizeManager === 'object' && 'subscribe' in this.fontSizeManager) {\n this.unsubscribeFontSize = this.fontSizeManager.subscribe((fontSize) => {\n this.currentFontSize = fontSize\n this.updateTagFontSize()\n })\n }\n }\n\n /** 卸载标注 */\n public unmount() {\n if (!this.mounted) return\n this.mounted = false\n // 移除模型\n this.modelGroup.remove(...this.modelGroup.children)\n // 移除标签\n this.tagApp?.destroy()\n this.tagApp = null\n // 解除事件监听\n this.plugin.hooks.off('stateChange', this.onPluginStateChange)\n this.plugin.hooks.off('configChange', this.onPluginConfigChange)\n this.plugin.five.off('modeChange', this.updateVisible)\n this.plugin.five.off('modelShownFloorChange', this.updateVisible)\n this.plugin.five.off('cameraUpdate', this.onFiveCameraUpdate)\n this.resizeObserver?.unobserve()\n // 取消字体大小订阅\n this.unsubscribeFontSize?.()\n }\n\n public dispose() {\n this.unmount()\n this.opacityAnime?.dispose()\n if (this.containerResizeTimeoutID) clearTimeout(this.containerResizeTimeoutID)\n this.makerObject.geometry.dispose()\n this.makerObject.material.dispose()\n this.outline.geometry.dispose()\n this.outline.material.dispose()\n this.hooks.off()\n }\n\n /** 更改标注透明度\n * @param opacity 标注透明度,范围:0-1\n */\n public setOpacity(opacity: number) {\n this.opacity = opacity\n // 如果当前有透明度动画,应该先销毁动画\n this.opacityAnime?.dispose()\n this.makerObject.material.opacity = opacity\n this.plugin.five.needsRender = true\n }\n\n /** 更改标注颜色\n * @param color 标注颜色,支持 hex\n * @example setColor('#FF0000')\n */\n public setColor(color: string) {\n const colorObj = new THREE.Color(color)\n this.makerObject.material.color = colorObj\n this.outline.material.color = colorObj\n this.plugin.five.needsRender = true\n }\n\n /** 更改标注高度\n * @param height 标注高度,单位:米\n */\n public setHeight(height: number) {\n if (height <= 0) throw new Error('高度必须大于 0')\n this.height = height\n // 处理模型\n this.makerObject.geometry.dispose()\n this.outline.geometry.dispose()\n this.makerObject.geometry = createMakerObjectGeometry(this.shape, height)\n // 处理 outline\n this.outline.geometry = new THREE.EdgesGeometry(this.makerObject.geometry)\n // 计算 tagPosition\n const shapePoints = this.shape.extractPoints(10).shape.slice(0, -1)\n const shapeCenterPoint = getCenterPointOfPoints(shapePoints)\n const shapeCenterPoint3 = new THREE.Vector3(shapeCenterPoint.x, shapeCenterPoint.y, height)\n format2XOZ(shapeCenterPoint3, this.bottomY)\n this.tagPosition.copy(shapeCenterPoint3)\n this.updateTag()\n\n // 渲染场景\n this.plugin.five.needsRender = true\n }\n\n /** 更改标注标签的显示层级\n * @description 为什么需要这个方法\n * 在相机朝向或位置发生变化时,各个标签所在的坐标与相机的远近关系发生了变化,所以标签的层级也会有变化。\n * 比如:\n * - 相机 -> 标签 A -> 标签 B: 标签 A 在标签 B 的前面\n * - 标签 A <- 标签 B <- 相机: 标签 A 在标签 B 的后面\n * 但是当前元素是无法感知到这种变化的,所以需要通过父元素调用这个方法来更新标签的层级。\n */\n public setTagZIndex(zIndex: number) {\n if (this.tagZIndex === zIndex) return\n this.tagApp?.update({ zIndex })\n }\n\n /** 显示标注 */\n // public show() {\n // return this.doOpacityAnime({\n // duration: 500,\n // makerObjectOpacity: [this.makerObject.material.opacity, this.opacity],\n // outlineOpacity: [this.outline.material.opacity, 1],\n // ...options,\n // })\n // }\n\n /** 隐藏标注 */\n // public hide() {\n // return this.doOpacityAnime({\n // duration: 500,\n // makerObjectOpacity: [this.makerObject.material.opacity, 0],\n // outlineOpacity: [this.outline.material.opacity, 0],\n // ...options,\n // })\n // }\n\n /** 透明度动画 */\n private doOpacityAnime = (\n options: Required<PluginType.AnimeOptions> & { makerObjectOpacity: [number, number]; outlineOpacity: [number, number] },\n ) => {\n this.opacityAnime?.dispose()\n const duration = options.duration\n const [startMakerObjectOpacity, endMakerObjectOpacity] = options.makerObjectOpacity\n const [startOutlineOpacity, endOutlineOpacity] = options.outlineOpacity\n\n if (duration === 0) {\n this.makerObject.material.opacity = endMakerObjectOpacity\n this.outline.material.opacity = endOutlineOpacity\n return\n }\n\n return new Promise<boolean>((resolve) => {\n this.opacityAnime = new BetterTween({ makerObjectOpacity: startMakerObjectOpacity, outlineOpacity: startOutlineOpacity })\n .to({\n makerObjectOpacity: endMakerObjectOpacity,\n outlineOpacity: endOutlineOpacity,\n })\n .onUpdate(({ makerObjectOpacity, outlineOpacity }) => {\n this.makerObject.material.opacity = makerObjectOpacity\n this.outline.material.opacity = outlineOpacity\n this.plugin.five.needsRender = true\n })\n .onComplete(() => resolve(true))\n .onDispose(() => {\n // 销毁动画的时候应该把值设置到终值\n this.makerObject.material.opacity = endMakerObjectOpacity\n this.outline.material.opacity = endOutlineOpacity\n this.plugin.five.needsRender = true\n resolve(false)\n })\n .play()\n })\n }\n\n /** 插件 Config 变化时更新自身 depthTest */\n private onPluginConfigChange = (event: { config: PluginType.Config }) => {\n this.makerObject.material.depthTest = event.config.modelDepthTest\n this.outline.material.depthTest = event.config.modelDepthTest\n this.plugin.five.needsRender = true\n }\n\n /** 插件整体可见性变化时,需要更新自身可见性 */\n private onPluginStateChange = () => {\n this.updateVisible()\n this.updateTagVisible()\n }\n\n /** 更新标注可见性 */\n private updateVisible = () => {\n const { result: visible, msg } = this.checkVisible()\n this.checkMsg.checkVisibleMsg = msg\n if (this.visible === visible) return\n this.visible = visible\n const modelGroupVisible = this.data.object_data.visible ?? true\n this.modelGroup.visible = visible && modelGroupVisible\n this.plugin.five.needsRender = true\n }\n\n /** 检测标注是否可见 */\n private checkVisible = (): { result: boolean; msg: string } => {\n const pluginState = this.plugin.state\n if (!pluginState.visible) return { result: false, msg: '插件不可见' }\n const shownFloor = this.plugin.fiveUtil.model.shownFloor\n const floorVisible = shownFloor === null || shownFloor === this.floorIndex\n if (!floorVisible) return { result: false, msg: `模型高亮楼层不符合展示条件, 当前高亮楼层为:${shownFloor}` }\n return { result: true, msg: '' }\n }\n\n /** 更新标注标签 */\n private updateTag = () => {\n if (!this.tagApp) return\n this.updateTagNDCPosition()\n this.updateTagDomTransform()\n this.updateTagVisible()\n }\n\n /** 更新标注标签的 NDC Position */\n private updateTagNDCPosition = () => {\n const tagPosition = this.tagPosition\n const tagNDCPosition = tagPosition.clone().project(this.plugin.five.camera)\n this.tagNDCPosition.copy(tagNDCPosition)\n }\n\n /** 更新标注标签的 transform */\n private updateTagDomTransform = () => {\n const ndcPosition = this.tagNDCPosition\n const left = Math.round(((ndcPosition.x + 1) / 2) * this.plugin.tagDomContainer.clientWidth)\n const top = Math.round(((-ndcPosition.y + 1) / 2) * this.plugin.tagDomContainer.clientHeight)\n if (this.tagTransform.left === left && this.tagTransform.top === top) return\n this.tagTransform = { left, top }\n this.tagApp?.update({ transform: `translate(${left}px, ${top}px)` })\n }\n\n /** 更新标注标签可见性 */\n private updateTagVisible = () => {\n const { result: tagVisible, msg } = this.checkTagVisible()\n this.checkMsg.checkTagVisibleMsg = msg\n if (this.tagVisible === tagVisible) return\n this.tagVisible = tagVisible\n if (this.tagApp) {\n this.tagVisible ? this.hooks.emit('tagShow') : this.hooks.emit('tagHide')\n this.tagApp?.update({ visible: tagVisible })\n }\n }\n\n /** 检测标注标签是否可见 */\n private checkTagVisible = (): { result: boolean; msg: string } => {\n // 检测标注整体可见性\n const makerVisible = this.visible\n if (!makerVisible) return { result: false, msg: '标注整体不可见' }\n // resize 动画中不可见\n if (this.isInContainerResizeAnimation) return { result: false, msg: '处于容器 resize 动画中' }\n // 模型遮挡检测\n const five = this.plugin.five\n const cameraPosition = five.camera.position.clone()\n _raycaster.set(cameraPosition.clone(), this.tagPosition.clone().sub(cameraPosition).normalize())\n const [intersection] = this.plugin.fiveUtil.model.intersectRaycaster(_raycaster)\n const vectorDistance = this.tagPosition.distanceTo(five.camera.position)\n if (intersection && intersection.distance + 0.1 < vectorDistance) return { result: false, msg: '标注标签被 Five 模型遮挡' }\n // 检测标注标签 NDC Position 是否在屏幕内\n const tagNDCPosition = this.tagNDCPosition\n if (Math.abs(tagNDCPosition.x) > 1.2 || Math.abs(tagNDCPosition.y) > 1.2 || Math.abs(tagNDCPosition.z) > 1)\n return { result: false, msg: '标注标签不在屏幕内' }\n\n return { result: true, msg: '' }\n }\n\n /** 相机位姿发生变化时,更新标签 */\n private onFiveCameraUpdate: EventCallback['cameraUpdate'] = () => {\n if (!this.tagApp) return\n if (!this.visible) return\n this.updateTagNDCPosition()\n this.updateTagDomTransform()\n this.updateTagVisible()\n }\n\n /** tag container DOM 发生 resize */\n private onContainerResize = () => {\n // resize start 时,更新标签\n const isResizeStart = this.isInContainerResizeAnimation === false\n if (isResizeStart) {\n this.isInContainerResizeAnimation = true\n this.updateTag()\n }\n\n const onResizeEnd = () => {\n this.isInContainerResizeAnimation = false\n this.containerResizeTimeoutID = null\n this.updateTag()\n }\n\n if (this.containerResizeTimeoutID) clearTimeout(this.containerResizeTimeoutID)\n this.containerResizeTimeoutID = setTimeout(onResizeEnd, 100)\n }\n\n /** 更新标注字体大小 */\n private updateTagFontSize = () => {\n if (this.tagApp) {\n this.tagApp.update({ fontSize: this.currentFontSize })\n }\n }\n}\n\n/** 创建标注几何体的 Geometry */\nfunction createMakerObjectGeometry(shape: THREE.Shape, height: number) {\n const geometry = new THREE.ExtrudeGeometry(shape, {\n depth: height,\n bevelEnabled: false,\n })\n return geometry\n}\n\n/** 创建标注几何体的 Material */\nfunction createMakerObjectMaterial(color: THREE.Color, opacity: number) {\n return new THREE.MeshBasicMaterial({\n color,\n opacity,\n transparent: true,\n })\n}\n\n/** 把 XOY 面上的 Mesh 转换成 XOZ 面 */\nfunction format2XOZ(object: THREE.Object3D | THREE.Box3 | THREE.Vector3, bottomY: number) {\n const matrix = new THREE.Matrix4() // 创建一个新的 Matrix4 对象\n // 创建各个子变换矩阵\n const rotationMatrix = new THREE.Matrix4().makeRotationX(Math.PI / 2)\n const translationMatrix = new THREE.Matrix4().makeTranslation(0, 0, -bottomY)\n const scaleMatrix = new THREE.Matrix4().makeScale(1, 1, -1)\n\n // 分别对 matrix 应用旋转、平移、缩放\n matrix.multiply(rotationMatrix) // 对 matrix 应用旋转\n matrix.multiply(translationMatrix) // 对 matrix 应用平移\n matrix.multiply(scaleMatrix) // 对 matrix 应用缩放\n\n // 对 object 应用 matrix 变换\n object.applyMatrix4(matrix)\n}\n","import * as THREE from 'three/webgpu'\nimport type { EventCallback, Five } from '@realsee/five-webgpu'\nimport * as BasePlugin from '../base/BasePluginWithData'\nimport { equal } from '../shared-utils'\nimport { AreaMakerItem } from './utils/Item'\nimport type * as PluginType from './typing'\n\nexport class Controller extends BasePlugin.Controller<PluginType.State, PluginType.EventMap, PluginType.ServerData, PluginType.PluginData> {\n // ==================== public properties ====================\n /** 插件当前状态 */\n public state: PluginType.State\n /** 标注模型 { id: item } 的映射表 */\n public itemMap: Map<string | number, AreaMakerItem>\n /** 自定义 DOM */\n public itemRenderer?: PluginType.ItemRenderer\n /** 标注模型容器 */\n public modelGroup: THREE.Group\n /** 当前使用的数据 */\n public data?: PluginType.PluginData\n /** tag 容器 */\n public tagDomContainer: HTMLDivElement\n /** 插件配置项 */\n public get config() {\n return { ...this._config }\n }\n /** 是否已经被销毁 */\n public get disposed() {\n return this._disposed\n }\n /** 查询问题使用的调试对象 */\n public checkMsg = {\n childrenMountedState: '',\n }\n\n // ==================== private properties ====================\n /** 是否在 Five Change Mode 动画中 */\n private isInFiveChangeModeAnime = false\n /** 子组件是否挂载 */\n private childrenMountedState = false\n /** config 的原始值 */\n private _config: Required<PluginType.Config>\n /** disposed 的原始值 */\n private _disposed = false\n\n /** AreaMakerPlugin\n * @param `five` `<Five>` Five 实例\n * @param `params` `<PluginType.Params> | <undefined>` 插件初始化参数\n * @param `params.initialState` `<PluginType.State> | <undefined>` 插件初始化后,使用的状态\n */\n public constructor(five: Five, params?: PluginType.Params) {\n super(five)\n this.five = five\n\n this.tagDomContainer = document.createElement('div')\n this.tagDomContainer.style.position = 'absolute'\n this.tagDomContainer.style.top = '0'\n this.tagDomContainer.style.left = '0'\n this.tagDomContainer.style.width = '100%'\n this.tagDomContainer.style.height = '100%'\n this.tagDomContainer.style.pointerEvents = 'none'\n\n // 处理 initialState\n const defaultState: PluginType.State = {\n enabled: true,\n visible: true,\n }\n this.state = Object.assign(defaultState, params?.initialState)\n\n // 处理 config\n const config: Required<PluginType.Config> = {\n modelDepthTest: true,\n ...params?.config,\n }\n this._config = config\n\n this.modelGroup = new THREE.Group()\n this.modelGroup.name = 'ModelMakerPluginGroup'\n this.itemMap = new Map()\n\n if (this.state.enabled) this._enable({ userAction: false })\n this.five.once('dispose', this.dispose)\n }\n\n /** 加载数据,重复调用会使用新数据覆盖旧数据 */\n public async load(data: PluginType.ServerData) {\n if (this.disposed) throw new Error('AreaMakerPlugin 已销毁')\n const prevData = this.data\n this.data = this.formatData(data)\n this.hooks.emit('dataChange', this.data, prevData)\n\n // 清除原有数据\n this.modelGroup.remove(...this.modelGroup.children)\n this.itemMap.forEach((item) => item.dispose())\n this.itemMap.clear()\n this.childrenMountedState = false\n this.checkMsg.childrenMountedState = ''\n\n // 加载新数据\n this.data.list.forEach((dataItem) => {\n const item = new AreaMakerItem(this, dataItem)\n item.itemRenderer = this.itemRenderer\n this.modelGroup.add(item.modelGroup)\n this.itemMap.set(dataItem.id, item)\n item.hooks.on('tagClick', this.onMakerTagClick)\n })\n\n this.updateChildrenMountedState()\n }\n\n /** 将插件的 DOM 容器添加到指定的 DOM 元素上 */\n public appendTo(wrapper: Element): void {\n wrapper.appendChild(this.tagDomContainer)\n }\n\n /** 启用插件\n * @param `options` `<Option> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public enable(options: BasePlugin.BaseOptions = {}) {\n if (this.disposed || this.state.enabled) return\n const userAction = options.userAction ?? true\n this.updateState({ enabled: true }, userAction)\n this._enable({ userAction })\n }\n\n /** 禁用插件\n * @param `options` `<Option> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public disable(options: BasePlugin.BaseOptions = {}) {\n if (this.state.enabled === false) return\n const userAction = options.userAction ?? true\n this.updateState({ enabled: false }, userAction)\n this._disable({ userAction })\n }\n\n /** 展示标注\n * @param `options` `<Partial<ShowHideOptions>> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public async show(options?: Partial<PluginType.ShowHideOptions>): Promise<void> {\n if (this.state.visible) return Promise.resolve()\n if (this.disposed) return Promise.reject(new Error('不能在已销毁的插件上调用 show'))\n const mergedOptions: PluginType.ShowHideOptions = { userAction: true, ...options }\n this.updateState({ visible: true }, mergedOptions.userAction)\n await this._show(mergedOptions)\n }\n\n /** 插件内容整体隐藏\n * @param `options` `<Partial<ShowHideOptions>> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public async hide(options?: Partial<PluginType.ShowHideOptions>) {\n if (this.state.visible === false) return\n const mergedOptions: PluginType.ShowHideOptions = { userAction: true, ...options }\n this.updateState({ visible: false }, mergedOptions.userAction)\n await this._hide(mergedOptions)\n }\n\n // 目前带动画的展示和隐藏功能有些需求细节没有确定,暂时不实现\n // /** 展示标注\n // * @param `options` `<Partial<ShowHideOptions>> | <undefined>`\n // * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n // * @param `options.anime` `<AnimeOptions> | <undefined>` 动画配置。\n // * @param `options.anime.duration` `<number> | <undefined>` 动画时间,默认是 500ms。\n // */\n // public async show(options?: Partial<PluginType.ShowHideOptions>): Promise<void> {\n // if (this.state.visible) return Promise.resolve()\n // if (this.disposed) return Promise.reject(new Error('不能在已销毁的插件上调用 show'))\n // const mergedOptions: PluginType.ShowHideOptions = {\n // userAction: true,\n // anime: { duration: 500, ...options?.anime },\n // ...options,\n // }\n // this.updateState({ visible: true }, mergedOptions.userAction)\n // await this._show(mergedOptions)\n // }\n // /** 插件内容整体隐藏\n // * @param `options` `<Partial<ShowHideOptions>> | <undefined>`\n // * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n // * @param `options.anime` `<AnimeOptions> | <undefined>` 动画配置。\n // * @param `options.anime.duration` `<number> | <undefined>` 动画时间,默认是 500ms。\n // */\n // public async hide(options?: Partial<PluginType.ShowHideOptions>) {\n // if (this.state.visible === false) return\n // const mergedOptions: PluginType.ShowHideOptions = {\n // userAction: true,\n // anime: { duration: 500, ...options?.anime },\n // ...options,\n // }\n // this.updateState({ visible: false }, mergedOptions.userAction)\n // await this._hide(mergedOptions)\n // }\n\n /** 更改插件 State\n * @param `state` `<Partial<Plugin.State>>` 插件属性 `state` 的子集。\n * @param `options` `<Option> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public setState(state: Partial<PluginType.State>, options: BasePlugin.BaseOptions = {}) {\n const prevState = this.state\n if (equal(state, prevState, { deep: true })) return\n\n const userAction = options.userAction !== undefined ? options.userAction : true\n this.updateState(state, userAction)\n\n if (state.enabled !== undefined && prevState.enabled !== state.enabled) {\n state.enabled ? this._enable({ userAction }) : this._disable({ userAction })\n }\n\n if (state.visible !== undefined && prevState.visible !== state.visible) {\n const options = { userAction, anime: { duration: 500 } }\n state.visible ? this._show(options) : this._hide(options)\n }\n }\n\n /** 更改插件 Config\n * @param `config` `<Partial<Plugin.Config>>` 插件属性 `config` 的子集。\n * @param `options` `<Option> | <undefined>`\n */\n public updateConfig(config: Partial<PluginType.Config>, options: BasePlugin.BaseOptions = {}) {\n const prevConfig = this.config\n const newConfig = { ...prevConfig, ...config }\n this._config = newConfig\n this.hooks.emit('configChange', { prevConfig, config: newConfig, userAction: options.userAction ?? true })\n }\n\n /** 根据 ID 获取标注 */\n public getMaskItemByID(id: string | number) {\n return this.itemMap.get(id)\n }\n\n /** 销毁插件,移除所有副作用,销毁后将不响应任何 API */\n public clear() {\n this.itemMap.forEach(item => item.dispose())\n this.itemMap.clear()\n this.modelGroup.clear()\n this.childrenMountedState = false\n this.data = undefined\n this.five.needsRender = true\n }\n\n public dispose = () => {\n if (this.disposed) return\n this._disposed = true\n this.state.enabled = false\n this._disable({ userAction: false })\n this.clear()\n this.tagDomContainer.remove()\n this.five.off('dispose', this.dispose)\n this.hooks.emit('dispose')\n this.hooks.off()\n }\n\n protected formatData(serverData: PluginType.ServerData): PluginType.PluginData {\n function isV1(data: PluginType.ServerData): data is PluginType.ServerDataV1 {\n // 如果 list 长度为 0,不能判断是 v1 还是 v2,所以默认是 v1\n if (data.list.length === 0) return true\n return !('shape' in data.list[0].object_data)\n }\n if (isV1(serverData)) {\n return {\n list: serverData.list\n // 三个点以下不能构成面\n .filter((item) => item.object_data.points.length >= 3)\n .map((item) => {\n // 通过 points 生成 shape\n const shape = new THREE.Shape()\n const firstPoint = item.object_data.points[0]\n shape.moveTo(firstPoint[0], firstPoint[2])\n item.object_data.points.slice(1).forEach((point) => shape.lineTo(point[0], point[2]))\n shape.lineTo(firstPoint[0], firstPoint[2])\n\n const formattedItem: PluginType.ServerAreaMakerItem = {\n ...item,\n floor_index: item.object_data.floorIndex,\n object_data: {\n ...item.object_data,\n bottom_y: firstPoint[1] + item.object_data.fixedY,\n shape: shape.toJSON(),\n height: item.object_data.height + item.object_data.fixedHeight,\n },\n }\n return formattedItem\n }),\n }\n }\n return serverData\n }\n\n private checkChildrenMountedState(): { result: boolean; msg: string } {\n const pluginState = this.state\n const five = this.five\n if (!pluginState.enabled) return { result: false, msg: '插件不可用' }\n const mode = five.getCurrentState().mode\n if (mode === 'Panorama') return { result: false, msg: `Five 模态不符合条件, 当前模态为:${mode}` }\n if (this.isInFiveChangeModeAnime) return { result: false, msg: '切换模态动画中不展示' }\n return { result: true, msg: '' }\n }\n\n private updateChildrenMountedState() {\n const { result, msg } = this.checkChildrenMountedState()\n this.checkMsg.childrenMountedState = msg\n if (result === this.childrenMountedState) return\n this.childrenMountedState = result\n this.itemMap.forEach((item) => {\n this.childrenMountedState ? item.mount() : item.unmount()\n })\n }\n\n private onFiveInitAnimationWillStart: EventCallback['initAnimationWillStart'] = () => {\n this.isInFiveChangeModeAnime = true\n this.updateChildrenMountedState()\n }\n\n private onFiveInitAnimationEnded: EventCallback['initAnimationEnded'] = () => {\n this.isInFiveChangeModeAnime = false\n this.updateChildrenMountedState()\n }\n\n private onFiveCameraUpdate: EventCallback['cameraUpdate'] = () => {\n const camera = this.five.camera\n const sortedItems = [...this.itemMap.values()].sort((a, b) => {\n const aDistance = a.tagPosition.distanceTo(camera.position)\n const bDistance = b.tagPosition.distanceTo(camera.position)\n return bDistance - aDistance\n })\n sortedItems.forEach((item, index) => {\n this.getMaskItemByID(item.id)?.setTagZIndex(index * 10)\n })\n }\n\n private onFiveModeChange: EventCallback['modeChange'] = () => {\n this.updateChildrenMountedState()\n }\n\n private onMakerTagClick: PluginType.AreaMakerItemEventMap['tagClick'] = (event) => {\n this.hooks.emit('wantsTap', { target: event.target, intersectObjects: [] })\n }\n\n private updateState(state: Partial<PluginType.State>, userAction: boolean) {\n const prevState = this.state\n this.state = { ...this.state, ...state }\n this.hooks.emit('stateChange', { state: this.state, prevState, userAction })\n }\n\n private _enable(options: { userAction: boolean }) {\n this.hooks.emit('enable', { userAction: options.userAction })\n // resume model effects\n this.five.scene.add(this.modelGroup)\n this.updateChildrenMountedState()\n this.five.needsRender = true\n\n // resume event effects\n this.five.on('wantsTapGesture', this.onWantsFiveTapGesture)\n this.five.on('initAnimationWillStart', this.onFiveInitAnimationWillStart)\n this.five.on('initAnimationEnded', this.onFiveInitAnimationEnded)\n this.five.on('modeChange', this.onFiveModeChange)\n this.five.on('cameraUpdate', this.onFiveCameraUpdate)\n }\n\n private onWantsFiveTapGesture: EventCallback['wantsTapGesture'] = (raycaster) => {\n const intersectResArray = Array.from(this.itemMap.values())\n .filter((item) => item.mounted && item.visible)\n .map((item) => ({\n makerItem: item,\n intersects: item.modelGroup.getRaycastIntersects(raycaster),\n }))\n .filter(({ intersects }) => intersects.length > 0)\n if (intersectResArray.length === 0) return\n const nearestIntersectRes = intersectResArray.reduce((prev, curr) => {\n const prevDistance = prev.intersects[0].distance\n const currDistance = curr.intersects[0].distance\n return prevDistance < currDistance ? prev : curr\n })\n const fiveModelIntersect = this.fiveUtil.model.intersectRaycaster(raycaster)[0]\n const depthTest = this.config.modelDepthTest\n if (depthTest && fiveModelIntersect && fiveModelIntersect.distance < nearestIntersectRes.intersects[0].distance) return\n const preventDefault = this.hooks.emit('wantsTap', {\n target: nearestIntersectRes.makerItem,\n intersectObjects: nearestIntersectRes.intersects,\n })\n if (preventDefault) return false\n }\n\n private _disable(options: { userAction: boolean }) {\n this.hooks.emit('disable', { userAction: options.userAction })\n // dispose model effects\n // this.disposeAnime()\n this.five.scene.remove(this.modelGroup)\n this.updateChildrenMountedState()\n this.five.needsRender = true\n // dispose event effects\n this.five.off('wantsTapGesture', this.onWantsFiveTapGesture)\n this.five.off('initAnimationWillStart', this.onFiveInitAnimationWillStart)\n this.five.off('initAnimationEnded', this.onFiveInitAnimationEnded)\n this.five.off('modeChange', this.onFiveModeChange)\n this.five.off('cameraUpdate', this.onFiveCameraUpdate)\n }\n\n private async _show(options: PluginType.ShowHideOptions) {\n this.hooks.emit('show', options)\n this.five.needsRender = true\n }\n\n private async _hide(options: PluginType.ShowHideOptions) {\n this.hooks.emit('hide', options)\n this.five.needsRender = true\n }\n}\n","import type { Five } from '@realsee/five-webgpu'\nimport type * as AreaMakerPluginType from './typing'\nimport { Controller } from './Controller'\n\nexport const AreaMakerPlugin = (five: Five, params?: AreaMakerPluginType.Params) => new Controller(five, params)\n\nexport type { AreaMakerPluginType }\n"],"mappings":";;;;;;;;;;;;AAEA,IAAaA,IAAb,cAAkFiB,EAAM,SAAS;CAC/F,WAAgC,CAAC;CAGjC,qBAA4B,GAA4B;EACtD,IAAME,IAAmC,CAAC;EAE1C,OADA,KAAK,QAAQC,GAAWD,CAAU,GAC3BA;CACT;CAGA,uBAA8B,GAA4B;EACxD,OAAO,KAAK,qBAAqBC,CAAS,CAAC,CAAC;CAC9C;AACF,GCZMnB,IAAN,cAGUC,EAAyC;CAIjD,YAAmB,GAAqB,GAAqB;EAC3D,MAAMqB,GAAUC,CAAQ;CAC1B;AACF,GCAMC,IAAN,cAAkCtB,EAAS;CACzC;CAEA,YAAmB,GAA8B;EAE/C,AADA,MAAM,GACN,KAAK,gBAAgBuB;CACvB;CAEA,QAAe,GAA4B,GAAwC;EAEjF,KADyB,cAAc,YAC3B,QAAQN,GAAWD,CAAU;CAC3C;AACF,GAEaQ,IAAb,MAA2B;CACzB;CAEA,OAAc;CAEd;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA,UAAiB;CAEjB,WAAkB;EAEhB,iBAAiB;EAEjB,oBAAoB;CACtB;CAEA;CAEA,UAAiB;CAGjB;CAEA,aAAoC;CAEpC,cAAqB,IAAIV,EAAM,QAAQ;CAEvC,iBAAwB,IAAIA,EAAM,QAAQ;CAE1C,eAAsB;EAAE,MAAM;EAAG,KAAK;CAAE;CAExC,YAAmB;CAEnB,QAAe,IAAIX,EAA4C;CAG/D;CAEA;CAEA;CAEA;CAEA,+BAAuC;CAEvC,2BAA0D;CAE1D;CAEA,kBAA0BS,EAA4B;CAEtD,kBAA0BD,EAAmB;CAE7C,sBAAmD;CAEnD,YAAmB,GAAoB,GAAsC;EAC3E,IAAMc,IAAaC,EAAK,aAClBC,IAAUF,EAAW,UACrBG,IAASH,EAAW,QACpBI,IAAQ,IAAIf,EAAM,MAAMW,EAAW,SAAS,SAAS,GACrDK,IAAUL,EAAW,WAAW;EA0BtC,AAxBA,KAAK,OAAOC,GACZ,KAAK,KAAKA,EAAK,IACf,KAAK,OAAOA,EAAK,QAAQ,IACzB,KAAK,SAASK,GACd,KAAK,SAASH,GACd,KAAK,UAAUD,GACf,KAAK,UAAUG,GACf,KAAK,QAAQ,IAAIhB,EAAM,MAAM,CAAC,CAAC,SAASW,EAAW,KAAwB,GAC3E,KAAK,aAAaC,EAAK,aAEvB,KAAK,cAAc,IAAIZ,EAAM,KAAKkB,EAA0B,KAAK,OAAOJ,CAAM,GAAGK,EAA0BJ,GAAOC,CAAO,CAAC,GAC1HI,EAAW,KAAK,aAAaP,CAAO,GACpC,KAAK,YAAY,SAAS,YAAY,KAAK,OAAO,OAAO,gBAEzD,KAAK,UAAU,IAAI1B,EACjB,IAAIa,EAAM,cAAc,KAAK,YAAY,QAAQ,GACjD,IAAIA,EAAM,kBAAkB;GAAE;GAAO,aAAa;EAAK,CAAC,CAC1D,GACAoB,EAAW,KAAK,SAASP,CAAO,GAChC,KAAK,QAAQ,SAAS,YAAY,KAAK,OAAO,OAAO,gBACrD,KAAK,UAAUC,CAAM,GAErB,KAAK,aAAa,IAAIN,EAAoB,IAAI,GAE9C,KAAK,WAAW,UAAUG,EAAW,WAAW;CAClD;CAGA,QAAe;EACb,IAAI,KAAK,SAAS;EAQlB,AAPA,KAAK,UAAU,IAEf,KAAK,cAAc,GAEnB,KAAK,YAAY,SAAS,YAAY,KAAK,OAAO,OAAO,gBACzD,KAAK,QAAQ,SAAS,YAAY,KAAK,OAAO,OAAO,gBAErD,KAAK,WAAW,IAAI,KAAK,aAAa,KAAK,OAAO;EAElD,IAAMU,IAAS,CAAC,CAAC,KAAK,MAChBC,IAAe,KAAK,OAAO;EA0BjC,AAzBID,MACF,KAAK,SAAS1B,EAAeC,GAAW0B,GAAc;GAClD,UAAU,KAAK;GACf,cAAc,KAAK;GACnB,SAAS,KAAK;GACd,SAAS,KAAK;GACd,gBAAgB,KAAK;GACrB,WAAW,aAAa,KAAK,aAAa,KAAK,MAAM,KAAK,aAAa,IAAI;GAC3E,UAAU,MAAkB,KAAK,MAAM,KAAK,YAAY;IAAE,QAAQ;IAAM,aAAa;GAAE,CAAC;EAC1F,CAAC,GACH,KAAK,UAAU,IAGjB,KAAK,OAAO,KAAK,cAAc,IAG/B,KAAK,OAAO,MAAM,GAAG,eAAe,KAAK,mBAAmB,GAC5D,KAAK,OAAO,MAAM,GAAG,gBAAgB,KAAK,oBAAoB,GAC9D,KAAK,OAAO,KAAK,GAAG,cAAc,KAAK,aAAa,GACpD,KAAK,OAAO,KAAK,GAAG,yBAAyB,KAAK,aAAa,GAC/D,KAAK,OAAO,KAAK,GAAG,gBAAgB,KAAK,kBAAkB,GAC3D,KAAK,iBAAiB/B,EAAe,KAAK,mBAAmB+B,CAAY,GACzE,KAAK,eAAe,QAAQ,GAGxB,OAAO,KAAK,mBAAoB,YAAY,eAAe,KAAK,oBAClE,KAAK,sBAAsB,KAAK,gBAAgB,WAAW,MAAa;GAEtE,AADA,KAAK,kBAAkBC,GACvB,KAAK,kBAAkB;EACzB,CAAC;CAEL;CAGA,UAAiB;EACf,AAAK,KAAK,YACV,KAAK,UAAU,IAEf,KAAK,WAAW,OAAO,GAAG,KAAK,WAAW,QAAQ,GAElD,KAAK,QAAQ,QAAQ,GACrB,KAAK,SAAS,MAEd,KAAK,OAAO,MAAM,IAAI,eAAe,KAAK,mBAAmB,GAC7D,KAAK,OAAO,MAAM,IAAI,gBAAgB,KAAK,oBAAoB,GAC/D,KAAK,OAAO,KAAK,IAAI,cAAc,KAAK,aAAa,GACrD,KAAK,OAAO,KAAK,IAAI,yBAAyB,KAAK,aAAa,GAChE,KAAK,OAAO,KAAK,IAAI,gBAAgB,KAAK,kBAAkB,GAC5D,KAAK,gBAAgB,UAAU,GAE/B,KAAK,sBAAsB;CAC7B;CAEA,UAAiB;EAQf,AAPA,KAAK,QAAQ,GACb,KAAK,cAAc,QAAQ,GACvB,KAAK,4BAA0B,aAAa,KAAK,wBAAwB,GAC7E,KAAK,YAAY,SAAS,QAAQ,GAClC,KAAK,YAAY,SAAS,QAAQ,GAClC,KAAK,QAAQ,SAAS,QAAQ,GAC9B,KAAK,QAAQ,SAAS,QAAQ,GAC9B,KAAK,MAAM,IAAI;CACjB;CAKA,WAAkB,GAAiB;EAKjC,AAJA,KAAK,UAAUP,GAEf,KAAK,cAAc,QAAQ,GAC3B,KAAK,YAAY,SAAS,UAAUA,GACpC,KAAK,OAAO,KAAK,cAAc;CACjC;CAMA,SAAgB,GAAe;EAC7B,IAAMQ,IAAW,IAAIxB,EAAM,MAAMe,CAAK;EAGtC,AAFA,KAAK,YAAY,SAAS,QAAQS,GAClC,KAAK,QAAQ,SAAS,QAAQA,GAC9B,KAAK,OAAO,KAAK,cAAc;CACjC;CAKA,UAAiB,GAAgB;EAC/B,IAAIV,KAAU,GAAG,MAAU,MAAM,UAAU;EAO3C,AANA,KAAK,SAASA,GAEd,KAAK,YAAY,SAAS,QAAQ,GAClC,KAAK,QAAQ,SAAS,QAAQ,GAC9B,KAAK,YAAY,WAAWI,EAA0B,KAAK,OAAOJ,CAAM,GAExE,KAAK,QAAQ,WAAW,IAAId,EAAM,cAAc,KAAK,YAAY,QAAQ;EAEzE,IAAMyB,IAAc,KAAK,MAAM,cAAc,EAAE,CAAC,CAAC,MAAM,MAAM,GAAG,EAAE,GAC5DC,IAAmB3B,EAAuB0B,CAAW,GACrDE,IAAoB,IAAI3B,EAAM,QAAQ0B,EAAiB,GAAGA,EAAiB,GAAGZ,CAAM;EAM1F,AALAM,EAAWO,GAAmB,KAAK,OAAO,GAC1C,KAAK,YAAY,KAAKA,CAAiB,GACvC,KAAK,UAAU,GAGf,KAAK,OAAO,KAAK,cAAc;CACjC;CAUA,aAAoB,GAAgB;EAClC,AAAI,KAAK,cAAcC,KACvB,KAAK,QAAQ,OAAO,EAAE,UAAO,CAAC;CAChC;CAuBA,kBACE,MACG;EACH,KAAK,cAAc,QAAQ;EAC3B,IAAMC,IAAWC,EAAQ,UACnB,CAACC,GAAyBC,KAAyBF,EAAQ,oBAC3D,CAACG,GAAqBC,KAAqBJ,EAAQ;EAEzD,IAAID,MAAa,GAEf,AADA,KAAK,YAAY,SAAS,UAAUG,GACpC,KAAK,QAAQ,SAAS,UAAUE;OAIlC,OAAO,IAAI,SAAkB,MAAY;GACvC,KAAK,eAAe,IAAI1C,EAAY;IAAE,oBAAoBuC;IAAyB,gBAAgBE;GAAoB,CAAC,CAAC,CACtH,GAAG;IACF,oBAAoBD;IACpB,gBAAgBE;GAClB,CAAC,CAAC,CACD,UAAU,EAAE,uBAAoB,wBAAqB;IAGpD,AAFA,KAAK,YAAY,SAAS,UAAUC,GACpC,KAAK,QAAQ,SAAS,UAAUC,GAChC,KAAK,OAAO,KAAK,cAAc;GACjC,CAAC,CAAC,CACD,iBAAiBC,EAAQ,EAAI,CAAC,CAAC,CAC/B,gBAAgB;IAKf,AAHA,KAAK,YAAY,SAAS,UAAUL,GACpC,KAAK,QAAQ,SAAS,UAAUE,GAChC,KAAK,OAAO,KAAK,cAAc,IAC/BG,EAAQ,EAAK;GACf,CAAC,CAAC,CACD,KAAK;EACV,CAAC;CACH;CAGA,wBAAgC,MAAyC;EAGvE,AAFA,KAAK,YAAY,SAAS,YAAYC,EAAM,OAAO,gBACnD,KAAK,QAAQ,SAAS,YAAYA,EAAM,OAAO,gBAC/C,KAAK,OAAO,KAAK,cAAc;CACjC;CAGA,4BAAoC;EAElC,AADA,KAAK,cAAc,GACnB,KAAK,iBAAiB;CACxB;CAGA,sBAA8B;EAC5B,IAAM,EAAE,QAAQC,GAAS,WAAQ,KAAK,aAAa;EAEnD,IADA,KAAK,SAAS,kBAAkBC,GAC5B,KAAK,YAAYD,GAAS;EAC9B,KAAK,UAAUA;EACf,IAAME,IAAoB,KAAK,KAAK,YAAY,WAAW;EAE3D,AADA,KAAK,WAAW,UAAUF,KAAWE,GACrC,KAAK,OAAO,KAAK,cAAc;CACjC;CAGA,qBAA+D;EAE7D,IAAI,CADgB,KAAK,OAAO,MACf,SAAS,OAAO;GAAE,QAAQ;GAAO,KAAK;EAAQ;EAC/D,IAAMC,IAAa,KAAK,OAAO,SAAS,MAAM;EAG9C,OAFqBA,MAAe,QAAQA,MAAe,KAAK,aACtC;GAAE,QAAQ;GAAO,KAAK,0BAA0BA;EAAa,IAChF;GAAE,QAAQ;GAAM,KAAK;EAAG;CACjC;CAGA,kBAA0B;EACxB,AAAK,KAAK,WACV,KAAK,qBAAqB,GAC1B,KAAK,sBAAsB,GAC3B,KAAK,iBAAiB;CACxB;CAGA,6BAAqC;EAEnC,IAAMC,IADc,KAAK,YACU,MAAM,CAAC,CAAC,QAAQ,KAAK,OAAO,KAAK,MAAM;EAC1E,KAAK,eAAe,KAAKA,CAAc;CACzC;CAGA,8BAAsC;EACpC,IAAMC,IAAc,KAAK,gBACnBC,IAAO,KAAK,OAAQD,EAAY,IAAI,KAAK,IAAK,KAAK,OAAO,gBAAgB,WAAW,GACrFE,IAAM,KAAK,OAAQ,CAACF,EAAY,IAAI,KAAK,IAAK,KAAK,OAAO,gBAAgB,YAAY;EAC5F,CAAI,KAAK,aAAa,SAASC,KAAQ,KAAK,aAAa,QAAQC,OACjE,KAAK,eAAe;GAAE;GAAM;EAAI,GAChC,KAAK,QAAQ,OAAO,EAAE,WAAW,aAAaD,EAAK,MAAMC,EAAI,KAAK,CAAC;CACrE;CAGA,yBAAiC;EAC/B,IAAM,EAAE,QAAQC,GAAY,WAAQ,KAAK,gBAAgB;EAEzD,AADA,KAAK,SAAS,qBAAqBP,GAC/B,KAAK,eAAeO,MACxB,KAAK,aAAaA,GACd,KAAK,WACP,KAAK,aAAa,KAAK,MAAM,KAAK,SAAS,IAAI,KAAK,MAAM,KAAK,SAAS,GACxE,KAAK,QAAQ,OAAO,EAAE,SAASA,EAAW,CAAC;CAE/C;CAGA,wBAAkE;EAGhE,IAAI,CADiB,KAAK,SACP,OAAO;GAAE,QAAQ;GAAO,KAAK;EAAU;EAE1D,IAAI,KAAK,8BAA8B,OAAO;GAAE,QAAQ;GAAO,KAAK;EAAkB;EAEtF,IAAMC,IAAO,KAAK,OAAO,MACnBC,IAAiBD,EAAK,OAAO,SAAS,MAAM;EAClD,EAAW,IAAIC,EAAe,MAAM,GAAG,KAAK,YAAY,MAAM,CAAC,CAAC,IAAIA,CAAc,CAAC,CAAC,UAAU,CAAC;EAC/F,IAAM,CAACC,KAAgB,KAAK,OAAO,SAAS,MAAM,mBAAmB5D,CAAU,GACzE6D,IAAiB,KAAK,YAAY,WAAWH,EAAK,OAAO,QAAQ;EACvE,IAAIE,KAAgBA,EAAa,WAAW,KAAMC,GAAgB,OAAO;GAAE,QAAQ;GAAO,KAAK;EAAkB;EAEjH,IAAMR,IAAiB,KAAK;EAI5B,OAHI,KAAK,IAAIA,EAAe,CAAC,IAAI,OAAO,KAAK,IAAIA,EAAe,CAAC,IAAI,OAAO,KAAK,IAAIA,EAAe,CAAC,IAAI,IAChG;GAAE,QAAQ;GAAO,KAAK;EAAY,IAEpC;GAAE,QAAQ;GAAM,KAAK;EAAG;CACjC;CAGA,2BAAkE;EAChE,AAAK,KAAK,UACL,KAAK,YACV,KAAK,qBAAqB,GAC1B,KAAK,sBAAsB,GAC3B,KAAK,iBAAiB;CACxB;CAGA,0BAAkC;EAGhC,AADsB,KAAK,iCAAiC,OAE1D,KAAK,+BAA+B,IACpC,KAAK,UAAU;EAGjB,IAAMS,UAAoB;GAGxB,AAFA,KAAK,+BAA+B,IACpC,KAAK,2BAA2B,MAChC,KAAK,UAAU;EACjB;EAGA,AADI,KAAK,4BAA0B,aAAa,KAAK,wBAAwB,GAC7E,KAAK,2BAA2B,WAAWA,GAAa,GAAG;CAC7D;CAGA,0BAAkC;EAChC,AAAI,KAAK,UACP,KAAK,OAAO,OAAO,EAAE,UAAU,KAAK,gBAAgB,CAAC;CAEzD;AACF;AAGA,SAASlC,EAA0B,GAAoB,GAAgB;CAKrE,OAAO,IAJclB,EAAM,gBAAgBqD,GAAO;EAChD,OAAOvC;EACP,cAAc;CAChB,CACO;AACT;AAGA,SAASK,EAA0B,GAAoB,GAAiB;CACtE,OAAO,IAAInB,EAAM,kBAAkB;EACjC;EACA;EACA,aAAa;CACf,CAAC;AACH;AAGA,SAASoB,EAAW,GAAqD,GAAiB;CACxF,IAAMkC,IAAS,IAAItD,EAAM,QAAQ,GAE3BuD,IAAiB,IAAIvD,EAAM,QAAQ,CAAC,CAAC,cAAc,KAAK,KAAK,CAAC,GAC9DwD,IAAoB,IAAIxD,EAAM,QAAQ,CAAC,CAAC,gBAAgB,GAAG,GAAG,CAACa,CAAO,GACtE4C,IAAc,IAAIzD,EAAM,QAAQ,CAAC,CAAC,UAAU,GAAG,GAAG,EAAE;CAQ1D,AALAsD,EAAO,SAASC,CAAc,GAC9BD,EAAO,SAASE,CAAiB,GACjCF,EAAO,SAASG,CAAW,GAG3BC,EAAO,aAAaJ,CAAM;AAC5B;;;ACheA,IAAaK,IAAb,cAAgCvE,EAA2G;CAGzI;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA,IAAW,SAAS;EAClB,OAAO,EAAE,GAAG,KAAK,QAAQ;CAC3B;CAEA,IAAW,WAAW;EACpB,OAAO,KAAK;CACd;CAEA,WAAkB,EAChB,sBAAsB,GACxB;CAIA,0BAAkC;CAElC,uBAA+B;CAE/B;CAEA,YAAoB;CAOpB,YAAmB,GAAY,GAA4B;EAUzD,AATA,MAAM4D,CAAI,GACV,KAAK,OAAOA,GAEZ,KAAK,kBAAkB,SAAS,cAAc,KAAK,GACnD,KAAK,gBAAgB,MAAM,WAAW,YACtC,KAAK,gBAAgB,MAAM,MAAM,KACjC,KAAK,gBAAgB,MAAM,OAAO,KAClC,KAAK,gBAAgB,MAAM,QAAQ,QACnC,KAAK,gBAAgB,MAAM,SAAS,QACpC,KAAK,gBAAgB,MAAM,gBAAgB;EAG3C,IAAMY,IAAiC;GACrC,SAAS;GACT,SAAS;EACX;EACA,KAAK,QAAQ,OAAO,OAAOA,GAAcC,GAAQ,YAAY;EAG7D,IAAMC,IAAsC;GAC1C,gBAAgB;GAChB,GAAGD,GAAQ;EACb;EAQA,AAPA,KAAK,UAAUC,GAEf,KAAK,aAAa,IAAI9D,EAAM,MAAM,GAClC,KAAK,WAAW,OAAO,yBACvB,KAAK,0BAAU,IAAI,IAAI,GAEnB,KAAK,MAAM,WAAS,KAAK,QAAQ,EAAE,YAAY,GAAM,CAAC,GAC1D,KAAK,KAAK,KAAK,WAAW,KAAK,OAAO;CACxC;CAGA,MAAa,KAAK,GAA6B;EAC7C,IAAI,KAAK,UAAU,MAAU,MAAM,qBAAqB;EACxD,IAAM+D,IAAW,KAAK;EAoBtB,AAnBA,KAAK,OAAO,KAAK,WAAWnD,CAAI,GAChC,KAAK,MAAM,KAAK,cAAc,KAAK,MAAMmD,CAAQ,GAGjD,KAAK,WAAW,OAAO,GAAG,KAAK,WAAW,QAAQ,GAClD,KAAK,QAAQ,SAAS,MAASC,EAAK,QAAQ,CAAC,GAC7C,KAAK,QAAQ,MAAM,GACnB,KAAK,uBAAuB,IAC5B,KAAK,SAAS,uBAAuB,IAGrC,KAAK,KAAK,KAAK,SAAS,MAAa;GACnC,IAAMA,IAAO,IAAItD,EAAc,MAAMuD,CAAQ;GAI7C,AAHA,EAAK,eAAe,KAAK,cACzB,KAAK,WAAW,IAAID,EAAK,UAAU,GACnC,KAAK,QAAQ,IAAIC,EAAS,IAAID,CAAI,GAClCA,EAAK,MAAM,GAAG,YAAY,KAAK,eAAe;EAChD,CAAC,GAED,KAAK,2BAA2B;CAClC;CAGA,SAAgB,GAAwB;EACtC,EAAQ,YAAY,KAAK,eAAe;CAC1C;CAMA,OAAc,IAAkC,CAAC,GAAG;EAClD,IAAI,KAAK,YAAY,KAAK,MAAM,SAAS;EACzC,IAAME,IAAapC,EAAQ,cAAc;EAEzC,AADA,KAAK,YAAY,EAAE,SAAS,GAAK,GAAGoC,CAAU,GAC9C,KAAK,QAAQ,EAAE,cAAW,CAAC;CAC7B;CAMA,QAAe,IAAkC,CAAC,GAAG;EACnD,IAAI,KAAK,MAAM,YAAY,IAAO;EAClC,IAAMA,IAAapC,EAAQ,cAAc;EAEzC,AADA,KAAK,YAAY,EAAE,SAAS,GAAM,GAAGoC,CAAU,GAC/C,KAAK,SAAS,EAAE,cAAW,CAAC;CAC9B;CAMA,MAAa,KAAK,GAA8D;EAC9E,IAAI,KAAK,MAAM,SAAS,OAAO,QAAQ,QAAQ;EAC/C,IAAI,KAAK,UAAU,OAAO,QAAQ,OAAO,gBAAI,MAAM,mBAAmB,CAAC;EACvE,IAAMC,IAA4C;GAAE,YAAY;GAAM,GAAGrC;EAAQ;EAEjF,AADA,KAAK,YAAY,EAAE,SAAS,GAAK,GAAGqC,EAAc,UAAU,GAC5D,MAAM,KAAK,MAAMA,CAAa;CAChC;CAMA,MAAa,KAAK,GAA+C;EAC/D,IAAI,KAAK,MAAM,YAAY,IAAO;EAClC,IAAMA,IAA4C;GAAE,YAAY;GAAM,GAAGrC;EAAQ;EAEjF,AADA,KAAK,YAAY,EAAE,SAAS,GAAM,GAAGqC,EAAc,UAAU,GAC7D,MAAM,KAAK,MAAMA,CAAa;CAChC;CA0CA,SAAgB,GAAkC,IAAkC,CAAC,GAAG;EACtF,IAAMC,IAAY,KAAK;EACvB,IAAI3E,EAAM4E,GAAOD,GAAW,EAAE,MAAM,GAAK,CAAC,GAAG;EAE7C,IAAMF,IAAapC,EAAQ,eAAe,KAAA,KAAYA,EAAQ;EAO9D,IANA,KAAK,YAAYuC,GAAOH,CAAU,GAE9BG,EAAM,YAAY,KAAA,KAAaD,EAAU,YAAYC,EAAM,YAC7DA,EAAM,UAAU,KAAK,QAAQ,EAAE,cAAW,CAAC,IAAI,KAAK,SAAS,EAAE,cAAW,CAAC,IAGzEA,EAAM,YAAY,KAAA,KAAaD,EAAU,YAAYC,EAAM,SAAS;GACtE,IAAMvC,IAAU;IAAE;IAAY,OAAO,EAAE,UAAU,IAAI;GAAE;GACvD,EAAM,UAAU,KAAK,MAAMA,CAAO,IAAI,KAAK,MAAMA,CAAO;EAC1D;CACF;CAMA,aAAoB,GAAoC,IAAkC,CAAC,GAAG;EAC5F,IAAMwC,IAAa,KAAK,QAClBC,IAAY;GAAE,GAAGD;GAAY,GAAGR;EAAO;EAE7C,AADA,KAAK,UAAUS,GACf,KAAK,MAAM,KAAK,gBAAgB;GAAE;GAAY,QAAQA;GAAW,YAAYzC,EAAQ,cAAc;EAAK,CAAC;CAC3G;CAGA,gBAAuB,GAAqB;EAC1C,OAAO,KAAK,QAAQ,IAAI0C,CAAE;CAC5B;CAGA,QAAe;EAMb,AALA,KAAK,QAAQ,SAAQ,MAAQR,EAAK,QAAQ,CAAC,GAC3C,KAAK,QAAQ,MAAM,GACnB,KAAK,WAAW,MAAM,GACtB,KAAK,uBAAuB,IAC5B,KAAK,OAAO,KAAA,GACZ,KAAK,KAAK,cAAc;CAC1B;CAEA,gBAAuB;EACrB,AAAI,KAAK,aACT,KAAK,YAAY,IACjB,KAAK,MAAM,UAAU,IACrB,KAAK,SAAS,EAAE,YAAY,GAAM,CAAC,GACnC,KAAK,MAAM,GACX,KAAK,gBAAgB,OAAO,GAC5B,KAAK,KAAK,IAAI,WAAW,KAAK,OAAO,GACrC,KAAK,MAAM,KAAK,SAAS,GACzB,KAAK,MAAM,IAAI;CACjB;CAEA,WAAqB,GAA0D;EAC7E,SAASS,EAAK,GAA8D;GAG1E,OADI7D,EAAK,KAAK,WAAW,KAClB,EAAE,WAAWA,EAAK,KAAK,EAAE,CAAC;EACnC;EA4BA,OA3BI6D,EAAKC,CAAU,IACV,EACL,MAAMA,EAAW,KAEd,QAAQ,MAASV,EAAK,YAAY,OAAO,UAAU,CAAC,CAAC,CACrD,KAAK,MAAS;GAEb,IAAMX,IAAQ,IAAIrD,EAAM,MAAM,GACxB2E,IAAaX,EAAK,YAAY,OAAO;GAe3C,OAdAX,EAAM,OAAOsB,EAAW,IAAIA,EAAW,EAAE,GACzCX,EAAK,YAAY,OAAO,MAAM,CAAC,CAAC,CAAC,SAAS,MAAUX,EAAM,OAAOuB,EAAM,IAAIA,EAAM,EAAE,CAAC,GACpFvB,EAAM,OAAOsB,EAAW,IAAIA,EAAW,EAAE,GAYlC;IATL,GAAGX;IACH,aAAaA,EAAK,YAAY;IAC9B,aAAa;KACX,GAAGA,EAAK;KACR,UAAUW,EAAW,KAAKX,EAAK,YAAY;KAC3C,OAAOX,EAAM,OAAO;KACpB,QAAQW,EAAK,YAAY,SAASA,EAAK,YAAY;IACrD;GAEK;EACT,CAAC,EACL,IAEKU;CACT;CAEA,4BAAsE;EACpE,IAAMG,IAAc,KAAK,OACnB7B,IAAO,KAAK;EAClB,IAAI,CAAC6B,EAAY,SAAS,OAAO;GAAE,QAAQ;GAAO,KAAK;EAAQ;EAC/D,IAAMC,IAAO9B,EAAK,gBAAgB,CAAC,CAAC;EAGpC,OAFI8B,MAAS,aAAmB;GAAE,QAAQ;GAAO,KAAK,uBAAuBA;EAAO,IAChF,KAAK,0BAAgC;GAAE,QAAQ;GAAO,KAAK;EAAa,IACrE;GAAE,QAAQ;GAAM,KAAK;EAAG;CACjC;CAEA,6BAAqC;EACnC,IAAM,EAAE,WAAQ,WAAQ,KAAK,0BAA0B;EAEvD,AADA,KAAK,SAAS,uBAAuBtC,GACjCuC,MAAW,KAAK,yBACpB,KAAK,uBAAuBA,GAC5B,KAAK,QAAQ,SAAS,MAAS;GAC7B,KAAK,uBAAuBf,EAAK,MAAM,IAAIA,EAAK,QAAQ;EAC1D,CAAC;CACH;CAEA,qCAAsF;EAEpF,AADA,KAAK,0BAA0B,IAC/B,KAAK,2BAA2B;CAClC;CAEA,iCAA8E;EAE5E,AADA,KAAK,0BAA0B,IAC/B,KAAK,2BAA2B;CAClC;CAEA,2BAAkE;EAChE,IAAMgB,IAAS,KAAK,KAAK;EAMzB,CALqB,GAAG,KAAK,QAAQ,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,MAAM;GAC5D,IAAMC,IAAYC,EAAE,YAAY,WAAWF,EAAO,QAAQ;GAE1D,OADkBG,EAAE,YAAY,WAAWH,EAAO,QAC3C,IAAYC;EACrB,CACA,CAAA,CAAY,SAAS,GAAM,MAAU;GACnC,KAAK,gBAAgBjB,EAAK,EAAE,CAAC,EAAE,aAAaoB,IAAQ,EAAE;EACxD,CAAC;CACH;CAEA,yBAA8D;EAC5D,KAAK,2BAA2B;CAClC;CAEA,mBAAyE,MAAU;EACjF,KAAK,MAAM,KAAK,YAAY;GAAE,QAAQ9C,EAAM;GAAQ,kBAAkB,CAAC;EAAE,CAAC;CAC5E;CAEA,YAAoB,GAAkC,GAAqB;EACzE,IAAM8B,IAAY,KAAK;EAEvB,AADA,KAAK,QAAQ;GAAE,GAAG,KAAK;GAAO,GAAGC;EAAM,GACvC,KAAK,MAAM,KAAK,eAAe;GAAE,OAAO,KAAK;GAAO;GAAW;EAAW,CAAC;CAC7E;CAEA,QAAgB,GAAkC;EAYhD,AAXA,KAAK,MAAM,KAAK,UAAU,EAAE,YAAYvC,EAAQ,WAAW,CAAC,GAE5D,KAAK,KAAK,MAAM,IAAI,KAAK,UAAU,GACnC,KAAK,2BAA2B,GAChC,KAAK,KAAK,cAAc,IAGxB,KAAK,KAAK,GAAG,mBAAmB,KAAK,qBAAqB,GAC1D,KAAK,KAAK,GAAG,0BAA0B,KAAK,4BAA4B,GACxE,KAAK,KAAK,GAAG,sBAAsB,KAAK,wBAAwB,GAChE,KAAK,KAAK,GAAG,cAAc,KAAK,gBAAgB,GAChD,KAAK,KAAK,GAAG,gBAAgB,KAAK,kBAAkB;CACtD;CAEA,yBAAmE,MAAc;EAC/E,IAAMuD,IAAoB,MAAM,KAAK,KAAK,QAAQ,OAAO,CAAC,CAAC,CACxD,QAAQ,MAASrB,EAAK,WAAWA,EAAK,OAAO,CAAC,CAC9C,KAAK,OAAU;GACd,WAAWA;GACX,YAAYA,EAAK,WAAW,qBAAqB7D,CAAS;EAC5D,EAAE,CAAC,CACF,QAAQ,EAAE,oBAAiBD,EAAW,SAAS,CAAC;EACnD,IAAImF,EAAkB,WAAW,GAAG;EACpC,IAAMC,IAAsBD,EAAkB,QAAQ,GAAM,MACrCE,EAAK,WAAW,EAAE,CAAC,WACnBC,EAAK,WAAW,EAAE,CAAC,WACHD,IAAOC,CAC7C,GACKC,IAAqB,KAAK,SAAS,MAAM,mBAAmBtF,CAAS,CAAC,CAAC;EAE7E,IADkB,OAAK,OAAO,kBACbsF,KAAsBA,EAAmB,WAAWH,EAAoB,WAAW,EAAE,CAAC,aAChF,KAAK,MAAM,KAAK,YAAY;GACjD,QAAQA,EAAoB;GAC5B,kBAAkBA,EAAoB;EACxC,CACI,GAAgB,OAAO;CAC7B;CAEA,SAAiB,GAAkC;EAYjD,AAXA,KAAK,MAAM,KAAK,WAAW,EAAE,YAAYxD,EAAQ,WAAW,CAAC,GAG7D,KAAK,KAAK,MAAM,OAAO,KAAK,UAAU,GACtC,KAAK,2BAA2B,GAChC,KAAK,KAAK,cAAc,IAExB,KAAK,KAAK,IAAI,mBAAmB,KAAK,qBAAqB,GAC3D,KAAK,KAAK,IAAI,0BAA0B,KAAK,4BAA4B,GACzE,KAAK,KAAK,IAAI,sBAAsB,KAAK,wBAAwB,GACjE,KAAK,KAAK,IAAI,cAAc,KAAK,gBAAgB,GACjD,KAAK,KAAK,IAAI,gBAAgB,KAAK,kBAAkB;CACvD;CAEA,MAAc,MAAM,GAAqC;EAEvD,AADA,KAAK,MAAM,KAAK,QAAQA,CAAO,GAC/B,KAAK,KAAK,cAAc;CAC1B;CAEA,MAAc,MAAM,GAAqC;EAEvD,AADA,KAAK,MAAM,KAAK,QAAQA,CAAO,GAC/B,KAAK,KAAK,cAAc;CAC1B;AACF,GCrZa4D,KAAmB,GAAY,MAAwC,IAAI/B,EAAWX,GAAMa,CAAM"}
|
|
1
|
+
{"version":3,"file":"area-maker-Bnhx4SkH.js","names":["Object3D","LineSegments","OriginLineSegments","Object3D","LineSegments","BasePlugin.Controller","Subscribe","_raycaster","resizeObserver","BetterTween","equal","Controller$1","mountComponent","LabelItem","getCurrentFontSize","getGlobalResponsiveFontSize","getCenterPointOfPoints","THREE","Object3D$1","intersects","raycaster","LineSegments$1","LineSegments","geometry","material","AreaMakerModelGroup","areaMakerItem","AreaMakerItem","objectData","data","bottomY","height","color","opacity","plugin","createMakerObjectGeometry","createMakerObjectMaterial","format2XOZ","hasTag","tagContainer","fontSize","colorObj","shapePoints","shapeCenterPoint","shapeCenterPoint3","zIndex","duration","options","startMakerObjectOpacity","endMakerObjectOpacity","startOutlineOpacity","endOutlineOpacity","makerObjectOpacity","outlineOpacity","resolve","event","visible","msg","modelGroupVisible","shownFloor","tagNDCPosition","ndcPosition","left","top","tagVisible","five","cameraPosition","intersection","vectorDistance","onResizeEnd","shape","matrix","rotationMatrix","translationMatrix","scaleMatrix","object","Controller","defaultState","params","config","prevData","item","dataItem","userAction","mergedOptions","prevState","state","prevConfig","newConfig","id","isV1","serverData","firstPoint","point","pluginState","mode","result","camera","aDistance","a","b","index","intersectResArray","nearestIntersectRes","prev","curr","fiveModelIntersect","AreaMakerPlugin"],"sources":["../../src/shared-utils/three/core/Object3D.ts","../../src/shared-utils/three/core/LineSegments.ts","../../src/AreaMakerPlugin/utils/Item.ts","../../src/AreaMakerPlugin/Controller.ts","../../src/AreaMakerPlugin/index.ts"],"sourcesContent":["import * as THREE from 'three/webgpu'\n\nexport class Object3D<ChildeItem extends THREE.Object3D = THREE.Object3D> extends THREE.Object3D {\n public children: ChildeItem[] = []\n\n /** 获取 raycaster 与当前物体的交点 */\n public getRaycastIntersects(raycaster: THREE.Raycaster) {\n const intersects: THREE.Intersection[] = []\n this.raycast(raycaster, intersects)\n return intersects\n }\n\n /** 获取 raycaster 与当前物体的第一个交点 */\n public getRaycastIntersection(raycaster: THREE.Raycaster) {\n return this.getRaycastIntersects(raycaster)[0] as THREE.Intersection | undefined\n }\n}\n","/** Typed LineSegments constrained to Three's current BufferGeometry model. */\nimport type { BufferGeometry, Material } from 'three/webgpu'\nimport { LineSegments as OriginLineSegments } from 'three/webgpu'\n\nclass LineSegments<\n TGeometry extends BufferGeometry = BufferGeometry,\n TMaterial extends Material | Material[] = Material | Material[],\n> extends OriginLineSegments<TGeometry, TMaterial> {\n public declare geometry: TGeometry\n public declare material: TMaterial\n\n public constructor(geometry: TGeometry, material: TMaterial) {\n super(geometry, material)\n }\n}\n\nexport { LineSegments }\n","import * as THREE from 'three/webgpu'\nimport { BetterTween, Object3D } from '../../shared-utils'\nimport { LineSegments } from '../../shared-utils'\nimport type { Controller } from '../Controller'\nimport type * as PluginType from '../typing'\nimport LabelItem from '../../components/AreaLabel/LabelItem.svelte'\nimport { getCenterPointOfPoints } from '../../shared-utils/math/planimetry'\nimport type { EventCallback } from '@realsee/five-webgpu'\nimport { Subscribe } from '../../shared-utils/Subscribe'\nimport { resizeObserver } from '../../shared-utils/dom/resizeObserver'\nimport { _raycaster } from '../../shared-utils/three/temp'\nimport { getCurrentFontSize, getGlobalResponsiveFontSize } from '../../shared-utils/fontSize'\n\nimport { mountComponent, type MountedComponent } from '../../shared-utils/svelte/component.svelte'\nclass AreaMakerModelGroup extends Object3D {\n private areaMakerItem: AreaMakerItem\n\n public constructor(areaMakerItem: AreaMakerItem) {\n super()\n this.areaMakerItem = areaMakerItem\n }\n\n public raycast(raycaster: THREE.Raycaster, intersects: THREE.Intersection[]): void {\n const makerObject = this.areaMakerItem.makerObject\n makerObject.raycast(raycaster, intersects)\n }\n}\n\nexport class AreaMakerItem {\n public id: string | number\n /** 标注名称 */\n public name = ''\n /** 标注几何体 */\n public makerObject: THREE.Mesh<THREE.ExtrudeGeometry, THREE.MeshBasicMaterial>\n /** 标注几何体的边框 */\n public outline: LineSegments<THREE.EdgesGeometry, THREE.LineBasicMaterial>\n /** 标注底面 Y 坐标 */\n public bottomY: PluginType.ServerAreaMakerItem['object_data']['bottom_y']\n /** 标注透明度 */\n public opacity: PluginType.ServerAreaMakerItem['object_data']['opacity']\n /** 标注高度 */\n public height: PluginType.ServerAreaMakerItem['object_data']['height']\n /** 标注所在楼层 */\n public floorIndex: PluginType.ServerAreaMakerItem['floor_index']\n /** 标注底面形状 */\n public shape: THREE.Shape\n /** 是否被挂载 */\n public mounted = false\n /** 查询问题使用的调试对象 */\n public checkMsg = {\n /** 当标注没有展示时,可以通过这个字段查看原因 */\n checkVisibleMsg: '',\n /** 当标注标签没有展示时,可以通过这个字段查看原因 */\n checkTagVisibleMsg: '',\n }\n /** 模型容器 */\n public modelGroup: AreaMakerModelGroup\n /** 标注是否可见 */\n public visible = true\n // ==================== 标签相关 ====================\n /** 标注标签实例 */\n public tagApp: MountedComponent<any>\n /** 标注标签是否可见 */\n public tagVisible: boolean | null = null\n /** 标注标签的世界坐标 */\n public tagPosition = new THREE.Vector3()\n /** 标注标签的 NDC 坐标 */\n public tagNDCPosition = new THREE.Vector3()\n /** 标注标签的 transform */\n public tagTransform = { left: 0, top: 0 }\n /** 标注标签的显示层级 */\n public tagZIndex = 0\n /** 标注实例的事件处理器 */\n public hooks = new Subscribe<PluginType.AreaMakerItemEventMap>()\n\n /** 自定义 Dom */\n public itemRenderer?: PluginType.ItemRenderer\n /** 数据 */\n private data: PluginType.ServerAreaMakerItem\n /** Plugin 实例 */\n private plugin: Controller\n /** 标注透明度动画 */\n private opacityAnime?: BetterTween<{ makerObjectOpacity: number; outlineOpacity: number }>\n /** 是否在容器 resize 动画中 */\n private isInContainerResizeAnimation = false\n /** 监听容器 resize 的计时器 id,用于判断 resize 过程是否结束 */\n private containerResizeTimeoutID: NodeJS.Timeout | null = null\n /** 容器大小变化监听器 */\n private resizeObserver?: { observe: () => void; unobserve: () => void }\n /** 响应式字体大小管理器 */\n private fontSizeManager = getGlobalResponsiveFontSize()\n /** 当前字体大小 */\n private currentFontSize = getCurrentFontSize()\n /** 字体大小订阅取消函数 */\n private unsubscribeFontSize: (() => void) | null = null\n\n public constructor(plugin: Controller, data: PluginType.ServerAreaMakerItem) {\n const objectData = data.object_data\n const bottomY = objectData.bottom_y\n const height = objectData.height\n const color = new THREE.Color(objectData.color ?? '#FFFFFF')\n const opacity = objectData.opacity ?? 0.4\n\n this.data = data\n this.id = data.id\n this.name = data.name ?? ''\n this.plugin = plugin\n this.height = height\n this.bottomY = bottomY\n this.opacity = opacity\n this.shape = new THREE.Shape().fromJSON(objectData.shape as THREE.ShapeJSON)\n this.floorIndex = data.floor_index\n // 构造模型\n this.makerObject = new THREE.Mesh(createMakerObjectGeometry(this.shape, height), createMakerObjectMaterial(color, opacity))\n format2XOZ(this.makerObject, bottomY)\n this.makerObject.material.depthTest = this.plugin.config.modelDepthTest\n // 构造 outline\n this.outline = new LineSegments(\n new THREE.EdgesGeometry(this.makerObject.geometry),\n new THREE.LineBasicMaterial({ color, transparent: true }),\n )\n format2XOZ(this.outline, bottomY)\n this.outline.material.depthTest = this.plugin.config.modelDepthTest\n this.setHeight(height)\n\n this.modelGroup = new AreaMakerModelGroup(this)\n // 初始化 modelGroup 的 visible\n this.modelGroup.visible = objectData.visible ?? true\n }\n\n /** 挂载标注 */\n public mount() {\n if (this.mounted) return\n this.mounted = true\n // 更新 visible\n this.updateVisible()\n // 更新 depthTest\n this.makerObject.material.depthTest = this.plugin.config.modelDepthTest\n this.outline.material.depthTest = this.plugin.config.modelDepthTest\n // 添加模型\n this.modelGroup.add(this.makerObject, this.outline)\n // 应用标签\n const hasTag = !!this.name\n const tagContainer = this.plugin.tagDomContainer\n if (hasTag) {\n this.tagApp = mountComponent(LabelItem, tagContainer, {\n fontSize: this.currentFontSize,\n rendererData: this.data,\n content: this.name,\n visible: this.tagVisible,\n rendererIfNeed: this.itemRenderer,\n transform: `translate(${this.tagTransform.left}px, ${this.tagTransform.top}px)`,\n onClick: (e: MouseEvent) => this.hooks.emit('tagClick', { target: this, nativeEvent: e }),\n })\n this.updateTag()\n }\n\n this.plugin.five.needsRender = true\n\n // 添加事件监听\n this.plugin.hooks.on('stateChange', this.onPluginStateChange)\n this.plugin.hooks.on('configChange', this.onPluginConfigChange)\n this.plugin.five.on('modeChange', this.updateVisible)\n this.plugin.five.on('modelShownFloorChange', this.updateVisible)\n this.plugin.five.on('cameraUpdate', this.onFiveCameraUpdate)\n this.resizeObserver = resizeObserver(this.onContainerResize, tagContainer)\n this.resizeObserver.observe()\n\n // 监听字体大小变化\n if (typeof this.fontSizeManager === 'object' && 'subscribe' in this.fontSizeManager) {\n this.unsubscribeFontSize = this.fontSizeManager.subscribe((fontSize) => {\n this.currentFontSize = fontSize\n this.updateTagFontSize()\n })\n }\n }\n\n /** 卸载标注 */\n public unmount() {\n if (!this.mounted) return\n this.mounted = false\n // 移除模型\n this.modelGroup.remove(...this.modelGroup.children)\n // 移除标签\n this.tagApp?.destroy()\n this.tagApp = null\n // 解除事件监听\n this.plugin.hooks.off('stateChange', this.onPluginStateChange)\n this.plugin.hooks.off('configChange', this.onPluginConfigChange)\n this.plugin.five.off('modeChange', this.updateVisible)\n this.plugin.five.off('modelShownFloorChange', this.updateVisible)\n this.plugin.five.off('cameraUpdate', this.onFiveCameraUpdate)\n this.resizeObserver?.unobserve()\n // 取消字体大小订阅\n this.unsubscribeFontSize?.()\n }\n\n public dispose() {\n this.unmount()\n this.opacityAnime?.dispose()\n if (this.containerResizeTimeoutID) clearTimeout(this.containerResizeTimeoutID)\n this.makerObject.geometry.dispose()\n this.makerObject.material.dispose()\n this.outline.geometry.dispose()\n this.outline.material.dispose()\n this.hooks.off()\n }\n\n /** 更改标注透明度\n * @param opacity 标注透明度,范围:0-1\n */\n public setOpacity(opacity: number) {\n this.opacity = opacity\n // 如果当前有透明度动画,应该先销毁动画\n this.opacityAnime?.dispose()\n this.makerObject.material.opacity = opacity\n this.plugin.five.needsRender = true\n }\n\n /** 更改标注颜色\n * @param color 标注颜色,支持 hex\n * @example setColor('#FF0000')\n */\n public setColor(color: string) {\n const colorObj = new THREE.Color(color)\n this.makerObject.material.color = colorObj\n this.outline.material.color = colorObj\n this.plugin.five.needsRender = true\n }\n\n /** 更改标注高度\n * @param height 标注高度,单位:米\n */\n public setHeight(height: number) {\n if (height <= 0) throw new Error('高度必须大于 0')\n this.height = height\n // 处理模型\n this.makerObject.geometry.dispose()\n this.outline.geometry.dispose()\n this.makerObject.geometry = createMakerObjectGeometry(this.shape, height)\n // 处理 outline\n this.outline.geometry = new THREE.EdgesGeometry(this.makerObject.geometry)\n // 计算 tagPosition\n const shapePoints = this.shape.extractPoints(10).shape.slice(0, -1)\n const shapeCenterPoint = getCenterPointOfPoints(shapePoints)\n const shapeCenterPoint3 = new THREE.Vector3(shapeCenterPoint.x, shapeCenterPoint.y, height)\n format2XOZ(shapeCenterPoint3, this.bottomY)\n this.tagPosition.copy(shapeCenterPoint3)\n this.updateTag()\n\n // 渲染场景\n this.plugin.five.needsRender = true\n }\n\n /** 更改标注标签的显示层级\n * @description 为什么需要这个方法\n * 在相机朝向或位置发生变化时,各个标签所在的坐标与相机的远近关系发生了变化,所以标签的层级也会有变化。\n * 比如:\n * - 相机 -> 标签 A -> 标签 B: 标签 A 在标签 B 的前面\n * - 标签 A <- 标签 B <- 相机: 标签 A 在标签 B 的后面\n * 但是当前元素是无法感知到这种变化的,所以需要通过父元素调用这个方法来更新标签的层级。\n */\n public setTagZIndex(zIndex: number) {\n if (this.tagZIndex === zIndex) return\n this.tagApp?.update({ zIndex })\n }\n\n /** 显示标注 */\n // public show() {\n // return this.doOpacityAnime({\n // duration: 500,\n // makerObjectOpacity: [this.makerObject.material.opacity, this.opacity],\n // outlineOpacity: [this.outline.material.opacity, 1],\n // ...options,\n // })\n // }\n\n /** 隐藏标注 */\n // public hide() {\n // return this.doOpacityAnime({\n // duration: 500,\n // makerObjectOpacity: [this.makerObject.material.opacity, 0],\n // outlineOpacity: [this.outline.material.opacity, 0],\n // ...options,\n // })\n // }\n\n /** 透明度动画 */\n private doOpacityAnime = (\n options: Required<PluginType.AnimeOptions> & { makerObjectOpacity: [number, number]; outlineOpacity: [number, number] },\n ) => {\n this.opacityAnime?.dispose()\n const duration = options.duration\n const [startMakerObjectOpacity, endMakerObjectOpacity] = options.makerObjectOpacity\n const [startOutlineOpacity, endOutlineOpacity] = options.outlineOpacity\n\n if (duration === 0) {\n this.makerObject.material.opacity = endMakerObjectOpacity\n this.outline.material.opacity = endOutlineOpacity\n return\n }\n\n return new Promise<boolean>((resolve) => {\n this.opacityAnime = new BetterTween({ makerObjectOpacity: startMakerObjectOpacity, outlineOpacity: startOutlineOpacity })\n .to({\n makerObjectOpacity: endMakerObjectOpacity,\n outlineOpacity: endOutlineOpacity,\n })\n .onUpdate(({ makerObjectOpacity, outlineOpacity }) => {\n this.makerObject.material.opacity = makerObjectOpacity\n this.outline.material.opacity = outlineOpacity\n this.plugin.five.needsRender = true\n })\n .onComplete(() => resolve(true))\n .onDispose(() => {\n // 销毁动画的时候应该把值设置到终值\n this.makerObject.material.opacity = endMakerObjectOpacity\n this.outline.material.opacity = endOutlineOpacity\n this.plugin.five.needsRender = true\n resolve(false)\n })\n .play()\n })\n }\n\n /** 插件 Config 变化时更新自身 depthTest */\n private onPluginConfigChange = (event: { config: PluginType.Config }) => {\n this.makerObject.material.depthTest = event.config.modelDepthTest\n this.outline.material.depthTest = event.config.modelDepthTest\n this.plugin.five.needsRender = true\n }\n\n /** 插件整体可见性变化时,需要更新自身可见性 */\n private onPluginStateChange = () => {\n this.updateVisible()\n this.updateTagVisible()\n }\n\n /** 更新标注可见性 */\n private updateVisible = () => {\n const { result: visible, msg } = this.checkVisible()\n this.checkMsg.checkVisibleMsg = msg\n if (this.visible === visible) return\n this.visible = visible\n const modelGroupVisible = this.data.object_data.visible ?? true\n this.modelGroup.visible = visible && modelGroupVisible\n this.plugin.five.needsRender = true\n }\n\n /** 检测标注是否可见 */\n private checkVisible = (): { result: boolean; msg: string } => {\n const pluginState = this.plugin.state\n if (!pluginState.visible) return { result: false, msg: '插件不可见' }\n const shownFloor = this.plugin.fiveUtil.model.shownFloor\n const floorVisible = shownFloor === null || shownFloor === this.floorIndex\n if (!floorVisible) return { result: false, msg: `模型高亮楼层不符合展示条件, 当前高亮楼层为:${shownFloor}` }\n return { result: true, msg: '' }\n }\n\n /** 更新标注标签 */\n private updateTag = () => {\n if (!this.tagApp) return\n this.updateTagNDCPosition()\n this.updateTagDomTransform()\n this.updateTagVisible()\n }\n\n /** 更新标注标签的 NDC Position */\n private updateTagNDCPosition = () => {\n const tagPosition = this.tagPosition\n const tagNDCPosition = tagPosition.clone().project(this.plugin.five.camera)\n this.tagNDCPosition.copy(tagNDCPosition)\n }\n\n /** 更新标注标签的 transform */\n private updateTagDomTransform = () => {\n const ndcPosition = this.tagNDCPosition\n const left = Math.round(((ndcPosition.x + 1) / 2) * this.plugin.tagDomContainer.clientWidth)\n const top = Math.round(((-ndcPosition.y + 1) / 2) * this.plugin.tagDomContainer.clientHeight)\n if (this.tagTransform.left === left && this.tagTransform.top === top) return\n this.tagTransform = { left, top }\n this.tagApp?.update({ transform: `translate(${left}px, ${top}px)` })\n }\n\n /** 更新标注标签可见性 */\n private updateTagVisible = () => {\n const { result: tagVisible, msg } = this.checkTagVisible()\n this.checkMsg.checkTagVisibleMsg = msg\n if (this.tagVisible === tagVisible) return\n this.tagVisible = tagVisible\n if (this.tagApp) {\n this.tagVisible ? this.hooks.emit('tagShow') : this.hooks.emit('tagHide')\n this.tagApp?.update({ visible: tagVisible })\n }\n }\n\n /** 检测标注标签是否可见 */\n private checkTagVisible = (): { result: boolean; msg: string } => {\n // 检测标注整体可见性\n const makerVisible = this.visible\n if (!makerVisible) return { result: false, msg: '标注整体不可见' }\n // resize 动画中不可见\n if (this.isInContainerResizeAnimation) return { result: false, msg: '处于容器 resize 动画中' }\n // 模型遮挡检测\n const five = this.plugin.five\n const cameraPosition = five.camera.position.clone()\n _raycaster.set(cameraPosition.clone(), this.tagPosition.clone().sub(cameraPosition).normalize())\n const [intersection] = this.plugin.fiveUtil.model.intersectRaycaster(_raycaster)\n const vectorDistance = this.tagPosition.distanceTo(five.camera.position)\n if (intersection && intersection.distance + 0.1 < vectorDistance) return { result: false, msg: '标注标签被 Five 模型遮挡' }\n // 检测标注标签 NDC Position 是否在屏幕内\n const tagNDCPosition = this.tagNDCPosition\n if (Math.abs(tagNDCPosition.x) > 1.2 || Math.abs(tagNDCPosition.y) > 1.2 || Math.abs(tagNDCPosition.z) > 1)\n return { result: false, msg: '标注标签不在屏幕内' }\n\n return { result: true, msg: '' }\n }\n\n /** 相机位姿发生变化时,更新标签 */\n private onFiveCameraUpdate: EventCallback['cameraUpdate'] = () => {\n if (!this.tagApp) return\n if (!this.visible) return\n this.updateTagNDCPosition()\n this.updateTagDomTransform()\n this.updateTagVisible()\n }\n\n /** tag container DOM 发生 resize */\n private onContainerResize = () => {\n // resize start 时,更新标签\n const isResizeStart = this.isInContainerResizeAnimation === false\n if (isResizeStart) {\n this.isInContainerResizeAnimation = true\n this.updateTag()\n }\n\n const onResizeEnd = () => {\n this.isInContainerResizeAnimation = false\n this.containerResizeTimeoutID = null\n this.updateTag()\n }\n\n if (this.containerResizeTimeoutID) clearTimeout(this.containerResizeTimeoutID)\n this.containerResizeTimeoutID = setTimeout(onResizeEnd, 100)\n }\n\n /** 更新标注字体大小 */\n private updateTagFontSize = () => {\n if (this.tagApp) {\n this.tagApp.update({ fontSize: this.currentFontSize })\n }\n }\n}\n\n/** 创建标注几何体的 Geometry */\nfunction createMakerObjectGeometry(shape: THREE.Shape, height: number) {\n const geometry = new THREE.ExtrudeGeometry(shape, {\n depth: height,\n bevelEnabled: false,\n })\n return geometry\n}\n\n/** 创建标注几何体的 Material */\nfunction createMakerObjectMaterial(color: THREE.Color, opacity: number) {\n return new THREE.MeshBasicMaterial({\n color,\n opacity,\n transparent: true,\n })\n}\n\n/** 把 XOY 面上的 Mesh 转换成 XOZ 面 */\nfunction format2XOZ(object: THREE.Object3D | THREE.Box3 | THREE.Vector3, bottomY: number) {\n const matrix = new THREE.Matrix4() // 创建一个新的 Matrix4 对象\n // 创建各个子变换矩阵\n const rotationMatrix = new THREE.Matrix4().makeRotationX(Math.PI / 2)\n const translationMatrix = new THREE.Matrix4().makeTranslation(0, 0, -bottomY)\n const scaleMatrix = new THREE.Matrix4().makeScale(1, 1, -1)\n\n // 分别对 matrix 应用旋转、平移、缩放\n matrix.multiply(rotationMatrix) // 对 matrix 应用旋转\n matrix.multiply(translationMatrix) // 对 matrix 应用平移\n matrix.multiply(scaleMatrix) // 对 matrix 应用缩放\n\n // 对 object 应用 matrix 变换\n object.applyMatrix4(matrix)\n}\n","import * as THREE from 'three/webgpu'\nimport type { EventCallback, Five } from '@realsee/five-webgpu'\nimport * as BasePlugin from '../base/BasePluginWithData'\nimport { equal } from '../shared-utils'\nimport { AreaMakerItem } from './utils/Item'\nimport type * as PluginType from './typing'\n\nexport class Controller extends BasePlugin.Controller<PluginType.State, PluginType.EventMap, PluginType.ServerData, PluginType.PluginData> {\n // ==================== public properties ====================\n /** 插件当前状态 */\n public state: PluginType.State\n /** 标注模型 { id: item } 的映射表 */\n public itemMap: Map<string | number, AreaMakerItem>\n /** 自定义 DOM */\n public itemRenderer?: PluginType.ItemRenderer\n /** 标注模型容器 */\n public modelGroup: THREE.Group\n /** 当前使用的数据 */\n public data?: PluginType.PluginData\n /** tag 容器 */\n public tagDomContainer: HTMLDivElement\n /** 插件配置项 */\n public get config() {\n return { ...this._config }\n }\n /** 是否已经被销毁 */\n public get disposed() {\n return this._disposed\n }\n /** 查询问题使用的调试对象 */\n public checkMsg = {\n childrenMountedState: '',\n }\n\n // ==================== private properties ====================\n /** 是否在 Five Change Mode 动画中 */\n private isInFiveChangeModeAnime = false\n /** 子组件是否挂载 */\n private childrenMountedState = false\n /** config 的原始值 */\n private _config: Required<PluginType.Config>\n /** disposed 的原始值 */\n private _disposed = false\n\n /** AreaMakerPlugin\n * @param `five` `<Five>` Five 实例\n * @param `params` `<PluginType.Params> | <undefined>` 插件初始化参数\n * @param `params.initialState` `<PluginType.State> | <undefined>` 插件初始化后,使用的状态\n */\n public constructor(five: Five, params?: PluginType.Params) {\n super(five)\n this.five = five\n\n this.tagDomContainer = document.createElement('div')\n this.tagDomContainer.style.position = 'absolute'\n this.tagDomContainer.style.top = '0'\n this.tagDomContainer.style.left = '0'\n this.tagDomContainer.style.width = '100%'\n this.tagDomContainer.style.height = '100%'\n this.tagDomContainer.style.pointerEvents = 'none'\n\n // 处理 initialState\n const defaultState: PluginType.State = {\n enabled: true,\n visible: true,\n }\n this.state = Object.assign(defaultState, params?.initialState)\n\n // 处理 config\n const config: Required<PluginType.Config> = {\n modelDepthTest: true,\n ...params?.config,\n }\n this._config = config\n\n this.modelGroup = new THREE.Group()\n this.modelGroup.name = 'ModelMakerPluginGroup'\n this.itemMap = new Map()\n\n if (this.state.enabled) this._enable({ userAction: false })\n this.five.once('dispose', this.dispose)\n }\n\n /** 加载数据,重复调用会使用新数据覆盖旧数据 */\n public async load(data: PluginType.ServerData) {\n if (this.disposed) throw new Error('AreaMakerPlugin 已销毁')\n const prevData = this.data\n this.data = this.formatData(data)\n this.hooks.emit('dataChange', this.data, prevData)\n\n // 清除原有数据\n this.modelGroup.remove(...this.modelGroup.children)\n this.itemMap.forEach((item) => item.dispose())\n this.itemMap.clear()\n this.childrenMountedState = false\n this.checkMsg.childrenMountedState = ''\n\n // 加载新数据\n this.data.list.forEach((dataItem) => {\n const item = new AreaMakerItem(this, dataItem)\n item.itemRenderer = this.itemRenderer\n this.modelGroup.add(item.modelGroup)\n this.itemMap.set(dataItem.id, item)\n item.hooks.on('tagClick', this.onMakerTagClick)\n })\n\n this.updateChildrenMountedState()\n }\n\n /** 将插件的 DOM 容器添加到指定的 DOM 元素上 */\n public appendTo(wrapper: Element): void {\n wrapper.appendChild(this.tagDomContainer)\n }\n\n /** 启用插件\n * @param `options` `<Option> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public enable(options: BasePlugin.BaseOptions = {}) {\n if (this.disposed || this.state.enabled) return\n const userAction = options.userAction ?? true\n this.updateState({ enabled: true }, userAction)\n this._enable({ userAction })\n }\n\n /** 禁用插件\n * @param `options` `<Option> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public disable(options: BasePlugin.BaseOptions = {}) {\n if (this.state.enabled === false) return\n const userAction = options.userAction ?? true\n this.updateState({ enabled: false }, userAction)\n this._disable({ userAction })\n }\n\n /** 展示标注\n * @param `options` `<Partial<ShowHideOptions>> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public async show(options?: Partial<PluginType.ShowHideOptions>): Promise<void> {\n if (this.state.visible) return Promise.resolve()\n if (this.disposed) return Promise.reject(new Error('不能在已销毁的插件上调用 show'))\n const mergedOptions: PluginType.ShowHideOptions = { userAction: true, ...options }\n this.updateState({ visible: true }, mergedOptions.userAction)\n await this._show(mergedOptions)\n }\n\n /** 插件内容整体隐藏\n * @param `options` `<Partial<ShowHideOptions>> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public async hide(options?: Partial<PluginType.ShowHideOptions>) {\n if (this.state.visible === false) return\n const mergedOptions: PluginType.ShowHideOptions = { userAction: true, ...options }\n this.updateState({ visible: false }, mergedOptions.userAction)\n await this._hide(mergedOptions)\n }\n\n // 目前带动画的展示和隐藏功能有些需求细节没有确定,暂时不实现\n // /** 展示标注\n // * @param `options` `<Partial<ShowHideOptions>> | <undefined>`\n // * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n // * @param `options.anime` `<AnimeOptions> | <undefined>` 动画配置。\n // * @param `options.anime.duration` `<number> | <undefined>` 动画时间,默认是 500ms。\n // */\n // public async show(options?: Partial<PluginType.ShowHideOptions>): Promise<void> {\n // if (this.state.visible) return Promise.resolve()\n // if (this.disposed) return Promise.reject(new Error('不能在已销毁的插件上调用 show'))\n // const mergedOptions: PluginType.ShowHideOptions = {\n // userAction: true,\n // anime: { duration: 500, ...options?.anime },\n // ...options,\n // }\n // this.updateState({ visible: true }, mergedOptions.userAction)\n // await this._show(mergedOptions)\n // }\n // /** 插件内容整体隐藏\n // * @param `options` `<Partial<ShowHideOptions>> | <undefined>`\n // * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n // * @param `options.anime` `<AnimeOptions> | <undefined>` 动画配置。\n // * @param `options.anime.duration` `<number> | <undefined>` 动画时间,默认是 500ms。\n // */\n // public async hide(options?: Partial<PluginType.ShowHideOptions>) {\n // if (this.state.visible === false) return\n // const mergedOptions: PluginType.ShowHideOptions = {\n // userAction: true,\n // anime: { duration: 500, ...options?.anime },\n // ...options,\n // }\n // this.updateState({ visible: false }, mergedOptions.userAction)\n // await this._hide(mergedOptions)\n // }\n\n /** 更改插件 State\n * @param `state` `<Partial<Plugin.State>>` 插件属性 `state` 的子集。\n * @param `options` `<Option> | <undefined>`\n * @param `options.userAction` `<boolean> | <undefined>` 是否是用户操作。默认是 true。\n */\n public setState(state: Partial<PluginType.State>, options: BasePlugin.BaseOptions = {}) {\n const prevState = this.state\n if (equal(state, prevState, { deep: true })) return\n\n const userAction = options.userAction !== undefined ? options.userAction : true\n this.updateState(state, userAction)\n\n if (state.enabled !== undefined && prevState.enabled !== state.enabled) {\n state.enabled ? this._enable({ userAction }) : this._disable({ userAction })\n }\n\n if (state.visible !== undefined && prevState.visible !== state.visible) {\n const options = { userAction, anime: { duration: 500 } }\n state.visible ? this._show(options) : this._hide(options)\n }\n }\n\n /** 更改插件 Config\n * @param `config` `<Partial<Plugin.Config>>` 插件属性 `config` 的子集。\n * @param `options` `<Option> | <undefined>`\n */\n public updateConfig(config: Partial<PluginType.Config>, options: BasePlugin.BaseOptions = {}) {\n const prevConfig = this.config\n const newConfig = { ...prevConfig, ...config }\n this._config = newConfig\n this.hooks.emit('configChange', { prevConfig, config: newConfig, userAction: options.userAction ?? true })\n }\n\n /** 根据 ID 获取标注 */\n public getMaskItemByID(id: string | number) {\n return this.itemMap.get(id)\n }\n\n /** 销毁插件,移除所有副作用,销毁后将不响应任何 API */\n public clear() {\n this.itemMap.forEach(item => item.dispose())\n this.itemMap.clear()\n this.modelGroup.clear()\n this.childrenMountedState = false\n this.data = undefined\n this.five.needsRender = true\n }\n\n public dispose = () => {\n if (this.disposed) return\n this._disposed = true\n this.state.enabled = false\n this._disable({ userAction: false })\n this.clear()\n this.tagDomContainer.remove()\n this.five.off('dispose', this.dispose)\n this.hooks.emit('dispose')\n this.hooks.off()\n }\n\n protected formatData(serverData: PluginType.ServerData): PluginType.PluginData {\n function isV1(data: PluginType.ServerData): data is PluginType.ServerDataV1 {\n // 如果 list 长度为 0,不能判断是 v1 还是 v2,所以默认是 v1\n if (data.list.length === 0) return true\n return !('shape' in data.list[0].object_data)\n }\n if (isV1(serverData)) {\n return {\n list: serverData.list\n // 三个点以下不能构成面\n .filter((item) => item.object_data.points.length >= 3)\n .map((item) => {\n // 通过 points 生成 shape\n const shape = new THREE.Shape()\n const firstPoint = item.object_data.points[0]\n shape.moveTo(firstPoint[0], firstPoint[2])\n item.object_data.points.slice(1).forEach((point) => shape.lineTo(point[0], point[2]))\n shape.lineTo(firstPoint[0], firstPoint[2])\n\n const formattedItem: PluginType.ServerAreaMakerItem = {\n ...item,\n floor_index: item.object_data.floorIndex,\n object_data: {\n ...item.object_data,\n bottom_y: firstPoint[1] + item.object_data.fixedY,\n shape: shape.toJSON(),\n height: item.object_data.height + item.object_data.fixedHeight,\n },\n }\n return formattedItem\n }),\n }\n }\n return serverData\n }\n\n private checkChildrenMountedState(): { result: boolean; msg: string } {\n const pluginState = this.state\n const five = this.five\n if (!pluginState.enabled) return { result: false, msg: '插件不可用' }\n const mode = five.getCurrentState().mode\n if (mode === 'Panorama') return { result: false, msg: `Five 模态不符合条件, 当前模态为:${mode}` }\n if (this.isInFiveChangeModeAnime) return { result: false, msg: '切换模态动画中不展示' }\n return { result: true, msg: '' }\n }\n\n private updateChildrenMountedState() {\n const { result, msg } = this.checkChildrenMountedState()\n this.checkMsg.childrenMountedState = msg\n if (result === this.childrenMountedState) return\n this.childrenMountedState = result\n this.itemMap.forEach((item) => {\n this.childrenMountedState ? item.mount() : item.unmount()\n })\n }\n\n private onFiveInitAnimationWillStart: EventCallback['initAnimationWillStart'] = () => {\n this.isInFiveChangeModeAnime = true\n this.updateChildrenMountedState()\n }\n\n private onFiveInitAnimationEnded: EventCallback['initAnimationEnded'] = () => {\n this.isInFiveChangeModeAnime = false\n this.updateChildrenMountedState()\n }\n\n private onFiveCameraUpdate: EventCallback['cameraUpdate'] = () => {\n const camera = this.five.camera\n const sortedItems = [...this.itemMap.values()].sort((a, b) => {\n const aDistance = a.tagPosition.distanceTo(camera.position)\n const bDistance = b.tagPosition.distanceTo(camera.position)\n return bDistance - aDistance\n })\n sortedItems.forEach((item, index) => {\n this.getMaskItemByID(item.id)?.setTagZIndex(index * 10)\n })\n }\n\n private onFiveModeChange: EventCallback['modeChange'] = () => {\n this.updateChildrenMountedState()\n }\n\n private onMakerTagClick: PluginType.AreaMakerItemEventMap['tagClick'] = (event) => {\n this.hooks.emit('wantsTap', { target: event.target, intersectObjects: [] })\n }\n\n private updateState(state: Partial<PluginType.State>, userAction: boolean) {\n const prevState = this.state\n this.state = { ...this.state, ...state }\n this.hooks.emit('stateChange', { state: this.state, prevState, userAction })\n }\n\n private _enable(options: { userAction: boolean }) {\n this.hooks.emit('enable', { userAction: options.userAction })\n // resume model effects\n this.five.scene.add(this.modelGroup)\n this.updateChildrenMountedState()\n this.five.needsRender = true\n\n // resume event effects\n this.five.on('wantsTapGesture', this.onWantsFiveTapGesture)\n this.five.on('initAnimationWillStart', this.onFiveInitAnimationWillStart)\n this.five.on('initAnimationEnded', this.onFiveInitAnimationEnded)\n this.five.on('modeChange', this.onFiveModeChange)\n this.five.on('cameraUpdate', this.onFiveCameraUpdate)\n }\n\n private onWantsFiveTapGesture: EventCallback['wantsTapGesture'] = (raycaster) => {\n const intersectResArray = Array.from(this.itemMap.values())\n .filter((item) => item.mounted && item.visible)\n .map((item) => ({\n makerItem: item,\n intersects: item.modelGroup.getRaycastIntersects(raycaster),\n }))\n .filter(({ intersects }) => intersects.length > 0)\n if (intersectResArray.length === 0) return\n const nearestIntersectRes = intersectResArray.reduce((prev, curr) => {\n const prevDistance = prev.intersects[0].distance\n const currDistance = curr.intersects[0].distance\n return prevDistance < currDistance ? prev : curr\n })\n const fiveModelIntersect = this.fiveUtil.model.intersectRaycaster(raycaster)[0]\n const depthTest = this.config.modelDepthTest\n if (depthTest && fiveModelIntersect && fiveModelIntersect.distance < nearestIntersectRes.intersects[0].distance) return\n const preventDefault = this.hooks.emit('wantsTap', {\n target: nearestIntersectRes.makerItem,\n intersectObjects: nearestIntersectRes.intersects,\n })\n if (preventDefault) return false\n }\n\n private _disable(options: { userAction: boolean }) {\n this.hooks.emit('disable', { userAction: options.userAction })\n // dispose model effects\n // this.disposeAnime()\n this.five.scene.remove(this.modelGroup)\n this.updateChildrenMountedState()\n this.five.needsRender = true\n // dispose event effects\n this.five.off('wantsTapGesture', this.onWantsFiveTapGesture)\n this.five.off('initAnimationWillStart', this.onFiveInitAnimationWillStart)\n this.five.off('initAnimationEnded', this.onFiveInitAnimationEnded)\n this.five.off('modeChange', this.onFiveModeChange)\n this.five.off('cameraUpdate', this.onFiveCameraUpdate)\n }\n\n private async _show(options: PluginType.ShowHideOptions) {\n this.hooks.emit('show', options)\n this.five.needsRender = true\n }\n\n private async _hide(options: PluginType.ShowHideOptions) {\n this.hooks.emit('hide', options)\n this.five.needsRender = true\n }\n}\n","import type { Five } from '@realsee/five-webgpu'\nimport type * as AreaMakerPluginType from './typing'\nimport { Controller } from './Controller'\n\nexport const AreaMakerPlugin = (five: Five, params?: AreaMakerPluginType.Params) => new Controller(five, params)\n\nexport type { AreaMakerPluginType }\n"],"mappings":"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"}
|
|
@@ -78,6 +78,6 @@ var d = (e) => {
|
|
|
78
78
|
return t[0] = v * C, t[1] = (h * f * a - d * g * a - h * i * p + r * g * p + d * i * _ - r * f * _) * C, t[2] = (s * g * a - h * c * a + h * i * l - r * g * l - s * i * _ + r * c * _) * C, t[3] = (d * c * a - s * f * a - d * i * l + r * f * l + s * i * p - r * c * p) * C, t[4] = y * C, t[5] = (u * g * a - m * f * a + m * i * p - n * g * p - u * i * _ + n * f * _) * C, t[6] = (m * c * a - o * g * a - m * i * l + n * g * l + o * i * _ - n * c * _) * C, t[7] = (o * f * a - u * c * a + u * i * l - n * f * l - o * i * p + n * c * p) * C, t[8] = b * C, t[9] = (m * d * a - u * h * a - m * r * p + n * h * p + u * r * _ - n * d * _) * C, t[10] = (o * h * a - m * s * a + m * r * l - n * h * l - o * r * _ + n * s * _) * C, t[11] = (u * s * a - o * d * a - u * r * l + n * d * l + o * r * p - n * s * p) * C, t[12] = x * C, t[13] = (u * h * i - m * d * i + m * r * f - n * h * f - u * r * g + n * d * g) * C, t[14] = (m * s * i - o * h * i - m * r * c + n * h * c + o * r * g - n * s * g) * C, t[15] = (o * d * i - u * s * i + u * r * c - n * d * c - o * r * f + n * s * f) * C, e;
|
|
79
79
|
};
|
|
80
80
|
//#endregion
|
|
81
|
-
export {
|
|
81
|
+
export { r as a, c, i, a as n, l as o, o as r, s, u as t };
|
|
82
82
|
|
|
83
|
-
//# sourceMappingURL=boundingBox-
|
|
83
|
+
//# sourceMappingURL=boundingBox-CIqXgNXW.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boundingBox-DvCor5Hd.js","names":["THREE","_v1","THREESphere","point","lengthSq","length","delta","boxVertexes","box","max","min","boxVertex","index","boundingBox","bounding","object3D","boundingSphere","worldBoundingBox","worldBounding","worldBoundingSphere","boxOrSphere","boxOrSphereType","vector","object","geometry","position","i","l","v","invert","te","matrix4","n11","n21","n31","n41","n12","n22","n32","n42","n13","n23","n33","n43","n14","n24","n34","n44","t11","t12","t13","t14","det","detInv"],"sources":["../../src/shared-utils/three/core/Sphere.ts","../../src/shared-utils/three/boundingBox.ts"],"sourcesContent":["import * as THREE from 'three/webgpu'\n\nconst _v1 = new THREE.Vector3()\n\nexport class THREESphere extends THREE.Sphere {\n expandByPoint(point: THREE.Vector3) {\n if (this.isEmpty()) {\n this.center.copy(point)\n\n this.radius = 0\n\n return this\n }\n\n _v1.subVectors(point, this.center)\n\n const lengthSq = _v1.lengthSq()\n\n if (lengthSq > this.radius * this.radius) {\n // calculate the minimal sphere\n\n const length = Math.sqrt(lengthSq)\n\n const delta = (length - this.radius) * 0.5\n\n this.center.addScaledVector(_v1, delta / length)\n\n this.radius += delta\n }\n\n return this\n }\n}\n","import * as THREE from 'three/webgpu'\nimport { THREESphere } from './core/Sphere'\nimport type { Vector3Position } from '../../typings/math.type'\n\nexport function boxVertexes(box: { max: Vector3Position; min: Vector3Position }) {\n const { max, min } = box\n\n return [\n new THREE.Vector3(max.x, max.y, max.z),\n new THREE.Vector3(min.x, max.y, max.z),\n new THREE.Vector3(min.x, min.y, max.z),\n new THREE.Vector3(max.x, min.y, max.z),\n new THREE.Vector3(max.x, max.y, min.z),\n new THREE.Vector3(min.x, max.y, min.z),\n new THREE.Vector3(min.x, min.y, min.z),\n new THREE.Vector3(max.x, min.y, min.z),\n ]\n}\n\n/**\n * @description \n * ```markdown\n 5____4\n 1/___0/|\n | 6__|_7\n 2/___3/\n * ```\n */\nexport function boxVertex(box: { max: Vector3Position; min: Vector3Position }, index: number) {\n /*\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t*/\n const { max, min } = box\n switch (index) {\n case 0:\n return new THREE.Vector3(max.x, max.y, max.z)\n case 1:\n return new THREE.Vector3(min.x, max.y, max.z)\n case 2:\n return new THREE.Vector3(min.x, min.y, max.z)\n case 3:\n return new THREE.Vector3(max.x, min.y, max.z)\n case 4:\n return new THREE.Vector3(max.x, max.y, min.z)\n case 5:\n return new THREE.Vector3(min.x, max.y, min.z)\n case 6:\n return new THREE.Vector3(min.x, min.y, min.z)\n case 7:\n return new THREE.Vector3(max.x, min.y, min.z)\n }\n}\n\nexport function boundingBox(object3D: THREE.Object3D) {\n return bounding(object3D, 'box3')\n}\n\nexport function boundingSphere(object3D: THREE.Object3D) {\n return bounding(object3D, 'sphere')\n}\n\nexport function worldBoundingBox(object3D: THREE.Object3D) {\n return worldBounding(object3D, 'box3')\n}\n\nexport function worldBoundingSphere(object3D: THREE.Object3D) {\n return worldBounding(object3D, 'sphere')\n}\n\nexport function worldBounding<T extends 'box3' | 'sphere'>(\n object3D: THREE.Object3D,\n boxOrSphereType: T,\n): (T extends 'box3' ? THREE.Box3 : THREE.Sphere) | undefined {\n const boxOrSphere = boxOrSphereType === 'box3' ? new THREE.Box3() : new THREESphere()\n const vector = new THREE.Vector3()\n object3D.updateWorldMatrix(false, false)\n\n object3D.traverse((object) => {\n // 不计算阴影\n if (object.name === 'shadow') return\n // five line 写的比较特殊,计算boundingBox的话会有问题\n if (object.type === 'Line2') return\n const geometry = (object as any).geometry\n object.updateWorldMatrix(false, false)\n\n if (geometry !== undefined) {\n const position = geometry?.attributes?.position\n if (position) {\n // BufferGeometry\n for (let i = 0, l = position.count; i < l; i++) {\n vector.fromBufferAttribute(position, i).applyMatrix4(object.matrixWorld)\n boxOrSphere.expandByPoint(vector)\n }\n } else if (geometry.vertices) {\n // Geometry\n geometry.vertices.forEach((v: THREE.Vector3) => {\n const point = v.clone().applyMatrix4(object.matrixWorld)\n boxOrSphere.expandByPoint(point)\n })\n }\n }\n })\n if (boxOrSphere.isEmpty()) return\n return boxOrSphere as any\n}\n\nexport function bounding<T extends 'box3' | 'sphere'>(\n object3D: THREE.Object3D,\n boxOrSphereType: T,\n): T extends 'box3' ? THREE.Box3 : THREE.Sphere | undefined {\n const boxOrSphere = worldBounding(object3D, boxOrSphereType)\n if (boxOrSphere) boxOrSphere.applyMatrix4(invert(object3D.matrixWorld.clone()))\n return boxOrSphere as any\n}\n\nconst invert = (matrix4) => {\n // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n const te = matrix4.elements\n\n const n11 = te[0]\n const n21 = te[1]\n const n31 = te[2]\n const n41 = te[3]\n const n12 = te[4]\n const n22 = te[5]\n const n32 = te[6]\n const n42 = te[7]\n const n13 = te[8]\n const n23 = te[9]\n const n33 = te[10]\n const n43 = te[11]\n const n14 = te[12]\n const n24 = te[13]\n const n34 = te[14]\n const n44 = te[15]\n\n const t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44\n const t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44\n const t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44\n const t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34\n\n const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14\n\n if (det === 0) return matrix4.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\n\n const detInv = 1 / det\n\n te[0] = t11 * detInv\n te[1] = (n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44) * detInv\n te[2] = (n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44) * detInv\n te[3] = (n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43) * detInv\n\n te[4] = t12 * detInv\n te[5] = (n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44) * detInv\n te[6] = (n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44) * detInv\n te[7] = (n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43) * detInv\n\n te[8] = t13 * detInv\n te[9] = (n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44) * detInv\n te[10] = (n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44) * detInv\n te[11] = (n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43) * detInv\n\n te[12] = t14 * detInv\n te[13] = (n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34) * detInv\n te[14] = (n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34) * detInv\n te[15] = (n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33) * detInv\n\n return matrix4\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"boundingBox-CIqXgNXW.js","names":["THREE","_v1","THREESphere","point","lengthSq","length","delta","boxVertexes","box","max","min","boxVertex","index","boundingBox","bounding","object3D","boundingSphere","worldBoundingBox","worldBounding","worldBoundingSphere","boxOrSphere","boxOrSphereType","vector","object","geometry","position","i","l","v","invert","te","matrix4","n11","n21","n31","n41","n12","n22","n32","n42","n13","n23","n33","n43","n14","n24","n34","n44","t11","t12","t13","t14","det","detInv"],"sources":["../../src/shared-utils/three/core/Sphere.ts","../../src/shared-utils/three/boundingBox.ts"],"sourcesContent":["import * as THREE from 'three/webgpu'\n\nconst _v1 = new THREE.Vector3()\n\nexport class THREESphere extends THREE.Sphere {\n expandByPoint(point: THREE.Vector3) {\n if (this.isEmpty()) {\n this.center.copy(point)\n\n this.radius = 0\n\n return this\n }\n\n _v1.subVectors(point, this.center)\n\n const lengthSq = _v1.lengthSq()\n\n if (lengthSq > this.radius * this.radius) {\n // calculate the minimal sphere\n\n const length = Math.sqrt(lengthSq)\n\n const delta = (length - this.radius) * 0.5\n\n this.center.addScaledVector(_v1, delta / length)\n\n this.radius += delta\n }\n\n return this\n }\n}\n","import * as THREE from 'three/webgpu'\nimport { THREESphere } from './core/Sphere'\nimport type { Vector3Position } from '../../typings/math.type'\n\nexport function boxVertexes(box: { max: Vector3Position; min: Vector3Position }) {\n const { max, min } = box\n\n return [\n new THREE.Vector3(max.x, max.y, max.z),\n new THREE.Vector3(min.x, max.y, max.z),\n new THREE.Vector3(min.x, min.y, max.z),\n new THREE.Vector3(max.x, min.y, max.z),\n new THREE.Vector3(max.x, max.y, min.z),\n new THREE.Vector3(min.x, max.y, min.z),\n new THREE.Vector3(min.x, min.y, min.z),\n new THREE.Vector3(max.x, min.y, min.z),\n ]\n}\n\n/**\n * @description \n * ```markdown\n 5____4\n 1/___0/|\n | 6__|_7\n 2/___3/\n * ```\n */\nexport function boxVertex(box: { max: Vector3Position; min: Vector3Position }, index: number) {\n /*\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t*/\n const { max, min } = box\n switch (index) {\n case 0:\n return new THREE.Vector3(max.x, max.y, max.z)\n case 1:\n return new THREE.Vector3(min.x, max.y, max.z)\n case 2:\n return new THREE.Vector3(min.x, min.y, max.z)\n case 3:\n return new THREE.Vector3(max.x, min.y, max.z)\n case 4:\n return new THREE.Vector3(max.x, max.y, min.z)\n case 5:\n return new THREE.Vector3(min.x, max.y, min.z)\n case 6:\n return new THREE.Vector3(min.x, min.y, min.z)\n case 7:\n return new THREE.Vector3(max.x, min.y, min.z)\n }\n}\n\nexport function boundingBox(object3D: THREE.Object3D) {\n return bounding(object3D, 'box3')\n}\n\nexport function boundingSphere(object3D: THREE.Object3D) {\n return bounding(object3D, 'sphere')\n}\n\nexport function worldBoundingBox(object3D: THREE.Object3D) {\n return worldBounding(object3D, 'box3')\n}\n\nexport function worldBoundingSphere(object3D: THREE.Object3D) {\n return worldBounding(object3D, 'sphere')\n}\n\nexport function worldBounding<T extends 'box3' | 'sphere'>(\n object3D: THREE.Object3D,\n boxOrSphereType: T,\n): (T extends 'box3' ? THREE.Box3 : THREE.Sphere) | undefined {\n const boxOrSphere = boxOrSphereType === 'box3' ? new THREE.Box3() : new THREESphere()\n const vector = new THREE.Vector3()\n object3D.updateWorldMatrix(false, false)\n\n object3D.traverse((object) => {\n // 不计算阴影\n if (object.name === 'shadow') return\n // five line 写的比较特殊,计算boundingBox的话会有问题\n if (object.type === 'Line2') return\n const geometry = (object as any).geometry\n object.updateWorldMatrix(false, false)\n\n if (geometry !== undefined) {\n const position = geometry?.attributes?.position\n if (position) {\n // BufferGeometry\n for (let i = 0, l = position.count; i < l; i++) {\n vector.fromBufferAttribute(position, i).applyMatrix4(object.matrixWorld)\n boxOrSphere.expandByPoint(vector)\n }\n } else if (geometry.vertices) {\n // Geometry\n geometry.vertices.forEach((v: THREE.Vector3) => {\n const point = v.clone().applyMatrix4(object.matrixWorld)\n boxOrSphere.expandByPoint(point)\n })\n }\n }\n })\n if (boxOrSphere.isEmpty()) return\n return boxOrSphere as any\n}\n\nexport function bounding<T extends 'box3' | 'sphere'>(\n object3D: THREE.Object3D,\n boxOrSphereType: T,\n): T extends 'box3' ? THREE.Box3 : THREE.Sphere | undefined {\n const boxOrSphere = worldBounding(object3D, boxOrSphereType)\n if (boxOrSphere) boxOrSphere.applyMatrix4(invert(object3D.matrixWorld.clone()))\n return boxOrSphere as any\n}\n\nconst invert = (matrix4) => {\n // based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n const te = matrix4.elements\n\n const n11 = te[0]\n const n21 = te[1]\n const n31 = te[2]\n const n41 = te[3]\n const n12 = te[4]\n const n22 = te[5]\n const n32 = te[6]\n const n42 = te[7]\n const n13 = te[8]\n const n23 = te[9]\n const n33 = te[10]\n const n43 = te[11]\n const n14 = te[12]\n const n24 = te[13]\n const n34 = te[14]\n const n44 = te[15]\n\n const t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44\n const t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44\n const t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44\n const t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34\n\n const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14\n\n if (det === 0) return matrix4.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)\n\n const detInv = 1 / det\n\n te[0] = t11 * detInv\n te[1] = (n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44) * detInv\n te[2] = (n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44) * detInv\n te[3] = (n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43) * detInv\n\n te[4] = t12 * detInv\n te[5] = (n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44) * detInv\n te[6] = (n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44) * detInv\n te[7] = (n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43) * detInv\n\n te[8] = t13 * detInv\n te[9] = (n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44) * detInv\n te[10] = (n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44) * detInv\n te[11] = (n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43) * detInv\n\n te[12] = t14 * detInv\n te[13] = (n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34) * detInv\n te[14] = (n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34) * detInv\n te[15] = (n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33) * detInv\n\n return matrix4\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { n as e, t } from "./tween.esm-CJDtohfp.js";
|
|
2
|
-
import { n,
|
|
2
|
+
import { i as n, r } from "./animationFrame-CacKXN8l.js";
|
|
3
3
|
import { Five as i } from "@realsee/five-webgpu";
|
|
4
4
|
//#region src/shared-utils/animationFrame/tween.ts
|
|
5
5
|
var a = t;
|
|
@@ -109,4 +109,4 @@ var m = (e, t, n) => {
|
|
|
109
109
|
//#endregion
|
|
110
110
|
export { c as n, l as r, h as t };
|
|
111
111
|
|
|
112
|
-
//# sourceMappingURL=camera-movement-
|
|
112
|
+
//# sourceMappingURL=camera-movement-C1pwfMk_.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"camera-movement-C1pwfMk_.js","names":["TWEEN.Easing","TWEEN.Tween","PI_2","Tween","requestAnimationFrameInterval","Easing","Easing$1","tween","from","to","duration","easing","cancelAnimationFrame","time","destroyMethods","fn","destroyMethod","tweenProgress","CameraMovementEffect","\"Move\"","\"Rotate\"","Rotation","\"Clockwise\"","\"Anticlockwise\"","\"Loop\"","PI_2$1","formatLongitude","rad","formatLatitude","progressNumber","pst","getLongitudeParams","PI","PI_2","_from","_to","rotation","CameraMovementPlugin","state","move","opts","args","five","panoIndex","reject","resolve","getAnimeParams","currentFiveState","fromLatitude","toLatitude","fromLongitude","toLongitude","fromFov","toFov","rotate","Five","progress","flag","stop","dispose"],"sources":["../../src/shared-utils/animationFrame/tween.ts","../../src/CameraMovementPlugin/typing.ts","../../src/shared-utils/animationFrame/formatRad.ts","../../src/shared-utils/animationFrame/calculateProgress.ts","../../src/CameraMovementPlugin/CameraMovementPlugin.ts"],"sourcesContent":["import * as TWEEN from '@tweenjs/tween.js'\nimport { nextFrame, requestAnimationFrameInterval } from './index'\n\nexport const Easing = TWEEN.Easing\n\ninterface ITween<T> extends TWEEN.Tween<T> {\n onDestroy: (fn: () => void) => TWEEN.Tween<T>\n destroy: () => void\n}\n\n/**\n * 对象变化的补间动画\n * 1. 应用 requestAnimationFrameInterval 做 update\n * 2. 在原生 tween 上新增 destroy 方法和 onDestroy 监听\n * DOC: https://github.com/tweenjs/tween.js\n * @param from 对象起始状态\n * @param to 对象末尾状态\n * @param duration 经历时间(s)\n * @param easing 过程动画,默认是 Easing.Linear.None\n */\nexport default function tween<T>(from: T, to: T, duration: number, easing = Easing.Linear.None) {\n const tween = new TWEEN.Tween(from).to(to, duration).easing(easing) as ITween<T>\n // 这里注意一下,因为 requestAnimationFrameInterval 给的时间是从 0 开始的,tween 动画也从 0 开始\n nextFrame(() => tween.start(0))\n\n const cancelAnimationFrame = requestAnimationFrameInterval((time) => {\n if (tween.update(time) === false) cancelAnimationFrame()\n })\n const destroyMethods: ((...params: any) => any)[] = []\n tween.onDestroy = (fn) => {\n destroyMethods.push(fn)\n return tween\n }\n tween.destroy = function () {\n this.stop()\n Object.assign(tween, {\n _onStartCallback: null,\n _onUpdateCallback: null,\n _onCompleteCallback: null,\n _onStopCallbackL: null,\n })\n let destroyMethod: undefined | ((...params: any) => any)\n while ((destroyMethod = destroyMethods.shift())) destroyMethod()\n cancelAnimationFrame()\n }\n return tween\n}\n\nexport function tweenProgress(duration: number, easing: typeof Easing.Linear.None) {\n return tween({ progress: 0 }, { progress: 1 }, duration, easing)\n}\n","import type { Mode, Pose } from '@realsee/five-webgpu'\nexport interface CameraMovementPluginParameterType { }\n\nexport interface CameraMovementPluginExportType {\n stop(): void\n dispose(): void\n /**\n * 运镜:移动\n * @param moveArgs 移动参数\n * @param duration 移动耗时\n * @param opts 额外配置\n */\n move(moveArgs: Partial<MoveArgs>, duration: number, opts?: MoveOpts): Promise<boolean>\n /**\n * 运镜:旋转\n * @param rotateArgs 旋转参数\n * @param duration 旋转耗时\n * @param opts 额外配置\n */\n rotate(rotateArgs: Partial<RotateArgs>, duration: number, opts?: RotateOpts): Promise<boolean>\n}\n\n/**\n * 运镜效果\n */\nexport enum CameraMovementEffect {\n Move = 'Move',\n Rotate = 'Rotate',\n}\n\n/**\n * 旋转类型\n */\nexport enum Rotation {\n Clockwise = 'Clockwise',\n Anticlockwise = 'Anticlockwise',\n Loop = 'Loop',\n}\n\n/**\n * 回调配置\n */\nexport interface CameraMovementOptsCallback {\n asyncStartCallback?: () => void\n asyncEndCallback?: () => void\n}\n\n/**\n * 移动运镜参数\n */\nexport type MoveArgs = {\n mode: Mode\n panoIndex: number\n} & Pose\n\n/**\n * 移动运镜配置\n */\nexport type MoveOpts = {\n preload?: boolean\n} & CameraMovementOptsCallback\n\n/**\n * 旋转运镜参数\n */\nexport type RotateArgs = {\n panoIndex?: number\n rotateSpeed?: number\n rotation?: Rotation\n} & Pose\n\n/**\n * 旋转运镜配置\n */\nexport type RotateOpts = {\n preload?: boolean\n} & CameraMovementOptsCallback\n","const PI_2 = Math.PI * 2\n\n/**\n * 把一个任意角度的弧度值转换为一个 [0, 2PI] 的弧度值\n * @param rad 弧度值\n */\nexport function formatLongitude(rad: number) {\n return ((rad % PI_2) + PI_2) % PI_2\n}\n\n/**\n * 把一个任意角度的弧度值转换为一个 [-2PI, 2PI] 的弧度值\n * @param rad 弧度值\n */\nexport function formatLatitude(rad: number) {\n return rad % PI_2\n}\n\n/**\n * 把一个任意角度的弧度值转换为一个 [0, 2PI] 的弧度值\n * @param rad 弧度值\n */\nexport const formatRad = formatLongitude\n","import { formatRad } from './formatRad'\n\nconst PI = Math.PI\nconst PI_2 = PI * 2\n\n/**\n * 线性过程插值\n */\nexport function progressNumber(from: number, to: number, pst: number) {\n return from + (to - from) * pst\n}\n\n/**\n * 弧度过程插值值,会取锐角进行插值\n */\nexport function progressRad(from: number, to: number, pst: number) {\n from = formatRad(from)\n to = formatRad(to)\n\n if (to - from > PI) {\n return formatRad(progressNumber(from + PI_2, to, pst))\n }\n if (from - to > PI) {\n return formatRad(progressNumber(from - PI_2, to, pst))\n }\n return progressNumber(from, to, pst)\n}\n","import { Five } from '@realsee/five-webgpu'\nimport * as TWEEN from '@tweenjs/tween.js'\nimport type { FivePlugin } from '@realsee/five-webgpu'\nimport { tweenProgress } from '../shared-utils/animationFrame/tween'\n\nimport type {\n CameraMovementPluginExportType,\n CameraMovementPluginParameterType,\n MoveArgs,\n MoveOpts,\n RotateArgs,\n RotateOpts,\n} from './typing'\nimport { Rotation } from './typing'\nimport { formatLongitude, formatLatitude } from '../shared-utils/animationFrame/formatRad'\nimport { progressNumber } from '../shared-utils/animationFrame/calculateProgress'\n\ntype Tween = TWEEN.Tween<{ progress: number }> & { onDestroy: (p: any) => Tween; destroy: () => void }\n\nconst getLongitudeParams = (_from: number, _to: number, rotation: Rotation): { from: number; to: number } => {\n const PI = Math.PI\n const PI_2 = PI * 2\n let from = formatLongitude(_from)\n let to = formatLongitude(_to)\n // 逆时针旋转,初始值必须是较大的值\n if (rotation === Rotation.Anticlockwise && from < to) from += PI_2\n // 顺时针旋转,结束值必须是较大值\n if (rotation === Rotation.Clockwise && to < from) to += PI_2\n // Loop 旋转,找锐角旋转\n // 如果 to 比 from 大 180°,逆时针转\n // 如果 from 比 to 大 180°,顺时针转\n if (rotation === Rotation.Loop && to - from > PI) return getLongitudeParams(from, to, Rotation.Anticlockwise)\n if (rotation === Rotation.Loop && from - to > PI) return getLongitudeParams(from, to, Rotation.Clockwise)\n return { from, to }\n}\n\n/**\n * **运镜插件** 模拟类似于电影运镜效果。\n */\nexport const CameraMovementPlugin: FivePlugin<CameraMovementPluginParameterType, CameraMovementPluginExportType> = (five: Five) => {\n const state: { timeoutId?: NodeJS.Timeout; interruptCallback?: (flag: boolean) => void } = {}\n\n const move = async (args: Partial<MoveArgs>, duration: number, opts: MoveOpts = { preload: true }) => {\n if (state.interruptCallback) {\n state.interruptCallback(false)\n }\n\n if (opts.asyncStartCallback) {\n await opts.asyncStartCallback()\n }\n\n if (args.mode && args.mode !== five.currentMode) {\n await five.changeMode(args.mode)\n }\n\n if (opts.preload && args.panoIndex !== undefined && args.panoIndex !== five.panoIndex) {\n await five.preloadPano(args.panoIndex)\n }\n\n if (opts.asyncEndCallback) {\n await opts.asyncEndCallback()\n }\n\n if (args.panoIndex === undefined && args.fov === undefined && args.latitude === undefined && args.longitude === undefined) {\n return true\n }\n\n return await new Promise<boolean>((resolve, reject) => {\n const panoIndex = args.panoIndex !== undefined ? args.panoIndex : five.panoIndex\n if (panoIndex !== undefined) {\n five.moveToPano(panoIndex, {\n duration, // 移动耗时\n moveEndCallback: () => resolve(true), // 移动结束\n moveCancelCallback: () => reject(new Error('move canceled')), // 移动开始\n\n ...args,\n })\n } else {\n reject(new Error('unexpected error'))\n }\n })\n }\n\n const getAnimeParams = (args: RotateArgs) => {\n const currentFiveState = five.state\n // latitude\n const fromLatitude = formatLatitude(currentFiveState.latitude)\n const toLatitude = formatLatitude(args.latitude)\n // longitude\n const { from: fromLongitude, to: toLongitude } = getLongitudeParams(\n currentFiveState.longitude,\n args.longitude,\n args.rotation || Rotation.Loop,\n )\n // fov\n const fromFov = currentFiveState.fov\n const toFov = args.fov\n return {\n from: { latitude: fromLatitude, longitude: fromLongitude, fov: fromFov },\n to: { latitude: toLatitude, longitude: toLongitude, fov: toFov },\n }\n }\n\n const rotate = async (args: RotateArgs, duration: number, opts: RotateOpts = {}) => {\n if (state.interruptCallback) {\n state.interruptCallback(false)\n }\n\n if (opts.asyncStartCallback) {\n await opts.asyncStartCallback()\n }\n\n if (five.currentMode !== Five.Mode.Panorama) {\n await five.changeMode(Five.Mode.Panorama)\n }\n\n if (args.panoIndex !== undefined && args.panoIndex !== five.panoIndex) {\n if (opts.preload) await five.preloadPano(args.panoIndex)\n await new Promise((resolve, reject) => {\n if (!args.panoIndex) {\n resolve(true)\n return\n }\n five.moveToPano(args.panoIndex, {\n moveEndCallback: () => resolve(true), // 移动结束\n moveCancelCallback: () => reject(new Error('move canceled')), // 移动开始\n })\n })\n }\n\n if (opts.asyncEndCallback) {\n await opts.asyncEndCallback()\n }\n\n const { from, to } = getAnimeParams(args)\n return await new Promise<boolean>((resolve) => {\n const onUpdate = ({ progress }: { progress: number }) => {\n const state: Record<string, number> = {}\n state.longitude = progressNumber(from.longitude, to.longitude, progress)\n state.latitude = progressNumber(from.latitude, to.latitude, progress)\n state.fov = progressNumber(from.fov, to.fov, progress)\n five.setState(state, true)\n }\n\n const onComplete = () => {\n resolve(true)\n }\n\n const onDestroy = () => {\n resolve(false)\n }\n\n const animeDuration = args.rotateSpeed ? Math.ceil((Math.abs(to.longitude - from.longitude) / args.rotateSpeed) * 1000) : duration\n\n const tween = (tweenProgress(animeDuration, TWEEN.Easing.Linear.None) as Tween)\n .onUpdate(onUpdate)\n .onComplete(onComplete)\n .onDestroy(onDestroy)\n if (args.rotation === Rotation.Loop) {\n tween.repeat(Infinity).yoyo(true)\n }\n /**\n * 中断回调:可能会被其他动画中断。\n */\n state.interruptCallback = (flag = true) => {\n tween.destroy()\n state.interruptCallback = undefined\n if (state.timeoutId) {\n clearTimeout(state.timeoutId)\n state.timeoutId = undefined\n }\n resolve(flag)\n }\n state.timeoutId = setTimeout(() => {\n // 总时间到了之后强制结束,同时也是 Loop 模式的结束方式\n if (state.interruptCallback) state.interruptCallback(true)\n }, duration)\n })\n }\n\n const stop = () => {\n state.interruptCallback?.(false)\n if (state.timeoutId) clearTimeout(state.timeoutId)\n state.timeoutId = undefined\n }\n const dispose = () => { stop(); five.off('dispose', dispose) }\n five.once('dispose', dispose)\n return { move, rotate, stop, dispose }\n}\n\nexport default CameraMovementPlugin\n"],"mappings":";;;;AAGA,IAAaK,IAASL;AAiBtB,SAAwBO,EAAS,GAAS,GAAO,GAAkB,IAASF,EAAO,OAAO,MAAM;CAC9F,IAAME,IAAQ,IAAIN,EAAYO,CAAI,CAAC,CAAC,GAAGC,GAAIC,CAAQ,CAAC,CAAC,OAAOC,CAAM;CAElE,QAAgBJ,EAAM,MAAM,CAAC,CAAC;CAE9B,IAAMK,IAAuBR,GAA+B,MAAS;EACnE,AAAIG,EAAM,OAAOM,CAAI,MAAM,MAAOD,EAAqB;CACzD,CAAC,GACKE,IAA8C,CAAC;CAiBrD,OAhBA,EAAM,aAAa,OACjBA,EAAe,KAAKC,CAAE,GACfR,IAET,EAAM,UAAU,WAAY;EAE1B,AADA,KAAK,KAAK,GACV,OAAO,OAAOA,GAAO;GACnB,kBAAkB;GAClB,mBAAmB;GACnB,qBAAqB;GACrB,kBAAkB;EACpB,CAAC;EACD,IAAIS;EACJ,OAAQ,IAAgBF,EAAe,MAAM,IAAI,EAAc;EAC/D,EAAqB;CACvB,GACOP;AACT;AAEA,SAAgBU,EAAc,GAAkB,GAAmC;CACjF,OAAOV,EAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAGG,GAAUC,CAAM;AACjE;;;ACzBA,IAAYO,IAAL,yBAAA,GAAA;QACL,EAAAC,OAAA,QACA,EAAAC,SAAA;AACF,EAAA,CAAA,CAAA,GAKYC,IAAL,yBAAA,GAAA;QACL,EAAAC,YAAA,aACA,EAAAC,gBAAA,iBACA,EAAAC,OAAA;AACF,EAAA,CAAA,CAAA,GCrCMtB,IAAO,KAAK,KAAK;AAMvB,SAAgBwB,EAAgB,GAAa;CAC3C,QAASC,IAAMzB,IAAQA,KAAQA;AACjC;AAMA,SAAgB0B,EAAe,GAAa;CAC1C,OAAOD,IAAMzB;AACf;ACRA,SAAgB2B,EAAe,GAAc,GAAY,GAAa;CACpE,OAAOrB,KAAQC,IAAKD,KAAQsB;AAC9B;;;ACSA,IAAMC,KAAsB,GAAe,GAAa,MAAqD;CAC3G,IAAMC,IAAK,KAAK,IACVC,IAAOD,IAAK,GACdxB,IAAOkB,EAAgBQ,CAAK,GAC5BzB,IAAKiB,EAAgBS,CAAG;CAU5B,OARIC,MAAaf,EAAS,iBAAiBb,IAAOC,MAAI,KAAQwB,IAE1DG,MAAaf,EAAS,aAAaZ,IAAKD,MAAM,KAAMyB,IAIpDG,MAAaf,EAAS,QAAQZ,IAAKD,IAAOwB,IAAWD,EAAmBvB,GAAMC,GAAIY,EAAS,aAAa,IACxGe,MAAaf,EAAS,QAAQb,IAAOC,IAAKuB,IAAWD,EAAmBvB,GAAMC,GAAIY,EAAS,SAAS,IACjG;EAAE;EAAM;CAAG;AACpB,GAKagB,KAAuG,MAAe;CACjI,IAAMC,IAAqF,CAAC,GAEtFC,IAAO,OAAO,GAAyB,GAAkB,IAAiB,EAAE,SAAS,GAAK,OAC1FD,EAAM,qBACRA,EAAM,kBAAkB,EAAK,GAG3BE,EAAK,sBACP,MAAMA,EAAK,mBAAmB,GAG5BC,EAAK,QAAQA,EAAK,SAASC,EAAK,eAClC,MAAMA,EAAK,WAAWD,EAAK,IAAI,GAG7BD,EAAK,WAAWC,EAAK,cAAc,KAAA,KAAaA,EAAK,cAAcC,EAAK,aAC1E,MAAMA,EAAK,YAAYD,EAAK,SAAS,GAGnCD,EAAK,oBACP,MAAMA,EAAK,iBAAiB,GAG1BC,EAAK,cAAc,KAAA,KAAaA,EAAK,QAAQ,KAAA,KAAaA,EAAK,aAAa,KAAA,KAAaA,EAAK,cAAc,KAAA,KAIzG,MAAM,IAAI,SAAkB,GAAS,MAAW;EACrD,IAAME,IAAYF,EAAK,cAAc,KAAA,IAA6BC,EAAK,YAAtBD,EAAK;EACtD,AAAIE,MAAc,KAAA,IAShBC,EAAO,gBAAI,MAAM,kBAAkB,CAAC,IARpCF,EAAK,WAAWC,GAAW;GACzB;GACA,uBAAuBE,EAAQ,EAAI;GACnC,0BAA0BD,EAAO,gBAAI,MAAM,eAAe,CAAC;GAE3D,GAAGH;EACL,CAAC;CAIL,CAAC,IAGGK,KAAkB,MAAqB;EAC3C,IAAMC,IAAmBL,EAAK,OAExBM,IAAepB,EAAemB,EAAiB,QAAQ,GACvDE,IAAarB,EAAea,EAAK,QAAQ,GAEzC,EAAE,MAAMS,GAAe,IAAIC,MAAgBpB,EAC/CgB,EAAiB,WACjBN,EAAK,WACLA,EAAK,YAAYpB,EAAS,IAC5B,GAEM+B,IAAUL,EAAiB,KAC3BM,IAAQZ,EAAK;EACnB,OAAO;GACL,MAAM;IAAE,UAAUO;IAAc,WAAWE;IAAe,KAAKE;GAAQ;GACvE,IAAI;IAAE,UAAUH;IAAY,WAAWE;IAAa,KAAKE;GAAM;EACjE;CACF,GAEMC,IAAS,OAAO,GAAkB,GAAkB,IAAmB,CAAC,MAAM;EA2BlF,AA1BIhB,EAAM,qBACRA,EAAM,kBAAkB,EAAK,GAG3BE,EAAK,sBACP,MAAMA,EAAK,mBAAmB,GAG5BE,EAAK,gBAAgBa,EAAK,KAAK,YACjC,MAAMb,EAAK,WAAWa,EAAK,KAAK,QAAQ,GAGtCd,EAAK,cAAc,KAAA,KAAaA,EAAK,cAAcC,EAAK,cACtDF,EAAK,WAAS,MAAME,EAAK,YAAYD,EAAK,SAAS,GACvD,MAAM,IAAI,SAAS,GAAS,MAAW;GACrC,AAAKA,EAAK,YAIVC,EAAK,WAAWD,EAAK,WAAW;IAC9B,uBAAuBI,EAAQ,EAAI;IACnC,0BAA0BD,EAAO,gBAAI,MAAM,eAAe,CAAC;GAC7D,CAAC,IANCC,EAAQ,EAAI;EAOhB,CAAC,IAGCL,EAAK,oBACP,MAAMA,EAAK,iBAAiB;EAG9B,IAAM,EAAE,SAAM,UAAOM,EAAeL,CAAI;EACxC,OAAO,MAAM,IAAI,SAAkB,MAAY;GAmB7C,IAAMlC,IAASU,EAFOwB,EAAK,cAAc,KAAK,KAAM,KAAK,IAAIhC,EAAG,YAAYD,EAAK,SAAS,IAAIiC,EAAK,cAAe,GAAI,IAAI/B,GAE7FJ,EAA4B,OAAO,IAAI,CAAC,CAClE,UAnBe,EAAE,kBAAqC;IACvD,IAAMgC,IAAgC,CAAC;IAIvC,AAHA,EAAM,YAAYT,EAAerB,EAAK,WAAWC,EAAG,WAAW+C,CAAQ,GACvE,EAAM,WAAW3B,EAAerB,EAAK,UAAUC,EAAG,UAAU+C,CAAQ,GACpE,EAAM,MAAM3B,EAAerB,EAAK,KAAKC,EAAG,KAAK+C,CAAQ,GACrDd,EAAK,SAASJ,GAAO,EAAI;GAC3B,CAaoB,CAAC,CAClB,iBAZsB;IACvB,EAAQ,EAAI;GACd,CAUwB,CAAC,CACtB,gBATqB;IACtB,EAAQ,EAAK;GACf,CAOsB;GAgBtB,AAfIG,EAAK,aAAapB,EAAS,QAC7Bd,EAAM,OAAO,QAAQ,CAAC,CAAC,KAAK,EAAI,GAKlC,EAAM,qBAAqB,IAAO,OAAS;IAOzC,AANAA,EAAM,QAAQ,GACd,EAAM,oBAAoB,KAAA,GAC1B,AAEE+B,EAAM,eADN,aAAaA,EAAM,SAAS,GACV,KAAA,IAEpBO,EAAQY,CAAI;GACd,GACA,EAAM,YAAY,iBAAiB;IAEjC,AAAInB,EAAM,qBAAmBA,EAAM,kBAAkB,EAAI;GAC3D,GAAG5B,CAAQ;EACb,CAAC;CACH,GAEMgD,UAAa;EAGjB,AAFApB,EAAM,oBAAoB,EAAK,GAC3BA,EAAM,aAAW,aAAaA,EAAM,SAAS,GACjD,EAAM,YAAY,KAAA;CACpB,GACMqB,UAAgB;EAAU,AAARD,EAAK,GAAGhB,EAAK,IAAI,WAAWiB,CAAO;CAAE;CAE7D,OADAjB,EAAK,KAAK,WAAWiB,CAAO,GACrB;EAAE;EAAM;EAAQ;EAAM;CAAQ;AACvC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as e } from "./defaultUrls-
|
|
1
|
+
import { n as e } from "./defaultUrls-CfMtGzqM.js";
|
|
2
2
|
//#region src/shared-utils/url/absoluteUrl.ts
|
|
3
3
|
function t(e) {
|
|
4
4
|
return /^https?:\/\/|^\/\//.test(e) || /^data:/.test(e) || e.startsWith("//");
|
|
@@ -70,4 +70,4 @@ function l(e, t) {
|
|
|
70
70
|
//#endregion
|
|
71
71
|
export { n as i, i as n, r, c as t };
|
|
72
72
|
|
|
73
|
-
//# sourceMappingURL=changeMode-
|
|
73
|
+
//# sourceMappingURL=changeMode-D_I2AOjH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"changeMode-
|
|
1
|
+
{"version":3,"file":"changeMode-D_I2AOjH.js","names":["DEFAULT_STATIC_PREFIX","isAbsoluteURL","url","replaceStaticPrefix","prefix","normalizedUrl","originUrl","newHostname","newProtocol","newPort","prefixUrl","error","to","promise","nearlyEqual","num1","num2","accuracy","nearlyEqualRad","PI2","_rad1","rad1","_rad2","rad2","min","max","isObject","params","isVector3","changeMode","wantsChangeModeError","five","changeModeParams","resolve","targetPose","checkPose","fivePoseItem","fivePose","key","correctPoseItem"],"sources":["../../src/shared-utils/url/absoluteUrl.ts","../../src/shared-utils/url/replace-static-prefix.ts","../../src/shared-utils/to.ts","../../src/shared-utils/nearlyEqual.ts","../../src/shared-utils/five/changeMode.ts"],"sourcesContent":["export function isAbsoluteURL(url: string) {\n // https:// | http:// | // | base64 | '//'\n return /^https?:\\/\\/|^\\/\\//.test(url) || /^data:/.test(url) || url.startsWith('//')\n}\n\n/**\n * @description: 获取静态资源的url\n */\nexport function absoluteUrl(baseUrl: string, url: string) {\n return isAbsoluteURL(url) ? url : `${baseUrl}${url}`\n}\n","/**\n * 简单的URL转换器\n */\n\n/**\n * URL转换器 - 支持同步和异步\n */\nimport { isAbsoluteURL } from './absoluteUrl'\nimport { DEFAULT_STATIC_PREFIX } from './defaultUrls'\n/**\n * 替换静态资源前缀(仅处理绝对URL)\n * 能够替换资源前缀域名:\n * - 绝对路径:替换域名部分\n * - 相对路径:保持原样不进行替换\n * - 无效URL:返回原始URL\n */\nexport function replaceStaticPrefix(prefix: string = DEFAULT_STATIC_PREFIX, url: string): string {\n // 参数验证\n if (!url || typeof url !== 'string') {\n return url || ''\n }\n\n if (!prefix || typeof prefix !== 'string') {\n return url\n }\n\n if (prefix.startsWith('//')) {\n prefix = 'http:' + prefix\n }\n\n try {\n // 如果是相对路径,保持原样不进行替换\n if (!isAbsoluteURL(url)) {\n return url\n }\n\n // 处理以 // 开头的 URL,先转换为完整格式\n let normalizedUrl = url\n if (url.startsWith('//')) {\n normalizedUrl = 'http:' + url\n }\n\n // 处理绝对URL\n const originUrl = new URL(normalizedUrl)\n\n // 解析prefix,提取hostname、端口和可能的协议\n let newHostname = prefix\n let newProtocol = originUrl.protocol\n let newPort: string | undefined = undefined\n\n // 如果prefix包含协议,分离协议和hostname,但保持当前页面的协议\n if (prefix.includes('://')) {\n const prefixUrl = new URL(prefix)\n newHostname = prefixUrl.hostname\n newPort = prefixUrl.port\n // 保持当前页面的协议,不从 prefix 中提取\n // newProtocol = originUrl.protocol\n } else if (prefix.startsWith('//')) {\n // 处理 // 开头的prefix\n newHostname = prefix.substring(2)\n }\n\n // 验证hostname是否有效\n if (!newHostname || newHostname.trim() === '') {\n return url\n }\n\n // 替换hostname、端口和协议\n originUrl.hostname = newHostname\n if (newPort !== undefined) {\n originUrl.port = newPort\n }\n if (newProtocol !== originUrl.protocol) {\n originUrl.protocol = newProtocol\n }\n\n // 如果原始URL是以 // 开头的,返回结果也应该是 // 开头\n if (url.startsWith('//')) {\n return originUrl.toString().replace(/^https?:\\/\\//, '//')\n }\n\n return originUrl.toString()\n } catch (error) {\n // 如果URL解析失败,返回原始URL\n console.warn(`[replaceStaticPrefix] Invalid URL: ${url}`, error)\n return url\n }\n}\n","/**\n * 传入一个 Promise\n * 无异常,返回 [null, data]\n * 有异常,则返回 [Error, undefined]\n * 用于替代 try&catch 处理 await 异常的方案\n */\nexport async function to<T>(promise: Promise<T>): Promise<[null, T] | [Error, null]> {\n try {\n const data = await promise\n return [null, data]\n } catch (error) {\n if (error instanceof Error) return [error, null]\n return [new Error(''), null]\n }\n}\n\nexport default to\n","/**\n * 比较两个数字近似相等\n * @param num1 数字1\n * @param num2 数字2\n * @param accuracy 精度:精确到小数点后几位,默认精确到 小数点后四位\n */\nexport default function nearlyEqual(num1: number, num2: number, accuracy = 4) {\n return Math.abs(num1 - num2) < Math.pow(10, -accuracy)\n}\n\n/**\n * 比较两个弧度近似相等\n * @param rad1 弧度1\n * @param rad2 弧度2\n * @param accuracy 精度:精确到小数点后几位,默认精确到 小数点后四位\n */\nexport function nearlyEqualRad(rad1: number, rad2: number, accuracy = 4) {\n const PI2 = Math.PI * 2\n // 都转换到 0 ~ 2PI 之间\n // 把 0 和 4PI 的比较转化成 0 和 2PI 的比较\n const _rad1 = rad1 % PI2\n const _rad2 = rad2 % PI2\n const min = Math.min(_rad1, _rad2)\n const max = Math.max(_rad1, _rad2)\n // 当两个角度都是锐角时,直接比较大小\n // 有一个是锐角,一个是钝角时,需要判断两个角度是否相差 2PI\n return nearlyEqual(min, max, accuracy) || nearlyEqual(min + PI2, max, accuracy)\n}\n","import type * as THREE from 'three/webgpu'\nimport type { Five, Pose, State } from '@realsee/five-webgpu'\nimport nearlyEqual, { nearlyEqualRad } from '../nearlyEqual'\nimport to from '../to'\n\nfunction isObject(params: any): params is Object {\n return Object.prototype.toString.call(params) === '[object Object]'\n}\n\nfunction isVector3(params: any): params is THREE.Vector3 {\n return isObject(params) && !!params.isVector3\n}\n\n/** 等待 five changeMode 结束 */\nexport default async function changeMode(five: Five, changeModeParams: Parameters<Five['changeMode']>) {\n // ========== 等待 Five ChangeMode Promise ==========\n // Promise 只代表 changeMode 是否成功,不代表 changeMode 动画结束\n const [wantsChangeModeError] = await to(five.changeMode(...changeModeParams))\n if (wantsChangeModeError) throw new Error('change mode canceled')\n\n // ========== 等待 changeMode 动画结束 ==========\n await new Promise<void>((resolve) => {\n five.once('initAnimationWillStart', () => {\n five.once('initAnimationEnded', () => resolve())\n })\n })\n\n // ========== pose 校验 ==========\n // 如果没有目标 pose,动画结束就认为 changeMode 成功\n const targetPose = changeModeParams[1]\n if (!targetPose) return true\n // 如果有目标 pose,需要检测 current pose 是否与目标 pose 一致\n const fiveCurrentState = five.getCurrentState()\n const checkPoseResult = checkPose(targetPose, fiveCurrentState)\n if (!checkPoseResult) throw new Error('pose 与预期不符')\n}\n\n/** 校验 Five Pose 与传入 Pose 是否一致 */\nfunction checkPose(targetPose: Partial<Pose>, fivePose: Pose) {\n return Object.keys(targetPose).every((key) => {\n type StateKey = keyof State\n type ChangeModeStateKey = keyof Partial<Omit<State, 'mode'>>\n const fivePoseItem = fivePose[key as StateKey]\n const correctPoseItem = targetPose[key as ChangeModeStateKey]\n // 如果 fivePoseItem 或 correctPoseItem 不存在,不进行比较\n if (fivePoseItem === undefined || correctPoseItem === undefined) return true\n // 对于 longitude 和 latitude,需要判断 0 和 2PI 相等\n if (key === 'longitude' || key === 'latitude') return nearlyEqualRad(fivePoseItem, correctPoseItem, 2)\n // 如果 item 是 number,需要判断是否近似相等\n if (typeof fivePoseItem === 'number' && typeof correctPoseItem === 'number') {\n return nearlyEqual(fivePoseItem, correctPoseItem, 2)\n }\n // 如果 item 是 Vector3,需要判断距离是否相近\n // 1cm 以内都算相等\n if (isVector3(correctPoseItem) && isVector3(fivePoseItem)) return correctPoseItem.distanceTo(fivePoseItem) < 0.01\n return fivePoseItem === correctPoseItem\n })\n}\n"],"mappings":"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"}
|