@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,1015 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _rollupPluginBabelHelpers = require('../_virtual/_rollupPluginBabelHelpers.js');
6
+ var THREE = require('three');
7
+ var debugLogger = require('./debugLogger.js');
8
+
9
+ function _interopNamespace(e) {
10
+ if (e && e.__esModule) return e;
11
+ var n = Object.create(null);
12
+ if (e) {
13
+ Object.keys(e).forEach(function (k) {
14
+ if (k !== 'default') {
15
+ var d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: function () { return e[k]; }
19
+ });
20
+ }
21
+ });
22
+ }
23
+ n["default"] = e;
24
+ return Object.freeze(n);
25
+ }
26
+
27
+ var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
28
+
29
+ // We'll need to import RGBELoader from three examples
30
+ var RGBELoader;
31
+
32
+ // Dynamic import for browser compatibility
33
+ function importThreeLoaders() {
34
+ return _importThreeLoaders.apply(this, arguments);
35
+ } // This will be imported once textureConfig is created
36
+ function _importThreeLoaders() {
37
+ _importThreeLoaders = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee8() {
38
+ var module, _t0;
39
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context0) {
40
+ while (1) switch (_context0.n) {
41
+ case 0:
42
+ if (!(typeof window !== 'undefined')) {
43
+ _context0.n = 4;
44
+ break;
45
+ }
46
+ _context0.p = 1;
47
+ console.log('📦 Attempting to dynamically import RGBELoader...');
48
+ // Dynamic import for browser
49
+ _context0.n = 2;
50
+ return Promise.resolve().then(function () { return require('../node_modules/three/examples/jsm/loaders/RGBELoader.js'); });
51
+ case 2:
52
+ module = _context0.v;
53
+ RGBELoader = module.RGBELoader;
54
+ console.log('✅ RGBELoader imported successfully:', RGBELoader ? 'Available' : 'Undefined');
55
+ return _context0.a(2, true);
56
+ case 3:
57
+ _context0.p = 3;
58
+ _t0 = _context0.v;
59
+ console.error('Failed to load Three.js loaders:', _t0);
60
+ throw new Error('Failed to load Three.js loaders');
61
+ case 4:
62
+ return _context0.a(2, false);
63
+ }
64
+ }, _callee8, null, [[1, 3]]);
65
+ }));
66
+ return _importThreeLoaders.apply(this, arguments);
67
+ }
68
+ var loadTextureSetAndCreateMaterial;
69
+ function importTextureConfig() {
70
+ return _importTextureConfig.apply(this, arguments);
71
+ }
72
+ function _importTextureConfig() {
73
+ _importTextureConfig = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee9() {
74
+ var module, _t1;
75
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context1) {
76
+ while (1) switch (_context1.n) {
77
+ case 0:
78
+ if (!(typeof window !== 'undefined')) {
79
+ _context1.n = 4;
80
+ break;
81
+ }
82
+ _context1.p = 1;
83
+ console.log('📦 Attempting to dynamically import textureConfig...');
84
+ _context1.n = 2;
85
+ return Promise.resolve().then(function () { return require('./textureConfig.js'); });
86
+ case 2:
87
+ module = _context1.v;
88
+ loadTextureSetAndCreateMaterial = module.loadTextureSetAndCreateMaterial;
89
+ console.log('✅ TextureConfig imported successfully:', loadTextureSetAndCreateMaterial ? 'Available' : 'Undefined');
90
+ return _context1.a(2, true);
91
+ case 3:
92
+ _context1.p = 3;
93
+ _t1 = _context1.v;
94
+ console.error('Failed to load texture config:', _t1);
95
+ return _context1.a(2, false);
96
+ case 4:
97
+ return _context1.a(2, false);
98
+ }
99
+ }, _callee9, null, [[1, 3]]);
100
+ }));
101
+ return _importTextureConfig.apply(this, arguments);
102
+ }
103
+ var EnvironmentManager = /*#__PURE__*/function () {
104
+ function EnvironmentManager(component) {
105
+ _rollupPluginBabelHelpers.classCallCheck(this, EnvironmentManager);
106
+ this.component = component;
107
+
108
+ // Track loader status
109
+ this.loadersInitialized = false;
110
+
111
+ // Initialize loaders immediately
112
+ this.initLoaders();
113
+ }
114
+ return _rollupPluginBabelHelpers.createClass(EnvironmentManager, [{
115
+ key: "initLoaders",
116
+ value: function () {
117
+ var _initLoaders = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee() {
118
+ var _t;
119
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context) {
120
+ while (1) switch (_context.n) {
121
+ case 0:
122
+ console.log('🔄 Pre-initializing loaders in EnvironmentManager constructor...');
123
+ _context.p = 1;
124
+ _context.n = 2;
125
+ return Promise.all([importThreeLoaders(), importTextureConfig()]);
126
+ case 2:
127
+ this.loadersInitialized = true;
128
+ console.log('✅ EnvironmentManager loaders pre-initialized successfully');
129
+ _context.n = 4;
130
+ break;
131
+ case 3:
132
+ _context.p = 3;
133
+ _t = _context.v;
134
+ console.warn('⚠️ Error pre-initializing loaders:', _t);
135
+ case 4:
136
+ return _context.a(2);
137
+ }
138
+ }, _callee, this, [[1, 3]]);
139
+ }));
140
+ function initLoaders() {
141
+ return _initLoaders.apply(this, arguments);
142
+ }
143
+ return initLoaders;
144
+ }()
145
+ /**
146
+ * Create skybox with HDR environment mapping
147
+ */
148
+ }, {
149
+ key: "createSkybox",
150
+ value: (function () {
151
+ var _createSkybox = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee2() {
152
+ var _this = this;
153
+ var component, isContextLost, pmremGenerator, loaders, applyEnvironmentMap, _loop, _ret, _i, _loaders, _t4, _t5, _t6;
154
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context4) {
155
+ while (1) switch (_context4.n) {
156
+ case 0:
157
+ component = this.component;
158
+ if (!(!component || !component.renderer || !component.scene)) {
159
+ _context4.n = 1;
160
+ break;
161
+ }
162
+ debugLogger.logger.warn('Cannot create skybox: component, renderer or scene not available');
163
+ return _context4.a(2);
164
+ case 1:
165
+ console.log('🌍 Starting skybox creation process...');
166
+
167
+ // Make sure RGBELoader is available
168
+ if (RGBELoader) {
169
+ _context4.n = 5;
170
+ break;
171
+ }
172
+ console.log('⏳ RGBELoader not loaded yet, initializing now...');
173
+ _context4.p = 2;
174
+ _context4.n = 3;
175
+ return importThreeLoaders();
176
+ case 3:
177
+ console.log('✅ RGBELoader loaded on demand');
178
+ _context4.n = 5;
179
+ break;
180
+ case 4:
181
+ _context4.p = 4;
182
+ _t4 = _context4.v;
183
+ console.error('❌ Failed to load RGBELoader:', _t4);
184
+ this.createFallbackEnvironment();
185
+ return _context4.a(2);
186
+ case 5:
187
+ _context4.p = 5;
188
+ // Check if renderer is valid - safely check for context loss
189
+ isContextLost = component.renderer.context && typeof component.renderer.context.isContextLost === 'function' ? component.renderer.context.isContextLost() : false;
190
+ console.log('🔍 WebGL context check:', isContextLost ? 'Context lost' : 'Context valid');
191
+ if (!(!component.renderer.capabilities || isContextLost)) {
192
+ _context4.n = 6;
193
+ break;
194
+ }
195
+ debugLogger.logger.warn('WebGL context is lost or invalid, using fallback environment');
196
+ this.createFallbackEnvironment();
197
+ return _context4.a(2);
198
+ case 6:
199
+ _context4.p = 6;
200
+ pmremGenerator = new THREE__namespace.PMREMGenerator(component.renderer);
201
+
202
+ // Check if the generator was created successfully
203
+ if (pmremGenerator) {
204
+ _context4.n = 7;
205
+ break;
206
+ }
207
+ throw new Error('PMREMGenerator could not be created');
208
+ case 7:
209
+ // Attempt to compile the shader - this can fail if the context is limited
210
+ pmremGenerator.compileEquirectangularShader();
211
+ _context4.n = 9;
212
+ break;
213
+ case 8:
214
+ _context4.p = 8;
215
+ _t5 = _context4.v;
216
+ debugLogger.logger.warn('Failed to initialize PMREMGenerator:', _t5);
217
+ this.createFallbackEnvironment();
218
+ return _context4.a(2);
219
+ case 9:
220
+ loaders = [{
221
+ type: 'hdr',
222
+ loader: new RGBELoader(),
223
+ paths: [
224
+ // Try local paths first
225
+ '/skyboxes/kloofendal_48d_partly_cloudy_puresky_2k.hdr', '/skyboxes/kloofendal_48d_partly_cloudy_puresky_1k.hdr',
226
+ // Fall back to S3 paths
227
+ 'https://central-plant-assets.s3.us-east-1.amazonaws.com/skyboxes/kloofendal_48d_partly_cloudy_puresky_2k.hdr', 'https://central-plant-assets.s3.us-east-1.amazonaws.com/skyboxes/kloofendal_48d_partly_cloudy_puresky_1k.hdr']
228
+ }, {
229
+ type: 'jpeg',
230
+ loader: component.textureLoader || new THREE__namespace.TextureLoader(),
231
+ paths: [
232
+ // Try local paths first
233
+ '/skyboxes/sky_fallback.jpg',
234
+ // Fall back to S3 path
235
+ 'https://central-plant-assets.s3.us-east-1.amazonaws.com/skyboxes/sky_fallback.jpg']
236
+ }]; // Configure texture loaders with CORS settings
237
+ loaders.forEach(function (_ref) {
238
+ var loader = _ref.loader;
239
+ if (loader && typeof loader.setCrossOrigin === 'function') {
240
+ loader.setCrossOrigin('anonymous');
241
+ }
242
+ });
243
+ console.log('🔄 Configured loaders with CORS settings and fallback paths');
244
+ applyEnvironmentMap = function applyEnvironmentMap(envTexture, type) {
245
+ try {
246
+ var _component$scene$envi, _component$scene$back;
247
+ // Set proper mapping
248
+ envTexture.mapping = THREE__namespace.EquirectangularReflectionMapping;
249
+ // Ensure a valid color space is set for the texture
250
+ if (envTexture.colorSpace !== undefined) {
251
+ // For Three.js >= r152 (current version)
252
+ envTexture.colorSpace = component.renderer.outputColorSpace || THREE__namespace.SRGBColorSpace;
253
+ } else if (envTexture.encoding !== undefined) {
254
+ // For older versions (legacy support)
255
+ envTexture.encoding = component.renderer.outputEncoding || THREE__namespace.sRGBEncoding;
256
+ }
257
+
258
+ // Generate processed environment map
259
+ var processedEnvMap = pmremGenerator.fromEquirectangular(envTexture).texture;
260
+
261
+ // Diagnostic logging
262
+ debugLogger.logger.info("Generating environment map:\n - Type: ".concat(type, "\n - Texture valid: ").concat(envTexture !== null, "\n - Processed map valid: ").concat(processedEnvMap !== null, "\n - Renderer encoding: ").concat(component.renderer.outputEncoding || component.renderer.outputColorSpace, "\n - Texture encoding: ").concat(envTexture.encoding || envTexture.colorSpace));
263
+
264
+ // Clean up previous environment/background
265
+ if ((_component$scene$envi = component.scene.environment) !== null && _component$scene$envi !== void 0 && _component$scene$envi.dispose) component.scene.environment.dispose();
266
+ if ((_component$scene$back = component.scene.background) !== null && _component$scene$back !== void 0 && _component$scene$back.dispose) component.scene.background.dispose();
267
+
268
+ // Apply to scene
269
+ component.scene.environment = processedEnvMap;
270
+ component.scene.background = processedEnvMap;
271
+
272
+ // Clean up original texture
273
+ envTexture.dispose();
274
+
275
+ // Force a renderer update
276
+ if (component.renderer) {
277
+ component.renderer.toneMappingExposure = 1.0;
278
+ component.renderer.render(component.scene, component.camera);
279
+ }
280
+ debugLogger.logger.info("Environment map (".concat(type, ") applied successfully"));
281
+ return true;
282
+ } catch (error) {
283
+ debugLogger.logger.warn("Failed to apply ".concat(type, " environment map:"), error);
284
+ return false;
285
+ }
286
+ };
287
+ _loop = /*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _loop() {
288
+ var _loaders$_i, type, loader, paths, _iterator, _step, _loop2, _ret2, _t3;
289
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context3) {
290
+ while (1) switch (_context3.n) {
291
+ case 0:
292
+ _loaders$_i = _loaders[_i], type = _loaders$_i.type, loader = _loaders$_i.loader, paths = _loaders$_i.paths;
293
+ _iterator = _rollupPluginBabelHelpers.createForOfIteratorHelper(paths);
294
+ _context3.p = 1;
295
+ _loop2 = /*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _loop2() {
296
+ var path, exists, texture, _t2;
297
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context2) {
298
+ while (1) switch (_context2.n) {
299
+ case 0:
300
+ path = _step.value;
301
+ _context2.p = 1;
302
+ if (!path.startsWith('/')) {
303
+ _context2.n = 3;
304
+ break;
305
+ }
306
+ _context2.n = 2;
307
+ return _this.checkLocalTextureExists(path);
308
+ case 2:
309
+ exists = _context2.v;
310
+ console.log("\uD83D\uDD0D Local texture check for ".concat(path, ": ").concat(exists ? 'Available' : 'Not found'));
311
+ if (exists) {
312
+ _context2.n = 3;
313
+ break;
314
+ }
315
+ return _context2.a(2, 0);
316
+ case 3:
317
+ debugLogger.logger.info("Attempting to load ".concat(type, " texture: ").concat(path));
318
+ _context2.n = 4;
319
+ return new Promise(function (resolve, reject) {
320
+ var timeout = setTimeout(function () {
321
+ return reject(new Error("Timeout loading ".concat(path)));
322
+ }, 10000);
323
+
324
+ // Add event listeners for better diagnostics
325
+ var onProgress = function onProgress(event) {
326
+ if (event.lengthComputable) {
327
+ var percentComplete = event.loaded / event.total * 100;
328
+ console.log("Loading ".concat(path, ": ").concat(Math.round(percentComplete), "% complete"));
329
+ }
330
+ };
331
+ loader.load(path, function (tex) {
332
+ clearTimeout(timeout);
333
+ console.log("\u2705 Successfully loaded ".concat(type, " texture: ").concat(path));
334
+ resolve(tex);
335
+ }, onProgress, function (err) {
336
+ clearTimeout(timeout);
337
+ console.warn("\u274C Failed to load ".concat(path, ":"), err.message);
338
+ reject(err);
339
+ });
340
+ });
341
+ case 4:
342
+ texture = _context2.v;
343
+ if (!applyEnvironmentMap(texture, type)) {
344
+ _context2.n = 5;
345
+ break;
346
+ }
347
+ pmremGenerator.dispose();
348
+ return _context2.a(2, {
349
+ v: {
350
+ v: void 0
351
+ }
352
+ });
353
+ case 5:
354
+ _context2.n = 7;
355
+ break;
356
+ case 6:
357
+ _context2.p = 6;
358
+ _t2 = _context2.v;
359
+ debugLogger.logger.warn("Failed to load ".concat(path, ":"), _t2.message);
360
+ case 7:
361
+ return _context2.a(2);
362
+ }
363
+ }, _loop2, null, [[1, 6]]);
364
+ });
365
+ _iterator.s();
366
+ case 2:
367
+ if ((_step = _iterator.n()).done) {
368
+ _context3.n = 6;
369
+ break;
370
+ }
371
+ return _context3.d(_rollupPluginBabelHelpers.regeneratorValues(_loop2()), 3);
372
+ case 3:
373
+ _ret2 = _context3.v;
374
+ if (!(_ret2 === 0)) {
375
+ _context3.n = 4;
376
+ break;
377
+ }
378
+ return _context3.a(3, 5);
379
+ case 4:
380
+ if (!_ret2) {
381
+ _context3.n = 5;
382
+ break;
383
+ }
384
+ return _context3.a(2, _ret2.v);
385
+ case 5:
386
+ _context3.n = 2;
387
+ break;
388
+ case 6:
389
+ _context3.n = 8;
390
+ break;
391
+ case 7:
392
+ _context3.p = 7;
393
+ _t3 = _context3.v;
394
+ _iterator.e(_t3);
395
+ case 8:
396
+ _context3.p = 8;
397
+ _iterator.f();
398
+ return _context3.f(8);
399
+ case 9:
400
+ return _context3.a(2);
401
+ }
402
+ }, _loop, null, [[1, 7, 8, 9]]);
403
+ });
404
+ _i = 0, _loaders = loaders;
405
+ case 10:
406
+ if (!(_i < _loaders.length)) {
407
+ _context4.n = 13;
408
+ break;
409
+ }
410
+ return _context4.d(_rollupPluginBabelHelpers.regeneratorValues(_loop()), 11);
411
+ case 11:
412
+ _ret = _context4.v;
413
+ if (!_ret) {
414
+ _context4.n = 12;
415
+ break;
416
+ }
417
+ return _context4.a(2, _ret.v);
418
+ case 12:
419
+ _i++;
420
+ _context4.n = 10;
421
+ break;
422
+ case 13:
423
+ // If we reached here, all texture attempts failed - use procedural sky
424
+ this.createProceduralSky(pmremGenerator);
425
+ _context4.n = 15;
426
+ break;
427
+ case 14:
428
+ _context4.p = 14;
429
+ _t6 = _context4.v;
430
+ debugLogger.logger.error('Error creating skybox:', _t6);
431
+ this.createFallbackEnvironment();
432
+ case 15:
433
+ return _context4.a(2);
434
+ }
435
+ }, _callee2, this, [[6, 8], [5, 14], [2, 4]]);
436
+ }));
437
+ function createSkybox() {
438
+ return _createSkybox.apply(this, arguments);
439
+ }
440
+ return createSkybox;
441
+ }()
442
+ /**
443
+ * Create a fallback environment when renderer issues occur
444
+ */
445
+ )
446
+ }, {
447
+ key: "createFallbackEnvironment",
448
+ value: function createFallbackEnvironment() {
449
+ var component = this.component;
450
+ if (!component || !component.scene) return;
451
+ debugLogger.logger.info('Creating basic fallback environment');
452
+ // Add simple ambient and directional light
453
+ var ambientLight = new THREE__namespace.AmbientLight(0xffffff, 0.6);
454
+ component.scene.add(ambientLight);
455
+ var directionalLight = new THREE__namespace.DirectionalLight(0xffffff, 0.8);
456
+ directionalLight.position.set(1, 2, 3);
457
+ component.scene.add(directionalLight);
458
+
459
+ // Set a simple background color
460
+ component.scene.background = new THREE__namespace.Color(0x87CEEB);
461
+ }
462
+
463
+ /**
464
+ * Create procedural sky when textures fail to load
465
+ */
466
+ }, {
467
+ key: "createProceduralSky",
468
+ value: function createProceduralSky(pmremGenerator) {
469
+ var component = this.component;
470
+ if (!component || !component.scene) return;
471
+ debugLogger.logger.info('Using procedural sky fallback');
472
+ var ambientLight = new THREE__namespace.AmbientLight(0xffffff, 0.6);
473
+ component.scene.add(ambientLight);
474
+
475
+ // Add a directional light for better illumination
476
+ var directionalLight = new THREE__namespace.DirectionalLight(0xffffff, 0.8);
477
+ directionalLight.position.set(1, 1, 1);
478
+ component.scene.add(directionalLight);
479
+ try {
480
+ // Only attempt PMREM generation if we have a valid pmremGenerator
481
+ if (pmremGenerator && typeof pmremGenerator.fromScene === 'function') {
482
+ var skyScene = new THREE__namespace.Scene();
483
+ skyScene.add(new THREE__namespace.HemisphereLight(0x87CEEB, 0x444477, 1));
484
+
485
+ // Generate environment map from scene
486
+ var envMap = pmremGenerator.fromScene(skyScene);
487
+ if (envMap && envMap.texture) {
488
+ component.scene.environment = envMap.texture;
489
+ }
490
+ }
491
+
492
+ // Always set a background color as fallback
493
+ component.scene.background = new THREE__namespace.Color(0x87CEEB);
494
+ } catch (error) {
495
+ debugLogger.logger.warn('Failed to create procedural sky, using simple background', error);
496
+ component.scene.background = new THREE__namespace.Color(0x87CEEB);
497
+ } finally {
498
+ if (pmremGenerator && typeof pmremGenerator.dispose === 'function') {
499
+ pmremGenerator.dispose();
500
+ }
501
+ }
502
+ }
503
+
504
+ /**
505
+ * Setup scene lighting
506
+ */
507
+ }, {
508
+ key: "setupLighting",
509
+ value: function setupLighting() {
510
+ var component = this.component;
511
+ if (!component || !component.scene) {
512
+ debugLogger.logger.warn('Cannot setup lighting: component or scene not available');
513
+ return;
514
+ }
515
+
516
+ // Remove existing lights first
517
+ var existingLights = [];
518
+ component.scene.traverse(function (object) {
519
+ if (object instanceof THREE__namespace.Light) {
520
+ existingLights.push(object);
521
+ }
522
+ });
523
+ existingLights.forEach(function (light) {
524
+ component.scene.remove(light);
525
+ });
526
+
527
+ // Main directional light (sun)
528
+ var directionalLight = new THREE__namespace.DirectionalLight(0xffffff, 0.8);
529
+ directionalLight.position.set(5, 10, 7);
530
+ directionalLight.castShadow = true;
531
+
532
+ // Optimize shadow map
533
+ directionalLight.shadow.mapSize.width = 1024;
534
+ directionalLight.shadow.mapSize.height = 1024;
535
+ directionalLight.shadow.camera.near = 1;
536
+ directionalLight.shadow.camera.far = 30;
537
+ directionalLight.shadow.camera.left = -10;
538
+ directionalLight.shadow.camera.right = 10;
539
+ directionalLight.shadow.camera.top = 10;
540
+ directionalLight.shadow.camera.bottom = -10;
541
+ directionalLight.shadow.bias = -0.001;
542
+ component.scene.add(directionalLight);
543
+
544
+ // Ambient light for general illumination
545
+ var ambientLight = new THREE__namespace.AmbientLight(0xffffff, 0.3);
546
+ component.scene.add(ambientLight);
547
+
548
+ // Hemisphere light to simulate sky/ground reflection
549
+ var hemisphereLight = new THREE__namespace.HemisphereLight(0xffffff, 0x444477, 0.3);
550
+ component.scene.add(hemisphereLight);
551
+ debugLogger.logger.info('Scene lighting setup complete');
552
+ }
553
+
554
+ /**
555
+ * Create ground plane
556
+ */
557
+ }, {
558
+ key: "createGround",
559
+ value: function createGround() {
560
+ var component = this.component;
561
+ if (!component || !component.scene) {
562
+ debugLogger.logger.warn('Cannot create ground: component or scene not available');
563
+ return null;
564
+ }
565
+
566
+ // Create a ground plane
567
+ var groundGeometry = new THREE__namespace.PlaneGeometry(100, 100);
568
+ var groundMaterial = new THREE__namespace.MeshStandardMaterial({
569
+ color: 0xcccccc,
570
+ roughness: 0.8,
571
+ metalness: 0.2,
572
+ side: THREE__namespace.DoubleSide
573
+ });
574
+ var ground = new THREE__namespace.Mesh(groundGeometry, groundMaterial);
575
+ ground.rotation.x = -Math.PI / 2; // Rotate to be horizontal
576
+ ground.position.y = -0.01; // Slightly below origin
577
+ ground.receiveShadow = true;
578
+
579
+ // Set user data for identification
580
+ ground.userData = {
581
+ isEnvironmentObject: true,
582
+ type: 'ground'
583
+ };
584
+ component.scene.add(ground);
585
+ debugLogger.logger.info('Ground plane created');
586
+ return ground;
587
+ }
588
+
589
+ /**
590
+ * Create walls for the environment
591
+ */
592
+ }, {
593
+ key: "createWalls",
594
+ value: function createWalls() {
595
+ var component = this.component;
596
+ if (!component || !component.scene) {
597
+ debugLogger.logger.warn('Cannot create walls: component or scene not available');
598
+ return [];
599
+ }
600
+ var walls = [];
601
+ var wallHeight = 20;
602
+ var roomSize = 50;
603
+ var wallThickness = 1;
604
+ var wallColor = 0xdddddd;
605
+
606
+ // Wall materials
607
+ var wallMaterial = new THREE__namespace.MeshStandardMaterial({
608
+ color: wallColor,
609
+ roughness: 0.9,
610
+ metalness: 0.1,
611
+ side: THREE__namespace.DoubleSide
612
+ });
613
+
614
+ // Create walls (north, east, south, west)
615
+ var wallGeometries = [new THREE__namespace.BoxGeometry(roomSize, wallHeight, wallThickness),
616
+ // North
617
+ new THREE__namespace.BoxGeometry(wallThickness, wallHeight, roomSize),
618
+ // East
619
+ new THREE__namespace.BoxGeometry(roomSize, wallHeight, wallThickness),
620
+ // South
621
+ new THREE__namespace.BoxGeometry(wallThickness, wallHeight, roomSize) // West
622
+ ];
623
+ var wallPositions = [[0, wallHeight / 2, -roomSize / 2],
624
+ // North
625
+ [roomSize / 2, wallHeight / 2, 0],
626
+ // East
627
+ [0, wallHeight / 2, roomSize / 2],
628
+ // South
629
+ [-roomSize / 2, wallHeight / 2, 0] // West
630
+ ];
631
+ var wallNames = ['north-wall', 'east-wall', 'south-wall', 'west-wall'];
632
+
633
+ // Create each wall
634
+ for (var i = 0; i < 4; i++) {
635
+ var _wall$position;
636
+ var wall = new THREE__namespace.Mesh(wallGeometries[i], wallMaterial);
637
+ (_wall$position = wall.position).set.apply(_wall$position, _rollupPluginBabelHelpers.toConsumableArray(wallPositions[i]));
638
+ wall.receiveShadow = true;
639
+ wall.castShadow = true;
640
+
641
+ // Set user data for identification
642
+ wall.userData = {
643
+ isEnvironmentObject: true,
644
+ type: 'wall',
645
+ name: wallNames[i]
646
+ };
647
+ component.scene.add(wall);
648
+ walls.push(wall);
649
+ }
650
+ debugLogger.logger.info('Environment walls created');
651
+ return walls;
652
+ }
653
+
654
+ /**
655
+ * Set fog in the scene
656
+ */
657
+ }, {
658
+ key: "setFog",
659
+ value: function setFog() {
660
+ var color = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0xcccccc;
661
+ var density = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0.01;
662
+ var component = this.component;
663
+ if (!component || !component.scene) {
664
+ debugLogger.logger.warn('Cannot set fog: component or scene not available');
665
+ return;
666
+ }
667
+ component.scene.fog = new THREE__namespace.FogExp2(color, density);
668
+ debugLogger.logger.info('Scene fog applied');
669
+ }
670
+ /**
671
+ * Initialize the default environment
672
+ */
673
+ }, {
674
+ key: "initializeEnvironment",
675
+ value: (function () {
676
+ var _initializeEnvironment = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee3() {
677
+ var component, loadersReady, textureConfigReady, _t7;
678
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context5) {
679
+ while (1) switch (_context5.n) {
680
+ case 0:
681
+ component = this.component; // Make sure loaders are initialized first
682
+ console.log('🚀 Initializing loaders for environment...');
683
+ _context5.p = 1;
684
+ _context5.n = 2;
685
+ return importThreeLoaders();
686
+ case 2:
687
+ loadersReady = _context5.v;
688
+ _context5.n = 3;
689
+ return importTextureConfig();
690
+ case 3:
691
+ textureConfigReady = _context5.v;
692
+ console.log('✅ Environment loaders initialized:', {
693
+ loaders: loadersReady ? 'Ready' : 'Failed',
694
+ textureConfig: textureConfigReady ? 'Ready' : 'Failed'
695
+ });
696
+ _context5.n = 5;
697
+ break;
698
+ case 4:
699
+ _context5.p = 4;
700
+ _t7 = _context5.v;
701
+ console.warn('⚠️ Error initializing environment loaders:', _t7);
702
+ case 5:
703
+ // Configure renderer for proper HDR rendering if it exists
704
+ if (component && component.renderer) {
705
+ // Ensure proper tone mapping is set for HDR
706
+ component.renderer.toneMapping = THREE__namespace.ACESFilmicToneMapping;
707
+ component.renderer.toneMappingExposure = 1.0;
708
+ // For all Three.js versions from r152+
709
+ if (component.renderer.outputColorSpace !== undefined) {
710
+ component.renderer.outputColorSpace = THREE__namespace.SRGBColorSpace;
711
+ }
712
+ // For older Three.js versions (legacy support)
713
+ else if (component.renderer.outputEncoding !== undefined) {
714
+ component.renderer.outputEncoding = THREE__namespace.sRGBEncoding;
715
+ }
716
+ debugLogger.logger.info("Renderer configured for HDR:\n - Tone mapping: ".concat(component.renderer.toneMapping, "\n - Color space: ").concat(component.renderer.outputColorSpace || component.renderer.outputEncoding));
717
+ }
718
+
719
+ // Create skybox (includes base lighting)
720
+ _context5.n = 6;
721
+ return this.createSkybox();
722
+ case 6:
723
+ // Add additional lighting
724
+ this.setupLighting();
725
+
726
+ // Use textured ground instead of basic ground
727
+ _context5.n = 7;
728
+ return this.addTexturedGround();
729
+ case 7:
730
+ // No walls or fog by default
731
+ // await this.addBrickWalls();
732
+ // this.addHorizonFog();
733
+
734
+ debugLogger.logger.info('Environment initialization complete');
735
+ case 8:
736
+ return _context5.a(2);
737
+ }
738
+ }, _callee3, this, [[1, 4]]);
739
+ }));
740
+ function initializeEnvironment() {
741
+ return _initializeEnvironment.apply(this, arguments);
742
+ }
743
+ return initializeEnvironment;
744
+ }()
745
+ /**
746
+ * Add textured ground with materials from textureConfig
747
+ */
748
+ )
749
+ }, {
750
+ key: "addTexturedGround",
751
+ value: (function () {
752
+ var _addTexturedGround = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee4() {
753
+ var component, groundMaterial, groundGeometry, ground, _t8;
754
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context6) {
755
+ while (1) switch (_context6.n) {
756
+ case 0:
757
+ if (loadTextureSetAndCreateMaterial) {
758
+ _context6.n = 1;
759
+ break;
760
+ }
761
+ _context6.n = 1;
762
+ return importTextureConfig();
763
+ case 1:
764
+ component = this.component;
765
+ if (!(!component || !component.scene)) {
766
+ _context6.n = 2;
767
+ break;
768
+ }
769
+ debugLogger.logger.warn('Cannot create textured ground: component or scene not available');
770
+ return _context6.a(2, null);
771
+ case 2:
772
+ // Remove existing ground if present
773
+ component.scene.traverse(function (object) {
774
+ if (object.userData && object.userData.type === 'ground') {
775
+ component.scene.remove(object);
776
+ }
777
+ });
778
+ _context6.p = 3;
779
+ _context6.n = 4;
780
+ return loadTextureSetAndCreateMaterial(component, 'gravel_embedded_concrete');
781
+ case 4:
782
+ groundMaterial = _context6.v;
783
+ groundGeometry = new THREE__namespace.PlaneGeometry(100, 100);
784
+ ground = new THREE__namespace.Mesh(groundGeometry, groundMaterial);
785
+ ground.rotation.x = -Math.PI / 2; // Rotate to be horizontal
786
+ ground.position.y = -0.01; // Slightly below origin
787
+ ground.receiveShadow = true;
788
+
789
+ // Set user data for identification
790
+ ground.userData = {
791
+ isEnvironmentObject: true,
792
+ type: 'ground'
793
+ };
794
+ component.scene.add(ground);
795
+ debugLogger.logger.info('Textured ground created');
796
+ return _context6.a(2, ground);
797
+ case 5:
798
+ _context6.p = 5;
799
+ _t8 = _context6.v;
800
+ debugLogger.logger.error('Error creating textured ground:', _t8);
801
+ // Fallback to simple ground
802
+ return _context6.a(2, this.createGround());
803
+ }
804
+ }, _callee4, this, [[3, 5]]);
805
+ }));
806
+ function addTexturedGround() {
807
+ return _addTexturedGround.apply(this, arguments);
808
+ }
809
+ return addTexturedGround;
810
+ }()
811
+ /**
812
+ * Add brick walls with materials from textureConfig
813
+ */
814
+ )
815
+ }, {
816
+ key: "addBrickWalls",
817
+ value: (function () {
818
+ var _addBrickWalls = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee5() {
819
+ var component, wallMaterial, walls, wallHeight, roomSize, wallThickness, wallGeometries, wallPositions, wallNames, i, _wall$position2, wall, _t9;
820
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context7) {
821
+ while (1) switch (_context7.n) {
822
+ case 0:
823
+ if (loadTextureSetAndCreateMaterial) {
824
+ _context7.n = 1;
825
+ break;
826
+ }
827
+ _context7.n = 1;
828
+ return importTextureConfig();
829
+ case 1:
830
+ component = this.component;
831
+ if (!(!component || !component.scene)) {
832
+ _context7.n = 2;
833
+ break;
834
+ }
835
+ debugLogger.logger.warn('Cannot create brick walls: component or scene not available');
836
+ return _context7.a(2, []);
837
+ case 2:
838
+ // Remove existing walls if present
839
+ component.scene.traverse(function (object) {
840
+ if (object.userData && object.userData.type === 'wall') {
841
+ component.scene.remove(object);
842
+ }
843
+ });
844
+ _context7.p = 3;
845
+ _context7.n = 4;
846
+ return loadTextureSetAndCreateMaterial(component, 'brick');
847
+ case 4:
848
+ wallMaterial = _context7.v;
849
+ walls = [];
850
+ wallHeight = 20;
851
+ roomSize = 50;
852
+ wallThickness = 1; // Create walls (north, east, south, west)
853
+ wallGeometries = [new THREE__namespace.BoxGeometry(roomSize, wallHeight, wallThickness),
854
+ // North
855
+ new THREE__namespace.BoxGeometry(wallThickness, wallHeight, roomSize),
856
+ // East
857
+ new THREE__namespace.BoxGeometry(roomSize, wallHeight, wallThickness),
858
+ // South
859
+ new THREE__namespace.BoxGeometry(wallThickness, wallHeight, roomSize) // West
860
+ ];
861
+ wallPositions = [[0, wallHeight / 2, -roomSize / 2],
862
+ // North
863
+ [roomSize / 2, wallHeight / 2, 0],
864
+ // East
865
+ [0, wallHeight / 2, roomSize / 2],
866
+ // South
867
+ [-roomSize / 2, wallHeight / 2, 0] // West
868
+ ];
869
+ wallNames = ['north-wall', 'east-wall', 'south-wall', 'west-wall']; // Create each wall
870
+ for (i = 0; i < 4; i++) {
871
+ wall = new THREE__namespace.Mesh(wallGeometries[i], wallMaterial);
872
+ (_wall$position2 = wall.position).set.apply(_wall$position2, _rollupPluginBabelHelpers.toConsumableArray(wallPositions[i]));
873
+ wall.receiveShadow = true;
874
+ wall.castShadow = true;
875
+
876
+ // Set user data for identification
877
+ wall.userData = {
878
+ isEnvironmentObject: true,
879
+ type: 'wall',
880
+ name: wallNames[i]
881
+ };
882
+ component.scene.add(wall);
883
+ walls.push(wall);
884
+ }
885
+ debugLogger.logger.info('Textured environment walls created');
886
+ return _context7.a(2, walls);
887
+ case 5:
888
+ _context7.p = 5;
889
+ _t9 = _context7.v;
890
+ debugLogger.logger.error('Error creating brick walls:', _t9);
891
+ // Fallback to simple walls
892
+ return _context7.a(2, this.createWalls());
893
+ }
894
+ }, _callee5, this, [[3, 5]]);
895
+ }));
896
+ function addBrickWalls() {
897
+ return _addBrickWalls.apply(this, arguments);
898
+ }
899
+ return addBrickWalls;
900
+ }()
901
+ /**
902
+ * Add horizon fog effect
903
+ */
904
+ )
905
+ }, {
906
+ key: "addHorizonFog",
907
+ value: function addHorizonFog() {
908
+ var component = this.component;
909
+ if (!component || !component.scene) {
910
+ debugLogger.logger.warn('Cannot set horizon fog: component or scene not available');
911
+ return;
912
+ }
913
+
914
+ // Light blue-ish fog color
915
+ var fogColor = 0xd8e0ff;
916
+ // Less dense than the default fog
917
+ var fogDensity = 0.005;
918
+ component.scene.fog = new THREE__namespace.FogExp2(fogColor, fogDensity);
919
+ debugLogger.logger.info('Horizon fog applied');
920
+ }
921
+
922
+ /**
923
+ * Helper to check if a texture exists locally in static directory
924
+ * @param {string} path - Relative path to texture in static directory
925
+ * @returns {Promise<boolean>}
926
+ */
927
+ }, {
928
+ key: "checkLocalTextureExists",
929
+ value: (function () {
930
+ var _checkLocalTextureExists = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee6(path) {
931
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context8) {
932
+ while (1) switch (_context8.n) {
933
+ case 0:
934
+ // Remove leading slash if present
935
+ if (path.startsWith('/')) {
936
+ path = path.substring(1);
937
+ }
938
+
939
+ // For browser environment
940
+ if (!(typeof window !== 'undefined')) {
941
+ _context8.n = 1;
942
+ break;
943
+ }
944
+ return _context8.a(2, new Promise(function (resolve) {
945
+ var img = new Image();
946
+ img.onload = function () {
947
+ return resolve(true);
948
+ };
949
+ img.onerror = function () {
950
+ return resolve(false);
951
+ };
952
+
953
+ // Create full path relative to app root
954
+ var fullPath = window.location.origin + '/' + path;
955
+ img.src = fullPath;
956
+
957
+ // Set a timeout in case the image load hangs
958
+ setTimeout(function () {
959
+ return resolve(false);
960
+ }, 2000);
961
+ }));
962
+ case 1:
963
+ return _context8.a(2, false);
964
+ }
965
+ }, _callee6);
966
+ }));
967
+ function checkLocalTextureExists(_x) {
968
+ return _checkLocalTextureExists.apply(this, arguments);
969
+ }
970
+ return checkLocalTextureExists;
971
+ }())
972
+ }]);
973
+ }();
974
+
975
+ // Create a singleton instance
976
+ var environmentManager = null;
977
+
978
+ /**
979
+ * Get the global environment manager instance
980
+ */
981
+ function getEnvironmentManager() {
982
+ var component = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
983
+ if (!environmentManager || component && environmentManager.component !== component) {
984
+ environmentManager = new EnvironmentManager(component);
985
+ }
986
+ return environmentManager;
987
+ }
988
+ var environmentManager$1 = {
989
+ EnvironmentManager: EnvironmentManager,
990
+ getEnvironmentManager: getEnvironmentManager,
991
+ // Default initialization method for ease of use
992
+ initializeEnvironment: function () {
993
+ var _initializeEnvironment2 = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee7(component) {
994
+ var manager;
995
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context9) {
996
+ while (1) switch (_context9.n) {
997
+ case 0:
998
+ manager = getEnvironmentManager(component);
999
+ _context9.n = 1;
1000
+ return manager.initializeEnvironment();
1001
+ case 1:
1002
+ return _context9.a(2, manager);
1003
+ }
1004
+ }, _callee7);
1005
+ }));
1006
+ function initializeEnvironment(_x2) {
1007
+ return _initializeEnvironment2.apply(this, arguments);
1008
+ }
1009
+ return initializeEnvironment;
1010
+ }()
1011
+ };
1012
+
1013
+ exports.EnvironmentManager = EnvironmentManager;
1014
+ exports["default"] = environmentManager$1;
1015
+ exports.getEnvironmentManager = getEnvironmentManager;