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