@realsee/dnalogel 4.0.0-webgpu.18 → 4.0.0-webgpu.20
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 +10 -0
- package/dist/floorplan.js +1 -1
- package/dist/index.js +19 -19
- package/dist/internal/{BasePlugin-Cr_atQUC.js → BasePlugin-hxM1EHtV.js} +2 -2
- package/dist/internal/{BasePlugin-Cr_atQUC.js.map → BasePlugin-hxM1EHtV.js.map} +1 -1
- package/dist/internal/BasePluginWithData-BS2O9hNu.js +7 -0
- package/dist/internal/{BasePluginWithData-CIQpqYGe.js.map → BasePluginWithData-BS2O9hNu.js.map} +1 -1
- package/dist/internal/{Controller-Cq-mYkzT.js → Controller-CDLmWyXz.js} +3 -3
- package/dist/internal/{Controller-Cq-mYkzT.js.map → Controller-CDLmWyXz.js.map} +1 -1
- package/dist/internal/{Controller-BDT5_ZNe.js → Controller-CxAUW5kD.js} +2 -2
- package/dist/internal/{Controller-BDT5_ZNe.js.map → Controller-CxAUW5kD.js.map} +1 -1
- package/dist/internal/{Controller-5BvatEWD.js → Controller-DSKeCecj.js} +171 -154
- package/dist/internal/Controller-DSKeCecj.js.map +1 -0
- package/dist/internal/PointHelper-G9EgUMWo.js +1052 -0
- package/dist/internal/PointHelper-G9EgUMWo.js.map +1 -0
- package/dist/internal/{Rectangle-Z2T_h74M.js → Rectangle-HB8jF_bX.js} +3 -3
- package/dist/internal/{Rectangle-Z2T_h74M.js.map → Rectangle-HB8jF_bX.js.map} +1 -1
- package/dist/internal/{Work-PKaUMpXd.js → Work-6uuml2Ft.js} +4 -4
- package/dist/internal/{Work-PKaUMpXd.js.map → Work-6uuml2Ft.js.map} +1 -1
- package/dist/internal/{area-maker-BTGqxG6D.js → area-maker-D2ZIYsTG.js} +2 -2
- package/dist/internal/{area-maker-BTGqxG6D.js.map → area-maker-D2ZIYsTG.js.map} +1 -1
- package/dist/internal/{controller-B0hqJtoB.js → controller-DjCi781H.js} +4 -4
- package/dist/internal/{controller-B0hqJtoB.js.map → controller-DjCi781H.js.map} +1 -1
- package/dist/internal/{cruise-BkSbiLjd.js → cruise-DWxq9GTd.js} +2 -2
- package/dist/internal/{cruise-BkSbiLjd.js.map → cruise-DWxq9GTd.js.map} +1 -1
- package/dist/internal/{current-pano-image-DqyUFIP6.js → current-pano-image-DPLm0-o2.js} +2 -2
- package/dist/internal/{current-pano-image-DqyUFIP6.js.map → current-pano-image-DPLm0-o2.js.map} +1 -1
- package/dist/internal/{edgeSnap-8fdFCcXB.js → edgeSnap-CH0HidZm.js} +206 -83
- package/dist/internal/edgeSnap-CH0HidZm.js.map +1 -0
- package/dist/internal/{floorplan-Dkp7omYn.js → floorplan-B6Y-8xjB.js} +2 -2
- package/dist/internal/{floorplan-Dkp7omYn.js.map → floorplan-B6Y-8xjB.js.map} +1 -1
- package/dist/internal/{measure-KVSCjRnS.js → measure-DIstq55p.js} +2 -2
- package/dist/internal/{measure-KVSCjRnS.js.map → measure-DIstq55p.js.map} +1 -1
- package/dist/internal/measure-v2-Byp1mE5q.js +215 -0
- package/dist/internal/measure-v2-Byp1mE5q.js.map +1 -0
- package/dist/internal/{model-maker-L5eqUgkU.js → model-maker-Cea52AmN.js} +2 -2
- package/dist/internal/{model-maker-L5eqUgkU.js.map → model-maker-Cea52AmN.js.map} +1 -1
- package/dist/internal/{model-view-BWUU0-uq.js → model-view-DSRXOhPg.js} +12 -2
- package/dist/internal/model-view-DSRXOhPg.js.map +1 -0
- package/dist/internal/object3d-helper-JrdReT4Y.js +7 -0
- package/dist/internal/{object3d-helper-CUhRRdCQ.js.map → object3d-helper-JrdReT4Y.js.map} +1 -1
- package/dist/internal/{pano-compass-dmcsnFDQ.js → pano-compass-DENjS-F-.js} +2 -2
- package/dist/internal/{pano-compass-dmcsnFDQ.js.map → pano-compass-DENjS-F-.js.map} +1 -1
- package/dist/internal/{pano-door-label-C0sd66vf.js → pano-door-label-DFcBreFx.js} +2 -2
- package/dist/internal/{pano-door-label-C0sd66vf.js.map → pano-door-label-DFcBreFx.js.map} +1 -1
- package/dist/internal/{pano-measure-NbB7-uVE.js → pano-measure-bIqtdQ8N.js} +2 -2
- package/dist/internal/{pano-measure-NbB7-uVE.js.map → pano-measure-bIqtdQ8N.js.map} +1 -1
- package/dist/internal/{pano-measure-v2-CRPvPs0e.js → pano-measure-v2-BRr9Jses.js} +4 -4
- package/dist/internal/{pano-measure-v2-CRPvPs0e.js.map → pano-measure-v2-BRr9Jses.js.map} +1 -1
- package/dist/internal/{pano-tag-j8ZPJDDK.js → pano-tag-BI_eOX_D.js} +2 -2
- package/dist/internal/{pano-tag-j8ZPJDDK.js.map → pano-tag-BI_eOX_D.js.map} +1 -1
- package/dist/internal/{pano-video-Dcspq4j1.js → pano-video-D0dQTeX6.js} +2 -2
- package/dist/internal/{pano-video-Dcspq4j1.js.map → pano-video-D0dQTeX6.js.map} +1 -1
- package/dist/internal/{pipeline-CD2YkN5U.js → pipeline-CyleoezT.js} +2 -2
- package/dist/internal/{pipeline-CD2YkN5U.js.map → pipeline-CyleoezT.js.map} +1 -1
- package/dist/internal/{sculpt-CbEBEh9F.js → sculpt-BGx4Dudb.js} +3 -3
- package/dist/internal/{sculpt-CbEBEh9F.js.map → sculpt-BGx4Dudb.js.map} +1 -1
- package/dist/plugins/area-maker.js +1 -1
- package/dist/plugins/cruise.js +2 -2
- package/dist/plugins/current-pano-image.js +1 -1
- package/dist/plugins/guide-line.js +1 -1
- package/dist/plugins/measure-v2.js +2 -2
- package/dist/plugins/measure.js +2 -2
- package/dist/plugins/model-maker.js +1 -1
- package/dist/plugins/model-view.js +1 -1
- package/dist/plugins/object3d-helper.js +2 -2
- package/dist/plugins/pano-compass.js +1 -1
- package/dist/plugins/pano-door-label.js +1 -1
- package/dist/plugins/pano-measure-v2.js +1 -1
- package/dist/plugins/pano-measure.js +1 -1
- package/dist/plugins/pano-tag.js +2 -2
- package/dist/plugins/pano-video.js +1 -1
- package/dist/plugins/pipeline.js +1 -1
- package/dist/plugins/sculpt.js +2 -2
- package/dist/types/MeasurePlugin/Controller.d.ts +7 -0
- package/dist/types/MeasurePlugin/utils/MeasureMesh.d.ts +5 -0
- package/dist/types/MeasurePluginV2/Controller.d.ts +9 -0
- package/dist/types/MeasurePluginV2/Magnifier.d.ts +33 -0
- package/dist/types/MeasurePluginV2/PointOverlay.d.ts +5 -0
- package/dist/types/MeasurePluginV2/closeupView.d.ts +69 -0
- package/dist/types/MeasurePluginV2/normalMeasure.d.ts +116 -0
- package/dist/types/shared-utils/three/Magnifier.d.ts +55 -0
- package/dist/utils.js +1 -1
- package/package.json +1 -1
- package/dist/internal/BasePluginWithData-CIQpqYGe.js +0 -7
- package/dist/internal/Controller-5BvatEWD.js.map +0 -1
- package/dist/internal/PointHelper-grrf8vu1.js +0 -953
- package/dist/internal/PointHelper-grrf8vu1.js.map +0 -1
- package/dist/internal/edgeSnap-8fdFCcXB.js.map +0 -1
- package/dist/internal/measure-v2-DqjBlSeF.js +0 -83
- package/dist/internal/measure-v2-DqjBlSeF.js.map +0 -1
- package/dist/internal/model-view-BWUU0-uq.js.map +0 -1
- package/dist/internal/object3d-helper-CUhRRdCQ.js +0 -7
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import { c as e } from "./PointHelper-grrf8vu1.js";
|
|
2
|
-
import { t } from "./Controller-5BvatEWD.js";
|
|
3
|
-
import { a as n, i as r, n as i, o as a, s as o } from "./edgeSnap-8fdFCcXB.js";
|
|
4
|
-
//#region src/MeasurePluginV2/Controller.ts
|
|
5
|
-
var s = class extends t {
|
|
6
|
-
lastEdgeSnapEdgeCount = 0;
|
|
7
|
-
v2Five;
|
|
8
|
-
v2Magnifier;
|
|
9
|
-
v2Attached = !1;
|
|
10
|
-
edgeSnapOptions;
|
|
11
|
-
edgeSnapCache = new i();
|
|
12
|
-
constructor(e, t) {
|
|
13
|
-
super(e, t), this.v2Five = e, this.edgeSnapOptions = r(t?.edgeSnap);
|
|
14
|
-
let n = this.measure;
|
|
15
|
-
this.measure = () => {
|
|
16
|
-
this.edgeSnapCache.clear(), this.lastEdgeSnapEdgeCount = 0, this.pointSelector.clearDynamicAdhereLine(), n();
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
get edgeSnapEnabled() {
|
|
20
|
-
return this.edgeSnapOptions.enabled;
|
|
21
|
-
}
|
|
22
|
-
setEdgeSnapEnabled(e) {
|
|
23
|
-
this.edgeSnapOptions.enabled = e, this.edgeSnapCache.clear(), this.lastEdgeSnapEdgeCount = 0, this.pointSelector.clearDynamicAdhereLine(), this.pointSelector.refresh(), this.v2Five.needsRender = !0;
|
|
24
|
-
}
|
|
25
|
-
get magnifier() {
|
|
26
|
-
return this.v2Magnifier;
|
|
27
|
-
}
|
|
28
|
-
createPointSelector() {
|
|
29
|
-
return new o(this.v2Five, {
|
|
30
|
-
mode: "cursor",
|
|
31
|
-
helper: {
|
|
32
|
-
pointHelper: "highlight",
|
|
33
|
-
...e ? { magnifierParams: {
|
|
34
|
-
width: 150,
|
|
35
|
-
height: 150,
|
|
36
|
-
dragEnabled: !1,
|
|
37
|
-
autoFixPCPosition: !1,
|
|
38
|
-
initialPosition: {
|
|
39
|
-
left: "12px",
|
|
40
|
-
top: "12px"
|
|
41
|
-
}
|
|
42
|
-
} } : {}
|
|
43
|
-
},
|
|
44
|
-
skipPanorama: !0
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
get pointSelector() {
|
|
48
|
-
let e = super.pointSelector;
|
|
49
|
-
return this.v2Attached || (this.v2Attached = !0, this.attachOverlayRenderers(e)), e;
|
|
50
|
-
}
|
|
51
|
-
attachOverlayRenderers(e) {
|
|
52
|
-
let t = e.pointSelectorHelper;
|
|
53
|
-
this.attachMagnifier(t), this.attachPointHelper(t), this.attachEdgeSnap(e), e.on("intersectionUpdate", (e) => {
|
|
54
|
-
this.v2Magnifier?.setIntersection(e ?? null);
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
attachMagnifier(e) {
|
|
58
|
-
let t = e.magnifier;
|
|
59
|
-
if (!t) return;
|
|
60
|
-
let n = new a(this.v2Five, {
|
|
61
|
-
...t.config,
|
|
62
|
-
width: t.width,
|
|
63
|
-
height: t.height,
|
|
64
|
-
scale: t.scale
|
|
65
|
-
});
|
|
66
|
-
t.containerDom && n.appendTo(t.containerDom), t.state.enabled && n.enable(), e.magnifier = n, t.dispose(), this.v2Magnifier = n;
|
|
67
|
-
}
|
|
68
|
-
attachPointHelper(e) {
|
|
69
|
-
let t = e.pointHelper;
|
|
70
|
-
e.pointHelper = new n(this.v2Five), t?.dispose(), t?.parent && t.parent.remove(t);
|
|
71
|
-
}
|
|
72
|
-
attachEdgeSnap(e) {
|
|
73
|
-
e.adhereLineProvider = ({ intersection: e }) => {
|
|
74
|
-
if (!e?.point) return [];
|
|
75
|
-
let t = this.edgeSnapCache.query(this.v2Five.model, e.point, this.edgeSnapOptions);
|
|
76
|
-
return this.lastEdgeSnapEdgeCount = t.length, t;
|
|
77
|
-
};
|
|
78
|
-
}
|
|
79
|
-
}, c = (e, t) => new s(e, t);
|
|
80
|
-
//#endregion
|
|
81
|
-
export { s as n, c as t };
|
|
82
|
-
|
|
83
|
-
//# sourceMappingURL=measure-v2-DqjBlSeF.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"measure-v2-DqjBlSeF.js","names":["isTouchDevice","MeasurePointHelperV2","resolveEdgeSnapOptions","EdgeSnapCache","MeasureMagnifier","MeasurePointSelector","MeasureControllerV2","MeasureController","five","config","measure","enabled","pointSelector","helper","intersection","original","magnifier","edges","MeasurePluginV2"],"sources":["../../src/MeasurePluginV2/Controller.ts","../../src/MeasurePluginV2/index.ts"],"sourcesContent":["import type { Five } from '@realsee/five-webgpu'\nimport { MeasurePointSelector } from './PointSelector'\nimport { MeasureController } from '../MeasurePlugin/Controller'\nimport { isTouchDevice } from '../shared-utils/isTouchDevice'\nimport type { MeasurePluginConfig } from '../MeasurePlugin'\nimport { MeasureMagnifier } from './Magnifier'\nimport { MeasurePointHelperV2 } from './PointHelper'\nimport { EdgeSnapCache, resolveEdgeSnapOptions, type EdgeSnapOptions, type ResolvedEdgeSnapOptions } from './edgeSnap'\n\n/**\n * 量尺插件 V2:把放大镜和场景里的小光标换成带「红 / 绿 / 蓝坐标轴 + 红色截面框」的版本。\n *\n * 复用 MeasureController 的测量流程,通过工厂创建独立的 V2 选点器,并替换两个渲染组件:\n * - pointSelectorHelper.magnifier → MeasureMagnifier(多画一层叠加层)\n * - pointSelectorHelper.pointHelper → MeasurePointHelperV2(同样的红 / 绿 / 蓝 + 截面框)\n *\n * 两个替换件都沿用原实例的全部参数(宽高、缩放、autoFixPCPosition、dragEnabled、挂载容器),\n * 所以放大镜出现的位置、跟随方式、是否吃鼠标事件都和原插件一致,不会挡住在原本能选中的点位。\n */\n/** V2 配置:在原 MeasurePlugin 配置上增加模型边缘吸附 */\nexport type MeasurePluginV2Config = MeasurePluginConfig & {\n /**\n * @description 模型边缘吸附(试验能力):落点靠近模型边线时自动吸到边上。\n * 传 `false` 可关闭;不传默认开启。\n */\n edgeSnap?: boolean | EdgeSnapOptions\n}\n\nexport class MeasureControllerV2 extends MeasureController {\n /** 最近一次查询到的候选边数量,示例页 / 调试用 */\n public lastEdgeSnapEdgeCount = 0\n\n private v2Five: Five\n private v2Magnifier?: MeasureMagnifier\n private v2Attached = false\n private readonly edgeSnapOptions: ResolvedEdgeSnapOptions\n private readonly edgeSnapCache = new EdgeSnapCache()\n\n public constructor(five: Five, config?: MeasurePluginV2Config) {\n super(five, config)\n this.v2Five = five\n this.edgeSnapOptions = resolveEdgeSnapOptions(config?.edgeSnap)\n\n // MeasureController.measure 是实例上的箭头函数,不能用 prototype 方法覆盖,\n // 这里在包装后的入口里清一次缓存,避免上一次测量 / 上一楼层的边残留。\n const measure = this.measure\n this.measure = () => {\n this.edgeSnapCache.clear()\n this.lastEdgeSnapEdgeCount = 0\n this.pointSelector.clearDynamicAdhereLine()\n measure()\n }\n }\n\n public get edgeSnapEnabled() {\n return this.edgeSnapOptions.enabled\n }\n\n /** 运行时开关模型边缘吸附(不需要重开测量) */\n public setEdgeSnapEnabled(enabled: boolean) {\n this.edgeSnapOptions.enabled = enabled\n this.edgeSnapCache.clear()\n this.lastEdgeSnapEdgeCount = 0\n this.pointSelector.clearDynamicAdhereLine()\n this.pointSelector.refresh()\n this.v2Five.needsRender = true\n }\n\n /** V2 的放大镜实例;需要临时关掉叠加层做对比时,可以 magnifier.setOverlayEnabled(false) */\n public get magnifier() {\n return this.v2Magnifier\n }\n\n protected override createPointSelector() {\n return new MeasurePointSelector(this.v2Five, { mode: 'cursor', helper: { pointHelper: 'highlight', ...(isTouchDevice ? { magnifierParams: { width: 150, height: 150, dragEnabled: false, autoFixPCPosition: false, initialPosition: { left: '12px', top: '12px' } } } : {}) }, skipPanorama: true })\n }\n\n public override get pointSelector(): MeasurePointSelector {\n const pointSelector = super.pointSelector as MeasurePointSelector\n if (!this.v2Attached) {\n this.v2Attached = true\n this.attachOverlayRenderers(pointSelector)\n }\n return pointSelector\n }\n\n private attachOverlayRenderers(pointSelector: MeasurePointSelector) {\n const helper = pointSelector.pointSelectorHelper\n this.attachMagnifier(helper)\n this.attachPointHelper(helper)\n this.attachEdgeSnap(pointSelector)\n\n // 放大镜是在 renderFrame 里渲染的,而这次事件是同步抛出的,\n // 所以放大镜真正渲染时一定已经拿到了当次的落点与法线\n pointSelector.on('intersectionUpdate', (intersection) => {\n this.v2Magnifier?.setIntersection(intersection ?? null)\n })\n }\n\n private attachMagnifier(helper: MeasurePointSelector['pointSelectorHelper']) {\n const original = helper.magnifier\n if (!original) return\n\n // 宽 / 高 / 缩放 / dragEnabled / autoFixPCPosition / skipPanorama 全部照抄原实例,\n // 只把 render 换成「读像素之后再多画一层坐标轴 + 截面框」\n const magnifier = new MeasureMagnifier(this.v2Five, {\n ...original.config,\n width: original.width,\n height: original.height,\n scale: (original as any).scale,\n })\n\n if (original.containerDom) magnifier.appendTo(original.containerDom)\n if (original.state.enabled) magnifier.enable()\n\n helper.magnifier = magnifier\n // 原放大镜自己的 canvas 和 hammer 手势一并释放,避免两个 canvas 叠在一起\n original.dispose()\n this.v2Magnifier = magnifier\n }\n\n private attachPointHelper(helper: MeasurePointSelector['pointSelectorHelper']) {\n const original = helper.pointHelper\n const pointHelper = new MeasurePointHelperV2(this.v2Five)\n helper.pointHelper = pointHelper\n\n original?.dispose()\n if (original?.parent) original.parent.remove(original)\n }\n\n /**\n * 模型边缘吸附:每次选点器计算吸附前,按当前落点取附近的模型边界线。\n * 真正的吸附判断(3D 距离 / 屏幕距离)仍在 PointSelector 里,这里只负责供线。\n */\n private attachEdgeSnap(pointSelector: MeasurePointSelector) {\n pointSelector.adhereLineProvider = ({ intersection }) => {\n if (!intersection?.point) return []\n const edges = this.edgeSnapCache.query(this.v2Five.model, intersection.point, this.edgeSnapOptions)\n this.lastEdgeSnapEdgeCount = edges.length\n return edges\n }\n }\n}\n","import type { Five } from '@realsee/five-webgpu'\nimport { MeasureControllerV2 } from './Controller'\n\n/**\n * 量尺插件 V2 —— 点位选择可视化(对应 PRD《量尺点位选择器优化》)\n *\n * 与 MeasurePlugin 的关系:V2 是试点 fork,完全继承 MeasurePlugin 的控制器,\n * 新吸附算法、放大镜叠加层和场景光标仅在 V2 中生效,原插件继续使用原选点器。\n *\n * 使用方式(Console / 编辑器等接入方):\n * ```ts\n * import { MeasurePluginV2 } from '@realsee/dnalogel/plugins/measure-v2'\n * const measure = MeasurePluginV2(five, { unit: 'm' })\n * ```\n */\nexport { MeasureControllerV2 } from './Controller'\nexport type { MeasurePluginV2Config } from './Controller'\nexport { MeasureMagnifier } from './Magnifier'\nexport type { MeasureMagnifierOptions } from './Magnifier'\nexport { drawMeasureOverlay, getWorldNormal, OVERLAY_STYLE } from './PointOverlay'\nexport type { MagnifierViewport } from './PointOverlay'\nexport { collectNearbyEdges, EdgeSnapCache, DEFAULT_EDGE_SNAP_OPTIONS } from './edgeSnap'\nexport type { EdgeSnapOptions, ResolvedEdgeSnapOptions } from './edgeSnap'\n\n// 与 MeasurePlugin 完全一致的类型与工具,方便接入方整体替换 import 来源\nexport { validatePolygon } from '../MeasurePlugin'\nexport type { MeasureEndReason, MeasurePluginConfig, MeasurePluginEventMap, MeasureInteractionState } from '../MeasurePlugin'\n\nexport type MeasureControllerV2Interface = InstanceType<typeof MeasureControllerV2>\nexport type MeasurePluginV2ParamsInterface = ConstructorParameters<typeof MeasureControllerV2>[1]\n\nexport const MeasurePluginV2 = (five: Five, config?: MeasurePluginV2ParamsInterface) => {\n return new MeasureControllerV2(five, config)\n}\n\nexport default MeasurePluginV2\n"],"mappings":";;;;AA4BA,IAAaM,IAAb,cAAyCC,EAAkB;CAEzD,wBAA+B;CAE/B;CACA;CACA,aAAqB;CACrB;CACA,gBAAiC,IAAIJ,EAAc;CAEnD,YAAmB,GAAY,GAAgC;EAG7D,AAFA,MAAMK,GAAMC,CAAM,GAClB,KAAK,SAASD,GACd,KAAK,kBAAkBN,EAAuBO,GAAQ,QAAQ;EAI9D,IAAMC,IAAU,KAAK;EACrB,KAAK,gBAAgB;GAInB,AAHA,KAAK,cAAc,MAAM,GACzB,KAAK,wBAAwB,GAC7B,KAAK,cAAc,uBAAuB,GAC1CA,EAAQ;EACV;CACF;CAEA,IAAW,kBAAkB;EAC3B,OAAO,KAAK,gBAAgB;CAC9B;CAGA,mBAA0B,GAAkB;EAM1C,AALA,KAAK,gBAAgB,UAAUC,GAC/B,KAAK,cAAc,MAAM,GACzB,KAAK,wBAAwB,GAC7B,KAAK,cAAc,uBAAuB,GAC1C,KAAK,cAAc,QAAQ,GAC3B,KAAK,OAAO,cAAc;CAC5B;CAGA,IAAW,YAAY;EACrB,OAAO,KAAK;CACd;CAEA,sBAAyC;EACvC,OAAO,IAAIN,EAAqB,KAAK,QAAQ;GAAE,MAAM;GAAU,QAAQ;IAAE,aAAa;IAAa,GAAIL,IAAgB,EAAE,iBAAiB;KAAE,OAAO;KAAK,QAAQ;KAAK,aAAa;KAAO,mBAAmB;KAAO,iBAAiB;MAAE,MAAM;MAAQ,KAAK;KAAO;IAAE,EAAE,IAAI,CAAC;GAAG;GAAG,cAAc;EAAK,CAAC;CACrS;CAEA,IAAoB,gBAAsC;EACxD,IAAMY,IAAgB,MAAM;EAK5B,OAJK,KAAK,eACR,KAAK,aAAa,IAClB,KAAK,uBAAuBA,CAAa,IAEpCA;CACT;CAEA,uBAA+B,GAAqC;EAClE,IAAMC,IAASD,EAAc;EAO7B,AANA,KAAK,gBAAgBC,CAAM,GAC3B,KAAK,kBAAkBA,CAAM,GAC7B,KAAK,eAAeD,CAAa,GAIjCA,EAAc,GAAG,uBAAuB,MAAiB;GACvD,KAAK,aAAa,gBAAgBE,KAAgB,IAAI;EACxD,CAAC;CACH;CAEA,gBAAwB,GAAqD;EAC3E,IAAMC,IAAWF,EAAO;EACxB,IAAI,CAACE,GAAU;EAIf,IAAMC,IAAY,IAAIZ,EAAiB,KAAK,QAAQ;GAClD,GAAGW,EAAS;GACZ,OAAOA,EAAS;GAChB,QAAQA,EAAS;GACjB,OAAQA,EAAiB;EAC3B,CAAC;EAQD,AANIA,EAAS,gBAAcC,EAAU,SAASD,EAAS,YAAY,GAC/DA,EAAS,MAAM,WAASC,EAAU,OAAO,GAE7C,EAAO,YAAYA,GAEnBD,EAAS,QAAQ,GACjB,KAAK,cAAcC;CACrB;CAEA,kBAA0B,GAAqD;EAC7E,IAAMD,IAAWF,EAAO;EAKxB,AAHA,EAAO,cAAc,IADGZ,EAAqB,KAAK,MAC7B,GAErBc,GAAU,QAAQ,GACdA,GAAU,UAAQA,EAAS,OAAO,OAAOA,CAAQ;CACvD;CAMA,eAAuB,GAAqC;EAC1D,EAAc,sBAAsB,EAAE,sBAAmB;GACvD,IAAI,CAACD,GAAc,OAAO,OAAO,CAAC;GAClC,IAAMG,IAAQ,KAAK,cAAc,MAAM,KAAK,OAAO,OAAOH,EAAa,OAAO,KAAK,eAAe;GAElG,OADA,KAAK,wBAAwBG,EAAM,QAC5BA;EACT;CACF;AACF,GC/GaC,KAAmB,GAAY,MACnC,IAAIZ,EAAoBE,GAAMC,CAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"model-view-BWUU0-uq.js","names":["Subscribe","Subscribe$1","THREE","ModelViewPlugin","hooks","enabled","params","hasModelLoaded","loading","disposed","loadGeneration","disposeModelResources","needsRender","renderer","config","scene","camera","Camera","model","distance","offset","light","loadModel","work","five","fileUrl","textureBaseUrl","textureArrayUrl","generation","result","loadAt3d","_bounding","boundingBox","bounding","radius","_distance","update","error","initRendererIfNeeds","StandaloneRenderer","handleFiveWillLoad","handleFiveLoaded","enable","disable","render","appendTo","element","refresh","size","positionType","container","width","height","pose","dispose","userConfig"],"sources":["../../src/ModelViewPlugin/Plugin.ts"],"sourcesContent":["import type { PartialDeep } from 'type-fest'\nimport type { Fetcher, FivePlugin , Five} from '@realsee/five-webgpu'\nimport { Camera, loadAt3d } from '@realsee/five-webgpu'\nimport { Subscribe } from '../shared-utils/Subscribe'\nimport { boundingBox } from '../shared-utils'\nimport * as THREE from 'three/webgpu'\nimport { StandaloneRenderer } from '../shared-utils/rendering/StandaloneRenderer'\n\nexport interface Config {\n lookAtCurrentCamera: boolean\n lockedPanoIndex: number | null\n lockedLatitude: number | null\n lockedLongitude: number | null\n fetcher?: Fetcher | undefined\n}\n\nexport interface ModelViewPluginExportType {\n dispose: () => void\n enable: () => void\n\n disable: () => void\n\n hooks: Subscribe<{ loaded: () => void; willLoad: () => void }>\n\n getCurrentState: () => { enabled: boolean }\n\n appendTo: (element: HTMLElement, size?: { width?: number; height?: number }) => void\n\n refresh: (size?: { width?: number; height?: number }) => void\n\n changeConfigs: (config: Partial<Config>) => void\n}\n\nexport interface ModelViewPluginParameterType {\n config: Config\n initialState: { enabled: boolean }\n}\n\n/**\n * Five 模型插件\n * @template ExportType 导出方法\n */\nexport const ModelViewPlugin: FivePlugin<PartialDeep<ModelViewPluginParameterType> | undefined, ModelViewPluginExportType> = (\n five: Five,\n params,\n) => {\n const hooks = new Subscribe<{ loaded: () => void; willLoad: () => void }>()\n let enabled = params?.initialState?.enabled ?? true\n let hasModelLoaded = false\n let loading = false\n let disposed = false\n let loadGeneration = 0\n let disposeModelResources: (() => void) | undefined\n let needsRender = true\n let renderer: StandaloneRenderer | null = null\n\n const defaultConfig: Config = {\n lookAtCurrentCamera: false,\n lockedPanoIndex: null,\n lockedLatitude: null,\n lockedLongitude: null,\n }\n\n // @ts-ignore\n const config: Config = { ...defaultConfig, ...params?.config }\n\n const scene = new THREE.Scene()\n const camera = new Camera(60)\n camera.near = 1\n camera.updateTime(Date.now())\n\n let model = new THREE.Object3D()\n let distance: number | undefined\n let offset: THREE.Vector3 | undefined\n\n {\n const light = new THREE.DirectionalLight(0xffffff, 0.5)\n light.position.copy(new THREE.Vector3(1, 1, 1))\n scene.add(light)\n }\n {\n const light = new THREE.DirectionalLight(0xffffff, 0.3)\n scene.add(light)\n }\n {\n const light = new THREE.AmbientLight(0xffffff, 0.3)\n scene.add(light)\n }\n\n scene.add(model)\n\n const loadModel = async () => {\n if (disposed || loading || hasModelLoaded) return\n const work = five.work\n if (!work?.model?.file) return\n\n scene.remove(model)\n\n const fileUrl = work.getURL(work.model.file)\n const textureBaseUrl = work.getURL(work.model.textureBase)\n const textureArrayUrl = [...(work.model.textures || [])]\n if (!fileUrl || !textureBaseUrl || !textureArrayUrl) {\n return\n }\n\n loading = true\n const generation = ++loadGeneration\n try {\n const result = await loadAt3d(fileUrl, {\n textureOptions: { size: 128, quality: 70 },\n textureArray: textureArrayUrl,\n textureBaseUri: textureBaseUrl,\n fetcher: config.fetcher ?? undefined,\n })\n if (disposed || generation !== loadGeneration) {\n result.dispose()\n return\n }\n model = result.scene\n model.rotateX(-Math.PI / 2)\n disposeModelResources = result.dispose\n\n const _bounding = boundingBox(model)\n const bounding = new THREE.Box3()\n bounding.expandByPoint(new THREE.Vector3(_bounding.min.x, _bounding.min.z, -_bounding.min.y))\n bounding.expandByPoint(new THREE.Vector3(_bounding.max.x, _bounding.max.z, -_bounding.max.y))\n\n const radius = Math.pow(\n Math.pow(bounding.max.x - bounding.min.x + 1, 2) +\n Math.pow(bounding.max.y - bounding.min.y + 1, 2) +\n Math.pow(bounding.max.z - bounding.min.z + 1, 2),\n 1 / 2,\n )\n let _distance = radius / 2 / Math.tan((Math.PI * camera.fov) / 360)\n if (camera.aspect < 1) _distance /= camera.aspect\n\n distance = isNaN(_distance) ? radius : _distance\n offset = bounding.getCenter(new THREE.Vector3())\n\n scene.add(model)\n hasModelLoaded = true\n\n hooks.emit('loaded')\n update()\n five.needsRender = true\n } catch (error) {\n if (!disposed && generation === loadGeneration) console.error('ModelViewPlugin: Failed to load model', error)\n } finally {\n if (generation === loadGeneration) loading = false\n }\n }\n\n if (enabled) loadModel()\n\n const initRendererIfNeeds = () => {\n if (disposed || !five.renderer) return\n if (!renderer) {\n renderer = new StandaloneRenderer({ antialias: false, onReady: () => {\n needsRender = true\n five.needsRender = true\n } })\n renderer.setPixelRatio(five.renderer.getPixelRatio())\n renderer.setClearColor(0x181a1c, 0)\n }\n return renderer\n }\n\n const handleFiveWillLoad = () => {\n loadGeneration += 1\n loading = false\n disposeModelResources?.()\n disposeModelResources = undefined\n scene.remove(model)\n model = new THREE.Object3D()\n scene.add(model)\n hasModelLoaded = false\n distance = undefined\n offset = undefined\n hooks.emit('willLoad')\n update()\n }\n\n const handleFiveLoaded = () => {\n if (disposed || !enabled) return\n if (hasModelLoaded) return\n loadModel()\n }\n\n const enable = () => {\n if (disposed || enabled) return\n\n enabled = true\n scene.add(model)\n\n if (!hasModelLoaded && five.work?.model?.file) {\n loadModel()\n }\n\n update()\n }\n\n const disable = () => {\n if (disposed || !enabled) return\n\n scene.remove(model)\n needsRender = true\n render()\n\n enabled = false\n }\n\n const appendTo = (element: HTMLElement, size: { width?: number; height?: number } = {}) => {\n const renderer = initRendererIfNeeds()\n if (!renderer) return\n element.appendChild(renderer.domElement)\n refresh(size)\n const positionType = window.getComputedStyle(element).position\n if (positionType !== 'relative' && positionType !== 'absolute' && positionType !== 'fixed' && positionType !== 'sticky')\n element.style.position = 'relative'\n }\n\n const refresh = (size: { width?: number; height?: number } = {}) => {\n if (disposed || !renderer) return\n const element = renderer.domElement\n const container = element.parentNode as HTMLElement\n if (container?.nodeName) {\n const { width = container.offsetWidth, height = container.offsetHeight } = size\n renderer.setSize(width, height)\n // 修改摄像机 aspect 比值\n camera.aspect = width / height\n camera.updateProjectionMatrix()\n }\n\n update()\n }\n\n const update = () => {\n if (disposed || !enabled) return\n if (!distance || !offset) return\n const pose = five.getPose()\n pose.fov = camera.fov\n pose.offset = offset\n pose.distance = distance\n if (typeof config.lockedLatitude === 'number') pose.latitude = config.lockedLatitude\n if (typeof config.lockedLongitude === 'number') pose.longitude = config.lockedLongitude\n if (typeof config.lockedPanoIndex === 'number') {\n pose.offset = five.work.observers[config.lockedPanoIndex].standingPosition.clone()\n }\n if (config.lookAtCurrentCamera) pose.offset = five.camera.position.clone().setY(five.camera.position.y + 1)\n camera.setFromPose(pose)\n needsRender = true\n }\n\n const render = () => {\n if (disposed || !enabled) return\n if (needsRender !== true) return\n if (!renderer) return\n if (!renderer.domElement.parentNode) return\n const parentNode = renderer.domElement.parentNode as HTMLElement\n if (parentNode.offsetWidth === 0) return\n if (renderer.render(scene, camera)) needsRender = false\n }\n\n const dispose = () => {\n if (disposed) return\n disposed = true\n loadGeneration += 1\n disposeModelResources?.()\n disposeModelResources = undefined\n scene.remove(model)\n if (renderer) {\n renderer.dispose()\n renderer.domElement.remove()\n }\n renderer = null\n five.off('loaded', handleFiveLoaded)\n five.off('willLoad', handleFiveWillLoad)\n five.off('cameraDirectionUpdate', update)\n five.off('dispose', dispose)\n five.off('renderFrame', render)\n five.off('cameraPositionUpdate', update)\n hooks.off()\n }\n\n const changeConfigs = (userConfig: Partial<Config>) => {\n Object.assign(config, userConfig)\n update()\n }\n\n const getCurrentState = () => ({\n enabled,\n })\n\n five.on('loaded', handleFiveLoaded)\n five.on('willLoad', handleFiveWillLoad)\n five.on('cameraDirectionUpdate', update)\n five.on('dispose', dispose)\n five.on('renderFrame', render)\n five.on('cameraPositionUpdate', update)\n\n return { appendTo, refresh, changeConfigs, enable, disable, dispose, getCurrentState, hooks }\n}\n\nexport default ModelViewPlugin\n"],"mappings":"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"}
|