@2112-lab/central-plant 0.1.0

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 (54) hide show
  1. package/README.md +0 -0
  2. package/dist/bundle/index.js +14259 -0
  3. package/dist/cjs/_virtual/_rollupPluginBabelHelpers.js +353 -0
  4. package/dist/cjs/node_modules/three/examples/jsm/controls/OrbitControls.js +1292 -0
  5. package/dist/cjs/node_modules/three/examples/jsm/controls/TransformControls.js +1543 -0
  6. package/dist/cjs/node_modules/three/examples/jsm/loaders/GLTFLoader.js +4374 -0
  7. package/dist/cjs/node_modules/three/examples/jsm/loaders/RGBELoader.js +465 -0
  8. package/dist/cjs/node_modules/three/examples/jsm/utils/BufferGeometryUtils.js +117 -0
  9. package/dist/cjs/src/ConnectionManager.js +114 -0
  10. package/dist/cjs/src/Pathfinder.js +88 -0
  11. package/dist/cjs/src/animationManager.js +121 -0
  12. package/dist/cjs/src/componentManager.js +151 -0
  13. package/dist/cjs/src/debugLogger.js +176 -0
  14. package/dist/cjs/src/disposalManager.js +185 -0
  15. package/dist/cjs/src/environmentManager.js +1015 -0
  16. package/dist/cjs/src/hotReloadManager.js +252 -0
  17. package/dist/cjs/src/index.js +126 -0
  18. package/dist/cjs/src/keyboardControlsManager.js +206 -0
  19. package/dist/cjs/src/modelPreloader.js +360 -0
  20. package/dist/cjs/src/nameUtils.js +106 -0
  21. package/dist/cjs/src/pathfindingManager.js +321 -0
  22. package/dist/cjs/src/performanceMonitor.js +718 -0
  23. package/dist/cjs/src/sceneExportManager.js +292 -0
  24. package/dist/cjs/src/sceneInitializationManager.js +540 -0
  25. package/dist/cjs/src/sceneOperationsManager.js +560 -0
  26. package/dist/cjs/src/textureConfig.js +195 -0
  27. package/dist/cjs/src/transformControlsManager.js +851 -0
  28. package/dist/esm/_virtual/_rollupPluginBabelHelpers.js +328 -0
  29. package/dist/esm/node_modules/three/examples/jsm/controls/OrbitControls.js +1287 -0
  30. package/dist/esm/node_modules/three/examples/jsm/controls/TransformControls.js +1537 -0
  31. package/dist/esm/node_modules/three/examples/jsm/loaders/GLTFLoader.js +4370 -0
  32. package/dist/esm/node_modules/three/examples/jsm/loaders/RGBELoader.js +461 -0
  33. package/dist/esm/node_modules/three/examples/jsm/utils/BufferGeometryUtils.js +113 -0
  34. package/dist/esm/src/ConnectionManager.js +110 -0
  35. package/dist/esm/src/Pathfinder.js +84 -0
  36. package/dist/esm/src/animationManager.js +112 -0
  37. package/dist/esm/src/componentManager.js +123 -0
  38. package/dist/esm/src/debugLogger.js +167 -0
  39. package/dist/esm/src/disposalManager.js +155 -0
  40. package/dist/esm/src/environmentManager.js +989 -0
  41. package/dist/esm/src/hotReloadManager.js +244 -0
  42. package/dist/esm/src/index.js +117 -0
  43. package/dist/esm/src/keyboardControlsManager.js +196 -0
  44. package/dist/esm/src/modelPreloader.js +337 -0
  45. package/dist/esm/src/nameUtils.js +99 -0
  46. package/dist/esm/src/pathfindingManager.js +295 -0
  47. package/dist/esm/src/performanceMonitor.js +712 -0
  48. package/dist/esm/src/sceneExportManager.js +286 -0
  49. package/dist/esm/src/sceneInitializationManager.js +513 -0
  50. package/dist/esm/src/sceneOperationsManager.js +536 -0
  51. package/dist/esm/src/textureConfig.js +168 -0
  52. package/dist/esm/src/transformControlsManager.js +827 -0
  53. package/dist/index.d.ts +259 -0
  54. package/package.json +53 -0
@@ -0,0 +1,360 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _rollupPluginBabelHelpers = require('../_virtual/_rollupPluginBabelHelpers.js');
6
+ require('three');
7
+
8
+ function _interopNamespace(e) {
9
+ if (e && e.__esModule) return e;
10
+ var n = Object.create(null);
11
+ if (e) {
12
+ Object.keys(e).forEach(function (k) {
13
+ if (k !== 'default') {
14
+ var d = Object.getOwnPropertyDescriptor(e, k);
15
+ Object.defineProperty(n, k, d.get ? d : {
16
+ enumerable: true,
17
+ get: function () { return e[k]; }
18
+ });
19
+ }
20
+ });
21
+ }
22
+ n["default"] = e;
23
+ return Object.freeze(n);
24
+ }
25
+
26
+ var ModelPreloader = /*#__PURE__*/function () {
27
+ function ModelPreloader() {
28
+ _rollupPluginBabelHelpers.classCallCheck(this, ModelPreloader);
29
+ this.modelCache = new Map(); // Cache for loaded GLB models
30
+ this.loadingPromises = new Map(); // Track ongoing loads to prevent duplicates
31
+ this.isPreloading = false;
32
+ this.preloadingPromise = null;
33
+ this.componentDictionary = null;
34
+
35
+ // Load GLTFLoader dynamically if available
36
+ this.gltfLoader = null;
37
+ this.initLoader();
38
+ }
39
+ return _rollupPluginBabelHelpers.createClass(ModelPreloader, [{
40
+ key: "initLoader",
41
+ value: function () {
42
+ var _initLoader = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee() {
43
+ var GLTFLoaderModule, _t;
44
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context) {
45
+ while (1) switch (_context.n) {
46
+ case 0:
47
+ _context.p = 0;
48
+ if (!(typeof window !== 'undefined')) {
49
+ _context.n = 3;
50
+ break;
51
+ }
52
+ _context.n = 1;
53
+ return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('three')); });
54
+ case 1:
55
+ _context.v;
56
+ _context.n = 2;
57
+ return Promise.resolve().then(function () { return require('../node_modules/three/examples/jsm/loaders/GLTFLoader.js'); });
58
+ case 2:
59
+ GLTFLoaderModule = _context.v;
60
+ this.gltfLoader = new GLTFLoaderModule.GLTFLoader();
61
+ case 3:
62
+ _context.n = 5;
63
+ break;
64
+ case 4:
65
+ _context.p = 4;
66
+ _t = _context.v;
67
+ console.warn('Failed to initialize GLTFLoader:', _t);
68
+ case 5:
69
+ return _context.a(2);
70
+ }
71
+ }, _callee, this, [[0, 4]]);
72
+ }));
73
+ function initLoader() {
74
+ return _initLoader.apply(this, arguments);
75
+ }
76
+ return initLoader;
77
+ }()
78
+ /**
79
+ * Preload all models from the component dictionary
80
+ * @param {Object} componentDictionary - The component dictionary object
81
+ * @returns {Promise} Promise that resolves when all models are loaded
82
+ */
83
+ }, {
84
+ key: "preloadAllModels",
85
+ value: (function () {
86
+ var _preloadAllModels = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee3(componentDictionary) {
87
+ var _this = this;
88
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context4) {
89
+ while (1) switch (_context4.n) {
90
+ case 0:
91
+ if (!this.isPreloading) {
92
+ _context4.n = 1;
93
+ break;
94
+ }
95
+ console.log('⏳ Preloading already in progress, returning existing promise');
96
+ return _context4.a(2, this.preloadingPromise);
97
+ case 1:
98
+ if (componentDictionary) {
99
+ _context4.n = 2;
100
+ break;
101
+ }
102
+ throw new Error('Component dictionary is required to preload models');
103
+ case 2:
104
+ this.isPreloading = true;
105
+ this.componentDictionary = componentDictionary;
106
+
107
+ // Create a promise to track overall preloading
108
+ this.preloadingPromise = new Promise(/*#__PURE__*/function () {
109
+ var _ref = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee2(resolve) {
110
+ var results, modelKeysSet, loadPromises, _iterator, _step, _loop, _t2, _t3;
111
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context3) {
112
+ while (1) switch (_context3.n) {
113
+ case 0:
114
+ _context3.p = 0;
115
+ console.log("\uD83D\uDE80 Starting preload of models from dictionary with ".concat(Object.keys(componentDictionary).length, " components"));
116
+ results = {
117
+ total: 0,
118
+ success: 0,
119
+ failed: 0,
120
+ skipped: 0,
121
+ modelKeys: []
122
+ }; // Extract all unique model keys from the dictionary
123
+ modelKeysSet = new Set();
124
+ Object.values(componentDictionary).forEach(function (component) {
125
+ if (component.modelKey) {
126
+ modelKeysSet.add(component.modelKey);
127
+ }
128
+ });
129
+ results.total = modelKeysSet.size;
130
+ results.modelKeys = Array.from(modelKeysSet);
131
+
132
+ // Load basic models first
133
+ console.log("\uD83D\uDCE6 Found ".concat(results.total, " unique model keys to preload"));
134
+
135
+ // Return early if no models to load
136
+ if (!(results.total === 0)) {
137
+ _context3.n = 1;
138
+ break;
139
+ }
140
+ _this.isPreloading = false;
141
+ resolve(results);
142
+ return _context3.a(2);
143
+ case 1:
144
+ // Process each model key
145
+ loadPromises = [];
146
+ _iterator = _rollupPluginBabelHelpers.createForOfIteratorHelper(results.modelKeys);
147
+ _context3.p = 2;
148
+ _loop = /*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _loop() {
149
+ var modelKey, modelUrl;
150
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context2) {
151
+ while (1) switch (_context2.n) {
152
+ case 0:
153
+ modelKey = _step.value;
154
+ modelUrl = _this.getModelUrlFromKey(modelKey);
155
+ if (modelUrl) {
156
+ loadPromises.push(_this.preloadModel(modelKey, modelUrl).then(function () {
157
+ results.success++;
158
+ }).catch(function (error) {
159
+ console.error("\u274C Failed to preload model ".concat(modelKey, ":"), error);
160
+ results.failed++;
161
+ }));
162
+ } else {
163
+ console.warn("\u26A0\uFE0F No URL found for model key: ".concat(modelKey));
164
+ results.skipped++;
165
+ }
166
+ case 1:
167
+ return _context2.a(2);
168
+ }
169
+ }, _loop);
170
+ });
171
+ _iterator.s();
172
+ case 3:
173
+ if ((_step = _iterator.n()).done) {
174
+ _context3.n = 5;
175
+ break;
176
+ }
177
+ return _context3.d(_rollupPluginBabelHelpers.regeneratorValues(_loop()), 4);
178
+ case 4:
179
+ _context3.n = 3;
180
+ break;
181
+ case 5:
182
+ _context3.n = 7;
183
+ break;
184
+ case 6:
185
+ _context3.p = 6;
186
+ _t2 = _context3.v;
187
+ _iterator.e(_t2);
188
+ case 7:
189
+ _context3.p = 7;
190
+ _iterator.f();
191
+ return _context3.f(7);
192
+ case 8:
193
+ _context3.n = 9;
194
+ return Promise.allSettled(loadPromises);
195
+ case 9:
196
+ console.log('✅ Model preloading completed with results:', results);
197
+ _this.isPreloading = false;
198
+ resolve(results);
199
+ _context3.n = 11;
200
+ break;
201
+ case 10:
202
+ _context3.p = 10;
203
+ _t3 = _context3.v;
204
+ console.error('❌ Error during model preloading:', _t3);
205
+ _this.isPreloading = false;
206
+ resolve({
207
+ total: 0,
208
+ success: 0,
209
+ failed: 1,
210
+ skipped: 0,
211
+ error: _t3.message
212
+ });
213
+ case 11:
214
+ return _context3.a(2);
215
+ }
216
+ }, _callee2, null, [[2, 6, 7, 8], [0, 10]]);
217
+ }));
218
+ return function (_x2) {
219
+ return _ref.apply(this, arguments);
220
+ };
221
+ }());
222
+ return _context4.a(2, this.preloadingPromise);
223
+ }
224
+ }, _callee3, this);
225
+ }));
226
+ function preloadAllModels(_x) {
227
+ return _preloadAllModels.apply(this, arguments);
228
+ }
229
+ return preloadAllModels;
230
+ }()
231
+ /**
232
+ * Convert a model key to a URL
233
+ * @param {string} modelKey - The model key from the dictionary
234
+ * @returns {string} The URL for the model
235
+ */
236
+ )
237
+ }, {
238
+ key: "getModelUrlFromKey",
239
+ value: function getModelUrlFromKey(modelKey) {
240
+ // The modelKey already includes the .glb extension from the component dictionary
241
+ return modelKey;
242
+ }
243
+
244
+ /**
245
+ * Preload a specific model
246
+ * @param {string} modelKey - The model key
247
+ * @param {string} modelUrl - The URL to the model
248
+ * @returns {Promise} Promise that resolves with the loaded model
249
+ */
250
+ }, {
251
+ key: "preloadModel",
252
+ value: (function () {
253
+ var _preloadModel = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee4(modelKey, modelUrl) {
254
+ var _this2 = this;
255
+ var loadPromise;
256
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context5) {
257
+ while (1) switch (_context5.n) {
258
+ case 0:
259
+ if (this.gltfLoader) {
260
+ _context5.n = 2;
261
+ break;
262
+ }
263
+ _context5.n = 1;
264
+ return this.initLoader();
265
+ case 1:
266
+ if (this.gltfLoader) {
267
+ _context5.n = 2;
268
+ break;
269
+ }
270
+ throw new Error('GLTFLoader is not available');
271
+ case 2:
272
+ if (!this.modelCache.has(modelKey)) {
273
+ _context5.n = 3;
274
+ break;
275
+ }
276
+ return _context5.a(2, this.modelCache.get(modelKey));
277
+ case 3:
278
+ if (!this.loadingPromises.has(modelKey)) {
279
+ _context5.n = 4;
280
+ break;
281
+ }
282
+ return _context5.a(2, this.loadingPromises.get(modelKey));
283
+ case 4:
284
+ // Start loading the model
285
+ loadPromise = new Promise(function (resolve, reject) {
286
+ _this2.gltfLoader.load(modelUrl, function (gltf) {
287
+ console.log("\u2705 Successfully loaded model: ".concat(modelKey, " from ").concat(modelUrl));
288
+ _this2.modelCache.set(modelKey, gltf);
289
+ _this2.loadingPromises.delete(modelKey);
290
+ resolve(gltf);
291
+ }, function (progress) {
292
+ // Optional progress callback
293
+ if (progress.lengthComputable) {
294
+ progress.loaded / progress.total * 100;
295
+ // console.log(`📥 Loading ${modelKey}: ${percentComplete.toFixed(1)}%`);
296
+ }
297
+ }, function (error) {
298
+ console.error("\u274C Failed to load model ".concat(modelKey, " from ").concat(modelUrl, ":"), error);
299
+
300
+ // Add more detailed error information
301
+ if (error.message && error.message.includes('404')) {
302
+ console.error(" File not found. Check if the model exists at: ".concat(modelUrl));
303
+ } else if (error.message && error.message.includes('JSON')) {
304
+ console.error(" Invalid GLB file format. The file may be corrupted or is not a valid GLB/GLTF file.");
305
+ }
306
+ _this2.loadingPromises.delete(modelKey);
307
+ reject(error);
308
+ });
309
+ }); // Store the loading promise
310
+ this.loadingPromises.set(modelKey, loadPromise);
311
+ return _context5.a(2, loadPromise);
312
+ }
313
+ }, _callee4, this);
314
+ }));
315
+ function preloadModel(_x3, _x4) {
316
+ return _preloadModel.apply(this, arguments);
317
+ }
318
+ return preloadModel;
319
+ }()
320
+ /**
321
+ * Get a model from the cache
322
+ * @param {string} modelKey - The model key
323
+ * @returns {Object|null} The loaded model or null if not found
324
+ */
325
+ )
326
+ }, {
327
+ key: "getModel",
328
+ value: function getModel(modelKey) {
329
+ return this.modelCache.get(modelKey) || null;
330
+ }
331
+
332
+ /**
333
+ * Clear the model cache
334
+ */
335
+ }, {
336
+ key: "clearCache",
337
+ value: function clearCache() {
338
+ this.modelCache.clear();
339
+ }
340
+
341
+ /**
342
+ * Get statistics about the model cache
343
+ * @returns {Object} Cache statistics
344
+ */
345
+ }, {
346
+ key: "getCacheStats",
347
+ value: function getCacheStats() {
348
+ return {
349
+ cacheSize: this.modelCache.size,
350
+ cachedModels: Array.from(this.modelCache.keys()),
351
+ loading: Array.from(this.loadingPromises.keys()),
352
+ isPreloading: this.isPreloading
353
+ };
354
+ }
355
+ }]);
356
+ }(); // Create singleton instance
357
+ var modelPreloader = new ModelPreloader();
358
+
359
+ exports.ModelPreloader = ModelPreloader;
360
+ exports["default"] = modelPreloader;
@@ -0,0 +1,106 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ /**
6
+ * Name Utilities
7
+ * Common helper functions for name and UUID generation
8
+ */
9
+
10
+ /**
11
+ * Generate UUID from name using consistent transformation rules
12
+ * @param {string} name - The name to convert to UUID
13
+ * @returns {string} The generated UUID
14
+ */
15
+ function generateUuidFromName(name) {
16
+ if (!name) return null;
17
+
18
+ // Convert name to uppercase and replace spaces with hyphens
19
+ var uuid = name.toUpperCase().replace(/\s+COMPONENT$/i, '') // Remove "Component" suffix
20
+ .replace(/\s+/g, '-') // Replace spaces with hyphens
21
+ .replace(/[^A-Z0-9\-]/g, ''); // Remove special characters except hyphens
22
+
23
+ // Clean up any duplicate "COMPONENT" text that might have been left behind
24
+ uuid = uuid.replace(/-COMPONENT$/, '');
25
+ return uuid;
26
+ }
27
+
28
+ /**
29
+ * Check if two names would generate the same UUID
30
+ * @param {string} name1 - First name
31
+ * @param {string} name2 - Second name
32
+ * @returns {boolean} Whether the names generate the same UUID
33
+ */
34
+ function namesGenerateSameUuid(name1, name2) {
35
+ var uuid1 = generateUuidFromName(name1);
36
+ var uuid2 = generateUuidFromName(name2);
37
+ return uuid1 && uuid2 && uuid1 === uuid2;
38
+ }
39
+
40
+ /**
41
+ * Find an object in a Three.js scene by hardcoded UUID with fallback strategies
42
+ * @param {THREE.Scene} scene - The Three.js scene to search
43
+ * @param {string} targetUuid - The UUID to search for
44
+ * @returns {THREE.Object3D|null} The found object or null
45
+ */
46
+ function findObjectByHardcodedUuid(scene, targetUuid) {
47
+ if (!scene || !targetUuid) return null;
48
+ var foundObject = null;
49
+ scene.traverse(function (child) {
50
+ var _child$userData;
51
+ if (foundObject) return; // Stop if already found
52
+
53
+ // Strategy 1: Direct UUID match (HIGHEST PRIORITY)
54
+ if (child.uuid === targetUuid) {
55
+ foundObject = child;
56
+ return;
57
+ }
58
+
59
+ // Strategy 2: Original hardcoded UUID match
60
+ if (((_child$userData = child.userData) === null || _child$userData === void 0 ? void 0 : _child$userData.originalUuid) === targetUuid) {
61
+ foundObject = child;
62
+ return;
63
+ }
64
+
65
+ // Strategy 3: Name-based UUID match (FALLBACK)
66
+ if (child.name) {
67
+ var generatedUuid = generateUuidFromName(child.name);
68
+ if (generatedUuid === targetUuid) {
69
+ foundObject = child;
70
+ return;
71
+ }
72
+ }
73
+ });
74
+ return foundObject;
75
+ }
76
+
77
+ /**
78
+ * Get the hardcoded UUID for an object, prioritizing original over current
79
+ * @param {THREE.Object3D} object - The Three.js object
80
+ * @returns {string|null} The hardcoded UUID or null
81
+ */
82
+ function getHardcodedUuid(object) {
83
+ var _object$userData;
84
+ if (!object) return null;
85
+
86
+ // Priority 1: Original hardcoded UUID stored in userData
87
+ if ((_object$userData = object.userData) !== null && _object$userData !== void 0 && _object$userData.originalUuid) {
88
+ return object.userData.originalUuid;
89
+ }
90
+
91
+ // Priority 2: Current UUID (if it looks like a hardcoded one)
92
+ if (object.uuid && !object.uuid.includes('-') && object.uuid.length > 10) {
93
+ return object.uuid;
94
+ }
95
+
96
+ // Priority 3: Generate from name if available
97
+ if (object.name) {
98
+ return generateUuidFromName(object.name);
99
+ }
100
+ return null;
101
+ }
102
+
103
+ exports.findObjectByHardcodedUuid = findObjectByHardcodedUuid;
104
+ exports.generateUuidFromName = generateUuidFromName;
105
+ exports.getHardcodedUuid = getHardcodedUuid;
106
+ exports.namesGenerateSameUuid = namesGenerateSameUuid;