@2112-lab/central-plant 0.1.4 โ†’ 0.1.6

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 (88) hide show
  1. package/dist/bundle/index.js +33146 -1
  2. package/dist/cjs/_virtual/_rollupPluginBabelHelpers.js +432 -1
  3. package/dist/cjs/node_modules/@2112-lab/pathfinder/dist/index.esm.js +1448 -1
  4. package/dist/cjs/node_modules/three/examples/jsm/controls/OrbitControls.js +1853 -1
  5. package/dist/cjs/node_modules/three/examples/jsm/exporters/GLTFExporter.js +3537 -1
  6. package/dist/cjs/node_modules/three/examples/jsm/exporters/OBJExporter.js +305 -1
  7. package/dist/cjs/node_modules/three/examples/jsm/exporters/PLYExporter.js +542 -1
  8. package/dist/cjs/node_modules/three/examples/jsm/exporters/STLExporter.js +218 -1
  9. package/dist/cjs/node_modules/three/examples/jsm/loaders/DRACOLoader.js +683 -1
  10. package/dist/cjs/node_modules/three/examples/jsm/loaders/GLTFLoader.js +4811 -1
  11. package/dist/cjs/node_modules/three/examples/jsm/loaders/RGBELoader.js +480 -1
  12. package/dist/cjs/node_modules/three/examples/jsm/renderers/CSS2DRenderer.js +309 -1
  13. package/dist/cjs/node_modules/three/examples/jsm/utils/BufferGeometryUtils.js +120 -1
  14. package/dist/cjs/src/analysis/analysis.js +560 -1
  15. package/dist/cjs/src/analysis/testing.js +958 -1
  16. package/dist/cjs/src/core/centralPlant.js +1149 -1
  17. package/dist/cjs/src/core/debugLogger.js +175 -1
  18. package/dist/cjs/src/core/mathUtils.js +574 -1
  19. package/dist/cjs/src/core/nameUtils.js +93 -1
  20. package/dist/cjs/src/data/export.js +716 -1
  21. package/dist/cjs/src/data/import.js +380 -1
  22. package/dist/cjs/src/data/numerics.js +522 -1
  23. package/dist/cjs/src/helpers/sceneHelper.js +572 -1
  24. package/dist/cjs/src/index.js +69 -1
  25. package/dist/cjs/src/managers/components/animationManager.js +123 -1
  26. package/dist/cjs/src/managers/components/componentManager.js +332 -1
  27. package/dist/cjs/src/managers/components/pathfindingManager.js +1441 -1
  28. package/dist/cjs/src/managers/controls/TransformControls.js +1063 -1
  29. package/dist/cjs/src/managers/controls/cameraControlsManager.js +79 -1
  30. package/dist/cjs/src/managers/controls/dragDropManager.js +1026 -1
  31. package/dist/cjs/src/managers/controls/keyboardControlsManager.js +395 -1
  32. package/dist/cjs/src/managers/controls/transformControlsManager.js +1807 -1
  33. package/dist/cjs/src/managers/environment/environmentManager.js +714 -1
  34. package/dist/cjs/src/managers/environment/textureConfig.js +229 -1
  35. package/dist/cjs/src/managers/scene/sceneExportManager.js +264 -1
  36. package/dist/cjs/src/managers/scene/sceneInitializationManager.js +346 -1
  37. package/dist/cjs/src/managers/scene/sceneOperationsManager.js +1509 -1
  38. package/dist/cjs/src/managers/scene/sceneTooltipsManager.js +661 -1
  39. package/dist/cjs/src/managers/system/disposalManager.js +444 -1
  40. package/dist/cjs/src/managers/system/hotReloadManager.js +291 -1
  41. package/dist/cjs/src/managers/system/performanceMonitor.js +863 -1
  42. package/dist/cjs/src/rendering/modelPreloader.js +369 -1
  43. package/dist/cjs/src/rendering/rendering2D.js +631 -1
  44. package/dist/cjs/src/rendering/rendering3D.js +685 -1
  45. package/dist/esm/_virtual/_rollupPluginBabelHelpers.js +396 -1
  46. package/dist/esm/node_modules/@2112-lab/pathfinder/dist/index.esm.js +1444 -1
  47. package/dist/esm/node_modules/three/examples/jsm/controls/OrbitControls.js +1849 -1
  48. package/dist/esm/node_modules/three/examples/jsm/exporters/GLTFExporter.js +3533 -1
  49. package/dist/esm/node_modules/three/examples/jsm/exporters/OBJExporter.js +301 -1
  50. package/dist/esm/node_modules/three/examples/jsm/exporters/PLYExporter.js +538 -1
  51. package/dist/esm/node_modules/three/examples/jsm/exporters/STLExporter.js +214 -1
  52. package/dist/esm/node_modules/three/examples/jsm/loaders/DRACOLoader.js +679 -1
  53. package/dist/esm/node_modules/three/examples/jsm/loaders/GLTFLoader.js +4807 -1
  54. package/dist/esm/node_modules/three/examples/jsm/loaders/RGBELoader.js +476 -1
  55. package/dist/esm/node_modules/three/examples/jsm/renderers/CSS2DRenderer.js +304 -1
  56. package/dist/esm/node_modules/three/examples/jsm/utils/BufferGeometryUtils.js +116 -1
  57. package/dist/esm/src/analysis/analysis.js +536 -1
  58. package/dist/esm/src/analysis/testing.js +954 -1
  59. package/dist/esm/src/core/centralPlant.js +1144 -1
  60. package/dist/esm/src/core/debugLogger.js +167 -1
  61. package/dist/esm/src/core/mathUtils.js +570 -1
  62. package/dist/esm/src/core/nameUtils.js +87 -1
  63. package/dist/esm/src/data/export.js +712 -1
  64. package/dist/esm/src/data/import.js +356 -1
  65. package/dist/esm/src/data/numerics.js +518 -1
  66. package/dist/esm/src/helpers/sceneHelper.js +547 -1
  67. package/dist/esm/src/index.js +35 -1
  68. package/dist/esm/src/managers/components/animationManager.js +119 -1
  69. package/dist/esm/src/managers/components/componentManager.js +328 -1
  70. package/dist/esm/src/managers/components/pathfindingManager.js +1417 -1
  71. package/dist/esm/src/managers/controls/TransformControls.js +1057 -1
  72. package/dist/esm/src/managers/controls/cameraControlsManager.js +75 -1
  73. package/dist/esm/src/managers/controls/dragDropManager.js +1002 -1
  74. package/dist/esm/src/managers/controls/keyboardControlsManager.js +371 -1
  75. package/dist/esm/src/managers/controls/transformControlsManager.js +1782 -1
  76. package/dist/esm/src/managers/environment/environmentManager.js +690 -1
  77. package/dist/esm/src/managers/environment/textureConfig.js +202 -1
  78. package/dist/esm/src/managers/scene/sceneExportManager.js +260 -1
  79. package/dist/esm/src/managers/scene/sceneInitializationManager.js +322 -1
  80. package/dist/esm/src/managers/scene/sceneOperationsManager.js +1485 -1
  81. package/dist/esm/src/managers/scene/sceneTooltipsManager.js +637 -1
  82. package/dist/esm/src/managers/system/disposalManager.js +440 -1
  83. package/dist/esm/src/managers/system/hotReloadManager.js +287 -1
  84. package/dist/esm/src/managers/system/performanceMonitor.js +858 -1
  85. package/dist/esm/src/rendering/modelPreloader.js +364 -1
  86. package/dist/esm/src/rendering/rendering2D.js +627 -1
  87. package/dist/esm/src/rendering/rendering3D.js +661 -1
  88. package/package.json +1 -1
@@ -1 +1,364 @@
1
- import{createClass as t,classCallCheck as e,asyncToGenerator as i,regenerator as n,typeof as r}from"../../_virtual/_rollupPluginBabelHelpers.js";import"three";import{GLTFLoader as s}from"../../node_modules/three/examples/jsm/loaders/GLTFLoader.js";var o=function(){return t(function t(){e(this,t),this.modelCache=new Map,this.loadingPromises=new Map,this.gltfLoader=new s,this.isPreloading=!1,this.preloadingPromise=null,this.componentDictionary=null},[{key:"preloadAllModels",value:(a=i(n().m(function t(e){var i,s,o=this;return n().w(function(t){for(;;)switch(t.n){case 0:if(!this.isPreloading){t.n=1;break}return t.a(2,this.preloadingPromise);case 1:if(e&&"object"===r(e)){t.n=2;break}return t.a(2,Promise.reject(new Error("Invalid component dictionary")));case 2:return this.componentDictionary=e,this.isPreloading=!0,i=[],s=[],Object.keys(e).forEach(function(t){var n=e[t];n&&n.modelKey&&(i.includes(n.modelKey)||i.push(n.modelKey))}),i.forEach(function(t){s.push(o.preloadSingleModel(t))}),this.preloadingPromise=Promise.allSettled(s).then(function(t){var e=t.filter(function(t){return"fulfilled"===t.status}).length,n=t.filter(function(t){return"rejected"===t.status}).length;return o.isPreloading=!1,{successful:e,failed:n,total:i.length,cache:o.modelCache}}),t.a(2,this.preloadingPromise)}},t,this)})),function(t){return a.apply(this,arguments)})},{key:"preloadSingleModel",value:(u=i(n().m(function t(e){var i,r=this;return n().w(function(t){for(;;)switch(t.n){case 0:if(!this.modelCache.has(e)){t.n=1;break}return t.a(2,this.modelCache.get(e));case 1:if(!this.loadingPromises.has(e)){t.n=2;break}return t.a(2,this.loadingPromises.get(e));case 2:return i=new Promise(function(t,i){r.gltfLoader.load("/library/models/".concat(e),function(i){r.modelCache.set(e,i.scene),r.loadingPromises.delete(e),t(i.scene)},function(t){t.loaded,t.total},function(t){r.loadingPromises.delete(e),i(t)})}),this.loadingPromises.set(e,i),t.a(2,i)}},t,this)})),function(t){return u.apply(this,arguments)})},{key:"getCachedModel",value:function(t){return this.modelCache.has(t)?this.modelCache.get(t).clone():null}},{key:"getCachedModelWithDimensions",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(this.modelCache.has(t)){var i=this.modelCache.get(t).clone();if(e&&this.componentDictionary){var n=this.componentDictionary[e];n&&n.boundingBox&&(i.userData||(i.userData={}),i.userData.dimensions={x:n.boundingBox.x,y:n.boundingBox.y,z:n.boundingBox.z})}return i}return null}},{key:"addDimensionsToModel",value:function(t,e){if(!t||!e)return t;if(this.componentDictionary){var i=this.componentDictionary[e];i&&i.boundingBox&&(t.userData||(t.userData={}),t.userData.dimensions={x:i.boundingBox.x,y:i.boundingBox.y,z:i.boundingBox.z})}return t}},{key:"getStatus",value:function(){return{isPreloading:this.isPreloading,cachedModels:Array.from(this.modelCache.keys()),totalCached:this.modelCache.size,currentlyLoading:Array.from(this.loadingPromises.keys())}}},{key:"reloadModel",value:(o=i(n().m(function t(e){return n().w(function(t){for(;;)if(0===t.n)return this.modelCache.delete(e),this.loadingPromises.delete(e),t.a(2,this.preloadSingleModel(e))},t,this)})),function(t){return o.apply(this,arguments)})},{key:"clearCache",value:function(){this.modelCache.forEach(function(t,e){t&&t.traverse&&t.traverse(function(t){t.geometry&&t.geometry.dispose(),t.material&&(Array.isArray(t.material)?t.material.forEach(function(t){return t.dispose()}):t.material.dispose())})}),this.modelCache.clear(),this.loadingPromises.clear(),this.isPreloading=!1,this.preloadingPromise=null}},{key:"getCacheStats",value:function(){var t={totalModels:this.modelCache.size,loadingModels:this.loadingPromises.size,isPreloading:this.isPreloading,memoryUsage:0};return this.modelCache.forEach(function(e){e&&e.traverse&&e.traverse(function(e){var i;e.geometry&&(t.memoryUsage+=12*((null===(i=e.geometry.attributes.position)||void 0===i?void 0:i.count)||0))})}),t}}]);var o,u,a}(),u=new o;export{o as ModelPreloader,u as default};
1
+ import { createClass as _createClass, classCallCheck as _classCallCheck, asyncToGenerator as _asyncToGenerator, regenerator as _regenerator, typeof as _typeof } from '../../_virtual/_rollupPluginBabelHelpers.js';
2
+ import 'three';
3
+ import { GLTFLoader } from '../../node_modules/three/examples/jsm/loaders/GLTFLoader.js';
4
+
5
+ var ModelPreloader = /*#__PURE__*/function () {
6
+ function ModelPreloader() {
7
+ _classCallCheck(this, ModelPreloader);
8
+ this.modelCache = new Map(); // Cache for loaded GLB models
9
+ this.loadingPromises = new Map(); // Track ongoing loads to prevent duplicates
10
+ this.gltfLoader = new GLTFLoader();
11
+ this.isPreloading = false;
12
+ this.preloadingPromise = null;
13
+ this.componentDictionary = null;
14
+ console.log('๐Ÿš€ ModelPreloader initialized');
15
+ }
16
+
17
+ /**
18
+ * Preload all models from the component dictionary
19
+ * @param {Object} componentDictionary - The component dictionary object
20
+ * @returns {Promise} Promise that resolves when all models are loaded
21
+ */
22
+ return _createClass(ModelPreloader, [{
23
+ key: "preloadAllModels",
24
+ value: (function () {
25
+ var _preloadAllModels = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(componentDictionary) {
26
+ var _this = this;
27
+ var modelKeys, preloadPromises;
28
+ return _regenerator().w(function (_context) {
29
+ while (1) switch (_context.n) {
30
+ case 0:
31
+ if (!this.isPreloading) {
32
+ _context.n = 1;
33
+ break;
34
+ }
35
+ console.log('โณ Preloading already in progress, returning existing promise');
36
+ return _context.a(2, this.preloadingPromise);
37
+ case 1:
38
+ if (!(!componentDictionary || _typeof(componentDictionary) !== 'object')) {
39
+ _context.n = 2;
40
+ break;
41
+ }
42
+ console.error('โŒ Invalid component dictionary provided to preloader');
43
+ return _context.a(2, Promise.reject(new Error('Invalid component dictionary')));
44
+ case 2:
45
+ this.componentDictionary = componentDictionary;
46
+ this.isPreloading = true;
47
+ console.log('๐Ÿ”„ Starting to preload all models from component dictionary...');
48
+ modelKeys = [];
49
+ preloadPromises = []; // Extract all unique model keys from the component dictionary
50
+ Object.keys(componentDictionary).forEach(function (componentType) {
51
+ var component = componentDictionary[componentType];
52
+ if (component && component.modelKey) {
53
+ if (!modelKeys.includes(component.modelKey)) {
54
+ modelKeys.push(component.modelKey);
55
+ }
56
+ }
57
+ });
58
+ console.log("\uD83C\uDFAF Found ".concat(modelKeys.length, " unique models to preload:"), modelKeys);
59
+
60
+ // Create preload promises for each model
61
+ modelKeys.forEach(function (modelKey) {
62
+ preloadPromises.push(_this.preloadSingleModel(modelKey));
63
+ });
64
+
65
+ // Wait for all models to load (or fail)
66
+ this.preloadingPromise = Promise.allSettled(preloadPromises).then(function (results) {
67
+ var successful = results.filter(function (result) {
68
+ return result.status === 'fulfilled';
69
+ }).length;
70
+ var failed = results.filter(function (result) {
71
+ return result.status === 'rejected';
72
+ }).length;
73
+ console.log("\u2705 Preloading completed: ".concat(successful, " successful, ").concat(failed, " failed"));
74
+ if (failed > 0) {
75
+ console.warn('โš ๏ธ Some models failed to preload:', results.filter(function (result) {
76
+ return result.status === 'rejected';
77
+ }).map(function (result) {
78
+ return result.reason;
79
+ }));
80
+ }
81
+ _this.isPreloading = false;
82
+ return {
83
+ successful: successful,
84
+ failed: failed,
85
+ total: modelKeys.length,
86
+ cache: _this.modelCache
87
+ };
88
+ });
89
+ return _context.a(2, this.preloadingPromise);
90
+ }
91
+ }, _callee, this);
92
+ }));
93
+ function preloadAllModels(_x) {
94
+ return _preloadAllModels.apply(this, arguments);
95
+ }
96
+ return preloadAllModels;
97
+ }()
98
+ /**
99
+ * Preload a single model
100
+ * @param {string} modelKey - The model key (filename)
101
+ * @returns {Promise} Promise that resolves with the loaded model
102
+ */
103
+ )
104
+ }, {
105
+ key: "preloadSingleModel",
106
+ value: (function () {
107
+ var _preloadSingleModel = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(modelKey) {
108
+ var _this2 = this;
109
+ var loadPromise;
110
+ return _regenerator().w(function (_context2) {
111
+ while (1) switch (_context2.n) {
112
+ case 0:
113
+ if (!this.modelCache.has(modelKey)) {
114
+ _context2.n = 1;
115
+ break;
116
+ }
117
+ console.log("\uD83C\uDFAF Model ".concat(modelKey, " already cached, skipping"));
118
+ return _context2.a(2, this.modelCache.get(modelKey));
119
+ case 1:
120
+ if (!this.loadingPromises.has(modelKey)) {
121
+ _context2.n = 2;
122
+ break;
123
+ }
124
+ console.log("\u23F3 Model ".concat(modelKey, " already loading, waiting for completion"));
125
+ return _context2.a(2, this.loadingPromises.get(modelKey));
126
+ case 2:
127
+ console.log("\uD83D\uDD04 Starting preload of model: ".concat(modelKey));
128
+ loadPromise = new Promise(function (resolve, reject) {
129
+ _this2.gltfLoader.load("/library/models/".concat(modelKey), function (gltf) {
130
+ console.log("\u2705 Successfully preloaded model: ".concat(modelKey));
131
+ // Cache the scene for future use
132
+ _this2.modelCache.set(modelKey, gltf.scene);
133
+ // Remove from loading promises
134
+ _this2.loadingPromises.delete(modelKey);
135
+ resolve(gltf.scene);
136
+ }, function (progress) {
137
+ // Optional: track loading progress
138
+ var percentage = progress.loaded / progress.total * 100;
139
+ if (percentage % 25 === 0) {
140
+ // Log every 25%
141
+ console.log("\uD83D\uDCCA Loading ".concat(modelKey, ": ").concat(percentage.toFixed(0), "%"));
142
+ }
143
+ }, function (error) {
144
+ console.error("\u274C Failed to preload model ".concat(modelKey, ":"), error);
145
+ // Remove from loading promises
146
+ _this2.loadingPromises.delete(modelKey);
147
+ reject(error);
148
+ });
149
+ }); // Cache the loading promise
150
+ this.loadingPromises.set(modelKey, loadPromise);
151
+ return _context2.a(2, loadPromise);
152
+ }
153
+ }, _callee2, this);
154
+ }));
155
+ function preloadSingleModel(_x2) {
156
+ return _preloadSingleModel.apply(this, arguments);
157
+ }
158
+ return preloadSingleModel;
159
+ }()
160
+ /**
161
+ * Get a cached model (cloned for use)
162
+ * @param {string} modelKey - The model key
163
+ * @returns {THREE.Object3D|null} Cloned model or null if not found
164
+ */
165
+ )
166
+ }, {
167
+ key: "getCachedModel",
168
+ value: function getCachedModel(modelKey) {
169
+ if (this.modelCache.has(modelKey)) {
170
+ console.log("\uD83C\uDFAF Returning cached model: ".concat(modelKey));
171
+ return this.modelCache.get(modelKey).clone();
172
+ }
173
+ console.warn("\u26A0\uFE0F Model ".concat(modelKey, " not found in cache"));
174
+ return null;
175
+ }
176
+
177
+ /**
178
+ * Get a cached model (cloned for use) with dimensions from component dictionary
179
+ * @param {string} modelKey - The model key
180
+ * @param {string} libraryId - The library ID to look up dimensions
181
+ * @returns {THREE.Object3D|null} Cloned model with dimensions or null if not found
182
+ */
183
+ }, {
184
+ key: "getCachedModelWithDimensions",
185
+ value: function getCachedModelWithDimensions(modelKey) {
186
+ var libraryId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
187
+ if (this.modelCache.has(modelKey)) {
188
+ console.log("\uD83C\uDFAF Returning cached model with dimensions: ".concat(modelKey));
189
+ var clonedModel = this.modelCache.get(modelKey).clone();
190
+
191
+ // Add dimensions from component dictionary if available
192
+ if (libraryId && this.componentDictionary) {
193
+ var componentData = this.componentDictionary[libraryId];
194
+ if (componentData && componentData.boundingBox) {
195
+ if (!clonedModel.userData) {
196
+ clonedModel.userData = {};
197
+ }
198
+
199
+ // Add dimensions to userData
200
+ clonedModel.userData.dimensions = {
201
+ x: componentData.boundingBox.x,
202
+ y: componentData.boundingBox.y,
203
+ z: componentData.boundingBox.z
204
+ };
205
+ console.log("\uD83D\uDCCF Added dimensions to model userData for ".concat(libraryId, ":"), clonedModel.userData.dimensions);
206
+ } else {
207
+ console.warn("\u26A0\uFE0F No bounding box found for ".concat(libraryId, " in component dictionary"));
208
+ }
209
+ } else {
210
+ console.warn("\u26A0\uFE0F No libraryId provided or component dictionary not available for dimensions lookup");
211
+ }
212
+ return clonedModel;
213
+ }
214
+ console.warn("\u26A0\uFE0F Model ".concat(modelKey, " not found in cache"));
215
+ return null;
216
+ }
217
+
218
+ /**
219
+ * Add dimensions to an existing model from component dictionary
220
+ * @param {THREE.Object3D} model - The model to add dimensions to
221
+ * @param {string} libraryId - The library ID to look up dimensions
222
+ * @returns {THREE.Object3D} The model with dimensions added
223
+ */
224
+ }, {
225
+ key: "addDimensionsToModel",
226
+ value: function addDimensionsToModel(model, libraryId) {
227
+ if (!model || !libraryId) {
228
+ console.warn("\u26A0\uFE0F Invalid model or libraryId provided for dimensions");
229
+ return model;
230
+ }
231
+ if (this.componentDictionary) {
232
+ var componentData = this.componentDictionary[libraryId];
233
+ if (componentData && componentData.boundingBox) {
234
+ if (!model.userData) {
235
+ model.userData = {};
236
+ }
237
+
238
+ // Add dimensions to userData
239
+ model.userData.dimensions = {
240
+ x: componentData.boundingBox.x,
241
+ y: componentData.boundingBox.y,
242
+ z: componentData.boundingBox.z
243
+ };
244
+ console.log("\uD83D\uDCCF Added dimensions to existing model userData for ".concat(libraryId, ":"), model.userData.dimensions);
245
+ } else {
246
+ console.warn("\u26A0\uFE0F No bounding box found for ".concat(libraryId, " in component dictionary"));
247
+ }
248
+ } else {
249
+ console.warn("\u26A0\uFE0F Component dictionary not available for dimensions lookup");
250
+ }
251
+ return model;
252
+ }
253
+
254
+ /**
255
+ * Get preloading status
256
+ * @returns {Object} Status object
257
+ */
258
+ }, {
259
+ key: "getStatus",
260
+ value: function getStatus() {
261
+ return {
262
+ isPreloading: this.isPreloading,
263
+ cachedModels: Array.from(this.modelCache.keys()),
264
+ totalCached: this.modelCache.size,
265
+ currentlyLoading: Array.from(this.loadingPromises.keys())
266
+ };
267
+ }
268
+
269
+ /**
270
+ * Force reload a specific model
271
+ * @param {string} modelKey - The model key to reload
272
+ * @returns {Promise} Promise that resolves with the reloaded model
273
+ */
274
+ }, {
275
+ key: "reloadModel",
276
+ value: (function () {
277
+ var _reloadModel = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(modelKey) {
278
+ return _regenerator().w(function (_context3) {
279
+ while (1) switch (_context3.n) {
280
+ case 0:
281
+ console.log("\uD83D\uDD04 Force reloading model: ".concat(modelKey));
282
+
283
+ // Remove from cache and loading promises
284
+ this.modelCache.delete(modelKey);
285
+ this.loadingPromises.delete(modelKey);
286
+
287
+ // Preload again
288
+ return _context3.a(2, this.preloadSingleModel(modelKey));
289
+ }
290
+ }, _callee3, this);
291
+ }));
292
+ function reloadModel(_x3) {
293
+ return _reloadModel.apply(this, arguments);
294
+ }
295
+ return reloadModel;
296
+ }()
297
+ /**
298
+ * Clear all cached models (for cleanup)
299
+ */
300
+ )
301
+ }, {
302
+ key: "clearCache",
303
+ value: function clearCache() {
304
+ console.log('๐Ÿงน Clearing model preloader cache...');
305
+
306
+ // Dispose of all cached models
307
+ this.modelCache.forEach(function (model, modelKey) {
308
+ console.log("\uD83D\uDDD1\uFE0F Disposing cached model: ".concat(modelKey));
309
+ if (model && model.traverse) {
310
+ model.traverse(function (child) {
311
+ if (child.geometry) {
312
+ child.geometry.dispose();
313
+ }
314
+ if (child.material) {
315
+ if (Array.isArray(child.material)) {
316
+ child.material.forEach(function (material) {
317
+ return material.dispose();
318
+ });
319
+ } else {
320
+ child.material.dispose();
321
+ }
322
+ }
323
+ });
324
+ }
325
+ });
326
+ this.modelCache.clear();
327
+ this.loadingPromises.clear();
328
+ this.isPreloading = false;
329
+ this.preloadingPromise = null;
330
+ console.log('โœ… Model preloader cache cleared');
331
+ }
332
+
333
+ /**
334
+ * Get cache statistics
335
+ * @returns {Object} Cache statistics
336
+ */
337
+ }, {
338
+ key: "getCacheStats",
339
+ value: function getCacheStats() {
340
+ var stats = {
341
+ totalModels: this.modelCache.size,
342
+ loadingModels: this.loadingPromises.size,
343
+ isPreloading: this.isPreloading,
344
+ memoryUsage: 0
345
+ };
346
+
347
+ // Estimate memory usage (rough calculation)
348
+ this.modelCache.forEach(function (model) {
349
+ if (model && model.traverse) {
350
+ model.traverse(function (child) {
351
+ if (child.geometry) {
352
+ var _child$geometry$attri;
353
+ stats.memoryUsage += (((_child$geometry$attri = child.geometry.attributes.position) === null || _child$geometry$attri === void 0 ? void 0 : _child$geometry$attri.count) || 0) * 12; // Rough estimate
354
+ }
355
+ });
356
+ }
357
+ });
358
+ return stats;
359
+ }
360
+ }]);
361
+ }(); // Create singleton instance
362
+ var modelPreloader = new ModelPreloader();
363
+
364
+ export { ModelPreloader, modelPreloader as default };