@2112-lab/central-plant 0.3.37 → 0.3.39
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/dist/bundle/index.js +1080 -563
- package/dist/cjs/src/core/centralPlant.js +115 -68
- package/dist/cjs/src/core/centralPlantInternals.js +20 -36
- package/dist/cjs/src/index.js +19 -0
- package/dist/cjs/src/managers/behaviors/IoBehaviorManager.js +175 -234
- package/dist/cjs/src/managers/components/componentDataManager.js +63 -11
- package/dist/cjs/src/managers/scene/componentTooltipManager.js +95 -65
- package/dist/cjs/src/managers/scene/modelManager.js +93 -145
- package/dist/cjs/src/managers/scene/sceneExportManager.js +2 -1
- package/dist/cjs/src/managers/scene/sceneOperationsManager.js +8 -3
- package/dist/cjs/src/utils/animationTransformUtils.js +66 -0
- package/dist/cjs/src/utils/behaviorDispatch.js +62 -0
- package/dist/cjs/src/utils/behaviorRegistration.js +76 -0
- package/dist/cjs/src/utils/behaviorSceneUtils.js +155 -0
- package/dist/cjs/src/utils/behaviorSchema.js +209 -0
- package/dist/esm/src/core/centralPlant.js +115 -68
- package/dist/esm/src/core/centralPlantInternals.js +21 -37
- package/dist/esm/src/index.js +4 -0
- package/dist/esm/src/managers/behaviors/IoBehaviorManager.js +176 -235
- package/dist/esm/src/managers/components/componentDataManager.js +63 -11
- package/dist/esm/src/managers/scene/componentTooltipManager.js +95 -65
- package/dist/esm/src/managers/scene/modelManager.js +94 -146
- package/dist/esm/src/managers/scene/sceneExportManager.js +2 -1
- package/dist/esm/src/managers/scene/sceneOperationsManager.js +8 -3
- package/dist/esm/src/utils/animationTransformUtils.js +41 -0
- package/dist/esm/src/utils/behaviorDispatch.js +56 -0
- package/dist/esm/src/utils/behaviorRegistration.js +71 -0
- package/dist/esm/src/utils/behaviorSceneUtils.js +147 -0
- package/dist/esm/src/utils/behaviorSchema.js +201 -0
- package/dist/index.d.ts +169 -1
- package/package.json +1 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { createClass as _createClass, objectSpread2 as _objectSpread2, toConsumableArray as _toConsumableArray, typeof as _typeof, classCallCheck as _classCallCheck, asyncToGenerator as _asyncToGenerator, regenerator as _regenerator,
|
|
1
|
+
import { createClass as _createClass, objectSpread2 as _objectSpread2, toConsumableArray as _toConsumableArray, typeof as _typeof, classCallCheck as _classCallCheck, asyncToGenerator as _asyncToGenerator, regenerator as _regenerator, createForOfIteratorHelper as _createForOfIteratorHelper } from '../../../_virtual/_rollupPluginBabelHelpers.js';
|
|
2
2
|
import * as THREE from 'three';
|
|
3
3
|
import { attachIODevicesToComponent } from '../../utils/ioDeviceUtils.js';
|
|
4
|
+
import { registerBehaviorsForComponent } from '../../utils/behaviorRegistration.js';
|
|
4
5
|
import modelPreloader from '../../rendering/modelPreloader.js';
|
|
5
6
|
import { computeFilteredBoundingBox, computeFilteredBoundingBoxCached } from '../../utils/boundingBoxUtils.js';
|
|
6
7
|
import { cacheBasePosition } from './viewport2DManager.js';
|
|
@@ -53,12 +54,12 @@ var ModelManager = /*#__PURE__*/function () {
|
|
|
53
54
|
key: "loadLibraryModel",
|
|
54
55
|
value: function () {
|
|
55
56
|
var _loadLibraryModel = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(targetMesh, jsonEntry, componentData) {
|
|
56
|
-
var component, _jsonEntry$userData, _jsonEntry$userData2, _jsonEntry$userData3, originalProps, connectorChildren, gltfScene, libraryModel, _this$sceneViewer, ioBehavMgr,
|
|
57
|
-
return _regenerator().w(function (
|
|
58
|
-
while (1) switch (
|
|
57
|
+
var component, _jsonEntry$userData, _jsonEntry$userData2, _jsonEntry$userData3, originalProps, connectorChildren, gltfScene, libraryModel, _this$sceneViewer, ioBehavMgr, warmFn, _jsonEntry$userData4, _t;
|
|
58
|
+
return _regenerator().w(function (_context) {
|
|
59
|
+
while (1) switch (_context.n) {
|
|
59
60
|
case 0:
|
|
60
61
|
component = this.sceneViewer;
|
|
61
|
-
|
|
62
|
+
_context.p = 1;
|
|
62
63
|
console.log("Loading library GLB model for ".concat((_jsonEntry$userData = jsonEntry.userData) === null || _jsonEntry$userData === void 0 ? void 0 : _jsonEntry$userData.libraryId, "..."));
|
|
63
64
|
|
|
64
65
|
// Store original mesh properties before async operation
|
|
@@ -71,16 +72,16 @@ var ModelManager = /*#__PURE__*/function () {
|
|
|
71
72
|
uuid: targetMesh.uuid
|
|
72
73
|
}; // Preserve connector children (pass parent UUID for proper connector UUID generation)
|
|
73
74
|
connectorChildren = this._preserveConnectorChildren(targetMesh, originalProps.uuid); // Get model from cache or load directly
|
|
74
|
-
|
|
75
|
+
_context.n = 2;
|
|
75
76
|
return this._getLibraryModel(componentData.modelKey, (_jsonEntry$userData2 = jsonEntry.userData) === null || _jsonEntry$userData2 === void 0 ? void 0 : _jsonEntry$userData2.libraryId);
|
|
76
77
|
case 2:
|
|
77
|
-
gltfScene =
|
|
78
|
+
gltfScene = _context.v;
|
|
78
79
|
if (gltfScene) {
|
|
79
|
-
|
|
80
|
+
_context.n = 3;
|
|
80
81
|
break;
|
|
81
82
|
}
|
|
82
83
|
console.warn("\u26A0\uFE0F Could not load model ".concat(componentData.modelKey, ", keeping original mesh"));
|
|
83
|
-
return
|
|
84
|
+
return _context.a(2, targetMesh);
|
|
84
85
|
case 3:
|
|
85
86
|
// Configure the loaded model
|
|
86
87
|
libraryModel = this._configureLibraryModel(gltfScene, jsonEntry, componentData, originalProps); // Add preserved connectors
|
|
@@ -90,70 +91,17 @@ var ModelManager = /*#__PURE__*/function () {
|
|
|
90
91
|
|
|
91
92
|
// Attach IO devices for smart components (import flow)
|
|
92
93
|
if (!(componentData.isSmart && componentData.attachedDevices)) {
|
|
93
|
-
|
|
94
|
+
_context.n = 5;
|
|
94
95
|
break;
|
|
95
96
|
}
|
|
96
|
-
|
|
97
|
+
_context.n = 4;
|
|
97
98
|
return attachIODevicesToComponent(libraryModel, componentData, modelPreloader, originalProps.uuid);
|
|
98
99
|
case 4:
|
|
99
|
-
// Register behavior configs for each attached device
|
|
100
100
|
ioBehavMgr = (_this$sceneViewer = this.sceneViewer) === null || _this$sceneViewer === void 0 || (_this$sceneViewer = _this$sceneViewer.managers) === null || _this$sceneViewer === void 0 ? void 0 : _this$sceneViewer.ioBehaviorManager;
|
|
101
|
-
if (
|
|
102
|
-
|
|
103
|
-
break;
|
|
101
|
+
if (ioBehavMgr) {
|
|
102
|
+
registerBehaviorsForComponent(ioBehavMgr, originalProps.uuid, componentData, libraryModel, modelPreloader.componentDictionary);
|
|
104
103
|
}
|
|
105
|
-
_loop = /*#__PURE__*/_regenerator().m(function _loop() {
|
|
106
|
-
var _modelPreloader$compo, _deviceData$behaviorC;
|
|
107
|
-
var _Object$entries$_i, attachmentId, attachment, deviceData, deviceRoot;
|
|
108
|
-
return _regenerator().w(function (_context) {
|
|
109
|
-
while (1) switch (_context.n) {
|
|
110
|
-
case 0:
|
|
111
|
-
_Object$entries$_i = _slicedToArray(_Object$entries[_i], 2), attachmentId = _Object$entries$_i[0], attachment = _Object$entries$_i[1];
|
|
112
|
-
deviceData = (_modelPreloader$compo = modelPreloader.componentDictionary) === null || _modelPreloader$compo === void 0 ? void 0 : _modelPreloader$compo[attachment.deviceId];
|
|
113
|
-
console.log("[ModelManager] attachment \"".concat(attachmentId, "\" \u2192 deviceId \"").concat(attachment.deviceId, "\" \u2192 behaviorConfig:"), (_deviceData$behaviorC = deviceData === null || deviceData === void 0 ? void 0 : deviceData.behaviorConfig) !== null && _deviceData$behaviorC !== void 0 ? _deviceData$behaviorC : 'NONE');
|
|
114
|
-
if (deviceData !== null && deviceData !== void 0 && deviceData.behaviorConfig) {
|
|
115
|
-
_context.n = 1;
|
|
116
|
-
break;
|
|
117
|
-
}
|
|
118
|
-
return _context.a(2, 1);
|
|
119
|
-
case 1:
|
|
120
|
-
deviceRoot = null;
|
|
121
|
-
libraryModel.traverse(function (obj) {
|
|
122
|
-
var _obj$userData;
|
|
123
|
-
if (!deviceRoot && ((_obj$userData = obj.userData) === null || _obj$userData === void 0 ? void 0 : _obj$userData.attachmentId) === attachmentId) deviceRoot = obj;
|
|
124
|
-
});
|
|
125
|
-
if (deviceRoot) {
|
|
126
|
-
ioBehavMgr.loadBehaviors(attachmentId, deviceData.behaviorConfig, deviceRoot, originalProps.uuid);
|
|
127
|
-
}
|
|
128
|
-
case 2:
|
|
129
|
-
return _context.a(2);
|
|
130
|
-
}
|
|
131
|
-
}, _loop);
|
|
132
|
-
});
|
|
133
|
-
_i = 0, _Object$entries = Object.entries(componentData.attachedDevices);
|
|
134
104
|
case 5:
|
|
135
|
-
if (!(_i < _Object$entries.length)) {
|
|
136
|
-
_context2.n = 8;
|
|
137
|
-
break;
|
|
138
|
-
}
|
|
139
|
-
return _context2.d(_regeneratorValues(_loop()), 6);
|
|
140
|
-
case 6:
|
|
141
|
-
if (!_context2.v) {
|
|
142
|
-
_context2.n = 7;
|
|
143
|
-
break;
|
|
144
|
-
}
|
|
145
|
-
return _context2.a(3, 7);
|
|
146
|
-
case 7:
|
|
147
|
-
_i++;
|
|
148
|
-
_context2.n = 5;
|
|
149
|
-
break;
|
|
150
|
-
case 8:
|
|
151
|
-
// Register component-level behaviors (intra-component io-device linking)
|
|
152
|
-
if (componentData.behaviors && componentData.behaviors.length > 0) {
|
|
153
|
-
console.log("[ModelManager] Registering ".concat(componentData.behaviors.length, " component-level behavior(s) for ").concat(originalProps.uuid));
|
|
154
|
-
ioBehavMgr.registerComponentBehaviors(originalProps.uuid, componentData.behaviors);
|
|
155
|
-
}
|
|
156
|
-
case 9:
|
|
157
105
|
// Replace mesh in scene
|
|
158
106
|
this._replaceMeshInScene(targetMesh, libraryModel, originalProps.parent, component);
|
|
159
107
|
|
|
@@ -171,14 +119,14 @@ var ModelManager = /*#__PURE__*/function () {
|
|
|
171
119
|
}
|
|
172
120
|
}
|
|
173
121
|
console.log("\uD83C\uDF89 ".concat((_jsonEntry$userData3 = jsonEntry.userData) === null || _jsonEntry$userData3 === void 0 ? void 0 : _jsonEntry$userData3.libraryId, " GLB model successfully rendered in scene"));
|
|
174
|
-
return
|
|
175
|
-
case
|
|
176
|
-
|
|
177
|
-
_t =
|
|
122
|
+
return _context.a(2, libraryModel);
|
|
123
|
+
case 6:
|
|
124
|
+
_context.p = 6;
|
|
125
|
+
_t = _context.v;
|
|
178
126
|
console.error("\u274C Error loading ".concat((_jsonEntry$userData4 = jsonEntry.userData) === null || _jsonEntry$userData4 === void 0 ? void 0 : _jsonEntry$userData4.libraryId, " GLB model:"), _t);
|
|
179
|
-
return
|
|
127
|
+
return _context.a(2, targetMesh);
|
|
180
128
|
}
|
|
181
|
-
}, _callee, this, [[1,
|
|
129
|
+
}, _callee, this, [[1, 6]]);
|
|
182
130
|
}));
|
|
183
131
|
function loadLibraryModel(_x, _x2, _x3) {
|
|
184
132
|
return _loadLibraryModel.apply(this, arguments);
|
|
@@ -257,84 +205,84 @@ var ModelManager = /*#__PURE__*/function () {
|
|
|
257
205
|
var _getLibraryModel2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(modelKey, libraryId) {
|
|
258
206
|
var _this2 = this;
|
|
259
207
|
var gltfScene, preloaderStatus, modelPath, gltf, _t2, _t3, _t4;
|
|
260
|
-
return _regenerator().w(function (
|
|
261
|
-
while (1) switch (
|
|
208
|
+
return _regenerator().w(function (_context2) {
|
|
209
|
+
while (1) switch (_context2.n) {
|
|
262
210
|
case 0:
|
|
263
211
|
// Try cache first
|
|
264
212
|
gltfScene = modelPreloader.getCachedModelWithDimensions(modelKey, libraryId);
|
|
265
213
|
if (!gltfScene) {
|
|
266
|
-
|
|
214
|
+
_context2.n = 1;
|
|
267
215
|
break;
|
|
268
216
|
}
|
|
269
217
|
console.log("\uD83C\uDFAF GLB cache HIT: ".concat(modelKey));
|
|
270
|
-
return
|
|
218
|
+
return _context2.a(2, gltfScene);
|
|
271
219
|
case 1:
|
|
272
220
|
// Check if preloading is in progress
|
|
273
221
|
preloaderStatus = modelPreloader.getStatus();
|
|
274
222
|
if (!preloaderStatus.isPreloading) {
|
|
275
|
-
|
|
223
|
+
_context2.n = 6;
|
|
276
224
|
break;
|
|
277
225
|
}
|
|
278
226
|
console.log("\u23F3 Waiting for preloader: ".concat(modelKey));
|
|
279
|
-
|
|
280
|
-
|
|
227
|
+
_context2.p = 2;
|
|
228
|
+
_context2.n = 3;
|
|
281
229
|
return modelPreloader.preloadingPromise;
|
|
282
230
|
case 3:
|
|
283
231
|
gltfScene = modelPreloader.getCachedModelWithDimensions(modelKey, libraryId);
|
|
284
232
|
if (!gltfScene) {
|
|
285
|
-
|
|
233
|
+
_context2.n = 4;
|
|
286
234
|
break;
|
|
287
235
|
}
|
|
288
236
|
console.log("\uD83C\uDFAF GLB cache HIT (after preload): ".concat(modelKey));
|
|
289
|
-
return
|
|
237
|
+
return _context2.a(2, gltfScene);
|
|
290
238
|
case 4:
|
|
291
|
-
|
|
239
|
+
_context2.n = 6;
|
|
292
240
|
break;
|
|
293
241
|
case 5:
|
|
294
|
-
|
|
295
|
-
_t2 =
|
|
242
|
+
_context2.p = 5;
|
|
243
|
+
_t2 = _context2.v;
|
|
296
244
|
console.warn("\u26A0\uFE0F Preloading failed:", _t2);
|
|
297
245
|
case 6:
|
|
298
|
-
|
|
246
|
+
_context2.p = 6;
|
|
299
247
|
if (!modelPreloader.urlResolver) {
|
|
300
|
-
|
|
248
|
+
_context2.n = 11;
|
|
301
249
|
break;
|
|
302
250
|
}
|
|
303
|
-
|
|
304
|
-
|
|
251
|
+
_context2.p = 7;
|
|
252
|
+
_context2.n = 8;
|
|
305
253
|
return modelPreloader.urlResolver(modelKey);
|
|
306
254
|
case 8:
|
|
307
|
-
modelPath =
|
|
255
|
+
modelPath = _context2.v;
|
|
308
256
|
console.log("\uD83D\uDD17 Resolved URL for ".concat(modelKey));
|
|
309
|
-
|
|
257
|
+
_context2.n = 10;
|
|
310
258
|
break;
|
|
311
259
|
case 9:
|
|
312
|
-
|
|
313
|
-
_t3 =
|
|
260
|
+
_context2.p = 9;
|
|
261
|
+
_t3 = _context2.v;
|
|
314
262
|
console.warn("\u26A0\uFE0F URL resolver failed for ".concat(modelKey, ", falling back to local path:"), _t3);
|
|
315
263
|
modelPath = "".concat(modelPreloader.modelsBasePath).concat(modelKey);
|
|
316
264
|
case 10:
|
|
317
|
-
|
|
265
|
+
_context2.n = 12;
|
|
318
266
|
break;
|
|
319
267
|
case 11:
|
|
320
268
|
modelPath = "".concat(modelPreloader.modelsBasePath).concat(modelKey);
|
|
321
269
|
case 12:
|
|
322
270
|
console.log("\uD83D\uDCC2 Fallback loading from: ".concat(modelPath));
|
|
323
|
-
|
|
271
|
+
_context2.n = 13;
|
|
324
272
|
return new Promise(function (resolve, reject) {
|
|
325
273
|
_this2.sceneViewer.gltfLoader.load(modelPath, resolve, undefined, reject);
|
|
326
274
|
});
|
|
327
275
|
case 13:
|
|
328
|
-
gltf =
|
|
276
|
+
gltf = _context2.v;
|
|
329
277
|
if (libraryId) {
|
|
330
278
|
modelPreloader.cacheModel(modelKey, gltf.scene.clone(), libraryId);
|
|
331
279
|
}
|
|
332
|
-
return
|
|
280
|
+
return _context2.a(2, gltf.scene);
|
|
333
281
|
case 14:
|
|
334
|
-
|
|
335
|
-
_t4 =
|
|
282
|
+
_context2.p = 14;
|
|
283
|
+
_t4 = _context2.v;
|
|
336
284
|
console.error("Failed to load model ".concat(modelKey, ":"), _t4);
|
|
337
|
-
return
|
|
285
|
+
return _context2.a(2, null);
|
|
338
286
|
}
|
|
339
287
|
}, _callee2, null, [[7, 9], [6, 14], [2, 5]]);
|
|
340
288
|
}));
|
|
@@ -441,8 +389,8 @@ var ModelManager = /*#__PURE__*/function () {
|
|
|
441
389
|
value: (function () {
|
|
442
390
|
var _verifyModelPreloaderCache = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
|
|
443
391
|
var preloaderStatus, _t5;
|
|
444
|
-
return _regenerator().w(function (
|
|
445
|
-
while (1) switch (
|
|
392
|
+
return _regenerator().w(function (_context3) {
|
|
393
|
+
while (1) switch (_context3.n) {
|
|
446
394
|
case 0:
|
|
447
395
|
console.log('🔍 Verifying model preloader cache state...');
|
|
448
396
|
preloaderStatus = modelPreloader.getStatus();
|
|
@@ -450,23 +398,23 @@ var ModelManager = /*#__PURE__*/function () {
|
|
|
450
398
|
|
|
451
399
|
// If preloading is still in progress, wait for completion
|
|
452
400
|
if (!preloaderStatus.isPreloading) {
|
|
453
|
-
|
|
401
|
+
_context3.n = 4;
|
|
454
402
|
break;
|
|
455
403
|
}
|
|
456
404
|
console.log('⏳ Waiting for model preloading to complete...');
|
|
457
|
-
|
|
458
|
-
|
|
405
|
+
_context3.p = 1;
|
|
406
|
+
_context3.n = 2;
|
|
459
407
|
return modelPreloader.preloadingPromise;
|
|
460
408
|
case 2:
|
|
461
409
|
console.log('✅ Model preloading completed');
|
|
462
|
-
|
|
410
|
+
_context3.n = 4;
|
|
463
411
|
break;
|
|
464
412
|
case 3:
|
|
465
|
-
|
|
466
|
-
_t5 =
|
|
413
|
+
_context3.p = 3;
|
|
414
|
+
_t5 = _context3.v;
|
|
467
415
|
console.warn('⚠️ Model preloading failed, some models may load directly:', _t5);
|
|
468
416
|
case 4:
|
|
469
|
-
return
|
|
417
|
+
return _context3.a(2, preloaderStatus);
|
|
470
418
|
}
|
|
471
419
|
}, _callee3, null, [[1, 3]]);
|
|
472
420
|
}));
|
|
@@ -484,11 +432,11 @@ var ModelManager = /*#__PURE__*/function () {
|
|
|
484
432
|
value: (function () {
|
|
485
433
|
var _preloadMissingModels = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(data, componentDictionary) {
|
|
486
434
|
var _data$scene, _data$scene2, requiredModels, preloaderStatus, cachedModels, missingModels, basePath, modelUrls, _iterator, _step, modelKey, _t6, _t7;
|
|
487
|
-
return _regenerator().w(function (
|
|
488
|
-
while (1) switch (
|
|
435
|
+
return _regenerator().w(function (_context4) {
|
|
436
|
+
while (1) switch (_context4.n) {
|
|
489
437
|
case 0:
|
|
490
438
|
if (!(!data || !data.scene || !Array.isArray(data.scene.children))) {
|
|
491
|
-
|
|
439
|
+
_context4.n = 1;
|
|
492
440
|
break;
|
|
493
441
|
}
|
|
494
442
|
console.warn('⚠️ Invalid scene data structure in preloadMissingModels:', {
|
|
@@ -497,7 +445,7 @@ var ModelManager = /*#__PURE__*/function () {
|
|
|
497
445
|
hasChildren: !!(data !== null && data !== void 0 && (_data$scene = data.scene) !== null && _data$scene !== void 0 && _data$scene.children),
|
|
498
446
|
childrenType: data !== null && data !== void 0 && (_data$scene2 = data.scene) !== null && _data$scene2 !== void 0 && _data$scene2.children ? _typeof(data.scene.children) : 'undefined'
|
|
499
447
|
});
|
|
500
|
-
return
|
|
448
|
+
return _context4.a(2);
|
|
501
449
|
case 1:
|
|
502
450
|
requiredModels = new Set();
|
|
503
451
|
console.log("\uD83D\uDD0D Checking ".concat(data.scene.children.length, " scene objects for required models..."));
|
|
@@ -519,10 +467,10 @@ var ModelManager = /*#__PURE__*/function () {
|
|
|
519
467
|
}
|
|
520
468
|
});
|
|
521
469
|
console.log('🔍 Required models for this scene (Set):', Array.from(requiredModels));
|
|
522
|
-
|
|
470
|
+
_context4.n = 2;
|
|
523
471
|
return this.verifyModelPreloaderCache();
|
|
524
472
|
case 2:
|
|
525
|
-
preloaderStatus =
|
|
473
|
+
preloaderStatus = _context4.v;
|
|
526
474
|
cachedModels = preloaderStatus.cachedModels;
|
|
527
475
|
console.log('ModelPreloader cached models:', cachedModels);
|
|
528
476
|
|
|
@@ -553,7 +501,7 @@ var ModelManager = /*#__PURE__*/function () {
|
|
|
553
501
|
});
|
|
554
502
|
}
|
|
555
503
|
if (!(missingModels.length > 0)) {
|
|
556
|
-
|
|
504
|
+
_context4.n = 12;
|
|
557
505
|
break;
|
|
558
506
|
}
|
|
559
507
|
console.warn('⚠️ Some required models are not cached:', missingModels);
|
|
@@ -561,41 +509,41 @@ var ModelManager = /*#__PURE__*/function () {
|
|
|
561
509
|
|
|
562
510
|
// Preload missing models (Main in-memory preloader)
|
|
563
511
|
_iterator = _createForOfIteratorHelper(missingModels);
|
|
564
|
-
|
|
512
|
+
_context4.p = 3;
|
|
565
513
|
_iterator.s();
|
|
566
514
|
case 4:
|
|
567
515
|
if ((_step = _iterator.n()).done) {
|
|
568
|
-
|
|
516
|
+
_context4.n = 9;
|
|
569
517
|
break;
|
|
570
518
|
}
|
|
571
519
|
modelKey = _step.value;
|
|
572
|
-
|
|
573
|
-
|
|
520
|
+
_context4.p = 5;
|
|
521
|
+
_context4.n = 6;
|
|
574
522
|
return modelPreloader.preloadSingleModel(modelKey);
|
|
575
523
|
case 6:
|
|
576
524
|
console.log("\u2705 Successfully preloaded missing model: ".concat(modelKey));
|
|
577
|
-
|
|
525
|
+
_context4.n = 8;
|
|
578
526
|
break;
|
|
579
527
|
case 7:
|
|
580
|
-
|
|
581
|
-
_t6 =
|
|
528
|
+
_context4.p = 7;
|
|
529
|
+
_t6 = _context4.v;
|
|
582
530
|
console.warn("\u274C Failed to preload missing model ".concat(modelKey, ":"), _t6);
|
|
583
531
|
case 8:
|
|
584
|
-
|
|
532
|
+
_context4.n = 4;
|
|
585
533
|
break;
|
|
586
534
|
case 9:
|
|
587
|
-
|
|
535
|
+
_context4.n = 11;
|
|
588
536
|
break;
|
|
589
537
|
case 10:
|
|
590
|
-
|
|
591
|
-
_t7 =
|
|
538
|
+
_context4.p = 10;
|
|
539
|
+
_t7 = _context4.v;
|
|
592
540
|
_iterator.e(_t7);
|
|
593
541
|
case 11:
|
|
594
|
-
|
|
542
|
+
_context4.p = 11;
|
|
595
543
|
_iterator.f();
|
|
596
|
-
return
|
|
544
|
+
return _context4.f(11);
|
|
597
545
|
case 12:
|
|
598
|
-
return
|
|
546
|
+
return _context4.a(2);
|
|
599
547
|
}
|
|
600
548
|
}, _callee4, this, [[5, 7], [3, 10, 11, 12]]);
|
|
601
549
|
}));
|
|
@@ -614,14 +562,14 @@ var ModelManager = /*#__PURE__*/function () {
|
|
|
614
562
|
var _replaceWithGLBModels = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5(libraryObjectsToReplace) {
|
|
615
563
|
var _this3 = this;
|
|
616
564
|
var startTime, glbLoadingPromises;
|
|
617
|
-
return _regenerator().w(function (
|
|
618
|
-
while (1) switch (
|
|
565
|
+
return _regenerator().w(function (_context5) {
|
|
566
|
+
while (1) switch (_context5.n) {
|
|
619
567
|
case 0:
|
|
620
568
|
if (!(libraryObjectsToReplace.length === 0)) {
|
|
621
|
-
|
|
569
|
+
_context5.n = 1;
|
|
622
570
|
break;
|
|
623
571
|
}
|
|
624
|
-
return
|
|
572
|
+
return _context5.a(2);
|
|
625
573
|
case 1:
|
|
626
574
|
startTime = performance.now();
|
|
627
575
|
console.log("\uD83D\uDD04 Replacing ".concat(libraryObjectsToReplace.length, " objects with GLB models..."));
|
|
@@ -641,7 +589,7 @@ var ModelManager = /*#__PURE__*/function () {
|
|
|
641
589
|
return basicObject;
|
|
642
590
|
});
|
|
643
591
|
});
|
|
644
|
-
|
|
592
|
+
_context5.n = 2;
|
|
645
593
|
return Promise.all(glbLoadingPromises);
|
|
646
594
|
case 2:
|
|
647
595
|
console.log("\u23F1\uFE0F All GLB models loaded in ".concat((performance.now() - startTime).toFixed(0), "ms"));
|
|
@@ -684,7 +632,7 @@ var ModelManager = /*#__PURE__*/function () {
|
|
|
684
632
|
}));
|
|
685
633
|
}
|
|
686
634
|
case 3:
|
|
687
|
-
return
|
|
635
|
+
return _context5.a(2);
|
|
688
636
|
}
|
|
689
637
|
}, _callee5);
|
|
690
638
|
}));
|
|
@@ -719,26 +667,26 @@ var ModelManager = /*#__PURE__*/function () {
|
|
|
719
667
|
value: (function () {
|
|
720
668
|
var _loadComponentDictionary = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6() {
|
|
721
669
|
var response, dict, _t8;
|
|
722
|
-
return _regenerator().w(function (
|
|
723
|
-
while (1) switch (
|
|
670
|
+
return _regenerator().w(function (_context6) {
|
|
671
|
+
while (1) switch (_context6.n) {
|
|
724
672
|
case 0:
|
|
725
|
-
|
|
673
|
+
_context6.p = 0;
|
|
726
674
|
console.log('🔄 ModelManager loading component dictionary...');
|
|
727
|
-
|
|
675
|
+
_context6.n = 1;
|
|
728
676
|
return fetch('/library/component-dictionary.json');
|
|
729
677
|
case 1:
|
|
730
|
-
response =
|
|
731
|
-
|
|
678
|
+
response = _context6.v;
|
|
679
|
+
_context6.n = 2;
|
|
732
680
|
return response.json();
|
|
733
681
|
case 2:
|
|
734
|
-
dict =
|
|
682
|
+
dict = _context6.v;
|
|
735
683
|
console.log('✅ ModelManager loaded dictionary:', Object.keys(dict).length, 'entries');
|
|
736
|
-
return
|
|
684
|
+
return _context6.a(2, dict);
|
|
737
685
|
case 3:
|
|
738
|
-
|
|
739
|
-
_t8 =
|
|
686
|
+
_context6.p = 3;
|
|
687
|
+
_t8 = _context6.v;
|
|
740
688
|
console.warn('⚠️ Could not load component dictionary:', _t8);
|
|
741
|
-
return
|
|
689
|
+
return _context6.a(2, {});
|
|
742
690
|
}
|
|
743
691
|
}, _callee6, null, [[0, 3]]);
|
|
744
692
|
}));
|
|
@@ -177,7 +177,8 @@ var SceneExportManager = /*#__PURE__*/function () {
|
|
|
177
177
|
|
|
178
178
|
// Copy only essential userData properties (libraryId, objectType, direction, group)
|
|
179
179
|
Object.keys(threeObject.userData).forEach(function (key) {
|
|
180
|
-
|
|
180
|
+
// Skip runtime/internal keys (e.g. _filteredBBoxCache from boundingBoxUtils)
|
|
181
|
+
if (!excludedKeys.has(key) && !key.startsWith('_')) {
|
|
181
182
|
jsonObject.userData[key] = threeObject.userData[key];
|
|
182
183
|
}
|
|
183
184
|
});
|
|
@@ -90,10 +90,15 @@ var SceneOperationsManager = /*#__PURE__*/function () {
|
|
|
90
90
|
key: "clearSceneObjects",
|
|
91
91
|
value: function () {
|
|
92
92
|
var _clearSceneObjects = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
|
|
93
|
-
var
|
|
93
|
+
var _this$sceneViewer;
|
|
94
|
+
var ioBehavMgr, result;
|
|
94
95
|
return _regenerator().w(function (_context) {
|
|
95
96
|
while (1) switch (_context.n) {
|
|
96
97
|
case 0:
|
|
98
|
+
ioBehavMgr = (_this$sceneViewer = this.sceneViewer) === null || _this$sceneViewer === void 0 || (_this$sceneViewer = _this$sceneViewer.managers) === null || _this$sceneViewer === void 0 ? void 0 : _this$sceneViewer.ioBehaviorManager;
|
|
99
|
+
if (ioBehavMgr !== null && ioBehavMgr !== void 0 && ioBehavMgr.resetForScene) {
|
|
100
|
+
ioBehavMgr.resetForScene();
|
|
101
|
+
}
|
|
97
102
|
_context.n = 1;
|
|
98
103
|
return this.sceneClearingUtility.clearAllObjects();
|
|
99
104
|
case 1:
|
|
@@ -459,9 +464,9 @@ var SceneOperationsManager = /*#__PURE__*/function () {
|
|
|
459
464
|
// Use crosscubeTextureSet if available, otherwise fallback material
|
|
460
465
|
var material = materials[obj.material];
|
|
461
466
|
if (!material) {
|
|
462
|
-
var _this$
|
|
467
|
+
var _this$sceneViewer2;
|
|
463
468
|
// Check if we have crosscubeTextureSet from scene loading
|
|
464
|
-
var crosscubeTextureSet = (_this$
|
|
469
|
+
var crosscubeTextureSet = (_this$sceneViewer2 = this.sceneViewer) === null || _this$sceneViewer2 === void 0 ? void 0 : _this$sceneViewer2.crosscubeTextureSet;
|
|
465
470
|
if (crosscubeTextureSet) {
|
|
466
471
|
// Match PathfindingManager.createPipeMaterial() with textures
|
|
467
472
|
var pathColor = '#245e29'; // Default green color from PathfindingManager.getPathColor()
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import * as THREE from 'three';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Translation helpers for I/O device animations.
|
|
5
|
+
* Offsets are expressed in the device/model root's local space so every child
|
|
6
|
+
* mesh moves along the same predictable axes regardless of intermediate parents.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @param {THREE.Object3D} modelRoot
|
|
11
|
+
* @param {{ x?: number, y?: number, z?: number }|THREE.Vector3} offset
|
|
12
|
+
* @returns {THREE.Vector3}
|
|
13
|
+
*/
|
|
14
|
+
function modelOffsetToWorldDelta(modelRoot, offset) {
|
|
15
|
+
var _offset$x, _offset$y, _offset$z;
|
|
16
|
+
var v = offset instanceof THREE.Vector3 ? offset.clone() : new THREE.Vector3((_offset$x = offset === null || offset === void 0 ? void 0 : offset.x) !== null && _offset$x !== void 0 ? _offset$x : 0, (_offset$y = offset === null || offset === void 0 ? void 0 : offset.y) !== null && _offset$y !== void 0 ? _offset$y : 0, (_offset$z = offset === null || offset === void 0 ? void 0 : offset.z) !== null && _offset$z !== void 0 ? _offset$z : 0);
|
|
17
|
+
var q = new THREE.Quaternion();
|
|
18
|
+
modelRoot.getWorldQuaternion(q);
|
|
19
|
+
return v.applyQuaternion(q);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Apply a model-root-space translation from a mesh's rest local pose.
|
|
24
|
+
*
|
|
25
|
+
* @param {THREE.Object3D} mesh
|
|
26
|
+
* @param {THREE.Object3D} modelRoot
|
|
27
|
+
* @param {THREE.Vector3} origLocalPos
|
|
28
|
+
* @param {{ x?: number, y?: number, z?: number }} modelOffset
|
|
29
|
+
*/
|
|
30
|
+
function applyModelRootTranslation(mesh, modelRoot, origLocalPos, modelOffset) {
|
|
31
|
+
if (!mesh || !modelRoot || !origLocalPos) return;
|
|
32
|
+
mesh.position.copy(origLocalPos);
|
|
33
|
+
mesh.updateMatrixWorld(true);
|
|
34
|
+
var origWorldPos = new THREE.Vector3();
|
|
35
|
+
mesh.getWorldPosition(origWorldPos);
|
|
36
|
+
var newWorldPos = origWorldPos.add(modelOffsetToWorldDelta(modelRoot, modelOffset));
|
|
37
|
+
if (mesh.parent) mesh.parent.worldToLocal(newWorldPos);
|
|
38
|
+
mesh.position.copy(newWorldPos);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export { applyModelRootTranslation, modelOffsetToWorldDelta };
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared I/O device state dispatch helpers used by centralPlant and componentTooltipManager.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @param {string} attachmentId
|
|
7
|
+
* @param {string|null|undefined} parentUuid
|
|
8
|
+
* @returns {string}
|
|
9
|
+
*/
|
|
10
|
+
function getScopedAttachmentKey(attachmentId, parentUuid) {
|
|
11
|
+
if (!parentUuid) return attachmentId;
|
|
12
|
+
return "".concat(parentUuid, "::").concat(attachmentId);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @param {Object} sceneViewer
|
|
17
|
+
* @returns {import('../managers/behaviors/IoBehaviorManager.js').IoBehaviorManager|null}
|
|
18
|
+
*/
|
|
19
|
+
function getIoBehaviorManager(sceneViewer) {
|
|
20
|
+
var _sceneViewer$managers, _sceneViewer$centralP;
|
|
21
|
+
if (!sceneViewer) return null;
|
|
22
|
+
return ((_sceneViewer$managers = sceneViewer.managers) === null || _sceneViewer$managers === void 0 ? void 0 : _sceneViewer$managers.ioBehaviorManager) || sceneViewer.ioBehaviorManager || ((_sceneViewer$centralP = sceneViewer.centralPlant) === null || _sceneViewer$centralP === void 0 || (_sceneViewer$centralP = _sceneViewer$centralP.managers) === null || _sceneViewer$centralP === void 0 ? void 0 : _sceneViewer$centralP.ioBehaviorManager) || null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Resolve tooltip/drag data points for an I/O device attachment.
|
|
27
|
+
* Prefers behaviorConfig-driven animation data points; merges legacy ioConfig snapshot.
|
|
28
|
+
*
|
|
29
|
+
* @param {string} parentUuid
|
|
30
|
+
* @param {string} attachmentId
|
|
31
|
+
* @param {Object} userData - io-device userData (may include dataPoints snapshot)
|
|
32
|
+
* @param {import('../managers/behaviors/IoBehaviorManager.js').IoBehaviorManager|null} ioBehaviorManager
|
|
33
|
+
* @param {THREE.Object3D|null} [hitMesh]
|
|
34
|
+
* @returns {Object[]}
|
|
35
|
+
*/
|
|
36
|
+
function resolveDataPoints(parentUuid, attachmentId, userData, ioBehaviorManager) {
|
|
37
|
+
var hitMesh = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
|
|
38
|
+
var fromAnimations = (ioBehaviorManager === null || ioBehaviorManager === void 0 ? void 0 : ioBehaviorManager.getAnimationDataPoints(parentUuid, attachmentId, hitMesh)) || [];
|
|
39
|
+
if (fromAnimations.length) return fromAnimations;
|
|
40
|
+
var legacy = (userData === null || userData === void 0 ? void 0 : userData.dataPoints) || [];
|
|
41
|
+
return legacy.map(function (dp) {
|
|
42
|
+
var _dp$defaultValue;
|
|
43
|
+
return {
|
|
44
|
+
id: dp.id || dp.name,
|
|
45
|
+
name: dp.name || dp.id,
|
|
46
|
+
stateType: dp.stateType || 'binary',
|
|
47
|
+
stateConfig: dp.stateConfig || {},
|
|
48
|
+
defaultValue: (_dp$defaultValue = dp.defaultValue) !== null && _dp$defaultValue !== void 0 ? _dp$defaultValue : null,
|
|
49
|
+
direction: dp.direction || (userData === null || userData === void 0 ? void 0 : userData.ioDirection) || 'output'
|
|
50
|
+
};
|
|
51
|
+
}).filter(function (dp) {
|
|
52
|
+
return dp.id;
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export { getIoBehaviorManager, getScopedAttachmentKey, resolveDataPoints };
|