@2112-lab/central-plant 0.3.38 → 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.
Files changed (29) hide show
  1. package/dist/bundle/index.js +1078 -562
  2. package/dist/cjs/src/core/centralPlant.js +115 -68
  3. package/dist/cjs/src/core/centralPlantInternals.js +20 -36
  4. package/dist/cjs/src/index.js +19 -0
  5. package/dist/cjs/src/managers/behaviors/IoBehaviorManager.js +175 -234
  6. package/dist/cjs/src/managers/components/componentDataManager.js +63 -11
  7. package/dist/cjs/src/managers/scene/componentTooltipManager.js +95 -65
  8. package/dist/cjs/src/managers/scene/modelManager.js +93 -145
  9. package/dist/cjs/src/managers/scene/sceneOperationsManager.js +8 -3
  10. package/dist/cjs/src/utils/animationTransformUtils.js +66 -0
  11. package/dist/cjs/src/utils/behaviorDispatch.js +62 -0
  12. package/dist/cjs/src/utils/behaviorRegistration.js +76 -0
  13. package/dist/cjs/src/utils/behaviorSceneUtils.js +155 -0
  14. package/dist/cjs/src/utils/behaviorSchema.js +209 -0
  15. package/dist/esm/src/core/centralPlant.js +115 -68
  16. package/dist/esm/src/core/centralPlantInternals.js +21 -37
  17. package/dist/esm/src/index.js +4 -0
  18. package/dist/esm/src/managers/behaviors/IoBehaviorManager.js +176 -235
  19. package/dist/esm/src/managers/components/componentDataManager.js +63 -11
  20. package/dist/esm/src/managers/scene/componentTooltipManager.js +95 -65
  21. package/dist/esm/src/managers/scene/modelManager.js +94 -146
  22. package/dist/esm/src/managers/scene/sceneOperationsManager.js +8 -3
  23. package/dist/esm/src/utils/animationTransformUtils.js +41 -0
  24. package/dist/esm/src/utils/behaviorDispatch.js +56 -0
  25. package/dist/esm/src/utils/behaviorRegistration.js +71 -0
  26. package/dist/esm/src/utils/behaviorSceneUtils.js +147 -0
  27. package/dist/esm/src/utils/behaviorSchema.js +201 -0
  28. package/dist/index.d.ts +169 -1
  29. 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, regeneratorValues as _regeneratorValues, slicedToArray as _slicedToArray, createForOfIteratorHelper as _createForOfIteratorHelper } from '../../../_virtual/_rollupPluginBabelHelpers.js';
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, _loop, _i, _Object$entries, warmFn, _jsonEntry$userData4, _t;
57
- return _regenerator().w(function (_context2) {
58
- while (1) switch (_context2.n) {
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
- _context2.p = 1;
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
- _context2.n = 2;
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 = _context2.v;
78
+ gltfScene = _context.v;
78
79
  if (gltfScene) {
79
- _context2.n = 3;
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 _context2.a(2, targetMesh);
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
- _context2.n = 9;
94
+ _context.n = 5;
94
95
  break;
95
96
  }
96
- _context2.n = 4;
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 (!ioBehavMgr) {
102
- _context2.n = 9;
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 _context2.a(2, libraryModel);
175
- case 10:
176
- _context2.p = 10;
177
- _t = _context2.v;
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 _context2.a(2, targetMesh);
127
+ return _context.a(2, targetMesh);
180
128
  }
181
- }, _callee, this, [[1, 10]]);
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 (_context3) {
261
- while (1) switch (_context3.n) {
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
- _context3.n = 1;
214
+ _context2.n = 1;
267
215
  break;
268
216
  }
269
217
  console.log("\uD83C\uDFAF GLB cache HIT: ".concat(modelKey));
270
- return _context3.a(2, gltfScene);
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
- _context3.n = 6;
223
+ _context2.n = 6;
276
224
  break;
277
225
  }
278
226
  console.log("\u23F3 Waiting for preloader: ".concat(modelKey));
279
- _context3.p = 2;
280
- _context3.n = 3;
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
- _context3.n = 4;
233
+ _context2.n = 4;
286
234
  break;
287
235
  }
288
236
  console.log("\uD83C\uDFAF GLB cache HIT (after preload): ".concat(modelKey));
289
- return _context3.a(2, gltfScene);
237
+ return _context2.a(2, gltfScene);
290
238
  case 4:
291
- _context3.n = 6;
239
+ _context2.n = 6;
292
240
  break;
293
241
  case 5:
294
- _context3.p = 5;
295
- _t2 = _context3.v;
242
+ _context2.p = 5;
243
+ _t2 = _context2.v;
296
244
  console.warn("\u26A0\uFE0F Preloading failed:", _t2);
297
245
  case 6:
298
- _context3.p = 6;
246
+ _context2.p = 6;
299
247
  if (!modelPreloader.urlResolver) {
300
- _context3.n = 11;
248
+ _context2.n = 11;
301
249
  break;
302
250
  }
303
- _context3.p = 7;
304
- _context3.n = 8;
251
+ _context2.p = 7;
252
+ _context2.n = 8;
305
253
  return modelPreloader.urlResolver(modelKey);
306
254
  case 8:
307
- modelPath = _context3.v;
255
+ modelPath = _context2.v;
308
256
  console.log("\uD83D\uDD17 Resolved URL for ".concat(modelKey));
309
- _context3.n = 10;
257
+ _context2.n = 10;
310
258
  break;
311
259
  case 9:
312
- _context3.p = 9;
313
- _t3 = _context3.v;
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
- _context3.n = 12;
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
- _context3.n = 13;
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 = _context3.v;
276
+ gltf = _context2.v;
329
277
  if (libraryId) {
330
278
  modelPreloader.cacheModel(modelKey, gltf.scene.clone(), libraryId);
331
279
  }
332
- return _context3.a(2, gltf.scene);
280
+ return _context2.a(2, gltf.scene);
333
281
  case 14:
334
- _context3.p = 14;
335
- _t4 = _context3.v;
282
+ _context2.p = 14;
283
+ _t4 = _context2.v;
336
284
  console.error("Failed to load model ".concat(modelKey, ":"), _t4);
337
- return _context3.a(2, null);
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 (_context4) {
445
- while (1) switch (_context4.n) {
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
- _context4.n = 4;
401
+ _context3.n = 4;
454
402
  break;
455
403
  }
456
404
  console.log('⏳ Waiting for model preloading to complete...');
457
- _context4.p = 1;
458
- _context4.n = 2;
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
- _context4.n = 4;
410
+ _context3.n = 4;
463
411
  break;
464
412
  case 3:
465
- _context4.p = 3;
466
- _t5 = _context4.v;
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 _context4.a(2, preloaderStatus);
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 (_context5) {
488
- while (1) switch (_context5.n) {
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
- _context5.n = 1;
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 _context5.a(2);
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
- _context5.n = 2;
470
+ _context4.n = 2;
523
471
  return this.verifyModelPreloaderCache();
524
472
  case 2:
525
- preloaderStatus = _context5.v;
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
- _context5.n = 12;
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
- _context5.p = 3;
512
+ _context4.p = 3;
565
513
  _iterator.s();
566
514
  case 4:
567
515
  if ((_step = _iterator.n()).done) {
568
- _context5.n = 9;
516
+ _context4.n = 9;
569
517
  break;
570
518
  }
571
519
  modelKey = _step.value;
572
- _context5.p = 5;
573
- _context5.n = 6;
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
- _context5.n = 8;
525
+ _context4.n = 8;
578
526
  break;
579
527
  case 7:
580
- _context5.p = 7;
581
- _t6 = _context5.v;
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
- _context5.n = 4;
532
+ _context4.n = 4;
585
533
  break;
586
534
  case 9:
587
- _context5.n = 11;
535
+ _context4.n = 11;
588
536
  break;
589
537
  case 10:
590
- _context5.p = 10;
591
- _t7 = _context5.v;
538
+ _context4.p = 10;
539
+ _t7 = _context4.v;
592
540
  _iterator.e(_t7);
593
541
  case 11:
594
- _context5.p = 11;
542
+ _context4.p = 11;
595
543
  _iterator.f();
596
- return _context5.f(11);
544
+ return _context4.f(11);
597
545
  case 12:
598
- return _context5.a(2);
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 (_context6) {
618
- while (1) switch (_context6.n) {
565
+ return _regenerator().w(function (_context5) {
566
+ while (1) switch (_context5.n) {
619
567
  case 0:
620
568
  if (!(libraryObjectsToReplace.length === 0)) {
621
- _context6.n = 1;
569
+ _context5.n = 1;
622
570
  break;
623
571
  }
624
- return _context6.a(2);
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
- _context6.n = 2;
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 _context6.a(2);
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 (_context7) {
723
- while (1) switch (_context7.n) {
670
+ return _regenerator().w(function (_context6) {
671
+ while (1) switch (_context6.n) {
724
672
  case 0:
725
- _context7.p = 0;
673
+ _context6.p = 0;
726
674
  console.log('🔄 ModelManager loading component dictionary...');
727
- _context7.n = 1;
675
+ _context6.n = 1;
728
676
  return fetch('/library/component-dictionary.json');
729
677
  case 1:
730
- response = _context7.v;
731
- _context7.n = 2;
678
+ response = _context6.v;
679
+ _context6.n = 2;
732
680
  return response.json();
733
681
  case 2:
734
- dict = _context7.v;
682
+ dict = _context6.v;
735
683
  console.log('✅ ModelManager loaded dictionary:', Object.keys(dict).length, 'entries');
736
- return _context7.a(2, dict);
684
+ return _context6.a(2, dict);
737
685
  case 3:
738
- _context7.p = 3;
739
- _t8 = _context7.v;
686
+ _context6.p = 3;
687
+ _t8 = _context6.v;
740
688
  console.warn('⚠️ Could not load component dictionary:', _t8);
741
- return _context7.a(2, {});
689
+ return _context6.a(2, {});
742
690
  }
743
691
  }, _callee6, null, [[0, 3]]);
744
692
  }));
@@ -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 result;
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$sceneViewer;
467
+ var _this$sceneViewer2;
463
468
  // Check if we have crosscubeTextureSet from scene loading
464
- var crosscubeTextureSet = (_this$sceneViewer = this.sceneViewer) === null || _this$sceneViewer === void 0 ? void 0 : _this$sceneViewer.crosscubeTextureSet;
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 };