@realsee/dnalogel 4.0.0-webgpu.18 → 4.0.0-webgpu.19
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 +5 -0
- package/dist/floorplan.js +1 -1
- package/dist/index.js +18 -18
- package/dist/internal/{BasePlugin-Cr_atQUC.js → BasePlugin-AYcNjiyG.js} +2 -2
- package/dist/internal/{BasePlugin-Cr_atQUC.js.map → BasePlugin-AYcNjiyG.js.map} +1 -1
- package/dist/internal/BasePluginWithData-CWgZY4u8.js +7 -0
- package/dist/internal/{BasePluginWithData-CIQpqYGe.js.map → BasePluginWithData-CWgZY4u8.js.map} +1 -1
- package/dist/internal/{Controller-Cq-mYkzT.js → Controller-DPpDpYsR.js} +3 -3
- package/dist/internal/{Controller-Cq-mYkzT.js.map → Controller-DPpDpYsR.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/{Controller-BDT5_ZNe.js → Controller-DZwww-c4.js} +2 -2
- package/dist/internal/{Controller-BDT5_ZNe.js.map → Controller-DZwww-c4.js.map} +1 -1
- 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-DSOdWXl_.js} +3 -3
- package/dist/internal/{Rectangle-Z2T_h74M.js.map → Rectangle-DSOdWXl_.js.map} +1 -1
- package/dist/internal/{Work-PKaUMpXd.js → Work-HQHipxJj.js} +4 -4
- package/dist/internal/{Work-PKaUMpXd.js.map → Work-HQHipxJj.js.map} +1 -1
- package/dist/internal/{area-maker-BTGqxG6D.js → area-maker-Diy_UkTD.js} +2 -2
- package/dist/internal/{area-maker-BTGqxG6D.js.map → area-maker-Diy_UkTD.js.map} +1 -1
- package/dist/internal/{controller-B0hqJtoB.js → controller-DZUdbdd8.js} +4 -4
- package/dist/internal/{controller-B0hqJtoB.js.map → controller-DZUdbdd8.js.map} +1 -1
- package/dist/internal/{cruise-BkSbiLjd.js → cruise-Bo8CD4vF.js} +2 -2
- package/dist/internal/{cruise-BkSbiLjd.js.map → cruise-Bo8CD4vF.js.map} +1 -1
- package/dist/internal/{current-pano-image-DqyUFIP6.js → current-pano-image-Cqq4DRPh.js} +2 -2
- package/dist/internal/{current-pano-image-DqyUFIP6.js.map → current-pano-image-Cqq4DRPh.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-DwcrbASA.js} +2 -2
- package/dist/internal/{floorplan-Dkp7omYn.js.map → floorplan-DwcrbASA.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-pQcaAh5M.js} +2 -2
- package/dist/internal/{model-maker-L5eqUgkU.js.map → model-maker-pQcaAh5M.js.map} +1 -1
- package/dist/internal/object3d-helper-zRXHAcbm.js +7 -0
- package/dist/internal/{object3d-helper-CUhRRdCQ.js.map → object3d-helper-zRXHAcbm.js.map} +1 -1
- package/dist/internal/{pano-compass-dmcsnFDQ.js → pano-compass-CMIljzhC.js} +2 -2
- package/dist/internal/{pano-compass-dmcsnFDQ.js.map → pano-compass-CMIljzhC.js.map} +1 -1
- package/dist/internal/{pano-door-label-C0sd66vf.js → pano-door-label-B4nqTTzN.js} +2 -2
- package/dist/internal/{pano-door-label-C0sd66vf.js.map → pano-door-label-B4nqTTzN.js.map} +1 -1
- package/dist/internal/{pano-measure-NbB7-uVE.js → pano-measure-C2r0ecHk.js} +2 -2
- package/dist/internal/{pano-measure-NbB7-uVE.js.map → pano-measure-C2r0ecHk.js.map} +1 -1
- package/dist/internal/{pano-measure-v2-CRPvPs0e.js → pano-measure-v2-BfSAjO-I.js} +4 -4
- package/dist/internal/{pano-measure-v2-CRPvPs0e.js.map → pano-measure-v2-BfSAjO-I.js.map} +1 -1
- package/dist/internal/{pano-tag-j8ZPJDDK.js → pano-tag-BXo_4I6D.js} +2 -2
- package/dist/internal/{pano-tag-j8ZPJDDK.js.map → pano-tag-BXo_4I6D.js.map} +1 -1
- package/dist/internal/{pano-video-Dcspq4j1.js → pano-video-CS6-eXci.js} +2 -2
- package/dist/internal/{pano-video-Dcspq4j1.js.map → pano-video-CS6-eXci.js.map} +1 -1
- package/dist/internal/{pipeline-CD2YkN5U.js → pipeline-BN9A4lPZ.js} +2 -2
- package/dist/internal/{pipeline-CD2YkN5U.js.map → pipeline-BN9A4lPZ.js.map} +1 -1
- package/dist/internal/{sculpt-CbEBEh9F.js → sculpt-e0IRMtjB.js} +3 -3
- package/dist/internal/{sculpt-CbEBEh9F.js.map → sculpt-e0IRMtjB.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/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/object3d-helper-CUhRRdCQ.js +0 -7
|
@@ -0,0 +1,1052 @@
|
|
|
1
|
+
import { r as e } from "./rolldown-runtime-B0aSnxlc.js";
|
|
2
|
+
import { t } from "./Subscribe-DLlAl88n.js";
|
|
3
|
+
import { C as n, c as r } from "./generatePolygonGeometry-DEr9kX3D.js";
|
|
4
|
+
import { i, r as a, s as o, t as s } from "./CSS3DObject-Bra0eAMf.js";
|
|
5
|
+
import { t as c } from "./getFiveModel-CZVrrU1D.js";
|
|
6
|
+
import { n as l } from "./fiveModelLoad-BUIBYxzp.js";
|
|
7
|
+
import { r as u } from "./resizeObserver-AY-35us4.js";
|
|
8
|
+
import { t as d } from "./rayOnLine-CrCXTByv.js";
|
|
9
|
+
import * as f from "three/webgpu";
|
|
10
|
+
import { Vector3 as p } from "three/webgpu";
|
|
11
|
+
//#region src/shared-utils/three/Magnifier.ts
|
|
12
|
+
var m = class {
|
|
13
|
+
width;
|
|
14
|
+
height;
|
|
15
|
+
containerDom;
|
|
16
|
+
hooks = new t();
|
|
17
|
+
canvas = document.createElement("canvas");
|
|
18
|
+
config;
|
|
19
|
+
state = { enabled: !1 };
|
|
20
|
+
readPixelsPixelRatio;
|
|
21
|
+
afterRender;
|
|
22
|
+
beforeRender;
|
|
23
|
+
five;
|
|
24
|
+
scale;
|
|
25
|
+
offset = {
|
|
26
|
+
x: 0,
|
|
27
|
+
y: 0
|
|
28
|
+
};
|
|
29
|
+
context;
|
|
30
|
+
renderCenter = new f.Vector3();
|
|
31
|
+
hammer;
|
|
32
|
+
offsetRange;
|
|
33
|
+
isPanning = !1;
|
|
34
|
+
isDisposed = !1;
|
|
35
|
+
imageData = new ImageData(1, 1);
|
|
36
|
+
pendingRender;
|
|
37
|
+
renderRevision = 0;
|
|
38
|
+
invalidatedRevision = -1;
|
|
39
|
+
adaptiveReadWindow;
|
|
40
|
+
smoothedReadWindowPx = 0;
|
|
41
|
+
adaptiveDisabled = !1;
|
|
42
|
+
constructor(t, n) {
|
|
43
|
+
if (!t.renderer) {
|
|
44
|
+
console.error("Five Render 未初始化");
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
this.five = t, this.scale = n?.scale ?? 2, this.width = n?.width ?? 190, this.height = n?.height ?? n?.width ?? 190, this.readPixelsPixelRatio = h(n?.readPixelsPixelRatio), this.adaptiveReadWindow = g(n?.adaptiveReadWindow), this.config = {
|
|
48
|
+
dragEnabled: n?.dragEnabled || !1,
|
|
49
|
+
autoFixPCPosition: n?.autoFixPCPosition || !1,
|
|
50
|
+
initialPosition: n?.initialPosition || {
|
|
51
|
+
left: "0",
|
|
52
|
+
top: "0"
|
|
53
|
+
},
|
|
54
|
+
skipPanorama: n?.skipPanorama || !1
|
|
55
|
+
};
|
|
56
|
+
let r = this.canvas.getContext("2d");
|
|
57
|
+
if (!r) throw Error("CANNOT CREATE CONTEXT2D");
|
|
58
|
+
this.context = r, this.config.dragEnabled && import("./hammer-Cq7WcpTp.js").then((t) => /* @__PURE__ */ e(t.default, 1)).then(({ default: e }) => {
|
|
59
|
+
this.isDisposed || (this.hammer = new e(this.canvas), this.hammer.on("pan", this.onPan), this.hammer.on("panstart", this.onPanstart), this.hammer.on("panend", this.onPanend));
|
|
60
|
+
}), this.initStyle();
|
|
61
|
+
}
|
|
62
|
+
enable() {
|
|
63
|
+
if (!(this.isDisposed || this.state.enabled)) return this.state.enabled = !0, this.containerDom && this._appendTo(this.containerDom), this;
|
|
64
|
+
}
|
|
65
|
+
disable() {
|
|
66
|
+
if (this.state.enabled) return this.state.enabled = !1, this.invalidatedRevision = this.renderRevision, this.canvas.style.visibility = "hidden", this.canvas.remove(), this;
|
|
67
|
+
}
|
|
68
|
+
dispose() {
|
|
69
|
+
this.isDisposed || (this.isDisposed = !0, this.clear(), this.disable(), this.hammer?.destroy());
|
|
70
|
+
}
|
|
71
|
+
appendTo(e) {
|
|
72
|
+
return this.containerDom && this.containerDom?.removeChild(this.canvas), this.containerDom = e, this.state.enabled && this._appendTo(e), this;
|
|
73
|
+
}
|
|
74
|
+
clear() {
|
|
75
|
+
return this.invalidatedRevision = this.renderRevision, this.context?.clearRect(0, 0, this.canvas.width, this.canvas.height), this;
|
|
76
|
+
}
|
|
77
|
+
renderWithPoint(e) {
|
|
78
|
+
this.containerDom && this.state.enabled && (this.renderCenter = e, this.render(), this.config.autoFixPCPosition && this.autoFixPCPosition());
|
|
79
|
+
}
|
|
80
|
+
renderWithScreenPoint(e) {
|
|
81
|
+
this.containerDom && this.state.enabled && (this.renderCenter = e, this.render(), this.config.autoFixPCPosition && this.autoFixPCPosition());
|
|
82
|
+
}
|
|
83
|
+
resetOffset() {
|
|
84
|
+
this.offset = {
|
|
85
|
+
x: 0,
|
|
86
|
+
y: 0
|
|
87
|
+
}, this.canvas.style.transform = "translate3d(0px, 0px, 100px)";
|
|
88
|
+
}
|
|
89
|
+
updateScale(e) {
|
|
90
|
+
e > 0 && (this.scale = e, this.invalidatedRevision = this.renderRevision);
|
|
91
|
+
}
|
|
92
|
+
setReadPixelsPixelRatio(e) {
|
|
93
|
+
let t = h(e);
|
|
94
|
+
t !== this.readPixelsPixelRatio && (this.readPixelsPixelRatio = t, this.invalidatedRevision = this.renderRevision);
|
|
95
|
+
}
|
|
96
|
+
setSkipPanorama(e) {
|
|
97
|
+
this.config.skipPanorama = e;
|
|
98
|
+
}
|
|
99
|
+
setAdaptiveReadWindow(e) {
|
|
100
|
+
this.adaptiveReadWindow = g(e), this.adaptiveDisabled = !1, this.smoothedReadWindowPx = 0, this.invalidatedRevision = this.renderRevision;
|
|
101
|
+
}
|
|
102
|
+
getReadPixelsPixelRatio() {
|
|
103
|
+
return this.readPixelsPixelRatio;
|
|
104
|
+
}
|
|
105
|
+
updateSize(e, t) {
|
|
106
|
+
if (e > 0) {
|
|
107
|
+
this.width = e, this.height = t || e, this.canvas.setAttribute("width", (this.width * 1).toString()), this.canvas.setAttribute("height", (this.height * 1).toString()), this.canvas.style.width = this.width + "px", this.canvas.style.height = this.height + "px";
|
|
108
|
+
let n = Math.floor(this.width * 1), r = Math.floor(this.height * 1);
|
|
109
|
+
this.imageData = new ImageData(n, r), this.clear();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
render() {
|
|
113
|
+
return this.renderRevision += 1, this.pendingRender ||= this.renderLatest().finally(() => {
|
|
114
|
+
this.pendingRender = void 0;
|
|
115
|
+
}), this.pendingRender;
|
|
116
|
+
}
|
|
117
|
+
async renderLatest() {
|
|
118
|
+
for (; !this.isDisposed && this.state.enabled && this.containerDom && this.five.renderer;) {
|
|
119
|
+
let e = this.renderRevision, t = this.five.renderer.getSize(new f.Vector2()), n = this.renderCenter, r = () => {
|
|
120
|
+
let e = n instanceof f.Vector3 ? n.clone().project(this.five.camera) : null;
|
|
121
|
+
return e ? {
|
|
122
|
+
x: (e.x + 1) / 2 * t.x,
|
|
123
|
+
y: (e.y + 1) / 2 * t.y
|
|
124
|
+
} : {
|
|
125
|
+
x: n.x,
|
|
126
|
+
y: t.y - n.y
|
|
127
|
+
};
|
|
128
|
+
}, { x: i, y: a } = r(), o = this.getBaseReadWindow(), s = /* @__PURE__ */ new Map(), c, l;
|
|
129
|
+
try {
|
|
130
|
+
if (c = this.beforeRender?.(n), c) {
|
|
131
|
+
let e = r();
|
|
132
|
+
i = e.x, a = e.y;
|
|
133
|
+
}
|
|
134
|
+
o = this.getReadWindow(this.getDistanceToCamera()), this.five.scene.traverse((e) => {
|
|
135
|
+
e.disableGetPixel && (s.set(e, e.visible), e.visible = !1);
|
|
136
|
+
});
|
|
137
|
+
try {
|
|
138
|
+
l = this.five.getPixels({
|
|
139
|
+
x: i - o.readWidth / 2,
|
|
140
|
+
y: a - o.readHeight / 2,
|
|
141
|
+
width: o.readWidth,
|
|
142
|
+
height: o.readHeight,
|
|
143
|
+
pixelRatio: o.radio,
|
|
144
|
+
skipPanorama: this.config.skipPanorama,
|
|
145
|
+
flipY: !0
|
|
146
|
+
});
|
|
147
|
+
} finally {
|
|
148
|
+
s.forEach((e, t) => {
|
|
149
|
+
t.visible = e;
|
|
150
|
+
}), typeof c == "function" && c(), c = void 0;
|
|
151
|
+
}
|
|
152
|
+
let u = await l;
|
|
153
|
+
if (this.isDisposed || !this.state.enabled || this.invalidatedRevision === this.renderRevision) return;
|
|
154
|
+
if (e !== this.renderRevision) continue;
|
|
155
|
+
if (u.length !== o.imageWidth * o.imageHeight * 4) {
|
|
156
|
+
if (this.readPixelsPixelRatio > 1 || this.isAdaptiveActive()) {
|
|
157
|
+
this.readPixelsPixelRatio = 1, this.adaptiveDisabled = !0, this.smoothedReadWindowPx = 0;
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
console.warn("Magnifier: Invalid pixel data length");
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if ((this.imageData.width !== o.imageWidth || this.imageData.height !== o.imageHeight) && (this.imageData = new ImageData(o.imageWidth, o.imageHeight)), this.canvas.width = o.imageWidth, this.canvas.height = o.imageHeight, this.imageData.data.set(u), this.context.putImageData(this.imageData, 0, 0), this.canvas.style.visibility = "visible", this.afterRender) try {
|
|
164
|
+
this.afterRender({
|
|
165
|
+
camera: this.five.camera,
|
|
166
|
+
renderSize: t,
|
|
167
|
+
readLeft: i - o.readWidth / 2,
|
|
168
|
+
readTop: a - o.readHeight / 2,
|
|
169
|
+
readWidth: o.readWidth,
|
|
170
|
+
readHeight: o.readHeight,
|
|
171
|
+
pixelRatio: o.radio,
|
|
172
|
+
canvasWidth: o.imageWidth,
|
|
173
|
+
canvasHeight: o.imageHeight
|
|
174
|
+
});
|
|
175
|
+
} catch (e) {
|
|
176
|
+
console.warn("Magnifier: afterRender 失败", e);
|
|
177
|
+
}
|
|
178
|
+
} catch (e) {
|
|
179
|
+
if (console.error("Magnifier: Failed to read pixels", e), this.readPixelsPixelRatio > 1 || this.isAdaptiveActive()) {
|
|
180
|
+
this.readPixelsPixelRatio = 1, this.adaptiveDisabled = !0, this.smoothedReadWindowPx = 0;
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
} finally {
|
|
184
|
+
typeof c == "function" && c();
|
|
185
|
+
}
|
|
186
|
+
if (e === this.renderRevision) return;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
getBaseReadWindow() {
|
|
190
|
+
let { width: e, height: t, scale: n } = this, r = Math.max(1, Math.round(e / n)), i = Math.max(1, Math.round(t / n)), a = Math.max(1, Math.ceil(n)) * this.readPixelsPixelRatio;
|
|
191
|
+
return {
|
|
192
|
+
readWidth: r,
|
|
193
|
+
readHeight: i,
|
|
194
|
+
radio: a,
|
|
195
|
+
imageWidth: r * a,
|
|
196
|
+
imageHeight: i * a
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
isAdaptiveActive() {
|
|
200
|
+
return this.adaptiveReadWindow.enabled && !this.adaptiveDisabled;
|
|
201
|
+
}
|
|
202
|
+
getReadWindow(e) {
|
|
203
|
+
let t = this.getBaseReadWindow(), n = this.adaptiveReadWindow;
|
|
204
|
+
if (!this.isAdaptiveActive() || !e || !Number.isFinite(e) || e <= 0) return t;
|
|
205
|
+
let r = this.five?.renderer, i = this.five?.camera;
|
|
206
|
+
if (!r || !i || i.isOrthographicCamera) return t;
|
|
207
|
+
let a = i.fov;
|
|
208
|
+
if (!Number.isFinite(a) || a <= 0) return t;
|
|
209
|
+
let o = r.getSize(new f.Vector2());
|
|
210
|
+
if (!o || o.y <= 0) return t;
|
|
211
|
+
let s = 2 * e * Math.tan(f.MathUtils.degToRad(Math.min(179, a)) / 2) / o.y;
|
|
212
|
+
if (!Number.isFinite(s) || s <= 0) return t;
|
|
213
|
+
let c = t.readWidth, l = Math.max(1, Math.min(c, Math.max(n.minWindowPx, this.width / Math.max(1, n.maxZoom)))), u = Math.min(c, Math.max(l, n.worldSize / s)), d = Math.min(1, Math.max(.05, n.smoothing));
|
|
214
|
+
return this.smoothedReadWindowPx = this.smoothedReadWindowPx > 0 ? this.smoothedReadWindowPx + (u - this.smoothedReadWindowPx) * d : u, this.frameFromReadWidth(Math.max(1, Math.round(this.smoothedReadWindowPx)), t);
|
|
215
|
+
}
|
|
216
|
+
frameFromReadWidth(e, t) {
|
|
217
|
+
let n = this.width > 0 ? this.height / this.width : 1, r = Math.max(1, Math.round(e * n)), i = Math.max(1, Math.min(32, Math.ceil(t.imageWidth / e)));
|
|
218
|
+
return {
|
|
219
|
+
readWidth: e,
|
|
220
|
+
readHeight: r,
|
|
221
|
+
radio: i,
|
|
222
|
+
imageWidth: e * i,
|
|
223
|
+
imageHeight: r * i
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
getDistanceToCamera() {
|
|
227
|
+
let e = this.renderCenter, t = this.five?.camera;
|
|
228
|
+
if (!t || !e?.isVector3) return;
|
|
229
|
+
let n = e.distanceTo(t.position);
|
|
230
|
+
return Number.isFinite(n) ? n : void 0;
|
|
231
|
+
}
|
|
232
|
+
_appendTo(e) {
|
|
233
|
+
if (this.resetOffset(), e.appendChild(this.canvas), !this.offsetRange) {
|
|
234
|
+
let t = this.canvas.getBoundingClientRect(), n = e.getBoundingClientRect(), r = n.right - t.right, i = n.bottom - t.bottom, a = n.left - t.left, o = n.top - t.top;
|
|
235
|
+
this.offsetRange = {
|
|
236
|
+
min: {
|
|
237
|
+
x: a,
|
|
238
|
+
y: o
|
|
239
|
+
},
|
|
240
|
+
max: {
|
|
241
|
+
x: r,
|
|
242
|
+
y: i
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
autoFixPCPosition() {
|
|
248
|
+
if (!this.containerDom) return;
|
|
249
|
+
let { width: e, height: t } = this, { clientWidth: n, clientHeight: r } = this.containerDom, [i, a, o] = (() => {
|
|
250
|
+
if (this.renderCenter.isVector3) {
|
|
251
|
+
let e = this.renderCenter.clone().project(this.five.camera);
|
|
252
|
+
return [
|
|
253
|
+
(e.x + 1) / 2 * n,
|
|
254
|
+
-(e.x - 1) / 2 * n,
|
|
255
|
+
-(e.y - 1) / 2 * r
|
|
256
|
+
];
|
|
257
|
+
}
|
|
258
|
+
return [
|
|
259
|
+
this.renderCenter.x,
|
|
260
|
+
n - this.renderCenter.x,
|
|
261
|
+
this.renderCenter.y
|
|
262
|
+
];
|
|
263
|
+
})();
|
|
264
|
+
i < 183 ? (this.canvas.style.top = -t / 2 + "px", this.canvas.style.left = "90px") : o < 183 ? (this.canvas.style.top = "90px", this.canvas.style.left = -e / 2 + "px") : a < 183 ? (this.canvas.style.top = -t / 2 + "px", this.canvas.style.left = -e - 90 + "px") : (this.canvas.style.left = -e / 2 + "px", this.canvas.style.top = -t - 90 + "px"), this.canvas.style.transform = `translate3d(${i}px, ${o}px, 10px)`, this.offset = {
|
|
265
|
+
x: i,
|
|
266
|
+
y: o
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
initStyle() {
|
|
270
|
+
let e = this.canvas;
|
|
271
|
+
e.classList.add("five-plugin__magnifier"), e.style.position = "absolute", e.style.pointerEvents = this.config.dragEnabled ? "all" : "none", e.style.borderRadius = "50%", e.style.zIndex = "99", e.setAttribute("width", (this.width * 1).toString()), e.setAttribute("height", (this.height * 1).toString()), e.style.border = "2px solid rgba(255,255,255,0.20)", e.style.width = this.width + "px", e.style.height = this.height + "px", e.style.top = this.config.initialPosition.top, e.style.left = this.config.initialPosition.left, e.style.transform = "translate(0,0,100px)", e.style.visibility = "hidden", this.config.dragEnabled && (this.canvas.style.cursor = "pointer");
|
|
272
|
+
}
|
|
273
|
+
getPanOffset(e, t) {
|
|
274
|
+
let { min: { x: n, y: r }, max: { x: i, y: a } } = t, o = this.offset.x + e.deltaX, s = this.offset.y + e.deltaY;
|
|
275
|
+
return {
|
|
276
|
+
translateX: Math.min(Math.max(o, n), i),
|
|
277
|
+
translateY: Math.min(Math.max(s, r), a)
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
onPanstart = () => {
|
|
281
|
+
this.isPanning = !0, this.canvas.style.boxShadow = "0 2px 30px 0 rgba(0,0,0,0.20)";
|
|
282
|
+
};
|
|
283
|
+
onPan = (e) => {
|
|
284
|
+
if (!this.isPanning || !this.offsetRange || this.hooks.emit("wantsPanGesture", e)) return;
|
|
285
|
+
let { translateX: t, translateY: n } = this.getPanOffset(e, this.offsetRange);
|
|
286
|
+
this.canvas.style.transform = `translate3d(${t}px, ${n}px, 100px)`;
|
|
287
|
+
};
|
|
288
|
+
onPanend = (e) => {
|
|
289
|
+
if (this.isPanning = !1, this.canvas.style.boxShadow = "none", !this.offsetRange) return;
|
|
290
|
+
let { translateX: t, translateY: n } = this.getPanOffset(e, this.offsetRange);
|
|
291
|
+
this.canvas.style.transform = `translate3d(${t}px, ${n}px, 100px)`, this.offset = {
|
|
292
|
+
x: t,
|
|
293
|
+
y: n
|
|
294
|
+
};
|
|
295
|
+
};
|
|
296
|
+
};
|
|
297
|
+
function h(e) {
|
|
298
|
+
return Number.isFinite(e) ? Math.min(4, Math.max(1, Math.round(e))) : 1;
|
|
299
|
+
}
|
|
300
|
+
function g(e) {
|
|
301
|
+
let t = typeof e == "object" && e ? e : {};
|
|
302
|
+
return {
|
|
303
|
+
enabled: e === !0 || typeof e == "object" && !!e,
|
|
304
|
+
worldSize: Number.isFinite(t.worldSize) ? Math.max(.01, t.worldSize) : .25,
|
|
305
|
+
maxZoom: Number.isFinite(t.maxZoom) ? Math.max(1, t.maxZoom) : 8,
|
|
306
|
+
minWindowPx: Number.isFinite(t.minWindowPx) ? Math.max(1, t.minWindowPx) : 24,
|
|
307
|
+
smoothing: Number.isFinite(t.smoothing) ? Math.min(1, Math.max(.05, t.smoothing)) : .25
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
//#endregion
|
|
311
|
+
//#region src/shared-utils/CSS3DRender/index.ts
|
|
312
|
+
var _ = /* @__PURE__ */ new WeakMap(), v = /* @__PURE__ */ new Set(), y = /* @__PURE__ */ new WeakSet(), b = /* @__PURE__ */ new Map(), x = /* @__PURE__ */ new Map(), S = /* @__PURE__ */ new WeakMap();
|
|
313
|
+
function C(e, t) {
|
|
314
|
+
for (let n = e; n; n = n.parent) if (n === t.scene) return !0;
|
|
315
|
+
return !1;
|
|
316
|
+
}
|
|
317
|
+
function w(e) {
|
|
318
|
+
return e === "front" ? b : x;
|
|
319
|
+
}
|
|
320
|
+
function T(e, t) {
|
|
321
|
+
return t ? (M(t), _.get(t)?.[e]) : w(e);
|
|
322
|
+
}
|
|
323
|
+
function E(e, t, n, r) {
|
|
324
|
+
if (!t) return !1;
|
|
325
|
+
let i = T(e, r), a = n || t.uuid;
|
|
326
|
+
return !i || i.has(a) ? !1 : (i.set(a, t), !0);
|
|
327
|
+
}
|
|
328
|
+
function D(e, t, n) {
|
|
329
|
+
if (!t) return !1;
|
|
330
|
+
let r = n ? [_.get(n)?.[e]] : [w(e), ...Array.from(v, (t) => t[e])], i = !1;
|
|
331
|
+
for (let e of r) if (e) {
|
|
332
|
+
if (typeof t == "string") i = e.delete(t) || i;
|
|
333
|
+
else for (let [n, r] of e) r === t && (i = e.delete(n) || i);
|
|
334
|
+
}
|
|
335
|
+
return i;
|
|
336
|
+
}
|
|
337
|
+
function O(e, t, n) {
|
|
338
|
+
return E("front", e, t, n);
|
|
339
|
+
}
|
|
340
|
+
function k(e, t) {
|
|
341
|
+
return D("front", e, t);
|
|
342
|
+
}
|
|
343
|
+
function ee(e, t, n) {
|
|
344
|
+
return E("behind", e, t, n);
|
|
345
|
+
}
|
|
346
|
+
function A(e, t) {
|
|
347
|
+
return D("behind", e, t);
|
|
348
|
+
}
|
|
349
|
+
function* j(e, t) {
|
|
350
|
+
yield* e[t].values();
|
|
351
|
+
for (let n of w(t).values()) C(n, e.five) && (S.set(n, e.five), yield n);
|
|
352
|
+
}
|
|
353
|
+
function M(e) {
|
|
354
|
+
let t = _.get(e);
|
|
355
|
+
if (t) return t.dispose;
|
|
356
|
+
if (y.has(e)) return () => {};
|
|
357
|
+
let n = new i("front"), r = new i("behind");
|
|
358
|
+
n.domElementWrapper.style.zIndex = "1";
|
|
359
|
+
let o = new AbortController(), s = !1, c = () => {
|
|
360
|
+
if (!s) {
|
|
361
|
+
s = !0, o.abort(), e.off("dispose", u), n.dispose(), r.dispose(), d.front.clear(), d.behind.clear();
|
|
362
|
+
for (let t of [b, x]) for (let [n, r] of t) {
|
|
363
|
+
let i = C(r, e), a = r;
|
|
364
|
+
for (; a.parent;) a = a.parent;
|
|
365
|
+
let o = !i && a.isScene === !0;
|
|
366
|
+
(i || S.get(r) === e && !o) && t.delete(n);
|
|
367
|
+
}
|
|
368
|
+
_.get(e) === d && _.delete(e), v.delete(d);
|
|
369
|
+
}
|
|
370
|
+
}, u = () => {
|
|
371
|
+
y.add(e), c();
|
|
372
|
+
}, d = {
|
|
373
|
+
five: e,
|
|
374
|
+
front: /* @__PURE__ */ new Map(),
|
|
375
|
+
behind: /* @__PURE__ */ new Map(),
|
|
376
|
+
dispose: c
|
|
377
|
+
};
|
|
378
|
+
return _.set(e, d), v.add(d), e.on("dispose", u), l(e, o.signal).then(() => {
|
|
379
|
+
if (s) return;
|
|
380
|
+
let t = e.getElement()?.parentElement;
|
|
381
|
+
if (!t) {
|
|
382
|
+
c();
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
let i = a(e);
|
|
386
|
+
i ? (n.appendToElement(t), n.renderCss3dObjectEveryFrame(() => j(d, "front"), e.camera), r.appendToElement(i), r.renderCss3dObjectEveryFrame(() => j(d, "behind"), e.camera)) : console.error("initialCSS3DRender: behindWrapper is not exist");
|
|
387
|
+
}), c;
|
|
388
|
+
}
|
|
389
|
+
//#endregion
|
|
390
|
+
//#region src/CSS3DRenderPlugin/utils/three/CSS3DSprite.ts
|
|
391
|
+
var N = class extends o {
|
|
392
|
+
isCSS3DSprite = !0;
|
|
393
|
+
isCSS3DObject = !0;
|
|
394
|
+
};
|
|
395
|
+
//#endregion
|
|
396
|
+
//#region src/shared-utils/three/PointSelector/utils/PointHelper2.ts
|
|
397
|
+
function P() {
|
|
398
|
+
let e = new f.Group(), t = new f.Mesh(new f.CircleGeometry(.19, 64), new f.MeshBasicMaterial({
|
|
399
|
+
color: 16777215,
|
|
400
|
+
opacity: .2,
|
|
401
|
+
side: f.DoubleSide,
|
|
402
|
+
depthTest: !1,
|
|
403
|
+
transparent: !0
|
|
404
|
+
})), n = new f.Mesh(new f.RingGeometry(.19, .2, 64), new f.MeshBasicMaterial({
|
|
405
|
+
color: 16777215,
|
|
406
|
+
opacity: .3,
|
|
407
|
+
side: f.DoubleSide,
|
|
408
|
+
depthTest: !1,
|
|
409
|
+
transparent: !0
|
|
410
|
+
}));
|
|
411
|
+
return e.add(t, n), e;
|
|
412
|
+
}
|
|
413
|
+
function F() {
|
|
414
|
+
let e = .5, t = new f.Group(), n = {
|
|
415
|
+
lineWidth: 1,
|
|
416
|
+
lineColor: 3407837,
|
|
417
|
+
lineOpacity: .7,
|
|
418
|
+
occlusionVisibility: !0
|
|
419
|
+
}, i = new r({
|
|
420
|
+
points: [{ x: -.5 }, { x: e }],
|
|
421
|
+
...n,
|
|
422
|
+
lineColor: 3407837
|
|
423
|
+
}), a = new r({
|
|
424
|
+
points: [{ y: -.5 }, { y: e }],
|
|
425
|
+
...n,
|
|
426
|
+
lineColor: 3407837
|
|
427
|
+
});
|
|
428
|
+
return t.add(i, a), t;
|
|
429
|
+
}
|
|
430
|
+
function I(e) {
|
|
431
|
+
let t = new f.CurvePath();
|
|
432
|
+
t.add(new f.LineCurve3(new f.Vector3(0, 0, 0), new f.Vector3(0, 0, e)));
|
|
433
|
+
let n = new f.TubeGeometry(t, 32, .003), r = new f.MeshBasicMaterial({
|
|
434
|
+
color: 10994687,
|
|
435
|
+
depthTest: !1,
|
|
436
|
+
transparent: !0
|
|
437
|
+
});
|
|
438
|
+
return new f.Mesh(n, r);
|
|
439
|
+
}
|
|
440
|
+
function L() {
|
|
441
|
+
let e = new f.RingGeometry(.03, .035, 64), t = new f.MeshBasicMaterial({
|
|
442
|
+
color: 16777215,
|
|
443
|
+
depthTest: !1,
|
|
444
|
+
transparent: !0,
|
|
445
|
+
side: f.DoubleSide
|
|
446
|
+
});
|
|
447
|
+
return new f.Mesh(e, t);
|
|
448
|
+
}
|
|
449
|
+
function R() {
|
|
450
|
+
let e = new f.SphereGeometry(.018, 32, 32), t = new f.MeshBasicMaterial({
|
|
451
|
+
color: 5085183,
|
|
452
|
+
depthTest: !1,
|
|
453
|
+
transparent: !0
|
|
454
|
+
});
|
|
455
|
+
return new f.Mesh(e, t);
|
|
456
|
+
}
|
|
457
|
+
function te() {
|
|
458
|
+
let e = document.createElement("img");
|
|
459
|
+
e.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAAVCAMAAAB8FU7dAAAAw1BMVEUAAACDuuiAsu11q/x8r/+HxtKHxtKIx9J4ut6Hx9Jcn/uNwNlmmf+RuP9ppf9orel3ud2HxtJrpf9oremev/9ppP9orelQmP9ZoPWSuP92q/9cnv9prel4ut53qv9orelYoPWIxdJPmP+HxtGRuP9oo/+Suf9Qmf92q/+RuP+DsP9Pmv+FxdFtre2SyMiRuP9PmP+evv9ppf9cnv+rxf9orepZofV4ut52q/+Dsf+Esv+5y/93q/9aofbF0f93rP9qpf8IzZ1iAAAAL3RSTlMAEg4s3dK5nodgVQoF/Pf39vbt7evr39rV1NTOzs6srJ+fiIZ9fWlpW09ERCwcHMH8LhIAAADRSURBVBjTjdDHkoMwEIThBrzOm3POOQwSYCRhe/f9n2p75FD2zX/VXL5qOAjzkixLsFL6fOFF5PwpXUj/eEwx7Oh9Jq+FdV5MqZkXlU9K4KZsmqY02x/A8LSwv14o0ylJWkP087WVhDfcjmjj5b/E3+CEpDPdGY58C7tKfzSiiA9uB4dV/NIF7yVQ7AGuq0lOIzrvnLP2Et2aMzUqryge8FVX0Zjl5XkG3KsR593pM2zVEScjvbMU7IdGjF19IzZ43Ceyve4Ai5Jep93u9BJs3j/gXjHbRgy31AAAAABJRU5ErkJggg==";
|
|
460
|
+
let t = new N(e);
|
|
461
|
+
return e.style.pointerEvents = "none", t.scale.set(.003, .003, .003), t;
|
|
462
|
+
}
|
|
463
|
+
var z = class extends f.Object3D {
|
|
464
|
+
five;
|
|
465
|
+
disableGetPixel = !0;
|
|
466
|
+
planeMesh;
|
|
467
|
+
ringMesh;
|
|
468
|
+
crossline;
|
|
469
|
+
lineMesh;
|
|
470
|
+
ballMesh;
|
|
471
|
+
cssBallMesh;
|
|
472
|
+
constructor(e) {
|
|
473
|
+
super(), this.five = e, n(this, e);
|
|
474
|
+
let t = .18;
|
|
475
|
+
this.planeMesh = P(), this.ringMesh = L(), this.crossline = F(), this.lineMesh = I(t), this.ballMesh = R(), this.cssBallMesh = te(), this.ballMesh.position.setZ(t), this.cssBallMesh.position.setZ(t), this.planeMesh.renderOrder = 0, this.ringMesh.renderOrder = 1, this.crossline.renderOrder = 2, this.lineMesh.renderOrder = 3, this.ballMesh.renderOrder = 4, this.add(this.planeMesh, this.lineMesh, this.ballMesh, this.ringMesh, this.cssBallMesh), O(this, void 0, e);
|
|
476
|
+
}
|
|
477
|
+
updateWithIntersect(e) {
|
|
478
|
+
if (!e.face) return;
|
|
479
|
+
let t = (() => {
|
|
480
|
+
let t = e.face.normal.clone().normalize();
|
|
481
|
+
return t.y > .99 ? new f.Vector3(0, 1, 0) : t.y < -.99 ? new f.Vector3(0, -1, 0) : t.x > .99 ? new f.Vector3(1, 0, 0) : t.x < -.99 ? new f.Vector3(-1, 0, 0) : t.z > .99 ? new f.Vector3(0, 0, 1) : t.z < -.99 ? new f.Vector3(0, 0, -1) : t.y < .01 && t.y > -.01 ? new f.Vector3(t.x, 0, t.z) : t;
|
|
482
|
+
})(), n = new f.Vector3().addVectors(e.point, t);
|
|
483
|
+
this.position.copy(e.point), this.lookAt(n);
|
|
484
|
+
}
|
|
485
|
+
show() {
|
|
486
|
+
this.visible = !0, this.add(this.cssBallMesh);
|
|
487
|
+
}
|
|
488
|
+
hide() {
|
|
489
|
+
this.visible = !1, this.remove(this.cssBallMesh);
|
|
490
|
+
}
|
|
491
|
+
dispose() {
|
|
492
|
+
this.traverse((e) => {
|
|
493
|
+
let t = e;
|
|
494
|
+
t.geometry?.dispose(), t.material && (Array.isArray(t.material) ? t.material : [t.material]).forEach((e) => e.dispose());
|
|
495
|
+
}), k(this, this.five), this.cssBallMesh.element.remove(), this.removeFromParent();
|
|
496
|
+
}
|
|
497
|
+
}, B = class {
|
|
498
|
+
five;
|
|
499
|
+
hooks = new t();
|
|
500
|
+
position = null;
|
|
501
|
+
magnifier = null;
|
|
502
|
+
pointHelper = null;
|
|
503
|
+
state = {
|
|
504
|
+
enabled: !1,
|
|
505
|
+
visible: !0
|
|
506
|
+
};
|
|
507
|
+
group = new f.Group();
|
|
508
|
+
constructor(e, t) {
|
|
509
|
+
this.five = e, this.magnifier = t?.magnifier === void 0 ? new m(e, {
|
|
510
|
+
dragEnabled: !0,
|
|
511
|
+
...t?.magnifierParams,
|
|
512
|
+
skipPanorama: t?.skipPanorama ?? !1
|
|
513
|
+
}) : t.magnifier;
|
|
514
|
+
let n = null;
|
|
515
|
+
n = t?.pointHelper === "default" || t?.pointHelper === void 0 ? new $(e) : t?.pointHelper === "highlight" ? new z(e) : t?.pointHelper === null ? null : t.pointHelper, this.pointHelper = n, this.group.name = "five-point-selector", this.five.scene.add(this.group), this.magnifier?.appendTo(t.container ?? e.getElement()?.parentElement ?? document.body);
|
|
516
|
+
}
|
|
517
|
+
show = () => {
|
|
518
|
+
this.state.visible || (this.state.visible = !0, this.pointHelper?.show(), this.magnifier?.enable(), this.five.needsRender = !0);
|
|
519
|
+
};
|
|
520
|
+
hide = () => {
|
|
521
|
+
this.state.visible && (this.state.visible = !1, this.pointHelper?.hide(), this.magnifier?.disable(), this.five.needsRender = !0);
|
|
522
|
+
};
|
|
523
|
+
enable() {
|
|
524
|
+
this.state.enabled || (this.state.enabled = !0, this.pointHelper && this.group.add(this.pointHelper), this.magnifier?.enable(), this.five.needsRender = !0, this.hooks.emit("enabled"));
|
|
525
|
+
}
|
|
526
|
+
disable() {
|
|
527
|
+
this.state.enabled && (this.state.enabled = !1, this.pointHelper && this.group.remove(this.pointHelper), this.magnifier?.disable(), this.hooks.emit("disabled"));
|
|
528
|
+
}
|
|
529
|
+
dispose() {
|
|
530
|
+
this.hooks.off(), this.disable(), this.abortUpdateMagnifier(), this.magnifier?.dispose(), this.magnifier = null, this.pointHelper?.dispose(), this.pointHelper = null, this.group.removeFromParent();
|
|
531
|
+
}
|
|
532
|
+
updateWithIntersect = (e, t = { emitEvent: !0 }) => {
|
|
533
|
+
if (!e) return;
|
|
534
|
+
this.abortUpdateMagnifier(), this.position = e, t.emitEvent && this.hooks.emit("intersectionUpdate", e), this.pointHelper?.updateWithIntersect(e);
|
|
535
|
+
let n = () => this.magnifier?.renderWithPoint(e.point);
|
|
536
|
+
this.abortUpdateMagnifier = () => this.five.off("renderFrame", n), this.five.once("renderFrame", n), this.five.needsRender = !0;
|
|
537
|
+
};
|
|
538
|
+
abortUpdateMagnifier = () => {};
|
|
539
|
+
}, V = typeof navigator > "u" ? 0 : navigator.maxTouchPoints || navigator.msMaxTouchPoints || 0, H = typeof window < "u" && ("ontouchstart" in window || V > 0);
|
|
540
|
+
//#endregion
|
|
541
|
+
//#region src/shared-utils/three/createIntersectionFace.ts
|
|
542
|
+
function U(e = new p()) {
|
|
543
|
+
return {
|
|
544
|
+
a: 0,
|
|
545
|
+
b: 0,
|
|
546
|
+
c: 0,
|
|
547
|
+
normal: e,
|
|
548
|
+
materialIndex: 0
|
|
549
|
+
};
|
|
550
|
+
}
|
|
551
|
+
//#endregion
|
|
552
|
+
//#region src/shared-utils/five/getRaycasterByNdcPosition.ts
|
|
553
|
+
function W(e, t) {
|
|
554
|
+
let { x: n, y: r } = t, i = n * 2 - 1, a = r * 2 - 1, o = new f.Raycaster();
|
|
555
|
+
return o.setFromCamera(new f.Vector2(i, a), e.camera), o.params.Points.threshold = .02, o;
|
|
556
|
+
}
|
|
557
|
+
//#endregion
|
|
558
|
+
//#region src/shared-utils/five/getPosition.ts
|
|
559
|
+
function G(e, t, n) {
|
|
560
|
+
let r = q(e, t);
|
|
561
|
+
return n?.virtualPoint ? r ?? K(t) : r;
|
|
562
|
+
}
|
|
563
|
+
function K(e, t = 3) {
|
|
564
|
+
let n = new f.Vector3().addVectors(e.ray.origin, e.ray.direction.clone().normalize().multiplyScalar(t)), r = e.ray.direction.clone().negate();
|
|
565
|
+
return {
|
|
566
|
+
distance: t,
|
|
567
|
+
point: n,
|
|
568
|
+
object: new f.Object3D(),
|
|
569
|
+
face: U(r),
|
|
570
|
+
raycaster: e,
|
|
571
|
+
isVirtual: !0
|
|
572
|
+
};
|
|
573
|
+
}
|
|
574
|
+
function q(e, t) {
|
|
575
|
+
let n = c(e).intersectRaycaster(t)[0];
|
|
576
|
+
if (n) return {
|
|
577
|
+
...n,
|
|
578
|
+
raycaster: t,
|
|
579
|
+
isVirtual: !1
|
|
580
|
+
};
|
|
581
|
+
}
|
|
582
|
+
//#endregion
|
|
583
|
+
//#region src/shared-utils/three/PointSelector/utils/contents.ts
|
|
584
|
+
var J = "url(\"data:image/svg+xml,%3Csvg width='12px' height='12px' viewBox='0 0 12 12' xmlns='http://www.w3.org/2000/svg'%3E%3Cg stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E%3Cpath d='M6,12 C9.3137085,12 12,9.3137085 12,6 C12,2.6862915 9.3137085,0 6,0 C2.6862915,0 0,2.6862915 0,6 C0,9.3137085 2.6862915,12 6,12 Z' fill='%23FF5959'%3E%3C/path%3E%3Cg transform='translate(2, 2)' stroke='%23FFFFFF'%3E%3Ccircle cx='4' cy='4' r='4'%3E%3C/circle%3E%3Cline x1='1.07141075' y1='1.23997894' x2='6.64700843' y2='6.81557662'%3E%3C/line%3E%3C/g%3E%3C/g%3E%3C/svg%3E\") 6 6, auto", Y = new f.Vector3(), X = () => !1, Z = class extends t {
|
|
585
|
+
get position() {
|
|
586
|
+
if (!this.outOfFive) return this.pointSelectorHelper.position;
|
|
587
|
+
}
|
|
588
|
+
get outOfFive() {
|
|
589
|
+
return this._outOfFive;
|
|
590
|
+
}
|
|
591
|
+
get enabled() {
|
|
592
|
+
return this._enabled;
|
|
593
|
+
}
|
|
594
|
+
get cursorError() {
|
|
595
|
+
return this._cursorError;
|
|
596
|
+
}
|
|
597
|
+
set cursorError(e) {
|
|
598
|
+
this._cursorError = e, this.five.getElement().style.cursor = e ? J : "", e ? this.pointSelectorHelper.hide() : this.pointSelectorHelper.show();
|
|
599
|
+
}
|
|
600
|
+
_cursorError = !1;
|
|
601
|
+
actionIfNoIntersection = "virtualPoint";
|
|
602
|
+
plane;
|
|
603
|
+
planeMode = "onlyVirtual";
|
|
604
|
+
disableIfNoIntersection = !1;
|
|
605
|
+
pointSelectorHelper;
|
|
606
|
+
five;
|
|
607
|
+
adhereEnabled = !0;
|
|
608
|
+
adhereRadius = .1;
|
|
609
|
+
adherePlane = [];
|
|
610
|
+
adhereLine = [];
|
|
611
|
+
set outOfFive(e) {
|
|
612
|
+
this._outOfFive = e;
|
|
613
|
+
}
|
|
614
|
+
_outOfFive = !1;
|
|
615
|
+
set enabled(e) {
|
|
616
|
+
this._enabled = e;
|
|
617
|
+
}
|
|
618
|
+
_enabled = !1;
|
|
619
|
+
mode;
|
|
620
|
+
pressDown = !1;
|
|
621
|
+
adherePoints;
|
|
622
|
+
setPressDown;
|
|
623
|
+
lastFiveHelperVisible;
|
|
624
|
+
lastIntersection;
|
|
625
|
+
mousePosition;
|
|
626
|
+
_mouseDownInfo;
|
|
627
|
+
_touchStartInfo;
|
|
628
|
+
config = {};
|
|
629
|
+
get mouseNdcPosition() {
|
|
630
|
+
return this.mousePosition ? this.mousePositionToNdcPosition(this.mousePosition) : null;
|
|
631
|
+
}
|
|
632
|
+
constructor(e, t) {
|
|
633
|
+
super(), this.five = e, this.config = {
|
|
634
|
+
...this.config,
|
|
635
|
+
...t
|
|
636
|
+
}, this.actionIfNoIntersection = t?.actionIfNoIntersection ?? "virtualPoint";
|
|
637
|
+
let n = t?.mode ?? "auto";
|
|
638
|
+
this.mode = n === "auto" ? H ? "fixed" : "cursor" : n;
|
|
639
|
+
let r = {
|
|
640
|
+
autoFixPCPosition: this.mode === "cursor",
|
|
641
|
+
initialPosition: this.mode === "fixed" ? {
|
|
642
|
+
left: "35%",
|
|
643
|
+
top: "20%"
|
|
644
|
+
} : void 0
|
|
645
|
+
};
|
|
646
|
+
this.pointSelectorHelper = new B(this.five, {
|
|
647
|
+
...t?.helper,
|
|
648
|
+
magnifierParams: {
|
|
649
|
+
...r,
|
|
650
|
+
...t?.helper?.magnifierParams
|
|
651
|
+
},
|
|
652
|
+
skipPanorama: t?.skipPanorama ?? !1
|
|
653
|
+
}), this.pointSelectorHelper.hide();
|
|
654
|
+
}
|
|
655
|
+
enable() {
|
|
656
|
+
if (this.enabled) return;
|
|
657
|
+
this.enabled = !0, this.outOfFive = !1, this.pointSelectorHelper.enable(), this.pointSelectorHelper.hide();
|
|
658
|
+
let e = this.five.getElement();
|
|
659
|
+
if (!e) throw Error("five element not found");
|
|
660
|
+
this.mode === "cursor" ? (this.five.on("wantsMoveToPano", X), this.five.on("wantsChangeMode", X), this.five.on("wantsTapGesture", X), e.addEventListener("touchstart", this.onTouchStart, { passive: !0 }), e.addEventListener("touchmove", this.onTouchMove), e.addEventListener("touchend", this.onTouchEnd), e.addEventListener("touchcancel", this.onTouchCancel), e.addEventListener("mousedown", this.onMouseDown), e.addEventListener("mouseup", this.onMouseUp), e.addEventListener("mousemove", this.updateByMousePosition), e.addEventListener("wheel", this.onMouseWheel), e.addEventListener("mouseenter", this.onMouseEnter), e.addEventListener("mouseout", this.onMouseLeave), this.five.on("wantsPanGesture", this.onFiveWantsPanGesture)) : this.mode === "fixed" && (this.five.on("panoArrived", this.renderScreenCenter), this.five.on("panGesture", this.renderScreenCenter), this.five.on("interiaPan", this.renderScreenCenter), this.renderScreenCenter(), this.pointSelectorHelper.show()), document.addEventListener("keydown", this.onKeyDown), document.addEventListener("keyup", this.onKeyUp), this.pointSelectorHelper.hooks.on("intersectionUpdate", this.emitIntersectionUpdate), this.lastFiveHelperVisible = this.five.helperVisible, this.five.helperVisible = !1, this.emit("enable");
|
|
661
|
+
}
|
|
662
|
+
disable() {
|
|
663
|
+
if (this.onTouchCancel(), !this.enabled) return;
|
|
664
|
+
this.enabled = !1, this.adherePoints = null, this.adhereLine = [], this.adherePlane = [], this.plane = void 0, this.pointSelectorHelper.disable(), this.five.getElement().style.cursor = "";
|
|
665
|
+
let e = this.five.getElement();
|
|
666
|
+
this.five.off("wantsPanGesture", this.onFiveWantsPanGesture), this.five.off("wantsMoveToPano", X), this.five.off("wantsChangeMode", X), this.five.off("wantsTapGesture", X), this.five.helperVisible = this.lastFiveHelperVisible, e?.removeEventListener("touchstart", this.onTouchStart), e?.removeEventListener("touchmove", this.onTouchMove), e?.removeEventListener("touchend", this.onTouchEnd), e?.removeEventListener("touchcancel", this.onTouchCancel), e?.removeEventListener("mousedown", this.onMouseDown), e?.removeEventListener("mouseup", this.onMouseUp), e?.removeEventListener("mousemove", this.updateByMousePosition), e?.removeEventListener("wheel", this.onMouseWheel), e?.removeEventListener("mouseenter", this.onMouseEnter), e?.removeEventListener("mouseout", this.onMouseLeave), this.five.off("panoArrived", this.renderScreenCenter), this.five.off("panGesture", this.renderScreenCenter), this.five.off("interiaPan", this.renderScreenCenter), document.removeEventListener("keydown", this.onKeyDown), document.removeEventListener("keyup", this.onKeyUp), this.pointSelectorHelper.hooks.off("intersectionUpdate", this.emitIntersectionUpdate), this.emit("disable");
|
|
667
|
+
}
|
|
668
|
+
dispose() {
|
|
669
|
+
this.disable(), this.pointSelectorHelper.dispose(), this.off();
|
|
670
|
+
}
|
|
671
|
+
setAdherePoints(e) {
|
|
672
|
+
this.adherePoints = e ? typeof e == "function" ? e : () => e : null;
|
|
673
|
+
}
|
|
674
|
+
select = (e) => {
|
|
675
|
+
e && this.updatePointSelectorHelperIntersect(e);
|
|
676
|
+
let t = this.emit("wantsSelect", this.position);
|
|
677
|
+
return t || (this.pointSelectorHelper.hide(), this.emit("select", this.position), console.debug(this.position)), !t;
|
|
678
|
+
};
|
|
679
|
+
onKeyDown = (e) => {
|
|
680
|
+
e.key === "Shift" && (this.adhereEnabled = !1);
|
|
681
|
+
};
|
|
682
|
+
onKeyUp = (e) => {
|
|
683
|
+
e.key === "Shift" && (this.adhereEnabled = !0);
|
|
684
|
+
};
|
|
685
|
+
onMouseWheel = (e) => {
|
|
686
|
+
this.updateByMousePosition(e);
|
|
687
|
+
let t = () => this.updateByMousePosition();
|
|
688
|
+
this.five.off("render.prepare", t), this.five.on("render.prepare", t), setTimeout(() => {
|
|
689
|
+
this.five.off("render.prepare", t);
|
|
690
|
+
}, 200);
|
|
691
|
+
};
|
|
692
|
+
onEnter = () => {
|
|
693
|
+
this.cursorError || this.pointSelectorHelper.show(), this.outOfFive = !1;
|
|
694
|
+
};
|
|
695
|
+
onMouseEnter = () => {
|
|
696
|
+
this.onEnter(), this.emit("intersectionUpdate", this.position);
|
|
697
|
+
};
|
|
698
|
+
onMouseLeave = () => {
|
|
699
|
+
this.pointSelectorHelper.hide(), this.outOfFive = !0, this.emit("intersectionUpdate", void 0);
|
|
700
|
+
};
|
|
701
|
+
onMouseDown = (e) => {
|
|
702
|
+
this._mouseDownInfo = {
|
|
703
|
+
clientX: e.clientX,
|
|
704
|
+
clientY: e.clientY,
|
|
705
|
+
timestamp: performance.now()
|
|
706
|
+
};
|
|
707
|
+
};
|
|
708
|
+
onMouseUp = (e) => {
|
|
709
|
+
if (!this._mouseDownInfo) return;
|
|
710
|
+
let { clientX: t, clientY: n, timestamp: r } = this._mouseDownInfo;
|
|
711
|
+
Math.abs(e.clientX - t) < 2 && Math.abs(e.clientY - n) < 2 && performance.now() - r < 500 ? this.select() : this._mouseDownInfo = null;
|
|
712
|
+
};
|
|
713
|
+
onTouchCancel = () => {
|
|
714
|
+
this.setPressDown && clearTimeout(this.setPressDown), this.setPressDown = void 0, this.pressDown = !1, this._touchStartInfo = null;
|
|
715
|
+
};
|
|
716
|
+
onTouchStart = (e) => {
|
|
717
|
+
this.onTouchCancel(), e.touches.length === 1 && (this._touchStartInfo = {
|
|
718
|
+
clientX: e.touches[0].clientX,
|
|
719
|
+
clientY: e.touches[0].clientY,
|
|
720
|
+
timestamp: performance.now()
|
|
721
|
+
}, this.setPressDown = setTimeout(() => {
|
|
722
|
+
if (this.setPressDown = void 0, this.mousePosition = {
|
|
723
|
+
clientX: e.touches[0].clientX,
|
|
724
|
+
clientY: e.touches[0].clientY
|
|
725
|
+
}, !this.mouseNdcPosition) return;
|
|
726
|
+
let t = this.updateByNdcPosition(this.mouseNdcPosition);
|
|
727
|
+
this.pressDown = t;
|
|
728
|
+
}, 200));
|
|
729
|
+
};
|
|
730
|
+
onTouchMove = (e) => {
|
|
731
|
+
if (e.touches.length !== 1) this.onTouchCancel();
|
|
732
|
+
else if (this.setPressDown) {
|
|
733
|
+
let t = !1;
|
|
734
|
+
if (this._touchStartInfo) {
|
|
735
|
+
let { clientX: n, clientY: r } = this._touchStartInfo;
|
|
736
|
+
(Math.abs(e.touches[0].clientX - n) > 2 || Math.abs(e.touches[0].clientY - r) > 2) && (t = !0);
|
|
737
|
+
}
|
|
738
|
+
t && (clearTimeout(this.setPressDown), this.setPressDown = void 0);
|
|
739
|
+
} else if (this.pressDown) {
|
|
740
|
+
if (this.mousePosition = {
|
|
741
|
+
clientX: e.touches[0].clientX,
|
|
742
|
+
clientY: e.touches[0].clientY
|
|
743
|
+
}, !this.mouseNdcPosition) return;
|
|
744
|
+
this.updateByNdcPosition(this.mouseNdcPosition);
|
|
745
|
+
}
|
|
746
|
+
};
|
|
747
|
+
onTouchEnd = (e) => {
|
|
748
|
+
this.setPressDown ? (clearTimeout(this.setPressDown), this.setPressDown = void 0) : this.pressDown && (setTimeout(() => {
|
|
749
|
+
this.pressDown = !1;
|
|
750
|
+
}, 100), this.select());
|
|
751
|
+
};
|
|
752
|
+
updateByMousePosition = (e) => {
|
|
753
|
+
this.five.getElement() && (!e || e?.buttons !== 0 ? this.pointSelectorHelper.hide() : (this.pointSelectorHelper.show(), e && (this.mousePosition = {
|
|
754
|
+
clientX: e.clientX,
|
|
755
|
+
clientY: e.clientY
|
|
756
|
+
}), this.updateByNdcPosition(this.mouseNdcPosition)));
|
|
757
|
+
};
|
|
758
|
+
updateByNdcPosition = (e) => {
|
|
759
|
+
let t = W(this.five, e);
|
|
760
|
+
this.config.hitFilter && (t.hitFilter = this.config.hitFilter);
|
|
761
|
+
let n = G(this.five, t);
|
|
762
|
+
if (n) {
|
|
763
|
+
if (this.plane && this.planeMode === "vertical" && (n = {
|
|
764
|
+
...n,
|
|
765
|
+
point: this.plane.projectPoint(n.point, new f.Vector3()),
|
|
766
|
+
face: U(this.plane.normal.clone()),
|
|
767
|
+
originalPoint: n.point.clone()
|
|
768
|
+
}), this.plane && this.planeMode === "onlyPlane") {
|
|
769
|
+
let e = t.ray.intersectPlane(this.plane, Y);
|
|
770
|
+
if (!e) return !1;
|
|
771
|
+
n = {
|
|
772
|
+
distance: this.five.camera.position.distanceTo(e),
|
|
773
|
+
point: e.clone(),
|
|
774
|
+
originalPoint: n.point.clone(),
|
|
775
|
+
face: U(this.plane.normal.clone()),
|
|
776
|
+
raycaster: t
|
|
777
|
+
};
|
|
778
|
+
}
|
|
779
|
+
return this.updatePointSelectorHelperIntersect(n), this.lastIntersection = n, !0;
|
|
780
|
+
}
|
|
781
|
+
if (this.disableIfNoIntersection) return this.updatePointSelectorHelperIntersect(null), !1;
|
|
782
|
+
if (this.plane) {
|
|
783
|
+
let e = t.ray.intersectPlane(this.plane, Y);
|
|
784
|
+
if (e) {
|
|
785
|
+
let n = {
|
|
786
|
+
distance: this.five.camera.position.distanceTo(e),
|
|
787
|
+
point: e.clone(),
|
|
788
|
+
object: new f.Object3D(),
|
|
789
|
+
face: U(this.plane.normal.clone()),
|
|
790
|
+
raycaster: t,
|
|
791
|
+
isVirtual: !0
|
|
792
|
+
};
|
|
793
|
+
return this.updatePointSelectorHelperIntersect(n), !0;
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
if (this.actionIfNoIntersection === "lastPoint") return this.updatePointSelectorHelperIntersect(this.lastIntersection), !0;
|
|
797
|
+
if (this.actionIfNoIntersection === "virtualPoint") {
|
|
798
|
+
let e = K(t, this.lastIntersection?.distance);
|
|
799
|
+
return e.face = U(this.lastIntersection?.face?.normal), e.isVirtual = !0, this.lastIntersection = e, this.updatePointSelectorHelperIntersect(e), !0;
|
|
800
|
+
}
|
|
801
|
+
if (this.actionIfNoIntersection === "disable") return this.updatePointSelectorHelperIntersect(null), !1;
|
|
802
|
+
};
|
|
803
|
+
updatePointSelectorHelperIntersect = (e) => {
|
|
804
|
+
if (!e) {
|
|
805
|
+
this.pointSelectorHelper.hide(), this.pointSelectorHelper.position = e, this.emit("intersectionUpdate", e), this.five.getElement().style.cursor = J;
|
|
806
|
+
return;
|
|
807
|
+
}
|
|
808
|
+
this.onEnter(), this.cursorError || (this.five.getElement().style.cursor = "");
|
|
809
|
+
let t = { ...e };
|
|
810
|
+
if (this.adhereEnabled && this.mouseNdcPosition && this.five.renderer) {
|
|
811
|
+
let n = {
|
|
812
|
+
x: this.mouseNdcPosition.x,
|
|
813
|
+
y: 1 - this.mouseNdcPosition.y
|
|
814
|
+
}, r = this.five.renderer.getSize(new f.Vector2());
|
|
815
|
+
if (this.adhereEnabled && typeof this.adherePoints == "function" && typeof this.adhereRadius == "number") {
|
|
816
|
+
for (let n of this.adherePlane) {
|
|
817
|
+
let r = n.distanceToPoint(e.point), i = n.projectPoint(e.point, new f.Vector3());
|
|
818
|
+
(!this.plane || this.plane.distanceToPoint(i) < .01) && (i = this.plane?.projectPoint(i, new f.Vector3()) ?? i, r < this.adhereRadius && (t.point = i.clone(), t.adherePoint = i.clone(), this.plane || (t.face = U(n.normal.clone())), t.isAdsorbed = !0));
|
|
819
|
+
}
|
|
820
|
+
for (let i of this.adhereLine) {
|
|
821
|
+
let a = i.closestPointToPoint(e.point, !1, new f.Vector3());
|
|
822
|
+
if (a.distanceTo(e.point) < this.adhereRadius) (!this.plane || this.plane.distanceToPoint(a) < .01) && (a = this.plane?.projectPoint(a, new f.Vector3()) ?? a, t.point = a.clone(), t.adhereLine = i.clone(), t.isAdsorbed = !0);
|
|
823
|
+
else {
|
|
824
|
+
let a = d({
|
|
825
|
+
raycaster: new u(this.five.camera.position, e.point.clone().sub(this.five.camera.position).normalize()),
|
|
826
|
+
line: i,
|
|
827
|
+
clampToLine: !1
|
|
828
|
+
}), o = a.clone().project(this.five.camera);
|
|
829
|
+
if (o.z <= 1) {
|
|
830
|
+
let e = {
|
|
831
|
+
x: (o.x + 1) / 2,
|
|
832
|
+
y: (1 - o.y) / 2
|
|
833
|
+
}, s = {
|
|
834
|
+
x: Math.abs(e.x - n.x) * r.width,
|
|
835
|
+
y: Math.abs(e.y - n.y) * r.height
|
|
836
|
+
}, c = a.clone();
|
|
837
|
+
s.x < 10 && s.y < 10 && (!this.plane || this.plane.distanceToPoint(c) < .01) && (c = this.plane?.projectPoint(c, new f.Vector3()) ?? c, t.point = c.clone(), t.adhereLine = i.clone(), t.isAdsorbed = !0);
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
for (let r of this.adherePoints({
|
|
842
|
+
intersection: e,
|
|
843
|
+
pointSelectorInstance: this
|
|
844
|
+
})) {
|
|
845
|
+
let i = r;
|
|
846
|
+
if (i.IsAlwaysVisible = r.IsAlwaysVisible, !(this.plane && this.plane.distanceToPoint(i) > .01)) {
|
|
847
|
+
if (i.distanceTo(e.point) < this.adhereRadius) {
|
|
848
|
+
t.point = this.plane?.projectPoint(i, new f.Vector3()) ?? i.clone(), !this.plane && r.normal && (t.face = U(r.normal)), t.isAdsorbed = !0;
|
|
849
|
+
break;
|
|
850
|
+
}
|
|
851
|
+
{
|
|
852
|
+
let e = i.clone().project(this.five.camera);
|
|
853
|
+
if (e.z > 1) continue;
|
|
854
|
+
let a = this.five.renderer.getSize(new f.Vector2()), o = {
|
|
855
|
+
x: (e.x + 1) / 2,
|
|
856
|
+
y: (1 - e.y) / 2
|
|
857
|
+
}, s = {
|
|
858
|
+
x: Math.abs(o.x - n.x) * a.width,
|
|
859
|
+
y: Math.abs(o.y - n.y) * a.height
|
|
860
|
+
};
|
|
861
|
+
if (s.x < 10 && s.y < 10) {
|
|
862
|
+
let e = !1;
|
|
863
|
+
if (i.IsAlwaysVisible) e = !0;
|
|
864
|
+
else {
|
|
865
|
+
let t = new f.Raycaster();
|
|
866
|
+
t.setFromCamera(new f.Vector2(o.x, o.y), this.five.camera);
|
|
867
|
+
let n = this.five.model.intersectRaycaster(t)[0], r = this.five.camera.position.distanceTo(i);
|
|
868
|
+
n && n.distance < r + .1 && (e = !0);
|
|
869
|
+
}
|
|
870
|
+
if (e) {
|
|
871
|
+
t.point = i.clone(), !this.plane && r.normal && (t.face = U(r.normal)), t.isAdsorbed = !0;
|
|
872
|
+
break;
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
}
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
this.pointSelectorHelper.updateWithIntersect(t, { emitEvent: !1 }), this.emit("intersectionUpdate", t);
|
|
881
|
+
};
|
|
882
|
+
mousePositionToNdcPosition = (e) => {
|
|
883
|
+
let t = this.five.getElement();
|
|
884
|
+
if (!t) return null;
|
|
885
|
+
let { top: n, left: r, width: i, height: a } = t.getBoundingClientRect(), { clientX: o, clientY: s } = e;
|
|
886
|
+
return {
|
|
887
|
+
x: (o - r) / i,
|
|
888
|
+
y: 1 - (s - n) / a
|
|
889
|
+
};
|
|
890
|
+
};
|
|
891
|
+
onFiveWantsPanGesture = () => {
|
|
892
|
+
if (this.pressDown) return !1;
|
|
893
|
+
};
|
|
894
|
+
renderScreenCenter = () => {
|
|
895
|
+
this.updateByNdcPosition({
|
|
896
|
+
x: .5,
|
|
897
|
+
y: .5
|
|
898
|
+
});
|
|
899
|
+
};
|
|
900
|
+
emitIntersectionUpdate = (e) => {
|
|
901
|
+
this.emit("intersectionUpdate", e);
|
|
902
|
+
};
|
|
903
|
+
}, ne = "data:image/png;base64,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", Q = "data:image/png;base64,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", re = `
|
|
904
|
+
<style>
|
|
905
|
+
.range-piece__container {
|
|
906
|
+
position: absolute;
|
|
907
|
+
top: 39%;
|
|
908
|
+
left: 50%;
|
|
909
|
+
margin-left: -54px;
|
|
910
|
+
width: 108px;
|
|
911
|
+
height: 108px;
|
|
912
|
+
display: flex;
|
|
913
|
+
align-items: center;
|
|
914
|
+
justify-content: center;
|
|
915
|
+
animation: pieceContainer 0.3s ease-in-out;
|
|
916
|
+
animation-fill-mode: forwards;
|
|
917
|
+
}
|
|
918
|
+
.range-piece__content {
|
|
919
|
+
width: 100%;
|
|
920
|
+
height: 100%;
|
|
921
|
+
background-image: url(${Q});
|
|
922
|
+
opacity: 0.4;
|
|
923
|
+
background-size: 100%;
|
|
924
|
+
background-repeat: no-repeat;
|
|
925
|
+
transition: linear transform 0.1s;
|
|
926
|
+
}
|
|
927
|
+
.range-piece__content--active {
|
|
928
|
+
animation: dotting ease-in-out 0.5s;
|
|
929
|
+
}
|
|
930
|
+
.range-piece__aim {
|
|
931
|
+
width: 100%;
|
|
932
|
+
height: 100%;
|
|
933
|
+
opacity: 1;
|
|
934
|
+
position: absolute;
|
|
935
|
+
background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbYAAAGwCAYAAADFUEBtAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAABtqADAAQAAAABAAABsAAAAABTZ8U6AAAtiklEQVR4Ae2dAXJbSbJdp+d7AfYSHOGVeAPek5fkNXgLjviLmRkZl+CRbtc8UBKRRalZpyIesiorMx/eIcjb+QCh//Y3hwQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkMEbgj7FKFpLA4QS+fPnyx23czJc//V498h2Oy8uXwDYCf/oF3HYWC0vgAAI3QfuP22V+uR35vYplrOsX/03w/kWAVgISmCPwX+ZKWUkCErgR+PvtiKjF9uj/iMx+C1/HOZeABJ4koLA9CdB0CRQBxKxFrLa/Tung7Ni+InEigTkCCtscSytJIATo2BC3dGYIWfvs2Hy9SGATAYVtE1jLHkkgohbxQsACgTkWn8IWEg4JbCCgsG2AasljCXArMgB6DpAWs3/i1EpAArMEFLZZnlY7m0C6snwyMuPqFiT+2Cvhi98hAQk8SUBhexKg6RIoAtyKjItbj1jCWGPxayUggSECCtsQSMtI4EYgYhVx624tYOK/8mXPIQEJDBNQ2IaBWu5oAnRh3GZkHSiIG8J3NCgvXgI7CShsO+la+zQCEa0ciBgWDlnji3VIQAIbCChsG6Ba8mgCdGSxjCsRu/IRr5WABJ4goLA9Ac9UCSwE6Nj6Y/0RsBxXviXdpQQkMEFAYZugaA0J3AnQhdG1xYsPccPKTAIS2ERAYdsE1rJHEohocQsy8xwZdGuse+8e4aMEJDBGQGEbQ2khCXz94AgCxkf8gwZf5u3P2iEBCQwSUNgGYVpKAjcC+eYRRKw7NeaBpLCFgkMCmwgobJvAWvZIAhE1bkUGAAK3zq/W8TkkIIEBAgrbAERLSOCVQISsPzgSd3x0a8xjczgkIIENBBS2DVAteSwBBGsVrV4zxx4LywuXwC4CCtsustY9kUDEio4t8/W9tO7cTuTjNUvgQwgobB+C2ZMcQoD317BX4kanhj0EjZcpgY8joLB9HGvP9PkJRKwiai1odm2f/+fuFf5mBBS23+wH4tP5yxPgViRdWy6I7iwihx/fX/6CvQAJ/G4EFLbf7Sfi8/krE+DfsEW0umvrOdensEFCK4FhAgrbMFDLHU0AQUO0sHRq3JaMdUhAApsIKGybwFr2SAIRsr7ViLAFRsSsha33su+QgASGCChsQyAtI4EbgYhabkdmRLi6M1uFbF2/JPkgAQk8T0Bhe56hFSQAgYgVHVt8iBsWX2zHZe2QgASGCChsQyAtI4EbgQhYjh6s23Yn17HOJSCBAQIK2wBES0jglUC6sBy8l9Zg8MUmBqHrGOcSkMAAAYVtAKIlJPBKIGLFsULBT7emsK2EXEtgiIDCNgTSMhK4EUC8EK0WsZ6zLzQJSGADAYVtA1RLHksggtUfCmkB63kAretjoXnhEpgmoLBNE7XeyQQQNrqzlUX22VPYVjquJTBEQGEbAmkZCdwI8KGQt0SLPazgJCCBYQIK2zBQyx1PgE9FAiICli4NG7+iFgoOCWwioLBtAmvZIwnw/hpfhsxtxxUGQrf6XUtAAgMEFLYBiJaQwCuBCBu/UxEvhG4F9NbeGutaAhL4SQL8Ev5kmuESkMAFgdxi5Fbko9uNj/wX5XRJQALvIaCwvYeaORK4JhBRQ7hi37rlSNx1Jb0SkMC7CShs70ZnogT+jUDEiiObLV6ZR+gYvYdPKwEJDBBQ2AYgWkICrwQQNUSsxWt9X633BCgBCQwSUNgGYVrqeAIRKz4wsgrX99bHwxOABKYIKGxTJK0jgfutx/XDI7zPxm1IBA4rNwlIYJiAwjYM1HJHE+DDIy1azLFHA/LiJfARBBS2j6DsOU4hEPFaOzauvTu3xCl0kNFKYJiAwjYM1HJHE0CwEC3W3IZE3AKJmKOBefES2EFAYdtB1ZqnEki3lq/TYiBkLWL4iNFKQALDBBS2YaCWO5oAHRoQ1tuSLWrZc0hAAhsIKGwboFryWAIRKwQLEYvYPZofC8oLl8BOAgrbTrrWPo1Ad2x0a2FwNe/bk6dx8nolsJWAwrYVr8UPIxCxomPj0hGw2O7c2NdKQALDBBS2YaCWO5pAxGsVsgbSe8x737kEJDBAQGEbgGgJCbwSSLdGx5bujPkKiM5t9buWgAQGCChsAxAtIYFXAmvH9gjMI8F7FK9fAhL4CQIK20/AMlQC3yEQYYto0ZHFZvRtR/bad4/yUQISGCGgsI1gtIgEXgjQsSFa2MaDD9t7ziUggQECCtsAREtI4JVAurUIFscVmKsu7ipOnwQk8E4CCts7wZkmgQcE8jvF7cYrEbvyPSilWwISeA8Bhe091MyRwDWBfE9kd2tXtxvxYa8r6ZWABN5NQGF7NzoTJfBvBBC1WDozgvC1ZU8rAQkMElDYBmFa6ngCES0+Fbl+pD9Chy9xORwSkMAGAgrbBqiWPJYAgoW4NQj24lu7uY5zLgEJPElAYXsSoOkSKAIRtO7KEDC6M9aJwVfpTiUggQkCCtsERWtI4E6gu7J4unPLHsKWPYUtFBwS2EBAYdsA1ZLHEohY0bFFxBC6R/NjQXnhEthJQGHbSdfapxFAyHLd3a09mp/Gx+uVwIcQUNg+BLMnOYRABIyOjUtmna6NW5HxeSsSQloJDBNQ2IaBWu54AnRtCFeLGbck/3WjxP7xwAQggWkCCts0UeudTCDfPJKjRwsYc76hpOOcS0ACQwQUtiGQlpHAjUCEK7cZ6cwChTmdG+KGTYxDAhIYJKCwDcK01PEEIlYcwEDAsKuftVYCEhgioLANgbSMBG4EHolad22JYS00CUhgAwGFbQNUSx5LILch+RRkQ6Bba8u845xLQAIDBBS2AYiWkMArgYhVv8fW76vRpeETmgQksImAwrYJrGWPJBBh4wiAtSt7a+9IYF60BHYQUNh2ULXmqQQQrti1M0Pk2GN9KiuvWwLbCChs29Ba+EACvMcWUVvfa+NWZLBE1BS2kHBIYAMBhW0DVEseTQDRamFrUcs8h0MCEthEQGHbBNayRxKImPGtIi1e3Z1l3kJ3JCgvWgI7CShsO+la+zQCb92KbBYKW9NwLoFhAgrbMFDLHU2A25DdoV0ByX7fqryK0ScBCbyTgML2TnCmSeCCAILVHRlzbNIyd0hAApsIKGybwFr2SALpwujaAED3ho1/jSFWKwEJDBBQ2AYgWkICrwRasBCytTvDLzQJSGATAYVtE1jLHkkgorW+d/ZIyNa4I4F50RLYQUBh20HVmqcSQNjo0rJmDpNHQse+VgISeJKAwvYkQNMlUATW99giao86MwWuwDmVwCQBhW2SprUk8OevyqKD+9cNDN1bW3lJQAIbCChsG6Ba8lgC6c440q0hYvk2Egb+7DkkIIENBBS2DVAteSyBiFVEbL0F2SKWPYcEJLCRgMK2Ea6ljyPQ3RoXH1HLgaAhco/eeyNPKwEJvJOAwvZOcKZJ4IIAYhW7Chni1vaihC4JSOBZAgrbswTNl8A3AhEtxI3ODCFLVPu+ZTmTgARGCShsozgtdjiBCBdHUKRruxKz9ifOIQEJDBJQ2AZhWup4AhGxdGyxLV6IG4CyXn3saSUggScJKGxPAjRdAkUgYsX7a9ySbIEjND6HBCSwiYDCtgmsZY8kQLfW3VjPgRLflZ99rQQk8AQBhe0JeKZK4IIAHRvCRceGTUrPL0rokoAEniGgsD1Dz1wJ/JnA2rGtnVm+Witj9d+9PkpAAiMEFLYRjBaRwAsBhC2W0d0Z++0jTisBCQwRUNiGQFpGAq8E8pVa6cgQLyyAWHOrEr9WAhIYIqCwDYG0jARuBNKR5Yh4ddeGiLUf3y3UIQEJTBJQ2CZpWut0AtxqjGjl6O6MOYwUNkhoJTBMQGEbBmq5owkgaIgWlk4NccMeDcuLl8AuAgrbLrLWPZEAtyK59ghbixjC1z5itRKQwBABhW0IpGUk8EqA99jo1uLuuaLmS0UCmwkobJsBW/4oAnRsES9Gd2nxIXJY4rQSkMAQAYVtCKRlJHAjgFjRtQVKfBE6fKyz55CABDYQUNg2QLXksQQiWhGwDESuhax9zO/RPkpAAmMEFLYxlBaSwIuYRbA4rpCke/N9tisy+iQwREBhGwJpGQncCETQeJ8tQHivLf51Hp9DAhLYQEBh2wDVkscSiFjlK7UYLV49Z18rAQlsIKCwbYBqyWMJRNT4kMgVhIhbd25XMfokIIEnCShsTwI0XQJFIMJFZ4Zlm/fV8PMhE/a1EpDAEAGFbQikZSRwIxDRWju2+CJq7Y8PgbtNHRKQwCQBhW2SprVOJ0AXhg0PRA02CBoWv1YCEhgioLANgbSMBG4EIlYRtVhuPcZm4LuvfJSABLYRUNi2obXwoQS45dhdG6IWmyMDe1/5KAEJjBFQ2MZQWkgCLx/1R7xi6dqYNyKFrWk4l8AgAYVtEKaljifQohYY3bVF5BA6bk8eD0wAEthBQGHbQdWaJxNAzBC5sEDQ6NxYn8zJa5fANgIK2za0Fj6QQIQrwhbbo9eZ/+t2tK9jnUtAAk8SUNieBGi6BIpARC3fPtIdGfPYDAQNe/f6KAEJjBFQ2MZQWkgCL6IVwWrRYo4Npv4+SbFJQALDBBS2YaCWO5rA+l2RLWbducXfe0dD8+IlME1AYZsmar2TCSBYV6KFD8uHTE7m5bVLYAsBhW0LVoseSmAVtn5fjXnQIG6HYvKyJbCXgMK2l6/VzyPQnVgLWM9DpePOo+QVS2AjAYVtI1xLH0cgYpWju7OGEHFjbxW6jnMuAQk8QUBhewKeqRJYCETUECwsIRG0+HIgbuxpJSCBQQIK2yBMS0ngRqA7NoQMMPmH2Rmr/+71UQISGCGgsI1gtIgEXghE1DJiW+BenLcH/vE2a60EJLCBgMK2AaoljyWQTqxFDaFrIN21td+5BCQwREBhGwJpGQncCCBsb91qpGtLjEMCEthAQGHbANWSxxJIh4aoxfIhkRaxK9+xwLxwCewgoLDtoGrNkwn090C2oMEkPm5H4tNKQAKDBBS2QZiWOp5Ad2x8vD9Q6NIyj7ARl7VDAhIYJqCwDQO13NEEEK1AoFuLqK0fImnROxqYFy+BHQQUth1UrXkqAYQN4cLGn3kGc4Tv7vVRAhIYI6CwjaG0kARe/p1aBKtFizk2mHouNglIYJiAwjYM1HLHE8htR7qzfi+tPzASYVPcjn+pCGAXAYVtF1nrnkiA99KwLV78+zW49B4+rQQkMEBAYRuAaAkJvBKIoHWXBhhEjK4ta3zEaCUggSECCtsQSMtI4JVAhC23IhE4bksiZr0WmgQksIGAwrYBqiWPJRDxQtgQstiIGevu2o4F5YVLYCcBhW0nXWufRgDxynX3e2qIXfzME+uQgAQ2EFDYNkC15LEEIlqrcCFgsd6GPPal4YV/JAGF7SNpe65TCETEELi+ZsWtaTiXwCYCCtsmsJY9kgCChqhh42f4HhsktBLYREBh2wTWskcSQNhyyzGiltGiljX+zB0SkMAGAscI25cvX/IHhj8y+ePCmj807QvqK3/7EkMNbO8zZ++RTdy6l9rk9/6Vb41lfRW7nidr6pPXMfERs+53feKI7Rr4Oqb3OX/73po/E881XFmeZyz7PA+ulfVqEx/ff3+1mSen31Pjk5F0bP/r9pr8H68x2SM2+6yxN9fX/9UN+T9iiaHO9+zVuR/l/ExsarwVv14fzxvLc2Dddt1jvdrkxIddz5l175PPua7W1GLvkU3tf77WJyY+ancd5uwnnnnb+FMzg5rYl7p//PEH9e9RBz3mF/CIUcLWfxjzyTXWWP4oscYmlr237Fs11zxi8zPIeTjXapPHf4QkJ4P42AxyqMm58K9xWa+xySEPS17Oj6/j2E8t/Fd1E7fmX8URs8ZTf/Wva/K7Nr63bNd/VLPzmV/FZi9HRvb5gxObwR8c/ohhs88c2778IYu/97LffzTZw2b/H7ej6/Temk9s/OQQv1rOu/rJw2afA99b9lHd9TzUbD/ztT6x+L8X92h/zU8cz5e9tsw7rmtnP/kZ8ffRudknjvNhqYcl78tN3DI/buSX7tTRf3xggC82Lwj+OF3tx3e1T+yP2h954fHHkfPFMu98fFfn5nrIJbbzH+Vx/t7vfObZT2zWnC++jPU8iem8xLSv89e4xDK6buJy/hw/Ovqcb51nrbcKZ+dSExZXNvU6Z62/ruGxXh/X/1YtePC8sDkHdcnnua7nz5o8LHWJpQZrLPGssWt8r3lexLYlLpbrz37W7K35+BOXwfpR/j3q22PHrfl93m8Z386Bjzhs/OvzJLZt4juO/B/l37WOmK9gPvtF8wLJdeaFwos1/gzWvIiIaU74Ov6t/MSxj8XH+fCzXm3iGZwfG3/nM8dSa81nPzYHce0nJxY/cdj2r/PEXMVR79Fe7yeGutjsM+Jb/dSNfZTfeeR3Xup3fmLyOiCPvcSR3zEdmzlHxxLfIpl6/Zx5TvFnsE5u1+rnc5Wf82cQh717v/m7bmIyOE/m5GGv4snDJi+j62TNPv5ex5d1DvaxxMXC+Tb9Wi/zq/yOoUbi1rqPfJ2feY/Uy0GtWHyJw48Pm72MrDPIyxxf5gzysPF37ayzhy/r4wYv9k9/4a8tef/A84Pnhx//jwziyMPiTw3q9rmofRXHXudSF9sxV3HU/dGf51r36rlyzr4ezt2245ivNjV4jn1u5uyteVn3Na1xa37WHMntedbkU3PNT8w6Eksce6yx1GUfm33yiY3lIK7zE5+jfcTFdp2sE8ugLjH4Y1MP/2qzT27mGTzv++r+yHMiljr4OzZz9vE/Wnc+tcnBJqbj4qfe6ienY/CRg43/rXzyiOm8dd5r8rDkZ524PvDFZvAzfVRvzb2q3b571YMeAfjpL/n1Pba+zrw4+OH3PDH9guo5+eRhOx9fYpljyWfvkZ+43ud5cK7ssc8eddtSizwsfmpc2fiI73N0/TUvex17lc8+ucRQt9f4YtfR+WvNxLKPJZ81ltzVEo9NfD+3zo8fMcDGx4Gva2VOjbbUwpe4+HqwF9t77WeePGJi8WOzz7xtzxOTQX722Mf3EvAakzn7+B+t33pu1CaGWmt9aseusexd5RLfMZyz49eanJ+/oeSvljxqYhPHQa2265w19ThP/PioHd/fTn1/LdfODyXzTz0e/JB5QeTae86Lpn0dgx+77nV+Yoh7ZJPfo/Px44td6xATyx4+1uRhiWW/4zlX7+HrOOarJfYqfz3/mpucNYY6jyznoxbrjseXmPaT05bYxBGb/cyzhw+bPQYxWWfOQU0sudi38rNHHpa678knB8u5Y+N7dA72yMOSx3rNz34G+6u97357TH5iOo6aiWp/1j2yR2zH4cNmjwMfdXpNjfYRxx7r2PgSu+7hwxIb26PzMl/XV8+j8zN/ibn4j/k17tOujxG2+lQkP8x8goixvlh4MeHHrvHxc/Re56/7iVvrxUdOz78Xl1gG+Vc5xMQmjueExR8bH7WyZsTX/vU87LW/5+THwj77HFf5OTf7mTPwYePPnLHWyh7nJ2a12adG5+MjvuPwJSZHrquvjXUsMV375r48Z/xdJ2tG51Mztv3MyYmND3/i19F7PeccxLPHOpZ6WGLIxU9O+5l3nc7HH9/qp17s1R7njWUfy3mJaT/ztX77yefnxB7noi412Mfix+LvPM7RPuLIi+39rK9i4j9mHCNsrz9RXihZXv3wr3zJwc8LiHUs80c128/51xz8if3e4DkQl1rk9x7naB9x2euDWm2pm1/crtX1Et97VzWJ59ysySW/1+27On+fp2NT42oQc/UcEo+fuK7B3vfisr/m57nnWGskltE5mRPLnDhs9nsQv/qpiz+Wj4uzlzqchzhq95r4+NpPPjnEscbih0XWfaxxrGNzPvI5P+uOy/yqJn5ief5Xsfg6h3jOzZrY2Az899WfnzP71CAmlvz2vVVr3eu8P80f3KX6U8xnXZwmbPk58kLqF8jqYy/+HPmFzFjj7t5/93c+MdjUyD4xsWtd9vAnt+dZM9b8R3Hx9x5/ZDgXlpi1LudjnzV5WfOHE1+fkzwsTK/Oc5XP+ZLPfizz7HfNrDlX5gzyk0c8cdTC4k9ufBzkxZ9BXPyJiSWG9ZVdfc0ve9S9Tb/O8WU/R0b77p5ve71+FNf+zHnu+FMj817Hl5HnjJ/ng8WfOOax7MefwR7+Pv8av66JTS75WOq+nOT1AR/xxGabeWoyf037+hy/l8/+Vd66lxjOg01Mz7vOVX728ZP3Yr0VCbozLD98XgyPrjpxxK4x5LKPTVz2Hu3jX+utecRR961fNGr1eeMjl3mv4+McmWes67v3/sgfj6yos8ZzfvZjmd+r3B/xJT5zbMdk3vmcfz1n4lZf53Eu7NW5spf62buqdXN/vY7OJy+5OThH4vGtlpyOTXwG58fevffHxJPDudbnSt7qT4Xk9CD2ytexnLPPT05qJPbqfPg6n1h8qdPzrMlj72q/fT3v3DU/cVwXOcRjk3M12CcPi5+crNtHHPucn3XHxtfrnmcvtdZ6iemaWZOHvbnOHEcBuP0XTDpUXgBYutZ13X7y2kf8lU3cz8RSI69C8mLxY/FdxcXXcdTBh1391GT/LftWLM+J/D7P1RzfWzUf1cLfdj0/e12fmCvb8ez3c4yPmNWy9z9vk/+WxW2Qmz9Iicfyx+g/b77/9+rnD9dqb9tf/3iRF9txicn60X7HMu9Y8qlBzCOb+OSvz+Mqntiuje+RvapDfnJ6/3vPoc+RzjK5Gev1v1Vnje3zrx127/U85/zR8/dzuXquXZfzr8+R9bHfPMLXNAXgpx+3e878wD/9tXqBH0/g9h9O//d21v96O/LHpwfr2LwGI3T/5/Z6/N8d5FwCEpghcJSwzSCzigQeEmjhajFLAl1b/BwPC7khAQm8n4DC9n52ZkpgJYBgxUbIesSXQcx95aMEJDBOQGEbR2rBwwlwu/vqPbagQfQQusNxefkSmCegsM0zteK5BOjGrsQLISPmXEpeuQQ2E1DYNgO2/FEE0q3RsWEDIPN+jy0+hC5zhwQkMEhAYRuEaanjCXQ31mIWMAjZao+HJgAJTBNQ2KaJWu9kAhEtOrV0aHRpfJCkhQ+BO5mX1y6BLQQUti1YLXoogVW4ELTg6D3Wh2LysiWwl4DCtpev1c8ikG5tvQWZT0ciarF0cZk7JCCBDQQUtg1QLXk0gQgW4hYQfO1Ri9rRgLx4CewmoLDtJmz9kwhExBC12Aw6tPvq/hiRs2NrIs4lMEhAYRuEaanjCSBYLVrrPOsrsTsengAkMEVAYZsiaR0J/Pt7aWGCkPU83VwLXvYcEpDAEAGFbQikZSRwIxCx4hZkC9c677XgJCCBYQIK2zBQyx1NIKKW99lyqzFHRkSMW4/47Nhe0PgggT0EFLY9XK16JoGIGN0YNiSYt2V+JimvWgIbCShsG+Fa+jgCEat0Y2vHFhB0bYlhHr9DAhIYJqCwDQO13NEEIlociFvWDPZ4Hw6/VgISGCSgsA3CtNTxBHjvDDHjW0cicuxlnkHMfeWjBCQwRkBhG0NpIQm8EOhu7B83D0IGHgQNi18rAQkMEVDYhkBaRgI3AhG1FjagRMQicG0VNuhoJTBMQGEbBmq5owlErFbBYr3ao0F58RLYSUBh20nX2qcRQNhi6dDCgDk2vqvOLn6HBCTwJAGF7UmApkugCETQECw6tGwzx1aKUwlIYJqAwjZN1HonE+A9tu7M4IEPiwCyr5WABIYIKGxDIC0jgRuBiFW6sqvODB9WYBKQwCYCCtsmsJY9kkBEK+JGVxYIzGMZCCBrrQQkMEhAYRuEaanjCUTY8iXI/3E76MxWG0jx4c/aIQEJDBJQ2AZhWup4AnRi+YfZ+daRq5GYDIXtzsFHCYwTUNjGkVrwcAII1ipu+GP7tuThuLx8CcwTUNjmmVrxXALpxujIIl65LZnB+2zM6exeNn2QgARmCShsszytdjaBdGPdmdGdtY9uDd/ZxLx6CWwgoLBtgGrJYwlErLpjy3oVsKy7gzsWlhcugV0EFLZdZK17IoEWslXQmgfi1z7nEpDAEAGFbQikZSRwI8B7Z4jaVWfmrUhfKhLYTEBh2wzY8kcRiKB1N5Y5QgYIRA+LXysBCQwRUNiGQFpGAjcCq7ABJX66N2wLIHFaCUhggIDCNgDREhJ4JcCtyAZCZ7bajnEuAQkMElDYBmFa6ngCEbb827V0ZXRmgZI5IwLHgU8rAQkMElDYBmFa6ngCCFYErr9Si24tgJhjj4cmAAlME1DYpola72QCESveO+NbRx7xUNgekdEvgScJKGxPAjRdAkUgYsXRtx8TEv/qi98hAQkME1DYhoFa7mgCES86tsyvBn7sVYw+CUjgCQIK2xPwTJXAQgBhozNDvFgjelmzt5RwKQEJPEtAYXuWoPkS+EYgwhXBQrQQsKyZJ7pjsnZIQAKDBBS2QZiWOp5ACxZiFiiP5scDE4AEdhBQ2HZQteapBCJgfbvxrXliHRKQwAYCCtsGqJY8lkDECsFi3rcgA6b3jwXlhUtgJwGFbSdda59GIP92rbs0xG3lsIrduu9aAhJ4goDC9gQ8UyWwEIiQRdzyrSN0ZkvIyzIxb+1f5eiTgAR+kIDC9oOgDJPADxCgQ+NbR1aBazHr+Q+UNkQCEvhRAgrbj5IyTgLfJ4CwxeZ24z9eU7j1iI1bYXuFo5HANAGFbZqo9U4mELHiPbYWLubYMOr5ycy8dgmME1DYxpFa8GACEasIG51ZbEaLGL77jo8SkMA4AYVtHKkFDyYQUYuIIWTYRoIP23vOJSCBAQIK2wBES0jglUDEahWsrOngEkbHtsZlzyEBCQwQUNgGIFpCAq8EIlZ9KxIwq4hlvfqI1UpAAk8SUNieBGi6BIoAgoW41daLkHXn1nvOJSCBQQIK2yBMSx1PIIKWI+OtjgwBvEf6KAEJjBJQ2EZxWuxwAqtgIW68r4boZc38cGRevgTmCShs80yteC6BfONIDoSMW48RuJ6fS8grl8AHEFDYPgCypziGAB1bd2P5Wi3WiFuA0M0dA8cLlcBHEVDYPoq05zmFACLG9fK9kVm3mPWcWK0EJDBAQGEbgGgJCbwSiKjRtdGdxTIQM/bwayUggUECCtsgTEsdTyDCxXtsiBg2cDJX1ELCIYGNBBS2jXAtfRwBRCy2Ray7Nm5VEnscJC9YArsJKGy7CVv/JAIRK4Qr1414YWFh1wYJrQQ2EFDYNkC15LEEImAcLV7dsWW/946F5YVLYBcBhW0XWeueSCDdGh1bd2k9DxfE70RGXrMEthNQ2LYj9gQHEYhgRdjoyK46tYNweKkS+DUEFLZfw92zfk4C+UQk3VhEje6Nq6Vz686OPa0EJDBEQGEbAmkZCdwI0LHF5htHMjLvDg6xQ+RegnyQgATmCChscyytJIEQ4N+x0b1d3Y5U1HytSGAjAYVtI1xLH0eAbgxLpxYQiFl3cMcB8oIl8BEEFLaPoOw5TiEQ0aJjyzUjZuv1x/9ob411LQEJ/CQBhe0ngRkugTcIrIKFeHXnlvR1/UZJtyQggZ8loLD9LDHjJfCYQG5BruKWaASOzHWNXysBCQwQUNgGIFpCAq8EELVHwtWd2qMYYUpAAk8SUNieBGi6BIpAxIoPjpT767TFrOdfA5xIQALPE1DYnmdoBQlAIGLFQXcWy0DM2MOvlYAEBgkobIMwLXU8gQhXd2yI3ArmkX+Ncy0BCbyDgML2DmimSOABgXzUP0e+dSQCR2e2dm0K2w2OQwK7CChsu8ha90QCCNY/bhePmCFudHL4E+uQgAQ2EFDYNkC15NEEELBAQLwQt/YdDcmLl8BOAgrbTrrWPo1ARK1vQXL97UPkED1itBKQwBABhW0IpGUkcCPArUhECxELHHzMex2fQwISGCKgsA2BtIwEbgTSmSFuiFrWmTPYV9ggopXAMAGFbRio5Y4msIpWi1fPj4bkxUtgNwGFbTdh659EIOKVri0DkaNzu3u/PSp031g4k8AoAYVtFKfFDieAmCFaLWr4gqj9hyPz8iUwT0Bhm2dqxXMJRLzo2EKhxaypxP9or+OcS0AC7yCgsL0DmikSeEAg3zrCR/sTgnitHdq6flBOtwQk8B4CCtt7qJkjgWsCETI+GZmv1WIgcFlnzsG+VgISGCSgsA3CtNTxBBC2gEj35pCABH4BAYXtF0D3lJ+WAN1aBC63GzOYY/H1e3EvgT5IQAIzBBS2GY5WkQAEImAc7cs8fkbP8WklIIEBAgrbAERLSOCVQMSKW5DdsWWbD4ys/tdUjQQkMEVAYZsiaR0JfPvgSFhE5BAz2MRnpwYNrQQ2EVDYNoG17JEE1vfYELIIHO+p2bEd+dLwoj+SgML2kbQ91wkEELBca3dnzLEnsPAaJfBLCChsvwS7J/2kBCJaEbb1FmT72FPgPumLwMv69QQUtl//M/AZfB4CESsEKxYRyxXiZ97r+BwSkMAQAYVtCKRlJHAjkE9ERrAQLea8rxZI+PqWZfwOCUhgiIDCNgTSMhK4EYho8XH/ALkStPgdEpDARgIK20a4lj6OQLqwfj+tAXBbEktX1zHOJSCBAQIK2wBES0igCHCrsVwvU4RstWucawlI4EkCCtuTAE2XQBG46tjo0LwtWaCcSmAnAYVtJ11rn0agu7W1M2N9GhOvVwIfTkBh+3DknvATE0DYeJ/t0aUmLjEOCUhgAwGFbQNUSx5LoAXLDu3Yl4EX/qsJKGy/+ifg+T8TgXRhdG28p5b1+j4bMZ/p2r0WCfw2BBS23+ZH4RP5BAQQLGwuKaLGrcm+/ZgYhwQksIGAwrYBqiWPJRCxyj/QplsLCEQNseu97DskIIFhAgrbMFDLHU0gIpbj77cjQsYtSOY318s+cVk7JCCBYQIK2zBQyx1NIIIVEfvHKwWEraHQsSXOIQEJbCCgsG2AasmjCUTcGJkjZPgUNEhoJbCJgMK2CaxljySw3mKkY+NWZFsF7siXiBf9EQQUto+g7DlOIRCxasG6muPDnsLG65TAhxFQ2D4MtSc6gEDEioNuLZfdtyMRNOwBWLxECXwsAYXtY3l7ts9NIGLFe2wtXD3/3AS8Ogn8BgQUtt/gh+BT+DQEELa1W4sfH1ax+zQ/di/kdyOgsP1uPxGfz1+ZQLq1CNYqWu1jD/tXvl6fuwR+SwIK22/5Y/FJ/UUJRKz6I/5Z06HFMuJX2KChlcAwAYVtGKjljieAYD2yAGKftVYCEhgioLANgbSMBG4E8o0j/E7la7XWwQdL4lfYVjquJTBEgF/CoXKWkcDxBBCsiBy3H+Nb58QdD0wAEpgmoLBNE7XeyQTSkdGV8d4aotZ+5iez8tolsI2AwrYNrYUPJBARoxPDBsPVvH0HovKSJbCPgMK2j62VzyMQsaIbo2O7ovDW3lW8PglI4CcIKGw/ActQCXyHQISNTgx7ldJxV/v6JCCBJwgobE/AM1UCC4F0ay1adGbYhGee8Zbw3SN8lIAE3kVAYXsXNpMkcEkgYsWtyAQgXtj2Ze6QgAQ2EFDYNkC15LEEEDY6tO7O2pe4FrtjgXnhEthBQGHbQdWapxJAsFq0mGPDhrhTOXndEthKQGHbitfihxH45+168zsV4UqHxm1JOreb68WnsIWEQwKbCChsm8Ba9lgCEbceiFxsBiLH+u71UQISGCOgsI2htJAEXrqxdGm8nwaSVcSyXn3EaiUggScJKGxPAjRdAkUAwULcauvr7UkEDdsxziUggQECCtsAREtI4JVAxIr31d4Sruy9tS9QCUjgCQIK2xPwTJXAQmAVLMSL99UQPdZLuksJSGCCgMI2QdEaErgTWG9B8l5bBI55IlcBvGf7KAEJjBBQ2EYwWkQCLwRasBCzbFzN43NIQAIbCChsG6Ba8lgCCBtCxjrdWt+GZH4sKC9cAjsJKGw76Vr7NAIRMkQrc8bVvH3EaSUggQECCtsAREtI4JVAC1u/p7YCemtvjXUtAQn8JAGF7SeBGS6BNwjkW0f+/rof8boaVx3dVZw+CUjgnQQUtneCM00CFwS6Y7vY/uqyY/uKwokE5gkobPNMrXguAd43i23x6u5t3TuXllcugU0EFLZNYC17JIGIVosbEPD1evWxp5WABJ4koLA9CdB0CRQBhI1u7apTq3CnEpDADgIK2w6q1jyVQH8wJKLGunnYqTUN5xLYQEBh2wDVkscSaNF6mf/xxx9fbuNm7vZYMl64BCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQlIQAISkIAEJCABCUhAAhKQgAQkIAEJSEACEpCABCQgAQn8NQn8fyHnyuSABiy2AAAAAElFTkSuQmCC) center / contain no-repeat;
|
|
936
|
+
}
|
|
937
|
+
@keyframes dotting {
|
|
938
|
+
0% {
|
|
939
|
+
opacity: 0.4;
|
|
940
|
+
transform: scale(1);
|
|
941
|
+
}
|
|
942
|
+
50% {
|
|
943
|
+
opacity: 1;
|
|
944
|
+
transform: scale(0.8);
|
|
945
|
+
}
|
|
946
|
+
100% {
|
|
947
|
+
opacity: 0.4;
|
|
948
|
+
transform: scale(1);
|
|
949
|
+
}
|
|
950
|
+
}
|
|
951
|
+
@keyframes pieceContainer {
|
|
952
|
+
from {
|
|
953
|
+
top: 49%;
|
|
954
|
+
}
|
|
955
|
+
to {
|
|
956
|
+
top: 39%;
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
</style>
|
|
960
|
+
<div class="range-piece__container">
|
|
961
|
+
<div class='range-piece__content'></div>
|
|
962
|
+
<div class="range-piece__aim"></div>
|
|
963
|
+
</div>
|
|
964
|
+
`;
|
|
965
|
+
//#endregion
|
|
966
|
+
//#region src/shared-utils/three/PointSelector/utils/PointHelper.ts
|
|
967
|
+
function ie() {
|
|
968
|
+
let e = new f.PlaneGeometry(.4, .4), t = ne, n = new f.TextureLoader().load(t);
|
|
969
|
+
n.colorSpace = f.SRGBColorSpace, n.minFilter = f.LinearFilter;
|
|
970
|
+
let r = new f.MeshBasicMaterial({
|
|
971
|
+
map: n,
|
|
972
|
+
transparent: !0,
|
|
973
|
+
depthTest: !1
|
|
974
|
+
});
|
|
975
|
+
return new f.Mesh(e, r);
|
|
976
|
+
}
|
|
977
|
+
function ae() {
|
|
978
|
+
let e = new f.CurvePath();
|
|
979
|
+
e.add(new f.LineCurve3(new f.Vector3(0, 0, 0), new f.Vector3(0, 0, .1)));
|
|
980
|
+
let t = new f.TubeGeometry(e, 8, .003), n = new Float32Array(t.getAttribute("position").count * 4), r = t.getAttribute("uv");
|
|
981
|
+
for (let e = 0; e < r.count; e++) n.set([
|
|
982
|
+
1,
|
|
983
|
+
1,
|
|
984
|
+
1,
|
|
985
|
+
1 - r.getX(e)
|
|
986
|
+
], e * 4);
|
|
987
|
+
t.setAttribute("color", new f.BufferAttribute(n, 4));
|
|
988
|
+
let i = new f.MeshBasicMaterial({
|
|
989
|
+
vertexColors: !0,
|
|
990
|
+
depthTest: !1,
|
|
991
|
+
transparent: !0
|
|
992
|
+
});
|
|
993
|
+
return new f.Mesh(t, i);
|
|
994
|
+
}
|
|
995
|
+
function oe() {
|
|
996
|
+
let e = new f.SphereGeometry(.01, 20, 20), t = new f.MeshBasicMaterial({
|
|
997
|
+
color: 10349931,
|
|
998
|
+
depthTest: !1,
|
|
999
|
+
transparent: !0,
|
|
1000
|
+
side: f.DoubleSide
|
|
1001
|
+
}), n = new f.Mesh(e, t);
|
|
1002
|
+
return n.position.set(0, 0, .1), n;
|
|
1003
|
+
}
|
|
1004
|
+
function se() {
|
|
1005
|
+
let e = .2, t = new s({
|
|
1006
|
+
pointerEvents: "none",
|
|
1007
|
+
cornerPoints: [
|
|
1008
|
+
new f.Vector3(-.2, e, 0),
|
|
1009
|
+
new f.Vector3(-.2, -.2, 0),
|
|
1010
|
+
new f.Vector3(e, -.2, 0),
|
|
1011
|
+
new f.Vector3(e, e, 0)
|
|
1012
|
+
]
|
|
1013
|
+
}), n = document.createElement("div");
|
|
1014
|
+
return n.style.width = "100%", n.style.height = "100%", n.style.backgroundImage = `url(${Q})`, n.style.backgroundSize = "100%", n.style.backgroundRepeat = "no-repeat", t.container.appendChild(n), t;
|
|
1015
|
+
}
|
|
1016
|
+
var $ = class extends f.Object3D {
|
|
1017
|
+
planeMesh;
|
|
1018
|
+
lineMesh;
|
|
1019
|
+
ballMesh;
|
|
1020
|
+
borderMesh;
|
|
1021
|
+
five;
|
|
1022
|
+
constructor(e) {
|
|
1023
|
+
super(), this.planeMesh = ie(), this.lineMesh = ae(), this.ballMesh = oe(), this.borderMesh = se(), this.addEventListener("added", () => {
|
|
1024
|
+
this.add(this.planeMesh, this.lineMesh, this.ballMesh, this.borderMesh);
|
|
1025
|
+
}), this.addEventListener("removed", () => {
|
|
1026
|
+
this.remove(this.planeMesh, this.lineMesh, this.ballMesh, this.borderMesh);
|
|
1027
|
+
}), M(e), this.five = e;
|
|
1028
|
+
}
|
|
1029
|
+
updateWithIntersect(e) {
|
|
1030
|
+
let t = e?.face?.normal ? new f.Vector3().addVectors(e.point, e.face.normal) : this.five.camera.position;
|
|
1031
|
+
this.position.copy(e.point), this.lookAt(t);
|
|
1032
|
+
}
|
|
1033
|
+
show() {
|
|
1034
|
+
this.visible = !0, this.borderMesh.parent || this.add(this.borderMesh);
|
|
1035
|
+
}
|
|
1036
|
+
hide() {
|
|
1037
|
+
this.visible = !1, this.remove(this.borderMesh);
|
|
1038
|
+
}
|
|
1039
|
+
dispose() {
|
|
1040
|
+
this.planeMesh.material.map?.dispose();
|
|
1041
|
+
for (let e of [
|
|
1042
|
+
this.planeMesh,
|
|
1043
|
+
this.lineMesh,
|
|
1044
|
+
this.ballMesh
|
|
1045
|
+
]) e.geometry.dispose(), e.material.dispose();
|
|
1046
|
+
this.borderMesh.dispose(), this.removeFromParent();
|
|
1047
|
+
}
|
|
1048
|
+
};
|
|
1049
|
+
//#endregion
|
|
1050
|
+
export { G as a, H as c, ee as d, O as f, m as g, k as h, J as i, B as l, A as m, re as n, W as o, M as p, Z as r, U as s, $ as t, z as u };
|
|
1051
|
+
|
|
1052
|
+
//# sourceMappingURL=PointHelper-G9EgUMWo.js.map
|