@realsee/dnalogel 4.0.0-webgpu.17 → 4.0.0-webgpu.18
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.js +16 -16
- package/dist/internal/{BasePlugin-BW03eBFv.js → BasePlugin-Cr_atQUC.js} +2 -2
- package/dist/internal/{BasePlugin-BW03eBFv.js.map → BasePlugin-Cr_atQUC.js.map} +1 -1
- package/dist/internal/BasePluginWithData-CIQpqYGe.js +7 -0
- package/dist/internal/{BasePluginWithData-5iUuu45u.js.map → BasePluginWithData-CIQpqYGe.js.map} +1 -1
- package/dist/internal/{Controller-CS5gPzPg.js → Controller-BDT5_ZNe.js} +2 -2
- package/dist/internal/{Controller-CS5gPzPg.js.map → Controller-BDT5_ZNe.js.map} +1 -1
- package/dist/internal/{Controller-DPvcZw20.js → Controller-Cq-mYkzT.js} +2 -2
- package/dist/internal/{Controller-DPvcZw20.js.map → Controller-Cq-mYkzT.js.map} +1 -1
- package/dist/internal/{Rectangle-Bw-_5i6A.js → Rectangle-Z2T_h74M.js} +2 -2
- package/dist/internal/{Rectangle-Bw-_5i6A.js.map → Rectangle-Z2T_h74M.js.map} +1 -1
- package/dist/internal/{Work-njB4pAsT.js → Work-PKaUMpXd.js} +4 -4
- package/dist/internal/{Work-njB4pAsT.js.map → Work-PKaUMpXd.js.map} +1 -1
- package/dist/internal/{area-maker-T7a6vfXC.js → area-maker-BTGqxG6D.js} +2 -2
- package/dist/internal/{area-maker-T7a6vfXC.js.map → area-maker-BTGqxG6D.js.map} +1 -1
- package/dist/internal/{controller-Vl3H6GBQ.js → controller-B0hqJtoB.js} +3 -3
- package/dist/internal/{controller-Vl3H6GBQ.js.map → controller-B0hqJtoB.js.map} +1 -1
- package/dist/internal/{cruise-rzsfiLn-.js → cruise-BkSbiLjd.js} +2 -2
- package/dist/internal/{cruise-rzsfiLn-.js.map → cruise-BkSbiLjd.js.map} +1 -1
- package/dist/internal/{current-pano-image-CAodOmyS.js → current-pano-image-DqyUFIP6.js} +2 -2
- package/dist/internal/{current-pano-image-CAodOmyS.js.map → current-pano-image-DqyUFIP6.js.map} +1 -1
- package/dist/internal/{floorplan-B82VmXnE.js → floorplan-Dkp7omYn.js} +2 -2
- package/dist/internal/{floorplan-B82VmXnE.js.map → floorplan-Dkp7omYn.js.map} +1 -1
- package/dist/internal/{model-maker-BHPMSkqn.js → model-maker-L5eqUgkU.js} +2 -2
- package/dist/internal/{model-maker-BHPMSkqn.js.map → model-maker-L5eqUgkU.js.map} +1 -1
- package/dist/internal/object3d-helper-CUhRRdCQ.js +7 -0
- package/dist/internal/{object3d-helper-CxJ_Ju1y.js.map → object3d-helper-CUhRRdCQ.js.map} +1 -1
- package/dist/internal/{pano-compass-2S5mt7af.js → pano-compass-dmcsnFDQ.js} +2 -2
- package/dist/internal/{pano-compass-2S5mt7af.js.map → pano-compass-dmcsnFDQ.js.map} +1 -1
- package/dist/internal/{pano-door-label-CK0sYPKY.js → pano-door-label-C0sd66vf.js} +2 -2
- package/dist/internal/{pano-door-label-CK0sYPKY.js.map → pano-door-label-C0sd66vf.js.map} +1 -1
- package/dist/internal/{pano-measure-DEofgQkM.js → pano-measure-NbB7-uVE.js} +2 -2
- package/dist/internal/{pano-measure-DEofgQkM.js.map → pano-measure-NbB7-uVE.js.map} +1 -1
- package/dist/internal/{pano-measure-v2-DVlj0AUQ.js → pano-measure-v2-CRPvPs0e.js} +2 -2
- package/dist/internal/{pano-measure-v2-DVlj0AUQ.js.map → pano-measure-v2-CRPvPs0e.js.map} +1 -1
- package/dist/internal/pano-ruler-BW78w4lv.js +240 -0
- package/dist/internal/pano-ruler-BW78w4lv.js.map +1 -0
- package/dist/internal/{pano-tag-BwRqx3wU.js → pano-tag-j8ZPJDDK.js} +2 -2
- package/dist/internal/{pano-tag-BwRqx3wU.js.map → pano-tag-j8ZPJDDK.js.map} +1 -1
- package/dist/internal/{pano-video-DF7h9OyJ.js → pano-video-Dcspq4j1.js} +2 -2
- package/dist/internal/{pano-video-DF7h9OyJ.js.map → pano-video-Dcspq4j1.js.map} +1 -1
- package/dist/internal/{pipeline-Bcxx8i_q.js → pipeline-CD2YkN5U.js} +2 -2
- package/dist/internal/{pipeline-Bcxx8i_q.js.map → pipeline-CD2YkN5U.js.map} +1 -1
- package/dist/internal/{sculpt-heTYi32h.js → sculpt-CbEBEh9F.js} +2 -2
- package/dist/internal/{sculpt-heTYi32h.js.map → sculpt-CbEBEh9F.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/model-maker.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-ruler.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/PanoRulerPlugin/room-height.d.ts +19 -0
- package/package.json +1 -1
- package/dist/internal/BasePluginWithData-5iUuu45u.js +0 -7
- package/dist/internal/object3d-helper-CxJ_Ju1y.js +0 -7
- package/dist/internal/pano-ruler-fzlUTkVu.js +0 -236
- package/dist/internal/pano-ruler-fzlUTkVu.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
import { t as e } from "./throttle-YRIkRKaX.js";
|
|
2
|
-
import { n as t } from "./planimetry-us3E4V8W.js";
|
|
3
|
-
import { Raycaster as n, Vector3 as r } from "three/webgpu";
|
|
4
|
-
import { Five as i } from "@realsee/five-webgpu";
|
|
5
|
-
//#region src/shared-utils/nextFrame.ts
|
|
6
|
-
function a(e, t = 0) {
|
|
7
|
-
requestAnimationFrame(t <= 0 ? e : () => a(e, t - 1));
|
|
8
|
-
}
|
|
9
|
-
//#endregion
|
|
10
|
-
//#region src/PanoRulerPlugin/style.ts
|
|
11
|
-
var o = "<style type=\"text/css\">\n.PanoRulerPlugin-rule-line {\n position: absolute;\n transform-origin: left center;\n width: 0;\n height: 0.0625rem;\n}\n\n.PanoRulerPlugin-rule-line::after {\n content: '';\n position: absolute;\n left: -0.125rem;\n top: -0.1rem;\n width: 0.25rem;\n height: 0.25rem;\n border-radius: 50%;\n background: #FFFFFF;\n z-index: 1;\n animation: viewport-rule-point 0.1s 1s;\n animation-fill-mode: both;\n}\n\n.PanoRulerPlugin-rule-line::before {\n content: '';\n position: absolute;\n right: -0.125rem;\n top: -0.1rem;\n width: 0.25rem;\n height: 0.25rem;\n border-radius: 50%;\n background: #FFFFFF;\n animation: viewport-rule-point 0.1s 1.5s;\n animation-fill-mode: both;\n}\n\n.PanoRulerPlugin-rule-line em {\n background: #fff;\n display: block;\n height: 100%;\n animation: viewport-rule-line 0.5s ease 1s;\n animation-fill-mode: both;\n box-shadow: 0 0 0.25rem rgb(0 0 0 / 40%);\n}\n\n.PanoRulerPlugin-rule-label {\n position: absolute;\n width: 0;\n height: 0;\n top: 0.0625rem;\n}\n\n.PanoRulerPlugin-rule-label-name {\n position: absolute;\n padding: 0.1875rem 0.375rem;\n background: rgba(195,195,195,0.30);\n backdrop-filter: blur(0.25rem);\n -webkit-backdrop-filter: blur(0.25rem);\n border-radius: 6.25rem;\n border: 0.0625rem solid rgba(255,255,255,0.6);\n white-space: nowrap;\n overflow: hidden;\n color: #FFFFFF;\n font-weight: 500;\n font-size: 0.75rem;\n line-height: 1;\n -webkit-animation: viewport-rule-label 0.25s ease 1s;\n animation: viewport-rule-label 0.25s ease 1s;\n animation-fill-mode: both;\n box-shadow: inset 0 0 0.625rem 0 rgba(255,255,255,0.30);\n}\n\n@keyframes viewport-rule-line {\n 0% { width: 0% }\n 100% { width: 100% }\n}\n\n@keyframes viewport-rule-label {\n 0% { opacity: 0; transform: scaleX(0); }\n 100% { opacity: 1; transform: translate(-50%, -50%) scaleX(1); }\n}\n\n@keyframes viewport-rule-point {\n 0% { transform: scaleX(0); }\n 100% { transform: scaleX(1); }\n}\n</style>\n", s = (e, t) => Math.sqrt((e.z - t.z) ** 2 + (e.x - t.x) ** 2), c = (e, t) => {
|
|
12
|
-
let i = {}, a = new n(), o = t.work;
|
|
13
|
-
if (!o) return i;
|
|
14
|
-
let s = e.observers;
|
|
15
|
-
o.observers.forEach((n, o) => {
|
|
16
|
-
let { standingPosition: c } = n, l = new r(c.x, c.y, c.z);
|
|
17
|
-
a.set(l, new r(0, 1, 0));
|
|
18
|
-
let [u] = t.model.intersectRaycaster(a), d = u ? u.point.y : 2.7, f = s[o];
|
|
19
|
-
if (!f) return i;
|
|
20
|
-
let p = e.rooms[f].name;
|
|
21
|
-
i[p] === void 0 ? i[p] = {
|
|
22
|
-
__roof: [d],
|
|
23
|
-
__floor: [l.y]
|
|
24
|
-
} : (i[p].__roof.push(d), i[p].__floor.push(l.y));
|
|
25
|
-
});
|
|
26
|
-
for (let e in i) {
|
|
27
|
-
let t = i[e];
|
|
28
|
-
t.__roof.sort(), t.__floor.sort(), t.floor = t.__floor[~~(t.__floor.length / 2)], t.roof = t.__roof[t.__roof.length - 1];
|
|
29
|
-
}
|
|
30
|
-
return i;
|
|
31
|
-
}, l = (n, l) => {
|
|
32
|
-
let u = {
|
|
33
|
-
enable: !1,
|
|
34
|
-
loaded: !1,
|
|
35
|
-
options: l.options || { distanceText: (e) => `${e.toFixed(1)}m` }
|
|
36
|
-
}, d = (e, t) => {
|
|
37
|
-
let n = `
|
|
38
|
-
<div class="PanoRulerPlugin-rule-line">
|
|
39
|
-
<em></em>
|
|
40
|
-
<div class="PanoRulerPlugin-rule-label">
|
|
41
|
-
<div class="PanoRulerPlugin-rule-label-name">${u.options.distanceText(t)}</div>
|
|
42
|
-
</div>
|
|
43
|
-
</div>
|
|
44
|
-
`, r = document.createElement("div");
|
|
45
|
-
return r.setAttribute("class", "PanoRulerPlugin-rule"), r.setAttribute("data-name", e), r.setAttribute("style", "display: none"), r.innerHTML = n, r;
|
|
46
|
-
}, f = document.createElement("div");
|
|
47
|
-
f.setAttribute("style", "position: absolute;pointer-events: none;width: 100%;height: 100%;left: 0;top: 0;overflow: hidden;");
|
|
48
|
-
let p = document.createElement("div");
|
|
49
|
-
p.innerHTML = o, f.appendChild(p);
|
|
50
|
-
let m = {}, h = (e, t) => {
|
|
51
|
-
if (u.loaded) throw Error("标尺被重复初始化!");
|
|
52
|
-
let i = c(e, n), a = n.work;
|
|
53
|
-
if (!a) return !1;
|
|
54
|
-
for (let n in t) {
|
|
55
|
-
let o = t[n], c = a.observers[0]?.standingPosition;
|
|
56
|
-
if (!c) return;
|
|
57
|
-
let l = o.map(({ x: t, z: n, observers: o }) => {
|
|
58
|
-
let l = o.length > 0 ? e.rooms[e.observers[o[0]]].name : "", u = i[l] ? i[l].floor : null, d = Infinity, f = {
|
|
59
|
-
index: 0,
|
|
60
|
-
x: c.x,
|
|
61
|
-
y: c.y,
|
|
62
|
-
z: c.z
|
|
63
|
-
};
|
|
64
|
-
o.forEach((e) => {
|
|
65
|
-
if (!a.observers[e]) return;
|
|
66
|
-
let { standingPosition: r } = a.observers[e], i = {
|
|
67
|
-
index: e,
|
|
68
|
-
x: r.x,
|
|
69
|
-
y: r.y,
|
|
70
|
-
z: r.z
|
|
71
|
-
}, o = s({
|
|
72
|
-
x: t,
|
|
73
|
-
z: n
|
|
74
|
-
}, i);
|
|
75
|
-
u ? o < d && Math.abs(i.y - u) < .3 && (d = o, f = i) : o < d && (d = o, f = i);
|
|
76
|
-
});
|
|
77
|
-
let p = new r(t, f.y, n);
|
|
78
|
-
Object.assign(p, { observers: o });
|
|
79
|
-
let m = i[l] ? i[l].roof : null, h = m ? new r(t, m, n) : null;
|
|
80
|
-
return h && Object.assign(h, { observers: o }), {
|
|
81
|
-
origin: p,
|
|
82
|
-
vertical: h
|
|
83
|
-
};
|
|
84
|
-
});
|
|
85
|
-
m[n] = {
|
|
86
|
-
origins: l.map((e) => e.origin),
|
|
87
|
-
rules: []
|
|
88
|
-
};
|
|
89
|
-
for (let { origin: e, vertical: t } of l) {
|
|
90
|
-
if (!t) continue;
|
|
91
|
-
let r = d(n, e.distanceTo(t));
|
|
92
|
-
f.append(r), m[n].rules.push({
|
|
93
|
-
vertical: !0,
|
|
94
|
-
rule: [e, t],
|
|
95
|
-
$element: r
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
for (let e = 0; e < l.length; e++) {
|
|
99
|
-
let t = e + 1;
|
|
100
|
-
t >= l.length && (t = 0);
|
|
101
|
-
let { origin: r } = l[e], { origin: i } = l[t], a = d(n, r.distanceTo(i));
|
|
102
|
-
f.append(a), m[n].rules.push({
|
|
103
|
-
vertical: !1,
|
|
104
|
-
rule: [r, i],
|
|
105
|
-
$element: a
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
return u.loaded = !0, !0;
|
|
110
|
-
}, g = async (e, t, r) => {
|
|
111
|
-
let i = e || l.roomInfo, a = t || l.roomRules;
|
|
112
|
-
if (!i || !a) throw Error("标尺数据依赖不齐全!");
|
|
113
|
-
return u.loaded = !1, u.options = {
|
|
114
|
-
...u.options,
|
|
115
|
-
...r || {}
|
|
116
|
-
}, n.model.loaded ? h(i, a) : await new Promise((e) => n.once("modelLoaded", () => e(h(i, a))));
|
|
117
|
-
};
|
|
118
|
-
l.roomInfo && l.roomRules && g(l.roomInfo, l.roomRules);
|
|
119
|
-
let _ = (e, n, r, i) => {
|
|
120
|
-
let a = [
|
|
121
|
-
[{
|
|
122
|
-
x: 0,
|
|
123
|
-
y: 0
|
|
124
|
-
}, {
|
|
125
|
-
x: r,
|
|
126
|
-
y: 0
|
|
127
|
-
}],
|
|
128
|
-
[{
|
|
129
|
-
x: 0,
|
|
130
|
-
y: 0
|
|
131
|
-
}, {
|
|
132
|
-
x: 0,
|
|
133
|
-
y: i
|
|
134
|
-
}],
|
|
135
|
-
[{
|
|
136
|
-
x: r,
|
|
137
|
-
y: 0
|
|
138
|
-
}, {
|
|
139
|
-
x: r,
|
|
140
|
-
y: i
|
|
141
|
-
}],
|
|
142
|
-
[{
|
|
143
|
-
x: 0,
|
|
144
|
-
y: i
|
|
145
|
-
}, {
|
|
146
|
-
x: r,
|
|
147
|
-
y: i
|
|
148
|
-
}]
|
|
149
|
-
], o = [];
|
|
150
|
-
for (let r = 0; r < a.length; r++) {
|
|
151
|
-
let i = t([e, n], [a[r][0], a[r][1]], !0);
|
|
152
|
-
i && o.push(i);
|
|
153
|
-
}
|
|
154
|
-
return o.length !== 0 && o;
|
|
155
|
-
}, v = () => {
|
|
156
|
-
let e = n.getElement()?.parentElement;
|
|
157
|
-
if (!e || !u.loaded || Object.keys(m).length <= 0) return;
|
|
158
|
-
let { panoIndex: t, camera: a, currentMode: o } = n;
|
|
159
|
-
if (t === void 0) return;
|
|
160
|
-
let s;
|
|
161
|
-
for (let e in m) e.split(",").indexOf(t.toString()) >= 0 && (s = e);
|
|
162
|
-
if (!s) {
|
|
163
|
-
for (let e in m) for (let { $element: t } of m[e].rules) t.style.display = "none";
|
|
164
|
-
return;
|
|
165
|
-
}
|
|
166
|
-
let c = a.position, l = a.getWorldDirection(new r()), d = e.clientWidth, f = e.clientHeight;
|
|
167
|
-
if (o !== i.Mode.Panorama) {
|
|
168
|
-
for (let e in m) for (let { $element: t } of m[e].rules) t.style.display = "none";
|
|
169
|
-
return;
|
|
170
|
-
}
|
|
171
|
-
for (let e in m) for (let { $element: t } of m[e].rules) t.style.display = e === s ? "block" : "none";
|
|
172
|
-
let p = [], [h] = m[s].origins.slice().filter((e) => e.observers.indexOf(t) >= 0).sort((e, t) => e.clone().setY(0).sub(c).normalize().angleTo(l.clone().setY(0)) - t.clone().setY(0).sub(c).normalize().angleTo(l.clone().setY(0))), g = [];
|
|
173
|
-
for (let { rule: e, vertical: n, $element: i } of m[s].rules) {
|
|
174
|
-
let [o, s] = e, u = i.querySelector(".PanoRulerPlugin-rule-line");
|
|
175
|
-
if (!u) return;
|
|
176
|
-
if (!h || o !== h && s !== h || o.distanceTo(s) < .3 || o.observers.indexOf(t) === -1 || s.observers.indexOf(t) === -1) {
|
|
177
|
-
i.style.display = "none";
|
|
178
|
-
continue;
|
|
179
|
-
}
|
|
180
|
-
let m = o.clone().sub(c).normalize().angleTo(l);
|
|
181
|
-
if (m > Math.PI / 2 || s.clone().sub(c).normalize().angleTo(l) > Math.PI / 2) {
|
|
182
|
-
i.style.display = "none";
|
|
183
|
-
continue;
|
|
184
|
-
}
|
|
185
|
-
let v = o.distanceTo(s);
|
|
186
|
-
if (s.clone().sub(s.clone().sub(o).divide(new r(2, 2, 2))).distanceTo(c) / v > 8) {
|
|
187
|
-
i.style.display = "none";
|
|
188
|
-
continue;
|
|
189
|
-
}
|
|
190
|
-
n || g.push(e), n && p.push({
|
|
191
|
-
$element: i,
|
|
192
|
-
startAngle: m
|
|
193
|
-
});
|
|
194
|
-
let y = o.clone().project(a), b = (y.x + 1) / 2 * d, x = (-y.y + 1) / 2 * f, S = s.clone().project(a), C = (S.x + 1) / 2 * d, w = (-S.y + 1) / 2 * f, T = Math.sqrt((C - b) ** 2 + (w - x) ** 2), E = T, D = 50, O = _({
|
|
195
|
-
x: ~~b,
|
|
196
|
-
y: ~~x
|
|
197
|
-
}, {
|
|
198
|
-
x: ~~C,
|
|
199
|
-
y: ~~w
|
|
200
|
-
}, d, f);
|
|
201
|
-
if (O && O.length === 1 && (h === o ? (E = Math.sqrt((O[0].x - b) ** 2 + (O[0].y - x) ** 2), D = E / T * 50) : h === s && (E = Math.sqrt((O[0].x - C) ** 2 + (O[0].y - w) ** 2), D = 100 - E / T * 50)), O && O.length === 2) {
|
|
202
|
-
let e = {
|
|
203
|
-
x: (O[0].x + O[1].x) / 2,
|
|
204
|
-
y: (O[0].y + O[1].y) / 2
|
|
205
|
-
};
|
|
206
|
-
D = Math.sqrt((e.x - b) ** 2 + (e.y - x) ** 2) / T * 100;
|
|
207
|
-
}
|
|
208
|
-
let k = (Math.PI / 2 - Math.atan2(C - b, x - w)) / Math.PI * 180, A = u.querySelector(".PanoRulerPlugin-rule-label"), j = A.children[0].clientWidth;
|
|
209
|
-
j >= T || j / 2 >= D / 100 * T || j / 2 >= (1 - D / 100) * T ? u.style.display = "none" : (u.style.display = "block", u.style.width = T + "px", u.style.left = b + "px", u.style.top = x + "px", u.style.transform = `rotate(${-k}deg)`, A.style.left = `${D}%`);
|
|
210
|
-
}
|
|
211
|
-
}, y = () => a(v);
|
|
212
|
-
e(v, 80);
|
|
213
|
-
let b = () => u.loaded ? (u.enable ||= (f.setAttribute("class", "PanoRulerPlugin" + (u.options.className ? " " + u.options.className : "")), n.getElement()?.parentElement?.append(f), v(), n.on("modeChange", v), n.on("cameraUpdate", y), !0), !0) : !1, x = () => (u.enable &&= (n.off("modeChange", v), n.off("cameraUpdate", y), f && f.remove(), !1), !0);
|
|
214
|
-
function S(e) {
|
|
215
|
-
if (e.distanceText && e.distanceText !== u.options.distanceText) {
|
|
216
|
-
let t = e.distanceText;
|
|
217
|
-
u.options.distanceText = t, Object.values(m).forEach((e) => {
|
|
218
|
-
e.rules.forEach((e) => {
|
|
219
|
-
let [n, r] = e.rule, i = n.distanceTo(r), a = e.$element.querySelector(".PanoRulerPlugin-rule-label-name");
|
|
220
|
-
a && (a.innerText = t(i));
|
|
221
|
-
});
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
return {
|
|
226
|
-
enable: b,
|
|
227
|
-
disable: x,
|
|
228
|
-
load: g,
|
|
229
|
-
state: u,
|
|
230
|
-
changeConfigs: S
|
|
231
|
-
};
|
|
232
|
-
};
|
|
233
|
-
//#endregion
|
|
234
|
-
export { l as t };
|
|
235
|
-
|
|
236
|
-
//# sourceMappingURL=pano-ruler-fzlUTkVu.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pano-ruler-fzlUTkVu.js","names":["throttle","intersectionOfLine","nextFrame","delay","fn","PanoRulerStyle","getDistance","p1","p2","getRoomHeightInfo","roomHeightInfo","raycaster","Raycaster","work","five","observers","roomInfo","position","observer","point","Vector3","intersection","verticalY","id","index","observerRoomName","roomName","room","PanoRulerPlugin","state","params","distance","tpl","domStr","res","name","$rule","style","__rule","_load","obKey","roomRules","points","defaultPosition","roomPoints","pointRoomName","medianFloorHeight","minDistance","nearestPoint","observerPoint","_origin","x","z","_vertical","roomPoint","vertical","$element","origin","nextIndex","next","load","_roomInfo","_roomRules","options","resolve","getRuleScreenIntr","screenLines","canvasWidth","canvasHeight","intr","i","result","startPoint","endPoint","freshRule","element","panoIndex","_name","cameraPosition","camera","cameraDirection","width","height","currentMode","Five","verticalLines","visibleOrigin","pointA","pointB","shownNotVerticalRules","start","end","rule","$line","startAngle","ruleLength","mouseStart","startLeft","startTop","mouseEnd","endLeft","endTop","visibleLength","labelOffset","middlePoint","deg","$label","labelWidth","nextFrameFreshRule","enable","disable","changeConfigs","config","distanceText","textEle"],"sources":["../../src/shared-utils/nextFrame.ts","../../src/PanoRulerPlugin/style.ts","../../src/PanoRulerPlugin/Plugin.ts"],"sourcesContent":["export function nextFrame(fn: () => void, delay = 0) {\n if (delay <= 0) requestAnimationFrame(fn)\n else requestAnimationFrame(() => nextFrame(fn, delay - 1))\n}\n","const PanoRulerStyle =\n`<style type=\"text/css\">\n.PanoRulerPlugin-rule-line {\n position: absolute;\n transform-origin: left center;\n width: 0;\n height: 0.0625rem;\n}\n\n.PanoRulerPlugin-rule-line::after {\n content: '';\n position: absolute;\n left: -0.125rem;\n top: -0.1rem;\n width: 0.25rem;\n height: 0.25rem;\n border-radius: 50%;\n background: #FFFFFF;\n z-index: 1;\n animation: viewport-rule-point 0.1s 1s;\n animation-fill-mode: both;\n}\n\n.PanoRulerPlugin-rule-line::before {\n content: '';\n position: absolute;\n right: -0.125rem;\n top: -0.1rem;\n width: 0.25rem;\n height: 0.25rem;\n border-radius: 50%;\n background: #FFFFFF;\n animation: viewport-rule-point 0.1s 1.5s;\n animation-fill-mode: both;\n}\n\n.PanoRulerPlugin-rule-line em {\n background: #fff;\n display: block;\n height: 100%;\n animation: viewport-rule-line 0.5s ease 1s;\n animation-fill-mode: both;\n box-shadow: 0 0 0.25rem rgb(0 0 0 / 40%);\n}\n\n.PanoRulerPlugin-rule-label {\n position: absolute;\n width: 0;\n height: 0;\n top: 0.0625rem;\n}\n\n.PanoRulerPlugin-rule-label-name {\n position: absolute;\n padding: 0.1875rem 0.375rem;\n background: rgba(195,195,195,0.30);\n backdrop-filter: blur(0.25rem);\n -webkit-backdrop-filter: blur(0.25rem);\n border-radius: 6.25rem;\n border: 0.0625rem solid rgba(255,255,255,0.6);\n white-space: nowrap;\n overflow: hidden;\n color: #FFFFFF;\n font-weight: 500;\n font-size: 0.75rem;\n line-height: 1;\n -webkit-animation: viewport-rule-label 0.25s ease 1s;\n animation: viewport-rule-label 0.25s ease 1s;\n animation-fill-mode: both;\n box-shadow: inset 0 0 0.625rem 0 rgba(255,255,255,0.30);\n}\n\n@keyframes viewport-rule-line {\n 0% { width: 0% }\n 100% { width: 100% }\n}\n\n@keyframes viewport-rule-label {\n 0% { opacity: 0; transform: scaleX(0); }\n 100% { opacity: 1; transform: translate(-50%, -50%) scaleX(1); }\n}\n\n@keyframes viewport-rule-point {\n 0% { transform: scaleX(0); }\n 100% { transform: scaleX(1); }\n}\n</style>\n`\n\nexport default PanoRulerStyle\n","\n\nimport type { FivePlugin } from '@realsee/five-webgpu'\nimport type { RoomInfo, RoomRules } from './typings'\nimport { Five } from '@realsee/five-webgpu'\nimport { Raycaster, Vector3 } from 'three/webgpu'\nimport { intersectionOfLine } from '../shared-utils/math/planimetry'\nimport { nextFrame } from '../shared-utils/nextFrame'\nimport throttle from '../shared-utils/throttle'\nimport PanoRulerStyle from './style'\n\ninterface PanoRulerPluginConfig {\n distanceText: (distance: number) => string\n}\n\nexport interface PanoRulerPluginOptions extends Partial<PanoRulerPluginConfig> {\n className?: string\n}\n\ninterface PanoRulerPluginPluginState {\n enable: boolean\n loaded: boolean\n options: PanoRulerPluginOptions\n}\n\nexport interface PanoRulerPluginParameterType {\n roomInfo?: RoomInfo\n roomRules?: RoomRules\n options?: PanoRulerPluginOptions\n}\n\nexport interface PanoRulerPluginExportType {\n enable: () => void\n disable: () => void\n load: (roomInfo?: RoomInfo, roomRules?: RoomRules, options?: PanoRulerPluginOptions) => Promise<boolean>\n state: PanoRulerPluginPluginState\n changeConfigs: (config: Partial<PanoRulerPluginConfig>) => void\n}\n\nconst getDistance = (p1: { x: number; z: number }, p2: { x: number; z: number }) => {\n return Math.sqrt(Math.pow(p1.z - p2.z, 2) + Math.pow(p1.x - p2.x, 2))\n}\n\nconst getRoomHeightInfo = (roomInfo: RoomInfo, five: Five) => {\n const roomHeightInfo: Record<string, { __roof: (number | null)[]; __floor: number[]; floor?: number | null; roof?: number | null }> = {}\n const raycaster = new Raycaster()\n const work = five.work\n if (!work) return roomHeightInfo\n\n const observers = roomInfo.observers\n\n work.observers.forEach((observer, index) => {\n const { standingPosition: position } = observer\n const point = new Vector3(position.x, position.y, position.z)\n raycaster.set(point, new Vector3(0, 1, 0))\n const [intersection] = five.model.intersectRaycaster(raycaster)\n // 虚景 VR 没有天花板碰撞射线无相交,默认固定层高2.7m\n const verticalY = intersection ? intersection.point.y : 2.7\n const id = observers[index]\n if (!id) return roomHeightInfo\n\n const observerRoomName = roomInfo.rooms[id].name\n\n if (roomHeightInfo[observerRoomName] === undefined) {\n roomHeightInfo[observerRoomName] = {\n __roof: [verticalY],\n __floor: [point.y],\n }\n } else {\n roomHeightInfo[observerRoomName].__roof.push(verticalY)\n roomHeightInfo[observerRoomName].__floor.push(point.y)\n }\n })\n\n // 地板高度求中位数,屋顶高度取最高\n for (const roomName in roomHeightInfo) {\n const room = roomHeightInfo[roomName]\n room.__roof.sort()\n room.__floor.sort()\n room.floor = room.__floor[~~(room.__floor.length / 2)]\n room.roof = room.__roof[room.__roof.length - 1]\n }\n return roomHeightInfo\n}\n\ninterface Origin extends Vector3 {\n observers: number[]\n}\n\ninterface Rule {\n [key: string]: {\n origins: Origin[]\n rules: {\n vertical: boolean\n rule: Origin[]\n $element: HTMLDivElement\n }[]\n }\n}\n\n/**\n * 全景标尺插件\n */\nexport const PanoRulerPlugin: FivePlugin<PanoRulerPluginParameterType, PanoRulerPluginExportType> = (five: Five, params) => {\n const state: PanoRulerPluginPluginState = {\n enable: false,\n loaded: false,\n options: params.options || {\n distanceText: (distance) => `${distance.toFixed(1)}m`,\n },\n }\n\n const tpl = (name: string, distance: number) => {\n const domStr = `\n <div class=\"PanoRulerPlugin-rule-line\">\n <em></em>\n <div class=\"PanoRulerPlugin-rule-label\">\n <div class=\"PanoRulerPlugin-rule-label-name\">${state.options.distanceText!(distance)}</div>\n </div>\n </div>\n `\n const res = document.createElement('div')\n res.setAttribute('class', 'PanoRulerPlugin-rule')\n res.setAttribute('data-name', name)\n res.setAttribute('style', 'display: none')\n res.innerHTML = domStr\n return res\n }\n\n const $rule = document.createElement('div')\n $rule.setAttribute('style', `position: absolute;pointer-events: none;width: 100%;height: 100%;left: 0;top: 0;overflow: hidden;`)\n\n // 添加标尺样式\n const style = document.createElement('div')\n style.innerHTML = PanoRulerStyle\n $rule.appendChild(style)\n\n const __rule: Rule = {}\n\n const _load = (roomInfo: RoomInfo, roomRules: RoomRules) => {\n if (state.loaded) {\n throw new Error('标尺被重复初始化!')\n }\n const roomHeightInfo = getRoomHeightInfo(roomInfo, five)\n const work = five.work\n if (!work) return false\n for (const obKey in roomRules) {\n const points = roomRules[obKey]\n const defaultPosition = work.observers[0]?.standingPosition\n if (!defaultPosition) return\n const roomPoints = points.map(({ x, z, observers }) => {\n const pointRoomName = observers.length > 0 ? roomInfo.rooms[roomInfo.observers[observers[0]]].name : ''\n const medianFloorHeight = roomHeightInfo[pointRoomName] ? roomHeightInfo[pointRoomName].floor : null\n let minDistance = Infinity\n let nearestPoint = {\n index: 0,\n x: defaultPosition.x,\n y: defaultPosition.y,\n z: defaultPosition.z,\n }\n\n observers.forEach((index) => {\n if (!work.observers[index]) return\n const { standingPosition: position } = work.observers[index]\n const observerPoint = {\n index,\n x: position.x,\n y: position.y,\n z: position.z,\n }\n const distance = getDistance({ x, z }, observerPoint)\n if (medianFloorHeight) {\n // 取最近点时排除高度与房间平均高度差大于0.3米的点\n if (distance < minDistance && Math.abs(observerPoint.y - medianFloorHeight) < 0.3) {\n minDistance = distance\n nearestPoint = observerPoint\n }\n } else {\n if (distance < minDistance) {\n minDistance = distance\n nearestPoint = observerPoint\n }\n }\n })\n const _origin = new Vector3(x, nearestPoint.y, z)\n Object.assign(_origin, { observers })\n\n const verticalY = roomHeightInfo[pointRoomName] ? roomHeightInfo[pointRoomName].roof : null\n const _vertical = !verticalY ? null : new Vector3(x, verticalY, z)\n if (_vertical) Object.assign(_vertical, { observers })\n\n const origin = _origin as Origin\n const vertical = _vertical as Origin\n return { origin, vertical }\n })\n\n __rule[obKey] = {\n origins: roomPoints.map((roomPoint) => roomPoint.origin) as Origin[],\n rules: [],\n }\n\n for (const { origin, vertical } of roomPoints) {\n if (!vertical) continue\n\n const $element = tpl(obKey, origin.distanceTo(vertical))\n $rule.append($element)\n __rule[obKey].rules.push({ vertical: true, rule: [origin, vertical], $element })\n }\n\n for (let index = 0; index < roomPoints.length; index++) {\n let nextIndex = index + 1\n if (nextIndex >= roomPoints.length) nextIndex = 0\n\n const { origin } = roomPoints[index]\n const { origin: next } = roomPoints[nextIndex]\n\n const $element = tpl(obKey, origin.distanceTo(next))\n $rule.append($element)\n __rule[obKey].rules.push({ vertical: false, rule: [origin, next], $element })\n }\n }\n\n state.loaded = true\n\n // freshRule()\n return true\n }\n\n const load = async (_roomInfo?: RoomInfo, _roomRules?: RoomRules, options?: PanoRulerPluginOptions) => {\n const roomInfo = _roomInfo || params.roomInfo\n const roomRules = _roomRules || params.roomRules\n\n if (!roomInfo || !roomRules) {\n throw new Error('标尺数据依赖不齐全!')\n }\n\n state.loaded = false\n\n state.options = { ...state.options, ...(options || {}) }\n if (five.model.loaded) {\n return _load(roomInfo, roomRules)\n } else {\n return await new Promise<boolean>((resolve) => five.once('modelLoaded', () => resolve(_load(roomInfo!, roomRules!))))\n }\n }\n\n if (params.roomInfo && params.roomRules) {\n load(params.roomInfo, params.roomRules)\n }\n\n const getRuleScreenIntr = (\n startPoint: { x: number; y: number },\n endPoint: { x: number; y: number },\n canvasWidth: number,\n canvasHeight: number,\n ) => {\n const screenLines = [\n [\n { x: 0, y: 0 },\n { x: canvasWidth, y: 0 },\n ],\n [\n { x: 0, y: 0 },\n { x: 0, y: canvasHeight },\n ],\n [\n { x: canvasWidth, y: 0 },\n { x: canvasWidth, y: canvasHeight },\n ],\n [\n { x: 0, y: canvasHeight },\n { x: canvasWidth, y: canvasHeight },\n ],\n ]\n const intr = []\n for (let i = 0; i < screenLines.length; i++) {\n const result = intersectionOfLine([startPoint, endPoint], [screenLines[i][0], screenLines[i][1]], true)\n if (result) intr.push(result)\n }\n if (intr.length === 0) return false\n else {\n return intr\n }\n }\n\n const freshRule = () => {\n const element = five.getElement()?.parentElement\n if (!element) return\n if (!state.loaded) return\n if (Object.keys(__rule).length <= 0) return\n const { panoIndex, camera, currentMode } = five\n\n if (panoIndex === undefined) return\n\n let name\n for (const _name in __rule) {\n if (_name.split(',').indexOf(panoIndex.toString()) >= 0) name = _name\n }\n if (!name) {\n for (const _name in __rule) {\n for (const { $element } of __rule[_name].rules) {\n $element.style.display = 'none'\n }\n }\n\n return\n }\n\n const cameraPosition = camera.position\n const cameraDirection = camera.getWorldDirection(new Vector3())\n\n const width = element.clientWidth\n const height = element.clientHeight\n\n // 非全景模式下隐藏所有标尺\n if (currentMode !== Five.Mode.Panorama) {\n for (const _name in __rule) {\n for (const { $element } of __rule[_name].rules) {\n $element.style.display = 'none'\n }\n }\n\n return\n }\n\n // 隐藏非当前点位的标尺\n for (const _name in __rule) {\n for (const { $element } of __rule[_name].rules) {\n $element.style.display = _name === name ? 'block' : 'none'\n }\n }\n\n const verticalLines = []\n // 可以看到的角度最小的拐点\n const [visibleOrigin] = __rule[name].origins\n .slice()\n .filter((point) => point.observers.indexOf(panoIndex) >= 0)\n .sort((pointA, pointB) => {\n const angleA = pointA.clone().setY(0).sub(cameraPosition).normalize().angleTo(cameraDirection.clone().setY(0))\n const angleB = pointB.clone().setY(0).sub(cameraPosition).normalize().angleTo(cameraDirection.clone().setY(0))\n\n return angleA - angleB\n })\n\n const shownNotVerticalRules = []\n for (const { rule, vertical, $element } of __rule[name].rules) {\n const [start, end] = rule\n const $line = $element.querySelector<HTMLDivElement>('.PanoRulerPlugin-rule-line')\n\n if (!$line) return\n if (!visibleOrigin) {\n $element.style.display = 'none'\n continue\n }\n if (start !== visibleOrigin && end !== visibleOrigin) {\n $element.style.display = 'none'\n continue\n }\n // 线小于0.3m隐藏\n if (start.distanceTo(end) < 0.3) {\n $element.style.display = 'none'\n continue\n }\n\n if (start.observers.indexOf(panoIndex) === -1 || end.observers.indexOf(panoIndex) === -1) {\n $element.style.display = 'none'\n\n continue\n }\n\n const startAngle = start.clone().sub(cameraPosition).normalize().angleTo(cameraDirection)\n if (startAngle > Math.PI / 2) {\n $element.style.display = 'none'\n continue\n }\n\n const endAngle = end.clone().sub(cameraPosition).normalize().angleTo(cameraDirection)\n if (endAngle > Math.PI / 2) {\n $element.style.display = 'none'\n continue\n }\n\n const ruleLength = start.distanceTo(end)\n const midPoint = end.clone().sub(\n end\n .clone()\n .sub(start)\n .divide(new Vector3(2, 2, 2)),\n )\n const disFromCameraToMid = midPoint.distanceTo(cameraPosition)\n if (disFromCameraToMid / ruleLength > 8) {\n $element.style.display = 'none'\n\n continue\n }\n\n if (!vertical) shownNotVerticalRules.push(rule)\n if (vertical) verticalLines.push({ $element, startAngle })\n\n const mouseStart = start.clone().project(camera)\n const startLeft = ((mouseStart.x + 1) / 2) * width\n const startTop = ((-mouseStart.y + 1) / 2) * height\n\n const mouseEnd = end.clone().project(camera)\n const endLeft = ((mouseEnd.x + 1) / 2) * width\n const endTop = ((-mouseEnd.y + 1) / 2) * height\n\n const distance = Math.sqrt(Math.pow(endLeft - startLeft, 2) + Math.pow(endTop - startTop, 2))\n let visibleLength = distance\n let labelOffset = 50\n const intr = getRuleScreenIntr(\n { x: ~~startLeft, y: ~~startTop },\n {\n x: ~~endLeft,\n y: ~~endTop,\n },\n width,\n height,\n )\n if (intr && intr.length === 1) {\n if (visibleOrigin === start) {\n visibleLength = Math.sqrt(Math.pow(intr[0].x - startLeft, 2) + Math.pow(intr[0].y - startTop, 2))\n labelOffset = (visibleLength / distance) * 50\n } else if (visibleOrigin === end) {\n visibleLength = Math.sqrt(Math.pow(intr[0].x - endLeft, 2) + Math.pow(intr[0].y - endTop, 2))\n labelOffset = 100 - (visibleLength / distance) * 50\n }\n }\n if (intr && intr.length === 2) {\n const middlePoint = {\n x: (intr[0].x + intr[1].x) / 2,\n y: (intr[0].y + intr[1].y) / 2,\n }\n const distanceFromStart = Math.sqrt(Math.pow(middlePoint.x - startLeft, 2) + Math.pow(middlePoint.y - startTop, 2))\n labelOffset = (distanceFromStart / distance) * 100\n }\n const rad = Math.PI / 2 - Math.atan2(endLeft - startLeft, startTop - endTop)\n\n const deg = (rad / Math.PI) * 180\n\n const $label = $line.querySelector('.PanoRulerPlugin-rule-label') as HTMLDivElement\n\n // 线的长度小于标签时或者标签与线两端点重合时隐藏,\n const labelWidth = $label.children[0].clientWidth\n if (\n labelWidth >= distance ||\n labelWidth / 2 >= (labelOffset / 100) * distance ||\n labelWidth / 2 >= (1 - labelOffset / 100) * distance\n ) {\n $line.style.display = 'none'\n } else {\n $line.style.display = 'block'\n $line.style.width = distance + 'px'\n $line.style.left = startLeft + 'px'\n $line.style.top = startTop + 'px'\n $line.style.transform = `rotate(${-deg}deg)`\n\n $label.style.left = `${labelOffset}%`\n }\n }\n }\n\n const nextFrameFreshRule = () => nextFrame(freshRule)\n const throttleFreshRule = throttle(freshRule, 80)\n\n const enable = () => {\n if (!state.loaded) return false\n if (state.enable) return true\n $rule.setAttribute('class', 'PanoRulerPlugin' + (state.options.className ? ' ' + state.options.className : ''))\n five.getElement()?.parentElement?.append($rule)\n freshRule()\n five.on('modeChange', freshRule)\n five.on('cameraUpdate', nextFrameFreshRule)\n state.enable = true\n return true\n }\n\n const disable = () => {\n if (!state.enable) return true\n five.off('modeChange', freshRule)\n five.off('cameraUpdate', nextFrameFreshRule)\n\n if ($rule) {\n $rule.remove()\n }\n\n state.enable = false\n return true\n }\n\n function changeConfigs(config: Partial<PanoRulerPluginConfig>) {\n if (config.distanceText && config.distanceText !== state.options.distanceText) {\n const distanceText = config.distanceText\n state.options.distanceText = distanceText\n Object.values(__rule).forEach((item) => {\n item.rules.forEach((rule) => {\n const [origin, vertical] = rule.rule\n const distance = origin.distanceTo(vertical)\n const textEle = rule.$element.querySelector<HTMLDivElement>('.PanoRulerPlugin-rule-label-name')\n if (!textEle) return\n textEle.innerText = distanceText(distance)\n })\n })\n }\n }\n\n return {\n enable,\n disable,\n load,\n state,\n changeConfigs,\n }\n}\n\nexport const panoRulerPluginServerParams = {\n name: 'PanoRulerPlugin',\n version: 0,\n}\nexport default PanoRulerPlugin\n"],"mappings":"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"}
|