@chocozhang/three-model-render 1.0.1

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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +609 -0
  3. package/dist/camera/index.d.ts +133 -0
  4. package/dist/camera/index.js +291 -0
  5. package/dist/camera/index.js.map +1 -0
  6. package/dist/camera/index.mjs +265 -0
  7. package/dist/camera/index.mjs.map +1 -0
  8. package/dist/core/index.d.ts +102 -0
  9. package/dist/core/index.js +455 -0
  10. package/dist/core/index.js.map +1 -0
  11. package/dist/core/index.mjs +432 -0
  12. package/dist/core/index.mjs.map +1 -0
  13. package/dist/effect/index.d.ts +214 -0
  14. package/dist/effect/index.js +749 -0
  15. package/dist/effect/index.js.map +1 -0
  16. package/dist/effect/index.mjs +728 -0
  17. package/dist/effect/index.mjs.map +1 -0
  18. package/dist/index.d.ts +852 -0
  19. package/dist/index.js +3268 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/index.mjs +3223 -0
  22. package/dist/index.mjs.map +1 -0
  23. package/dist/interaction/index.d.ts +160 -0
  24. package/dist/interaction/index.js +661 -0
  25. package/dist/interaction/index.js.map +1 -0
  26. package/dist/interaction/index.mjs +637 -0
  27. package/dist/interaction/index.mjs.map +1 -0
  28. package/dist/loader/index.d.ts +175 -0
  29. package/dist/loader/index.js +786 -0
  30. package/dist/loader/index.js.map +1 -0
  31. package/dist/loader/index.mjs +758 -0
  32. package/dist/loader/index.mjs.map +1 -0
  33. package/dist/setup/index.d.ts +47 -0
  34. package/dist/setup/index.js +199 -0
  35. package/dist/setup/index.js.map +1 -0
  36. package/dist/setup/index.mjs +178 -0
  37. package/dist/setup/index.mjs.map +1 -0
  38. package/dist/ui/index.d.ts +36 -0
  39. package/dist/ui/index.js +292 -0
  40. package/dist/ui/index.js.map +1 -0
  41. package/dist/ui/index.mjs +271 -0
  42. package/dist/ui/index.mjs.map +1 -0
  43. package/package.json +98 -0
@@ -0,0 +1,292 @@
1
+ 'use strict';
2
+
3
+ var THREE = require('three');
4
+
5
+ function _interopNamespaceDefault(e) {
6
+ var n = Object.create(null);
7
+ if (e) {
8
+ Object.keys(e).forEach(function (k) {
9
+ if (k !== 'default') {
10
+ var d = Object.getOwnPropertyDescriptor(e, k);
11
+ Object.defineProperty(n, k, d.get ? d : {
12
+ enumerable: true,
13
+ get: function () { return e[k]; }
14
+ });
15
+ }
16
+ });
17
+ }
18
+ n.default = e;
19
+ return Object.freeze(n);
20
+ }
21
+
22
+ var THREE__namespace = /*#__PURE__*/_interopNamespaceDefault(THREE);
23
+
24
+ /**
25
+ * 创建模型标签(带连线和脉冲圆点)- 优化版
26
+ *
27
+ * ✨ 优化内容:
28
+ * - 支持暂停/恢复更新
29
+ * - 可配置更新间隔
30
+ * - 淡入淡出效果
31
+ * - 缓存包围盒计算
32
+ * - RAF 管理优化
33
+ */
34
+ function createModelsLabel(camera, renderer, parentModel, modelLabelsMap, options) {
35
+ var _a, _b, _c, _d, _e, _f;
36
+ const cfg = {
37
+ fontSize: (options === null || options === void 0 ? void 0 : options.fontSize) || '12px',
38
+ color: (options === null || options === void 0 ? void 0 : options.color) || '#ffffff',
39
+ background: (options === null || options === void 0 ? void 0 : options.background) || '#1890ff',
40
+ padding: (options === null || options === void 0 ? void 0 : options.padding) || '6px 10px',
41
+ borderRadius: (options === null || options === void 0 ? void 0 : options.borderRadius) || '6px',
42
+ lift: (_a = options === null || options === void 0 ? void 0 : options.lift) !== null && _a !== void 0 ? _a : 100,
43
+ dotSize: (_b = options === null || options === void 0 ? void 0 : options.dotSize) !== null && _b !== void 0 ? _b : 6,
44
+ dotSpacing: (_c = options === null || options === void 0 ? void 0 : options.dotSpacing) !== null && _c !== void 0 ? _c : 2,
45
+ lineColor: (options === null || options === void 0 ? void 0 : options.lineColor) || 'rgba(200,200,200,0.7)',
46
+ lineWidth: (_d = options === null || options === void 0 ? void 0 : options.lineWidth) !== null && _d !== void 0 ? _d : 1,
47
+ updateInterval: (_e = options === null || options === void 0 ? void 0 : options.updateInterval) !== null && _e !== void 0 ? _e : 0, // ✨ 默认每帧更新
48
+ fadeInDuration: (_f = options === null || options === void 0 ? void 0 : options.fadeInDuration) !== null && _f !== void 0 ? _f : 300, // ✨ 淡入时长
49
+ };
50
+ const container = document.createElement('div');
51
+ container.style.position = 'absolute';
52
+ container.style.top = '0';
53
+ container.style.left = '0';
54
+ container.style.width = '100%';
55
+ container.style.height = '100%';
56
+ container.style.pointerEvents = 'none';
57
+ container.style.overflow = 'visible';
58
+ document.body.appendChild(container);
59
+ const svgNS = 'http://www.w3.org/2000/svg';
60
+ const svg = document.createElementNS(svgNS, 'svg');
61
+ svg.setAttribute('width', '100%');
62
+ svg.setAttribute('height', '100%');
63
+ svg.style.position = 'absolute';
64
+ svg.style.top = '0';
65
+ svg.style.left = '0';
66
+ svg.style.overflow = 'visible';
67
+ svg.style.pointerEvents = 'none';
68
+ svg.style.zIndex = '1';
69
+ container.appendChild(svg);
70
+ let currentModel = parentModel;
71
+ let currentLabelsMap = Object.assign({}, modelLabelsMap);
72
+ let labels = [];
73
+ let isActive = true;
74
+ let isPaused = false; // ✨ 暂停状态
75
+ let rafId = null; // ✨ RAF ID
76
+ let lastUpdateTime = 0; // ✨ 上次更新时间
77
+ // ✨ 注入样式(带淡入动画)
78
+ const styleId = 'three-model-label-styles';
79
+ if (!document.getElementById(styleId)) {
80
+ const style = document.createElement('style');
81
+ style.id = styleId;
82
+ style.innerHTML = `
83
+ @keyframes pulse-dot {
84
+ 0% { transform: scale(1); opacity: 1; }
85
+ 50% { transform: scale(1.6); opacity: 0.45; }
86
+ 100% { transform: scale(1); opacity: 1; }
87
+ }
88
+ @keyframes fade-in-label {
89
+ from { opacity: 0; transform: translateY(10px); }
90
+ to { opacity: 1; transform: translateY(0); }
91
+ }
92
+ .tm-label {
93
+ pointer-events: none;
94
+ display: inline-block;
95
+ line-height: 1;
96
+ will-change: transform, opacity;
97
+ transition: opacity 150ms ease;
98
+ }
99
+ .tm-label-wrapper {
100
+ display: inline-flex;
101
+ align-items: center;
102
+ gap: 8px;
103
+ animation: fade-in-label ${cfg.fadeInDuration}ms ease-out;
104
+ }
105
+ .tm-label-dot {
106
+ border-radius: 50%;
107
+ will-change: transform, opacity;
108
+ animation: pulse-dot 1.2s infinite ease-in-out;
109
+ }
110
+ .tm-label-text {
111
+ white-space: nowrap;
112
+ }
113
+ `;
114
+ document.head.appendChild(style);
115
+ }
116
+ // ✨ 获取或更新缓存的顶部位置
117
+ const getObjectTopPosition = (labelData) => {
118
+ const obj = labelData.object;
119
+ // 如果有缓存且对象没有变换,直接返回
120
+ if (labelData.cachedTopPos && !obj.matrixWorldNeedsUpdate) {
121
+ return labelData.cachedTopPos.clone();
122
+ }
123
+ // 重新计算
124
+ const box = new THREE__namespace.Box3().setFromObject(obj);
125
+ labelData.cachedBox = box;
126
+ if (!box.isEmpty()) {
127
+ const center = new THREE__namespace.Vector3();
128
+ box.getCenter(center);
129
+ const topPos = new THREE__namespace.Vector3(center.x, box.max.y, center.z);
130
+ labelData.cachedTopPos = topPos;
131
+ return topPos.clone();
132
+ }
133
+ const p = new THREE__namespace.Vector3();
134
+ obj.getWorldPosition(p);
135
+ labelData.cachedTopPos = p;
136
+ return p.clone();
137
+ };
138
+ const clearLabels = () => {
139
+ labels.forEach(({ el, line, wrapper }) => {
140
+ el.remove();
141
+ wrapper.remove();
142
+ if (line && line.parentNode)
143
+ line.parentNode.removeChild(line);
144
+ });
145
+ labels = [];
146
+ };
147
+ const rebuildLabels = () => {
148
+ clearLabels();
149
+ if (!currentModel)
150
+ return;
151
+ currentModel.traverse((child) => {
152
+ var _a;
153
+ if (child.isMesh || child.type === 'Group') {
154
+ const labelText = (_a = Object.entries(currentLabelsMap).find(([key]) => child.name.includes(key))) === null || _a === void 0 ? void 0 : _a[1];
155
+ if (!labelText)
156
+ return;
157
+ const wrapper = document.createElement('div');
158
+ wrapper.className = 'tm-label-wrapper';
159
+ wrapper.style.position = 'absolute';
160
+ wrapper.style.pointerEvents = 'none';
161
+ wrapper.style.transform = 'translate(-50%, -100%)';
162
+ wrapper.style.zIndex = '1';
163
+ const el = document.createElement('div');
164
+ el.className = 'tm-label';
165
+ el.style.background = cfg.background;
166
+ el.style.color = cfg.color;
167
+ el.style.padding = cfg.padding;
168
+ el.style.borderRadius = cfg.borderRadius;
169
+ el.style.fontSize = cfg.fontSize;
170
+ el.style.boxShadow = '0 6px 18px rgba(0,0,0,0.35)';
171
+ el.style.backdropFilter = 'blur(4px)';
172
+ el.style.border = '1px solid rgba(255,255,255,0.03)';
173
+ el.style.display = 'inline-block';
174
+ const txt = document.createElement('div');
175
+ txt.className = 'tm-label-text';
176
+ txt.innerText = labelText;
177
+ el.appendChild(txt);
178
+ const dot = document.createElement('div');
179
+ dot.className = 'tm-label-dot';
180
+ dot.style.width = `${cfg.dotSize}px`;
181
+ dot.style.height = `${cfg.dotSize}px`;
182
+ dot.style.background = 'radial-gradient(circle at 30% 30%, #fff, rgba(255,255,255,0.85) 20%, rgba(255,204,0,0.9) 60%, rgba(255,170,0,0.9) 100%)';
183
+ dot.style.boxShadow = '0 0 8px rgba(255,170,0,0.9)';
184
+ dot.style.flex = '0 0 auto';
185
+ dot.style.marginRight = `${cfg.dotSpacing}px`;
186
+ wrapper.appendChild(dot);
187
+ wrapper.appendChild(el);
188
+ container.appendChild(wrapper);
189
+ const line = document.createElementNS(svgNS, 'line');
190
+ line.setAttribute('stroke', cfg.lineColor);
191
+ line.setAttribute('stroke-width', `${cfg.lineWidth}`);
192
+ line.setAttribute('stroke-linecap', 'round');
193
+ line.setAttribute('opacity', '0.85');
194
+ svg.appendChild(line);
195
+ labels.push({
196
+ object: child,
197
+ el,
198
+ wrapper,
199
+ dot,
200
+ line,
201
+ cachedBox: null, // ✨ 初始化缓存
202
+ cachedTopPos: null
203
+ });
204
+ }
205
+ });
206
+ };
207
+ rebuildLabels();
208
+ // ✨ 优化的更新函数
209
+ const updateLabels = (timestamp) => {
210
+ if (!isActive || isPaused) {
211
+ rafId = null;
212
+ return;
213
+ }
214
+ // ✨ 节流处理
215
+ if (cfg.updateInterval > 0 && timestamp - lastUpdateTime < cfg.updateInterval) {
216
+ rafId = requestAnimationFrame(updateLabels);
217
+ return;
218
+ }
219
+ lastUpdateTime = timestamp;
220
+ const rect = renderer.domElement.getBoundingClientRect();
221
+ const width = rect.width;
222
+ const height = rect.height;
223
+ svg.setAttribute('width', `${width}`);
224
+ svg.setAttribute('height', `${height}`);
225
+ labels.forEach((labelData) => {
226
+ const { el, wrapper, dot, line } = labelData;
227
+ const topWorld = getObjectTopPosition(labelData); // ✨ 使用缓存
228
+ const topNDC = topWorld.clone().project(camera);
229
+ const modelX = (topNDC.x * 0.5 + 0.5) * width + rect.left;
230
+ const modelY = (-(topNDC.y * 0.5) + 0.5) * height + rect.top;
231
+ const labelX = modelX;
232
+ const labelY = modelY - cfg.lift;
233
+ wrapper.style.left = `${labelX}px`;
234
+ wrapper.style.top = `${labelY}px`;
235
+ const svgModelX = modelX - rect.left;
236
+ const svgModelY = modelY - rect.top;
237
+ const svgLabelX = labelX - rect.left;
238
+ const svgLabelY = labelY - rect.top + (el.getBoundingClientRect().height * 0.5);
239
+ line.setAttribute('x1', `${svgModelX}`);
240
+ line.setAttribute('y1', `${svgModelY}`);
241
+ line.setAttribute('x2', `${svgLabelX}`);
242
+ line.setAttribute('y2', `${svgLabelY}`);
243
+ const visible = topNDC.z < 1;
244
+ wrapper.style.display = visible ? 'flex' : 'none';
245
+ line.setAttribute('visibility', visible ? 'visible' : 'hidden');
246
+ dot.style.opacity = visible ? '1' : '0';
247
+ });
248
+ rafId = requestAnimationFrame(updateLabels);
249
+ };
250
+ rafId = requestAnimationFrame(updateLabels);
251
+ return {
252
+ updateModel(newModel) {
253
+ if (!newModel || newModel === currentModel)
254
+ return;
255
+ currentModel = newModel;
256
+ rebuildLabels();
257
+ },
258
+ updateLabelsMap(newMap) {
259
+ currentLabelsMap = Object.assign({}, newMap);
260
+ rebuildLabels();
261
+ },
262
+ // ✨ 暂停更新
263
+ pause() {
264
+ isPaused = true;
265
+ if (rafId !== null) {
266
+ cancelAnimationFrame(rafId);
267
+ rafId = null;
268
+ }
269
+ },
270
+ // ✨ 恢复更新
271
+ resume() {
272
+ if (!isPaused)
273
+ return;
274
+ isPaused = false;
275
+ rafId = requestAnimationFrame(updateLabels);
276
+ },
277
+ dispose() {
278
+ isActive = false;
279
+ isPaused = true;
280
+ if (rafId !== null) {
281
+ cancelAnimationFrame(rafId);
282
+ rafId = null;
283
+ }
284
+ clearLabels();
285
+ svg.remove();
286
+ container.remove();
287
+ },
288
+ };
289
+ }
290
+
291
+ exports.createModelsLabel = createModelsLabel;
292
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/ui/modelsLabel.ts"],"sourcesContent":[null],"names":["THREE"],"mappings":"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"}
@@ -0,0 +1,271 @@
1
+ import * as THREE from 'three';
2
+
3
+ /**
4
+ * 创建模型标签(带连线和脉冲圆点)- 优化版
5
+ *
6
+ * ✨ 优化内容:
7
+ * - 支持暂停/恢复更新
8
+ * - 可配置更新间隔
9
+ * - 淡入淡出效果
10
+ * - 缓存包围盒计算
11
+ * - RAF 管理优化
12
+ */
13
+ function createModelsLabel(camera, renderer, parentModel, modelLabelsMap, options) {
14
+ var _a, _b, _c, _d, _e, _f;
15
+ const cfg = {
16
+ fontSize: (options === null || options === void 0 ? void 0 : options.fontSize) || '12px',
17
+ color: (options === null || options === void 0 ? void 0 : options.color) || '#ffffff',
18
+ background: (options === null || options === void 0 ? void 0 : options.background) || '#1890ff',
19
+ padding: (options === null || options === void 0 ? void 0 : options.padding) || '6px 10px',
20
+ borderRadius: (options === null || options === void 0 ? void 0 : options.borderRadius) || '6px',
21
+ lift: (_a = options === null || options === void 0 ? void 0 : options.lift) !== null && _a !== void 0 ? _a : 100,
22
+ dotSize: (_b = options === null || options === void 0 ? void 0 : options.dotSize) !== null && _b !== void 0 ? _b : 6,
23
+ dotSpacing: (_c = options === null || options === void 0 ? void 0 : options.dotSpacing) !== null && _c !== void 0 ? _c : 2,
24
+ lineColor: (options === null || options === void 0 ? void 0 : options.lineColor) || 'rgba(200,200,200,0.7)',
25
+ lineWidth: (_d = options === null || options === void 0 ? void 0 : options.lineWidth) !== null && _d !== void 0 ? _d : 1,
26
+ updateInterval: (_e = options === null || options === void 0 ? void 0 : options.updateInterval) !== null && _e !== void 0 ? _e : 0, // ✨ 默认每帧更新
27
+ fadeInDuration: (_f = options === null || options === void 0 ? void 0 : options.fadeInDuration) !== null && _f !== void 0 ? _f : 300, // ✨ 淡入时长
28
+ };
29
+ const container = document.createElement('div');
30
+ container.style.position = 'absolute';
31
+ container.style.top = '0';
32
+ container.style.left = '0';
33
+ container.style.width = '100%';
34
+ container.style.height = '100%';
35
+ container.style.pointerEvents = 'none';
36
+ container.style.overflow = 'visible';
37
+ document.body.appendChild(container);
38
+ const svgNS = 'http://www.w3.org/2000/svg';
39
+ const svg = document.createElementNS(svgNS, 'svg');
40
+ svg.setAttribute('width', '100%');
41
+ svg.setAttribute('height', '100%');
42
+ svg.style.position = 'absolute';
43
+ svg.style.top = '0';
44
+ svg.style.left = '0';
45
+ svg.style.overflow = 'visible';
46
+ svg.style.pointerEvents = 'none';
47
+ svg.style.zIndex = '1';
48
+ container.appendChild(svg);
49
+ let currentModel = parentModel;
50
+ let currentLabelsMap = Object.assign({}, modelLabelsMap);
51
+ let labels = [];
52
+ let isActive = true;
53
+ let isPaused = false; // ✨ 暂停状态
54
+ let rafId = null; // ✨ RAF ID
55
+ let lastUpdateTime = 0; // ✨ 上次更新时间
56
+ // ✨ 注入样式(带淡入动画)
57
+ const styleId = 'three-model-label-styles';
58
+ if (!document.getElementById(styleId)) {
59
+ const style = document.createElement('style');
60
+ style.id = styleId;
61
+ style.innerHTML = `
62
+ @keyframes pulse-dot {
63
+ 0% { transform: scale(1); opacity: 1; }
64
+ 50% { transform: scale(1.6); opacity: 0.45; }
65
+ 100% { transform: scale(1); opacity: 1; }
66
+ }
67
+ @keyframes fade-in-label {
68
+ from { opacity: 0; transform: translateY(10px); }
69
+ to { opacity: 1; transform: translateY(0); }
70
+ }
71
+ .tm-label {
72
+ pointer-events: none;
73
+ display: inline-block;
74
+ line-height: 1;
75
+ will-change: transform, opacity;
76
+ transition: opacity 150ms ease;
77
+ }
78
+ .tm-label-wrapper {
79
+ display: inline-flex;
80
+ align-items: center;
81
+ gap: 8px;
82
+ animation: fade-in-label ${cfg.fadeInDuration}ms ease-out;
83
+ }
84
+ .tm-label-dot {
85
+ border-radius: 50%;
86
+ will-change: transform, opacity;
87
+ animation: pulse-dot 1.2s infinite ease-in-out;
88
+ }
89
+ .tm-label-text {
90
+ white-space: nowrap;
91
+ }
92
+ `;
93
+ document.head.appendChild(style);
94
+ }
95
+ // ✨ 获取或更新缓存的顶部位置
96
+ const getObjectTopPosition = (labelData) => {
97
+ const obj = labelData.object;
98
+ // 如果有缓存且对象没有变换,直接返回
99
+ if (labelData.cachedTopPos && !obj.matrixWorldNeedsUpdate) {
100
+ return labelData.cachedTopPos.clone();
101
+ }
102
+ // 重新计算
103
+ const box = new THREE.Box3().setFromObject(obj);
104
+ labelData.cachedBox = box;
105
+ if (!box.isEmpty()) {
106
+ const center = new THREE.Vector3();
107
+ box.getCenter(center);
108
+ const topPos = new THREE.Vector3(center.x, box.max.y, center.z);
109
+ labelData.cachedTopPos = topPos;
110
+ return topPos.clone();
111
+ }
112
+ const p = new THREE.Vector3();
113
+ obj.getWorldPosition(p);
114
+ labelData.cachedTopPos = p;
115
+ return p.clone();
116
+ };
117
+ const clearLabels = () => {
118
+ labels.forEach(({ el, line, wrapper }) => {
119
+ el.remove();
120
+ wrapper.remove();
121
+ if (line && line.parentNode)
122
+ line.parentNode.removeChild(line);
123
+ });
124
+ labels = [];
125
+ };
126
+ const rebuildLabels = () => {
127
+ clearLabels();
128
+ if (!currentModel)
129
+ return;
130
+ currentModel.traverse((child) => {
131
+ var _a;
132
+ if (child.isMesh || child.type === 'Group') {
133
+ const labelText = (_a = Object.entries(currentLabelsMap).find(([key]) => child.name.includes(key))) === null || _a === void 0 ? void 0 : _a[1];
134
+ if (!labelText)
135
+ return;
136
+ const wrapper = document.createElement('div');
137
+ wrapper.className = 'tm-label-wrapper';
138
+ wrapper.style.position = 'absolute';
139
+ wrapper.style.pointerEvents = 'none';
140
+ wrapper.style.transform = 'translate(-50%, -100%)';
141
+ wrapper.style.zIndex = '1';
142
+ const el = document.createElement('div');
143
+ el.className = 'tm-label';
144
+ el.style.background = cfg.background;
145
+ el.style.color = cfg.color;
146
+ el.style.padding = cfg.padding;
147
+ el.style.borderRadius = cfg.borderRadius;
148
+ el.style.fontSize = cfg.fontSize;
149
+ el.style.boxShadow = '0 6px 18px rgba(0,0,0,0.35)';
150
+ el.style.backdropFilter = 'blur(4px)';
151
+ el.style.border = '1px solid rgba(255,255,255,0.03)';
152
+ el.style.display = 'inline-block';
153
+ const txt = document.createElement('div');
154
+ txt.className = 'tm-label-text';
155
+ txt.innerText = labelText;
156
+ el.appendChild(txt);
157
+ const dot = document.createElement('div');
158
+ dot.className = 'tm-label-dot';
159
+ dot.style.width = `${cfg.dotSize}px`;
160
+ dot.style.height = `${cfg.dotSize}px`;
161
+ dot.style.background = 'radial-gradient(circle at 30% 30%, #fff, rgba(255,255,255,0.85) 20%, rgba(255,204,0,0.9) 60%, rgba(255,170,0,0.9) 100%)';
162
+ dot.style.boxShadow = '0 0 8px rgba(255,170,0,0.9)';
163
+ dot.style.flex = '0 0 auto';
164
+ dot.style.marginRight = `${cfg.dotSpacing}px`;
165
+ wrapper.appendChild(dot);
166
+ wrapper.appendChild(el);
167
+ container.appendChild(wrapper);
168
+ const line = document.createElementNS(svgNS, 'line');
169
+ line.setAttribute('stroke', cfg.lineColor);
170
+ line.setAttribute('stroke-width', `${cfg.lineWidth}`);
171
+ line.setAttribute('stroke-linecap', 'round');
172
+ line.setAttribute('opacity', '0.85');
173
+ svg.appendChild(line);
174
+ labels.push({
175
+ object: child,
176
+ el,
177
+ wrapper,
178
+ dot,
179
+ line,
180
+ cachedBox: null, // ✨ 初始化缓存
181
+ cachedTopPos: null
182
+ });
183
+ }
184
+ });
185
+ };
186
+ rebuildLabels();
187
+ // ✨ 优化的更新函数
188
+ const updateLabels = (timestamp) => {
189
+ if (!isActive || isPaused) {
190
+ rafId = null;
191
+ return;
192
+ }
193
+ // ✨ 节流处理
194
+ if (cfg.updateInterval > 0 && timestamp - lastUpdateTime < cfg.updateInterval) {
195
+ rafId = requestAnimationFrame(updateLabels);
196
+ return;
197
+ }
198
+ lastUpdateTime = timestamp;
199
+ const rect = renderer.domElement.getBoundingClientRect();
200
+ const width = rect.width;
201
+ const height = rect.height;
202
+ svg.setAttribute('width', `${width}`);
203
+ svg.setAttribute('height', `${height}`);
204
+ labels.forEach((labelData) => {
205
+ const { el, wrapper, dot, line } = labelData;
206
+ const topWorld = getObjectTopPosition(labelData); // ✨ 使用缓存
207
+ const topNDC = topWorld.clone().project(camera);
208
+ const modelX = (topNDC.x * 0.5 + 0.5) * width + rect.left;
209
+ const modelY = (-(topNDC.y * 0.5) + 0.5) * height + rect.top;
210
+ const labelX = modelX;
211
+ const labelY = modelY - cfg.lift;
212
+ wrapper.style.left = `${labelX}px`;
213
+ wrapper.style.top = `${labelY}px`;
214
+ const svgModelX = modelX - rect.left;
215
+ const svgModelY = modelY - rect.top;
216
+ const svgLabelX = labelX - rect.left;
217
+ const svgLabelY = labelY - rect.top + (el.getBoundingClientRect().height * 0.5);
218
+ line.setAttribute('x1', `${svgModelX}`);
219
+ line.setAttribute('y1', `${svgModelY}`);
220
+ line.setAttribute('x2', `${svgLabelX}`);
221
+ line.setAttribute('y2', `${svgLabelY}`);
222
+ const visible = topNDC.z < 1;
223
+ wrapper.style.display = visible ? 'flex' : 'none';
224
+ line.setAttribute('visibility', visible ? 'visible' : 'hidden');
225
+ dot.style.opacity = visible ? '1' : '0';
226
+ });
227
+ rafId = requestAnimationFrame(updateLabels);
228
+ };
229
+ rafId = requestAnimationFrame(updateLabels);
230
+ return {
231
+ updateModel(newModel) {
232
+ if (!newModel || newModel === currentModel)
233
+ return;
234
+ currentModel = newModel;
235
+ rebuildLabels();
236
+ },
237
+ updateLabelsMap(newMap) {
238
+ currentLabelsMap = Object.assign({}, newMap);
239
+ rebuildLabels();
240
+ },
241
+ // ✨ 暂停更新
242
+ pause() {
243
+ isPaused = true;
244
+ if (rafId !== null) {
245
+ cancelAnimationFrame(rafId);
246
+ rafId = null;
247
+ }
248
+ },
249
+ // ✨ 恢复更新
250
+ resume() {
251
+ if (!isPaused)
252
+ return;
253
+ isPaused = false;
254
+ rafId = requestAnimationFrame(updateLabels);
255
+ },
256
+ dispose() {
257
+ isActive = false;
258
+ isPaused = true;
259
+ if (rafId !== null) {
260
+ cancelAnimationFrame(rafId);
261
+ rafId = null;
262
+ }
263
+ clearLabels();
264
+ svg.remove();
265
+ container.remove();
266
+ },
267
+ };
268
+ }
269
+
270
+ export { createModelsLabel };
271
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","sources":["../../src/ui/modelsLabel.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}