@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,690 @@
1
- import{createClass as e,classCallCheck as r,asyncToGenerator as n,regenerator as t,regeneratorValues as a,createForOfIteratorHelper as o}from"../../../_virtual/_rollupPluginBabelHelpers.js";import*as i from"three";import{RGBELoader as s}from"../../../node_modules/three/examples/jsm/loaders/RGBELoader.js";import{loadTextureSetAndCreateMaterial as u}from"./textureConfig.js";import{logger as c}from"../../core/debugLogger.js";var l=function(){return e(function e(n){r(this,e),this.sceneViewer=n},[{key:"createSkybox",value:(y=n(t().m(function e(){var r,n,u,c,l,f,d,v,h,k;return t().w(function(e){for(;;)switch(e.n){case 0:r=this.sceneViewer,(n=new i.PMREMGenerator(r.renderer)).compileEquirectangularShader(),u=[{type:"hdr",loader:new s,paths:["/skyboxes/kloofendal_48d_partly_cloudy_puresky_2k.hdr","/skyboxes/kloofendal_48d_partly_cloudy_puresky_1k.hdr"]},{type:"jpeg",loader:r.textureLoader,paths:["/skyboxes/sky_fallback.jpg"]}],c=function(e,t){try{var a,o;e.mapping=i.EquirectangularReflectionMapping;var s=n.fromEquirectangular(e).texture;return null!==(a=r.scene.environment)&&void 0!==a&&a.dispose&&r.scene.environment.dispose(),null!==(o=r.scene.background)&&void 0!==o&&o.dispose&&r.scene.background.dispose(),r.scene.environment=s,r.scene.background=s,e.dispose(),!0}catch(e){return!1}},l=t().m(function e(){var r,i,s,u,l,f,h,k;return t().w(function(e){for(;;)switch(e.n){case 0:(r=v[d]).type,i=r.loader,s=r.paths,u=o(s),e.p=1,f=t().m(function e(){var r,a;return t().w(function(e){for(;;)switch(e.n){case 0:return r=l.value,e.p=1,e.n=2,new Promise(function(e,n){var t=setTimeout(function(){return n(new Error("Timeout"))},1e4);i.load(r,function(r){clearTimeout(t),e(r)},void 0,function(e){clearTimeout(t),n(e)})});case 2:if(a=e.v,!c(a)){e.n=3;break}return n.dispose(),e.a(2,{v:{v:void 0}});case 3:e.n=5;break;case 4:e.p=4,e.v;case 5:return e.a(2)}},e,null,[[1,4]])}),u.s();case 2:if((l=u.n()).done){e.n=5;break}return e.d(a(f()),3);case 3:if(!(h=e.v)){e.n=4;break}return e.a(2,h.v);case 4:e.n=2;break;case 5:e.n=7;break;case 6:e.p=6,k=e.v,u.e(k);case 7:return e.p=7,u.f(),e.f(7);case 8:return e.a(2)}},e,null,[[1,6,7,8]])}),d=0,v=u;case 1:if(!(d<v.length)){e.n=4;break}return e.d(a(l()),2);case 2:if(!(f=e.v)){e.n=3;break}return e.a(2,f.v);case 3:d++,e.n=1;break;case 4:h=new i.AmbientLight(16777215,.6),r.scene.add(h),(k=new i.Scene).add(new i.HemisphereLight(8900331,4473975,1)),r.scene.environment=n.fromScene(k).texture,r.scene.background=new i.Color(8900331),n.dispose();case 5:return e.a(2)}},e,this)})),function(){return y.apply(this,arguments)})},{key:"setupLighting",value:function(){var e=this.sceneViewer;e.scene.children=e.scene.children.filter(function(e){return!(e instanceof i.Light)});var r=new i.DirectionalLight(16777195,5);r.position.set(15,30,-10),r.castShadow=!0,r.shadow.camera.near=.1,r.shadow.camera.far=100,r.shadow.camera.left=-50,r.shadow.camera.right=50,r.shadow.camera.top=50,r.shadow.camera.bottom=-50,r.shadow.mapSize.width=2048,r.shadow.mapSize.height=2048,e.scene.add(r);var n=new i.DirectionalLight(16777164,.4);n.position.set(-10,10,-10),e.scene.add(n),c.info("Scene lighting setup completed")}},{key:"addTexturedGround",value:(k=n(t().m(function e(){var r,n,a,o,s,l;return t().w(function(e){for(;;)switch(e.n){case 0:return r=this.sceneViewer,c.debug("Starting addTexturedGround..."),n=new i.PlaneGeometry(30,30),a=new i.MeshStandardMaterial({color:7829367,metalness:.2,roughness:.9}),(o=new i.Mesh(n,a)).rotation.x=-Math.PI/2,o.position.y=0,o.receiveShadow=!0,o.name="Ground",o.userData.isBaseGround=!0,r.scene.add(o),e.p=1,c.debug("Loading concrete texture set..."),e.n=2,u("gravel_embedded_concrete",r.textureLoader);case 2:s=e.v,o.material=s,o.material.needsUpdate=!0,c.success("Ground material updated with textures"),e.n=4;break;case 3:e.p=3,l=e.v,c.warn("Error loading ground textures:",l);case 4:return e.a(2)}},e,this,[[1,3]])})),function(){return k.apply(this,arguments)})},{key:"addBrickWalls",value:(h=n(t().m(function e(){var r,n,a,o,s,l,f;return t().w(function(e){for(;;)switch(e.n){case 0:return r=this.sceneViewer,c.debug("Starting addBrickWalls..."),n=2.5,a=.5,o=new i.MeshPhysicalMaterial({color:7824226,roughness:.9,metalness:.1,clearcoat:.05,clearcoatRoughness:.4}),s=function(e){var t=function(n,t,a,o,s,u){var c=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,l=arguments.length>7&&void 0!==arguments[7]?arguments[7]:1,f=new i.BoxGeometry(n,t,a);if(1!==l){for(var d=f.attributes.uv,v=d.array,h=0;h<v.length;h+=2)v[h+1]*=l;d.needsUpdate=!0}var k=new i.Mesh(f,e);return k.position.set(o,s-.56,u),0!==c&&k.rotateY(c),k.userData.isBrickWall=!0,k.castShadow=!0,k.receiveShadow=!0,k.name="Wall",r.scene.add(k),k};t(30,n,a,0,1.25,14.75,0,1),t(30,n,a,0,1.25,-14.75,0,1),t(a,8.5,29,14.75,4.25,0,0,3.4),t(a,n,29,-14.75,1.25,0,0,1)},s(o),c.debug("Basic brick walls created"),e.p=1,c.debug("Loading brick texture set..."),e.n=2,u("brick",r.textureLoader);case 2:l=e.v,r.scene.traverse(function(e){e.isMesh&&e.userData.isBrickWall&&(e.material=l,e.material.needsUpdate=!0)}),c.success("Brick walls updated with textures"),e.n=4;break;case 3:e.p=3,f=e.v,c.warn("Error loading brick textures:",f);case 4:return e.a(2)}},e,this,[[1,3]])})),function(){return h.apply(this,arguments)})},{key:"addHorizonFog",value:function(){var e=this.sceneViewer,r=new i.ShaderMaterial({transparent:!0,uniforms:{fogColor:{value:new i.Color(5533306)},fogDensity:{value:1}},vertexShader:"\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n ",fragmentShader:"\n uniform vec3 fogColor;\n uniform float fogDensity;\n varying vec2 vUv;\n \n void main() {\n vec2 center = vec2(0.5, 0.5);\n float dist = distance(vUv, center);\n float opacity = (1.0 - smoothstep(0.0, 0.5, dist)) * fogDensity;\n gl_FragColor = vec4(fogColor, opacity);\n }\n ",side:i.DoubleSide}),n=new i.PlaneGeometry(300,300),t=new i.Mesh(n,r);return t.rotation.x=-Math.PI/2,t.position.y=-3,t.name="fogPlane",e.scene.add(t),t}},{key:"initializeEnvironment",value:(v=n(t().m(function e(){return t().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,this.createSkybox();case 1:return this.setupLighting(),e.n=2,this.addTexturedGround();case 2:return e.n=3,this.addBrickWalls();case 3:this.addHorizonFog(),c.info("Environment initialization completed");case 4:return e.a(2)}},e,this)})),function(){return v.apply(this,arguments)})},{key:"removeSkybox",value:function(){var e=this.sceneViewer;try{var r,n;return null!==(r=e.scene.environment)&&void 0!==r&&r.dispose&&e.scene.environment.dispose(),null!==(n=e.scene.background)&&void 0!==n&&n.dispose&&e.scene.background.dispose(),e.scene.environment=null,e.scene.background=new i.Color(16777215),c.info("Skybox removed successfully"),!0}catch(e){return!1}}},{key:"setSkyboxType",value:(d=n(t().m(function e(r){var n,a,o,s,u;return t().w(function(e){for(;;)switch(e.n){case 0:n=this.sceneViewer,e.p=1,null!==(a=n.scene.environment)&&void 0!==a&&a.dispose&&n.scene.environment.dispose(),null!==(o=n.scene.background)&&void 0!==o&&o.dispose&&n.scene.background.dispose(),(s=new i.PMREMGenerator(n.renderer)).compileEquirectangularShader(),u=r,e.n="HDR"===u?2:"Fallback"===u?4:"Color"===u?6:7;break;case 2:return e.n=3,this.loadHDRSkybox(s);case 3:case 5:return e.a(3,8);case 4:return e.n=5,this.loadFallbackSkybox(s);case 6:return this.setColorBackground(),e.a(3,8);case 7:return e.n=8,this.loadHDRSkybox(s);case 8:return s.dispose(),c.info("Skybox type changed to: ".concat(r)),e.a(2,!0);case 9:return e.p=9,e.v,e.a(2,!1)}},e,this,[[1,9]])})),function(e){return d.apply(this,arguments)})},{key:"loadHDRSkybox",value:(f=n(t().m(function e(r){var n,o,u,c,l,f,d;return t().w(function(e){for(;;)switch(e.n){case 0:n=this.sceneViewer,o=new s,u=["/skyboxes/kloofendal_48d_partly_cloudy_puresky_2k.hdr","/skyboxes/kloofendal_48d_partly_cloudy_puresky_1k.hdr"],c=t().m(function e(){var a,s,u;return t().w(function(e){for(;;)switch(e.n){case 0:return a=d[f],e.p=1,e.n=2,new Promise(function(e,r){var n=setTimeout(function(){return r(new Error("Timeout"))},1e4);o.load(a,function(r){clearTimeout(n),e(r)},void 0,function(e){clearTimeout(n),r(e)})});case 2:return(s=e.v).mapping=i.EquirectangularReflectionMapping,u=r.fromEquirectangular(s).texture,n.scene.environment=u,n.scene.background=u,s.dispose(),e.a(2,{v:void 0});case 3:e.p=3,e.v;case 4:return e.a(2)}},e,null,[[1,3]])}),f=0,d=u;case 1:if(!(f<d.length)){e.n=4;break}return e.d(a(c()),2);case 2:if(!(l=e.v)){e.n=3;break}return e.a(2,l.v);case 3:f++,e.n=1;break;case 4:throw new Error("Failed to load any HDR skybox");case 5:return e.a(2)}},e,this)})),function(e){return f.apply(this,arguments)})},{key:"loadFallbackSkybox",value:(l=n(t().m(function e(r){var n,a,o;return t().w(function(e){for(;;)switch(e.n){case 0:return n=this.sceneViewer,e.p=1,e.n=2,new Promise(function(e,r){var t=setTimeout(function(){return r(new Error("Timeout"))},1e4);n.textureLoader.load("/skyboxes/sky_fallback.jpg",function(r){clearTimeout(t),e(r)},void 0,function(e){clearTimeout(t),r(e)})});case 2:(a=e.v).mapping=i.EquirectangularReflectionMapping,o=r.fromEquirectangular(a).texture,n.scene.environment=o,n.scene.background=o,a.dispose(),e.n=4;break;case 3:throw e.p=3,e.v;case 4:return e.a(2)}},e,this,[[1,3]])})),function(e){return l.apply(this,arguments)})},{key:"setColorBackground",value:function(){var e=this.sceneViewer;e.scene.environment=null,e.scene.background=new i.Color(16777215);var r=new i.AmbientLight(16777215,.6);e.scene.add(r)}}]);var l,f,d,v,h,k,y}();export{l as EnvironmentManager};
1
+ import { createClass as _createClass, classCallCheck as _classCallCheck, asyncToGenerator as _asyncToGenerator, regenerator as _regenerator, regeneratorValues as _regeneratorValues, createForOfIteratorHelper as _createForOfIteratorHelper } from '../../../_virtual/_rollupPluginBabelHelpers.js';
2
+ import * as THREE from 'three';
3
+ import { RGBELoader } from '../../../node_modules/three/examples/jsm/loaders/RGBELoader.js';
4
+ import { loadTextureSetAndCreateMaterial } from './textureConfig.js';
5
+ import { logger } from '../../core/debugLogger.js';
6
+
7
+ var EnvironmentManager = /*#__PURE__*/function () {
8
+ function EnvironmentManager(sceneViewer) {
9
+ _classCallCheck(this, EnvironmentManager);
10
+ this.sceneViewer = sceneViewer;
11
+ }
12
+
13
+ /**
14
+ * Create skybox with HDR environment mapping
15
+ */
16
+ return _createClass(EnvironmentManager, [{
17
+ key: "createSkybox",
18
+ value: (function () {
19
+ var _createSkybox = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
20
+ var component, pmremGenerator, loaders, applyEnvironmentMap, _loop, _ret, _i, _loaders, ambientLight, skyScene;
21
+ return _regenerator().w(function (_context3) {
22
+ while (1) switch (_context3.n) {
23
+ case 0:
24
+ component = this.sceneViewer;
25
+ pmremGenerator = new THREE.PMREMGenerator(component.renderer);
26
+ pmremGenerator.compileEquirectangularShader();
27
+ loaders = [{
28
+ type: 'hdr',
29
+ loader: new RGBELoader(),
30
+ paths: ['/skyboxes/kloofendal_48d_partly_cloudy_puresky_2k.hdr', '/skyboxes/kloofendal_48d_partly_cloudy_puresky_1k.hdr']
31
+ }, {
32
+ type: 'jpeg',
33
+ loader: component.textureLoader,
34
+ paths: ['/skyboxes/sky_fallback.jpg']
35
+ }];
36
+ applyEnvironmentMap = function applyEnvironmentMap(envTexture, type) {
37
+ try {
38
+ var _component$scene$envi, _component$scene$back;
39
+ envTexture.mapping = THREE.EquirectangularReflectionMapping;
40
+ var processedEnvMap = pmremGenerator.fromEquirectangular(envTexture).texture;
41
+ if ((_component$scene$envi = component.scene.environment) !== null && _component$scene$envi !== void 0 && _component$scene$envi.dispose) component.scene.environment.dispose();
42
+ if ((_component$scene$back = component.scene.background) !== null && _component$scene$back !== void 0 && _component$scene$back.dispose) component.scene.background.dispose();
43
+ component.scene.environment = processedEnvMap;
44
+ component.scene.background = processedEnvMap;
45
+ envTexture.dispose();
46
+ console.log("\u2705 ".concat(type.toUpperCase(), " environment map applied successfully"));
47
+ return true;
48
+ } catch (error) {
49
+ console.warn("\u274C Failed to apply ".concat(type, " environment map:"), error);
50
+ return false;
51
+ }
52
+ };
53
+ _loop = /*#__PURE__*/_regenerator().m(function _loop() {
54
+ var _loaders$_i, type, loader, paths, _iterator, _step, _loop2, _ret2, _t2;
55
+ return _regenerator().w(function (_context2) {
56
+ while (1) switch (_context2.n) {
57
+ case 0:
58
+ _loaders$_i = _loaders[_i], type = _loaders$_i.type, loader = _loaders$_i.loader, paths = _loaders$_i.paths;
59
+ _iterator = _createForOfIteratorHelper(paths);
60
+ _context2.p = 1;
61
+ _loop2 = /*#__PURE__*/_regenerator().m(function _loop2() {
62
+ var path, texture, _t;
63
+ return _regenerator().w(function (_context) {
64
+ while (1) switch (_context.n) {
65
+ case 0:
66
+ path = _step.value;
67
+ _context.p = 1;
68
+ console.log("\uD83D\uDD04 Attempting to load ".concat(type.toUpperCase(), ": ").concat(path));
69
+ _context.n = 2;
70
+ return new Promise(function (resolve, reject) {
71
+ var timeout = setTimeout(function () {
72
+ return reject(new Error('Timeout'));
73
+ }, 10000);
74
+ loader.load(path, function (tex) {
75
+ clearTimeout(timeout);
76
+ resolve(tex);
77
+ }, undefined, function (err) {
78
+ clearTimeout(timeout);
79
+ reject(err);
80
+ });
81
+ });
82
+ case 2:
83
+ texture = _context.v;
84
+ if (!applyEnvironmentMap(texture, type)) {
85
+ _context.n = 3;
86
+ break;
87
+ }
88
+ pmremGenerator.dispose();
89
+ return _context.a(2, {
90
+ v: {
91
+ v: void 0
92
+ }
93
+ });
94
+ case 3:
95
+ _context.n = 5;
96
+ break;
97
+ case 4:
98
+ _context.p = 4;
99
+ _t = _context.v;
100
+ console.warn("\u26A0\uFE0F Failed to load ".concat(path, ":"), _t.message);
101
+ case 5:
102
+ return _context.a(2);
103
+ }
104
+ }, _loop2, null, [[1, 4]]);
105
+ });
106
+ _iterator.s();
107
+ case 2:
108
+ if ((_step = _iterator.n()).done) {
109
+ _context2.n = 5;
110
+ break;
111
+ }
112
+ return _context2.d(_regeneratorValues(_loop2()), 3);
113
+ case 3:
114
+ _ret2 = _context2.v;
115
+ if (!_ret2) {
116
+ _context2.n = 4;
117
+ break;
118
+ }
119
+ return _context2.a(2, _ret2.v);
120
+ case 4:
121
+ _context2.n = 2;
122
+ break;
123
+ case 5:
124
+ _context2.n = 7;
125
+ break;
126
+ case 6:
127
+ _context2.p = 6;
128
+ _t2 = _context2.v;
129
+ _iterator.e(_t2);
130
+ case 7:
131
+ _context2.p = 7;
132
+ _iterator.f();
133
+ return _context2.f(7);
134
+ case 8:
135
+ return _context2.a(2);
136
+ }
137
+ }, _loop, null, [[1, 6, 7, 8]]);
138
+ });
139
+ _i = 0, _loaders = loaders;
140
+ case 1:
141
+ if (!(_i < _loaders.length)) {
142
+ _context3.n = 4;
143
+ break;
144
+ }
145
+ return _context3.d(_regeneratorValues(_loop()), 2);
146
+ case 2:
147
+ _ret = _context3.v;
148
+ if (!_ret) {
149
+ _context3.n = 3;
150
+ break;
151
+ }
152
+ return _context3.a(2, _ret.v);
153
+ case 3:
154
+ _i++;
155
+ _context3.n = 1;
156
+ break;
157
+ case 4:
158
+ console.log('🎨 Using procedural sky fallback');
159
+ ambientLight = new THREE.AmbientLight(0xffffff, 0.6);
160
+ component.scene.add(ambientLight);
161
+ skyScene = new THREE.Scene();
162
+ skyScene.add(new THREE.HemisphereLight(0x87CEEB, 0x444477, 1));
163
+ component.scene.environment = pmremGenerator.fromScene(skyScene).texture;
164
+ component.scene.background = new THREE.Color(0x87CEEB);
165
+ pmremGenerator.dispose();
166
+ case 5:
167
+ return _context3.a(2);
168
+ }
169
+ }, _callee, this);
170
+ }));
171
+ function createSkybox() {
172
+ return _createSkybox.apply(this, arguments);
173
+ }
174
+ return createSkybox;
175
+ }()
176
+ /**
177
+ * Setup scene lighting
178
+ */
179
+ )
180
+ }, {
181
+ key: "setupLighting",
182
+ value: function setupLighting() {
183
+ var component = this.sceneViewer;
184
+
185
+ // Remove existing lights
186
+ component.scene.children = component.scene.children.filter(function (child) {
187
+ return !(child instanceof THREE.Light);
188
+ });
189
+
190
+ // Sun light (main directional light)
191
+ var sunLight = new THREE.DirectionalLight(0xffffeb, 5);
192
+ sunLight.position.set(15, 30, -10);
193
+ sunLight.castShadow = true;
194
+ sunLight.shadow.camera.near = 0.1;
195
+ sunLight.shadow.camera.far = 100;
196
+ sunLight.shadow.camera.left = -50;
197
+ sunLight.shadow.camera.right = 50;
198
+ sunLight.shadow.camera.top = 50;
199
+ sunLight.shadow.camera.bottom = -50;
200
+ sunLight.shadow.mapSize.width = 2048;
201
+ sunLight.shadow.mapSize.height = 2048;
202
+ component.scene.add(sunLight);
203
+ // component.scene.add(sunLight.target)
204
+
205
+ // // Ambient hemispheric light
206
+ // const ambientLight = new THREE.HemisphereLight(0xffffff, 0x444466, 0.35)
207
+ // component.scene.add(ambientLight)
208
+
209
+ // Fill light (secondary directional light)
210
+ var fillLight = new THREE.DirectionalLight(0xffffcc, 0.4);
211
+ fillLight.position.set(-10, 10, -10);
212
+ component.scene.add(fillLight);
213
+
214
+ // // Rim light (for edge definition)
215
+ // const rimLight = new THREE.DirectionalLight(0xffffff, 0.9)
216
+ // rimLight.position.set(0, 0, -20)
217
+ // component.scene.add(rimLight)
218
+
219
+ // // Spot light (for focused illumination)
220
+ // const spotLight = new THREE.SpotLight(0xffffff, 0.5)
221
+ // spotLight.position.set(5, 15, 5)
222
+ // spotLight.angle = Math.PI / 6
223
+ // spotLight.penumbra = 0.3
224
+ // spotLight.decay = 1.5
225
+ // spotLight.distance = 50
226
+ // spotLight.castShadow = true
227
+ // spotLight.shadow.bias = -0.0003
228
+ // spotLight.shadow.mapSize.width = 2048
229
+ // spotLight.shadow.mapSize.height = 2048
230
+ // component.scene.add(spotLight)
231
+
232
+ logger.info('Scene lighting setup completed');
233
+ }
234
+
235
+ /**
236
+ * Add textured ground plane
237
+ */
238
+ }, {
239
+ key: "addTexturedGround",
240
+ value: (function () {
241
+ var _addTexturedGround = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
242
+ var component, groundSize, groundGeometry, groundMaterial, ground, texturedMaterial, _t3;
243
+ return _regenerator().w(function (_context4) {
244
+ while (1) switch (_context4.n) {
245
+ case 0:
246
+ component = this.sceneViewer;
247
+ logger.debug('Starting addTexturedGround...');
248
+ groundSize = 30;
249
+ groundGeometry = new THREE.PlaneGeometry(groundSize, groundSize);
250
+ groundMaterial = new THREE.MeshStandardMaterial({
251
+ color: 0x777777,
252
+ metalness: 0.2,
253
+ roughness: 0.9
254
+ });
255
+ ground = new THREE.Mesh(groundGeometry, groundMaterial);
256
+ ground.rotation.x = -Math.PI / 2;
257
+ ground.position.y = 0;
258
+ ground.receiveShadow = true;
259
+ ground.name = 'Ground';
260
+ ground.userData.isBaseGround = true;
261
+ component.scene.add(ground);
262
+ _context4.p = 1;
263
+ logger.debug('Loading concrete texture set...');
264
+ _context4.n = 2;
265
+ return loadTextureSetAndCreateMaterial('gravel_embedded_concrete', component.textureLoader);
266
+ case 2:
267
+ texturedMaterial = _context4.v;
268
+ ground.material = texturedMaterial;
269
+ ground.material.needsUpdate = true;
270
+ logger.success('Ground material updated with textures');
271
+ _context4.n = 4;
272
+ break;
273
+ case 3:
274
+ _context4.p = 3;
275
+ _t3 = _context4.v;
276
+ logger.warn('Error loading ground textures:', _t3);
277
+ case 4:
278
+ return _context4.a(2);
279
+ }
280
+ }, _callee2, this, [[1, 3]]);
281
+ }));
282
+ function addTexturedGround() {
283
+ return _addTexturedGround.apply(this, arguments);
284
+ }
285
+ return addTexturedGround;
286
+ }()
287
+ /**
288
+ * Add brick walls around the scene
289
+ */
290
+ )
291
+ }, {
292
+ key: "addBrickWalls",
293
+ value: (function () {
294
+ var _addBrickWalls = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
295
+ var component, wallHeight, wallThickness, groundSize, halfGroundSize, brickMaterial, createWalls, texturedBrickMaterial, _t4;
296
+ return _regenerator().w(function (_context5) {
297
+ while (1) switch (_context5.n) {
298
+ case 0:
299
+ component = this.sceneViewer;
300
+ logger.debug('Starting addBrickWalls...');
301
+ wallHeight = 2.5;
302
+ wallThickness = 0.5;
303
+ groundSize = 30;
304
+ halfGroundSize = groundSize / 2;
305
+ brickMaterial = new THREE.MeshPhysicalMaterial({
306
+ color: 0x776362,
307
+ roughness: 0.9,
308
+ metalness: 0.1,
309
+ clearcoat: 0.05,
310
+ clearcoatRoughness: 0.4
311
+ });
312
+ createWalls = function createWalls(material) {
313
+ var createWall = function createWall(width, height, depth, x, y, z) {
314
+ var rotation = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0;
315
+ var textureScaleY = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : 1;
316
+ var geometry = new THREE.BoxGeometry(width, height, depth);
317
+ if (textureScaleY !== 1) {
318
+ var uvAttribute = geometry.attributes.uv;
319
+ var uvArray = uvAttribute.array;
320
+ for (var i = 0; i < uvArray.length; i += 2) {
321
+ uvArray[i + 1] *= textureScaleY;
322
+ }
323
+ uvAttribute.needsUpdate = true;
324
+ }
325
+ var wall = new THREE.Mesh(geometry, material);
326
+ wall.position.set(x, y - 0.56, z);
327
+ if (rotation !== 0) {
328
+ wall.rotateY(rotation);
329
+ }
330
+ wall.userData.isBrickWall = true;
331
+ wall.castShadow = true;
332
+ wall.receiveShadow = true;
333
+ wall.name = "Wall";
334
+ component.scene.add(wall);
335
+ return wall;
336
+ };
337
+
338
+ // Create walls with optimized direct values
339
+ createWall(groundSize, wallHeight, wallThickness, 0, wallHeight / 2, halfGroundSize - wallThickness / 2, 0, 1.0);
340
+ createWall(groundSize, wallHeight, wallThickness, 0, wallHeight / 2, -halfGroundSize + wallThickness / 2, 0, 1.0);
341
+ createWall(wallThickness, wallHeight + 6.0, groundSize - wallThickness * 2, halfGroundSize - wallThickness / 2, (wallHeight + 6.0) / 2, 0, 0, (wallHeight + 6.0) / wallHeight);
342
+ createWall(wallThickness, wallHeight, groundSize - wallThickness * 2, -halfGroundSize + wallThickness / 2, wallHeight / 2, 0, 0, 1.0);
343
+ };
344
+ createWalls(brickMaterial);
345
+ logger.debug('Basic brick walls created');
346
+ _context5.p = 1;
347
+ logger.debug('Loading brick texture set...');
348
+ _context5.n = 2;
349
+ return loadTextureSetAndCreateMaterial('brick', component.textureLoader);
350
+ case 2:
351
+ texturedBrickMaterial = _context5.v;
352
+ component.scene.traverse(function (object) {
353
+ if (object.isMesh && object.userData.isBrickWall) {
354
+ object.material = texturedBrickMaterial;
355
+ object.material.needsUpdate = true;
356
+ }
357
+ });
358
+ logger.success('Brick walls updated with textures');
359
+ _context5.n = 4;
360
+ break;
361
+ case 3:
362
+ _context5.p = 3;
363
+ _t4 = _context5.v;
364
+ logger.warn('Error loading brick textures:', _t4);
365
+ case 4:
366
+ return _context5.a(2);
367
+ }
368
+ }, _callee3, this, [[1, 3]]);
369
+ }));
370
+ function addBrickWalls() {
371
+ return _addBrickWalls.apply(this, arguments);
372
+ }
373
+ return addBrickWalls;
374
+ }()
375
+ /**
376
+ * Add horizon fog effect
377
+ */
378
+ )
379
+ }, {
380
+ key: "addHorizonFog",
381
+ value: function addHorizonFog() {
382
+ var component = this.sceneViewer;
383
+ var groundSize = 30;
384
+ var fogSize = groundSize * 10;
385
+ var fogMaterial = new THREE.ShaderMaterial({
386
+ transparent: true,
387
+ uniforms: {
388
+ fogColor: {
389
+ value: new THREE.Color(0x546E7A)
390
+ },
391
+ fogDensity: {
392
+ value: 1
393
+ }
394
+ },
395
+ vertexShader: "\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n ",
396
+ fragmentShader: "\n uniform vec3 fogColor;\n uniform float fogDensity;\n varying vec2 vUv;\n \n void main() {\n vec2 center = vec2(0.5, 0.5);\n float dist = distance(vUv, center);\n float opacity = (1.0 - smoothstep(0.0, 0.5, dist)) * fogDensity;\n gl_FragColor = vec4(fogColor, opacity);\n }\n ",
397
+ side: THREE.DoubleSide
398
+ });
399
+ var fogGeometry = new THREE.PlaneGeometry(fogSize, fogSize);
400
+ var fogPlane = new THREE.Mesh(fogGeometry, fogMaterial);
401
+ fogPlane.rotation.x = -Math.PI / 2;
402
+ fogPlane.position.y = -3.0;
403
+ fogPlane.name = "fogPlane";
404
+ component.scene.add(fogPlane);
405
+ return fogPlane;
406
+ }
407
+
408
+ /**
409
+ * Initialize complete environment
410
+ */
411
+ }, {
412
+ key: "initializeEnvironment",
413
+ value: (function () {
414
+ var _initializeEnvironment = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {
415
+ return _regenerator().w(function (_context6) {
416
+ while (1) switch (_context6.n) {
417
+ case 0:
418
+ _context6.n = 1;
419
+ return this.createSkybox();
420
+ case 1:
421
+ this.setupLighting();
422
+ _context6.n = 2;
423
+ return this.addTexturedGround();
424
+ case 2:
425
+ _context6.n = 3;
426
+ return this.addBrickWalls();
427
+ case 3:
428
+ this.addHorizonFog();
429
+ logger.info('Environment initialization completed');
430
+ case 4:
431
+ return _context6.a(2);
432
+ }
433
+ }, _callee4, this);
434
+ }));
435
+ function initializeEnvironment() {
436
+ return _initializeEnvironment.apply(this, arguments);
437
+ }
438
+ return initializeEnvironment;
439
+ }()
440
+ /**
441
+ * Remove the current skybox and reset to a plain background
442
+ */
443
+ )
444
+ }, {
445
+ key: "removeSkybox",
446
+ value: function removeSkybox() {
447
+ var component = this.sceneViewer;
448
+ try {
449
+ var _component$scene$envi2, _component$scene$back2;
450
+ // Dispose of current environment and background textures
451
+ if ((_component$scene$envi2 = component.scene.environment) !== null && _component$scene$envi2 !== void 0 && _component$scene$envi2.dispose) {
452
+ component.scene.environment.dispose();
453
+ }
454
+ if ((_component$scene$back2 = component.scene.background) !== null && _component$scene$back2 !== void 0 && _component$scene$back2.dispose) {
455
+ component.scene.background.dispose();
456
+ }
457
+
458
+ // Set to null/plain background
459
+ component.scene.environment = null;
460
+ component.scene.background = new THREE.Color(0xffffff); // White background
461
+
462
+ logger.info('Skybox removed successfully');
463
+ return true;
464
+ } catch (error) {
465
+ console.error('❌ Error removing skybox:', error);
466
+ return false;
467
+ }
468
+ }
469
+
470
+ /**
471
+ * Set the skybox type dynamically
472
+ * @param {string} skyboxType - 'HDR', 'Fallback', or 'Color'
473
+ */
474
+ }, {
475
+ key: "setSkyboxType",
476
+ value: (function () {
477
+ var _setSkyboxType = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5(skyboxType) {
478
+ var component, _component$scene$envi3, _component$scene$back3, _pmremGenerator, _t5, _t6;
479
+ return _regenerator().w(function (_context7) {
480
+ while (1) switch (_context7.n) {
481
+ case 0:
482
+ component = this.sceneViewer;
483
+ _context7.p = 1;
484
+ console.log("\uD83C\uDF0C Changing skybox type to: ".concat(skyboxType));
485
+
486
+ // Dispose of current environment textures
487
+ if ((_component$scene$envi3 = component.scene.environment) !== null && _component$scene$envi3 !== void 0 && _component$scene$envi3.dispose) {
488
+ component.scene.environment.dispose();
489
+ }
490
+ if ((_component$scene$back3 = component.scene.background) !== null && _component$scene$back3 !== void 0 && _component$scene$back3.dispose) {
491
+ component.scene.background.dispose();
492
+ }
493
+ _pmremGenerator = new THREE.PMREMGenerator(component.renderer);
494
+ _pmremGenerator.compileEquirectangularShader();
495
+ _t5 = skyboxType;
496
+ _context7.n = _t5 === 'HDR' ? 2 : _t5 === 'Fallback' ? 4 : _t5 === 'Color' ? 6 : 7;
497
+ break;
498
+ case 2:
499
+ _context7.n = 3;
500
+ return this.loadHDRSkybox(_pmremGenerator);
501
+ case 3:
502
+ return _context7.a(3, 8);
503
+ case 4:
504
+ _context7.n = 5;
505
+ return this.loadFallbackSkybox(_pmremGenerator);
506
+ case 5:
507
+ return _context7.a(3, 8);
508
+ case 6:
509
+ this.setColorBackground();
510
+ return _context7.a(3, 8);
511
+ case 7:
512
+ console.warn("Unknown skybox type: ".concat(skyboxType, ", falling back to HDR"));
513
+ _context7.n = 8;
514
+ return this.loadHDRSkybox(_pmremGenerator);
515
+ case 8:
516
+ _pmremGenerator.dispose();
517
+ logger.info("Skybox type changed to: ".concat(skyboxType));
518
+ return _context7.a(2, true);
519
+ case 9:
520
+ _context7.p = 9;
521
+ _t6 = _context7.v;
522
+ console.error('❌ Error setting skybox type:', _t6);
523
+ return _context7.a(2, false);
524
+ }
525
+ }, _callee5, this, [[1, 9]]);
526
+ }));
527
+ function setSkyboxType(_x) {
528
+ return _setSkyboxType.apply(this, arguments);
529
+ }
530
+ return setSkyboxType;
531
+ }()
532
+ /**
533
+ * Load HDR skybox specifically
534
+ */
535
+ )
536
+ }, {
537
+ key: "loadHDRSkybox",
538
+ value: (function () {
539
+ var _loadHDRSkybox = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6(pmremGenerator) {
540
+ var component, rgbeLoader, hdrPaths, _loop3, _ret3, _i2, _hdrPaths;
541
+ return _regenerator().w(function (_context9) {
542
+ while (1) switch (_context9.n) {
543
+ case 0:
544
+ component = this.sceneViewer;
545
+ rgbeLoader = new RGBELoader();
546
+ hdrPaths = ['/skyboxes/kloofendal_48d_partly_cloudy_puresky_2k.hdr', '/skyboxes/kloofendal_48d_partly_cloudy_puresky_1k.hdr'];
547
+ _loop3 = /*#__PURE__*/_regenerator().m(function _loop3() {
548
+ var path, texture, processedEnvMap, _t7;
549
+ return _regenerator().w(function (_context8) {
550
+ while (1) switch (_context8.n) {
551
+ case 0:
552
+ path = _hdrPaths[_i2];
553
+ _context8.p = 1;
554
+ console.log("\uD83D\uDD04 Loading HDR: ".concat(path));
555
+ _context8.n = 2;
556
+ return new Promise(function (resolve, reject) {
557
+ var timeout = setTimeout(function () {
558
+ return reject(new Error('Timeout'));
559
+ }, 10000);
560
+ rgbeLoader.load(path, function (tex) {
561
+ clearTimeout(timeout);
562
+ resolve(tex);
563
+ }, undefined, function (err) {
564
+ clearTimeout(timeout);
565
+ reject(err);
566
+ });
567
+ });
568
+ case 2:
569
+ texture = _context8.v;
570
+ texture.mapping = THREE.EquirectangularReflectionMapping;
571
+ processedEnvMap = pmremGenerator.fromEquirectangular(texture).texture;
572
+ component.scene.environment = processedEnvMap;
573
+ component.scene.background = processedEnvMap;
574
+ texture.dispose();
575
+ console.log('✅ HDR skybox loaded successfully');
576
+ return _context8.a(2, {
577
+ v: void 0
578
+ });
579
+ case 3:
580
+ _context8.p = 3;
581
+ _t7 = _context8.v;
582
+ console.warn("\u26A0\uFE0F Failed to load HDR skybox ".concat(path, ":"), _t7.message);
583
+ case 4:
584
+ return _context8.a(2);
585
+ }
586
+ }, _loop3, null, [[1, 3]]);
587
+ });
588
+ _i2 = 0, _hdrPaths = hdrPaths;
589
+ case 1:
590
+ if (!(_i2 < _hdrPaths.length)) {
591
+ _context9.n = 4;
592
+ break;
593
+ }
594
+ return _context9.d(_regeneratorValues(_loop3()), 2);
595
+ case 2:
596
+ _ret3 = _context9.v;
597
+ if (!_ret3) {
598
+ _context9.n = 3;
599
+ break;
600
+ }
601
+ return _context9.a(2, _ret3.v);
602
+ case 3:
603
+ _i2++;
604
+ _context9.n = 1;
605
+ break;
606
+ case 4:
607
+ throw new Error('Failed to load any HDR skybox');
608
+ case 5:
609
+ return _context9.a(2);
610
+ }
611
+ }, _callee6, this);
612
+ }));
613
+ function loadHDRSkybox(_x2) {
614
+ return _loadHDRSkybox.apply(this, arguments);
615
+ }
616
+ return loadHDRSkybox;
617
+ }()
618
+ /**
619
+ * Load fallback JPEG skybox
620
+ */
621
+ )
622
+ }, {
623
+ key: "loadFallbackSkybox",
624
+ value: (function () {
625
+ var _loadFallbackSkybox = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee7(pmremGenerator) {
626
+ var component, texture, processedEnvMap, _t8;
627
+ return _regenerator().w(function (_context0) {
628
+ while (1) switch (_context0.n) {
629
+ case 0:
630
+ component = this.sceneViewer;
631
+ _context0.p = 1;
632
+ console.log('🔄 Loading fallback skybox');
633
+ _context0.n = 2;
634
+ return new Promise(function (resolve, reject) {
635
+ var timeout = setTimeout(function () {
636
+ return reject(new Error('Timeout'));
637
+ }, 10000);
638
+ component.textureLoader.load('/skyboxes/sky_fallback.jpg', function (tex) {
639
+ clearTimeout(timeout);
640
+ resolve(tex);
641
+ }, undefined, function (err) {
642
+ clearTimeout(timeout);
643
+ reject(err);
644
+ });
645
+ });
646
+ case 2:
647
+ texture = _context0.v;
648
+ texture.mapping = THREE.EquirectangularReflectionMapping;
649
+ processedEnvMap = pmremGenerator.fromEquirectangular(texture).texture;
650
+ component.scene.environment = processedEnvMap;
651
+ component.scene.background = processedEnvMap;
652
+ texture.dispose();
653
+ console.log('✅ Fallback skybox loaded successfully');
654
+ _context0.n = 4;
655
+ break;
656
+ case 3:
657
+ _context0.p = 3;
658
+ _t8 = _context0.v;
659
+ console.warn('⚠️ Failed to load fallback skybox:', _t8.message);
660
+ throw _t8;
661
+ case 4:
662
+ return _context0.a(2);
663
+ }
664
+ }, _callee7, this, [[1, 3]]);
665
+ }));
666
+ function loadFallbackSkybox(_x3) {
667
+ return _loadFallbackSkybox.apply(this, arguments);
668
+ }
669
+ return loadFallbackSkybox;
670
+ }()
671
+ /**
672
+ * Set solid color background
673
+ */
674
+ )
675
+ }, {
676
+ key: "setColorBackground",
677
+ value: function setColorBackground() {
678
+ var component = this.sceneViewer;
679
+ component.scene.environment = null;
680
+ component.scene.background = new THREE.Color(0xffffff); // White background
681
+
682
+ // Add basic ambient lighting since we don't have environment lighting
683
+ var ambientLight = new THREE.AmbientLight(0xffffff, 0.6);
684
+ component.scene.add(ambientLight);
685
+ console.log('✅ Color background set successfully');
686
+ }
687
+ }]);
688
+ }();
689
+
690
+ export { EnvironmentManager };