@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,1485 @@
1
- import{createClass as e,objectSpread2 as n,classCallCheck as r,createForOfIteratorHelper as t,asyncToGenerator as a,regenerator as i,toConsumableArray as o,slicedToArray as u}from"../../../_virtual/_rollupPluginBabelHelpers.js";import*as c from"three";import{loadTextureSet as s}from"../environment/textureConfig.js";import l from"../../rendering/modelPreloader.js";import{modelLogger as v}from"../../core/debugLogger.js";var f=function(){return e(function e(n){r(this,e),this.sceneViewer=n},[{key:"clearSceneObjects",value:function(){var e=this.sceneViewer;this.deselectObject();var n=null;e.transformManager&&e.transformManager.transformControls&&(e.transformManager.setEnabled(!1),e.transformManager.transformControls.visible=!1,n=e.transformManager.transformControls);var r=[];e.scene.traverse(function(t){var a,i,o,u,c;0;var s=t===n||(null===(a=t.userData)||void 0===a?void 0:a.isTransformControls)||t.isTransformControls||t.type&&t.type.includes("TransformControls");s&&0,t===e.scene||null!==(i=t.userData)&&void 0!==i&&i.isBrickWall||null!==(o=t.userData)&&void 0!==o&&o.isBaseGround||null!==(u=t.userData)&&void 0!==u&&u.isBaseGrid||s||t.isLight||"PlaneGeometry"===(null===(c=t.geometry)||void 0===c?void 0:c.type)||r.push(t)}),r.forEach(function(n){e.scene.remove(n),n.geometry&&n.geometry.dispose(),n.material&&(Array.isArray(n.material)?n.material.forEach(function(e){return e.dispose()}):n.material.dispose())}),e.selectedObjectForTransform=null,e.transformHistory&&(e.transformHistory=[]),e.transformManager&&e.transformManager.transformControls||e.initTransformControls(),this.ensureTransformControlsAttached(!1)}},{key:"ensureTransformControlsAttached",value:function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],n=this.sceneViewer;if(n.transformManager){if(!n.transformManager.transformControls)return n.transformManager.createTransformControls(),void n.transformManager.setupEventListeners();n.transformManager.ensureSceneAttachment(e);!e&&n.transformManager.transformControls&&(n.transformManager.transformControls.visible=!1)}else n.initTransformControls()}},{key:"loadLibraryModel",value:(k=a(i().m(function e(n,r,t){var a,s,f,d,h,m,y,w,k,b,p,g,M,x,S,B;return i().w(function(e){for(;;)switch(e.n){case 0:if(a=this.sceneViewer,e.p=1,v.info("Loading library GLB model for ".concat(null===(s=r.userData)||void 0===s?void 0:s.libraryId,"...")),v.debug("Starting to load GLB model from /library/models/".concat(t.modelKey)),h=n.parent,m=n.position.clone(),y=n.quaternion.clone(),w=n.scale.clone(),k=n.name,b=n.uuid,p=[],n.children.forEach(function(e){var n=e.geometry&&("CONNECTOR-GEO"===e.geometry.uuid||"SphereGeometry"===e.geometry.type&&e.geometry.parameters),r=e.name&&e.name.toLowerCase().includes("connector");if(n&&r){if(e.userData||(e.userData={}),!e.userData.worldBoundingBox){var t=(new c.Box3).setFromObject(e);e.userData.worldBoundingBox={min:t.min.toArray(),max:t.max.toArray()}}var a=e.clone();if(e.userData){a.userData={},e.userData.worldBoundingBox&&(a.userData.worldBoundingBox={min:o(e.userData.worldBoundingBox.min),max:o(e.userData.worldBoundingBox.max)}),e.userData.direction&&(a.userData.direction=o(e.userData.direction));for(var i=0,s=Object.entries(e.userData);i<s.length;i++){var l=u(s[i],2),v=l[0],f=l[1];"worldBoundingBox"!==v&&"direction"!==v&&(a.userData[v]=f)}a.userData.originalUuid=e.uuid,void 0===a.userData.forExport&&(a.userData.forExport=!0),a.userData.componentType||(e.name&&e.name.toLowerCase().includes("connector")?a.userData.componentType="connector":e.name&&e.name.toLowerCase().includes("gateway")&&(a.userData.componentType="gateway"))}p.push(a)}}),!(g=l.getCachedModelWithDimensions(t.modelKey,null===(f=r.userData)||void 0===f?void 0:f.libraryId))){e.n=2;break}e.n=8;break;case 2:if(!l.getStatus().isPreloading){e.n=6;break}return e.p=3,e.n=4,l.preloadingPromise;case 4:g=l.getCachedModelWithDimensions(t.modelKey,null===(M=r.userData)||void 0===M?void 0:M.libraryId),e.n=6;break;case 5:e.p=5,e.v;case 6:if(g){e.n=8;break}return e.n=7,new Promise(function(e,n){a.gltfLoader.load("/library/models/".concat(t.modelKey),function(n){e(n)},function(e){},function(e){n(e)})});case 7:S=e.v,g=S.scene,null!==(x=r.userData)&&void 0!==x&&x.libraryId&&(g=l.addDimensionsToModel(g,r.userData.libraryId));case 8:return(B=g.isCachedClone?g:g.clone()).uuid=b,B.name=k,B.quaternion.copy(y),B.scale.copy(w),B.userData||(B.userData={}),B.userData.originalUuid=b,B.userData.componentType="component",B.userData.libraryId=null===(d=r.userData)||void 0===d?void 0:d.libraryId,t.boundingBox&&(B.userData.dimensions={x:t.boundingBox.x,y:t.boundingBox.y,z:t.boundingBox.z}),t.adaptedBoundingBox&&(B.userData.adaptedBoundingBox={x:t.adaptedBoundingBox.x,y:t.adaptedBoundingBox.y,z:t.adaptedBoundingBox.z}),r.position&&r.rotation?(B.position.set(r.position.x,r.position.y,r.position.z),B.rotation.set(c.MathUtils.degToRad(r.rotation.x),c.MathUtils.degToRad(r.rotation.y),c.MathUtils.degToRad(r.rotation.z))):B.position.copy(m),B.traverse(function(e){e.isMesh&&(e.castShadow=!0,e.receiveShadow=!0,e.material&&(e.material.envMapIntensity=1))}),p.forEach(function(e){B.add(e)}),B.children.forEach(function(e,n){e.name&&e.name.toLowerCase().includes("connector")}),B.children.length>0&&B.children.forEach(function(e,n){}),h&&h.add&&"function"==typeof h.add?(h.remove(n),h.add(B)):(a.scene.remove(n),a.scene.add(B)),e.a(2,B);case 9:return e.p=9,e.v,e.a(2,n)}},e,this,[[3,5],[1,9]])})),function(e,n,r){return k.apply(this,arguments)})},{key:"verifyModelPreloaderCache",value:(w=a(i().m(function e(){var n;return i().w(function(e){for(;;)switch(e.n){case 0:if(!(n=l.getStatus()).isPreloading){e.n=4;break}return e.p=1,e.n=2,l.preloadingPromise;case 2:e.n=4;break;case 3:e.p=3,e.v;case 4:return e.a(2,n)}},e,null,[[1,3]])})),function(){return w.apply(this,arguments)})},{key:"preloadMissingModels",value:(y=a(i().m(function e(n,r){var a,o,u,c,s,v,f,d;return i().w(function(e){for(;;)switch(e.n){case 0:return a=new Set,n.scene.object.children.forEach(function(e){var n,t;if(null!==(n=e.userData)&&void 0!==n&&n.libraryId&&r[null===(t=e.userData)||void 0===t?void 0:t.libraryId]){var i,o=r[null===(i=e.userData)||void 0===i?void 0:i.libraryId].modelKey;o&&a.add(o)}}),e.n=1,this.verifyModelPreloaderCache();case 1:if(o=e.v,u=o.cachedModels,!((c=Array.from(a).filter(function(e){return!u.includes(e)})).length>0)){e.n=11;break}s=t(c),e.p=2,s.s();case 3:if((v=s.n()).done){e.n=8;break}return f=v.value,e.p=4,e.n=5,l.preloadSingleModel(f);case 5:e.n=7;break;case 6:e.p=6,e.v;case 7:e.n=3;break;case 8:e.n=10;break;case 9:e.p=9,d=e.v,s.e(d);case 10:return e.p=10,s.f(),e.f(10);case 11:return e.a(2)}},e,this,[[4,6],[2,9,10,11]])})),function(e,n){return y.apply(this,arguments)})},{key:"createSceneMaterials",value:(m=a(i().m(function e(n){var r,t,a;return i().w(function(e){for(;;)switch(e.n){case 0:return r=this.sceneViewer,t={},a=null,e.p=1,e.n=2,s("light_metal",r.textureLoader);case 2:a=e.v,e.n=7;break;case 3:return e.p=3,e.v,e.p=4,e.n=5,s("gravel_embedded_concrete",r.textureLoader);case 5:a=e.v,e.n=7;break;case 6:e.p=6,e.v;case 7:return e.a(2,{materials:t,crosscubeTextureSet:a})}},e,this,[[4,6],[1,3]])})),function(e){return m.apply(this,arguments)})},{key:"createSceneGeometries",value:function(e,n){var r={};return e.scene.object.children.forEach(function(e){var t;if(null!==(t=e.userData)&&void 0!==t&&t.libraryId&&n[e.userData.libraryId]){var a=n[e.userData.libraryId].boundingBox,i=new c.BoxGeometry(a.x||1,a.y||1,a.z||1);r[e.geometry]=i}else{var o=e.uuid&&(e.uuid.toLowerCase().includes("connector")||e.uuid.toLowerCase().includes("gateway"));r[e.geometry]=o?new c.SphereGeometry(.1,16,16):new c.BoxGeometry(1,1,1)}}),r}},{key:"createSceneObject",value:function(e,r,t){var a=this,i=r[e.geometry],o=t[e.material];o||(o=new c.MeshPhysicalMaterial({color:12632256,roughness:.15,metalness:.9,emissive:0,envMapIntensity:1.5,transparent:!0,opacity:.8}));var u=new c.Mesh(i,o);if(u.uuid=e.uuid,u.name=e.name||e.uuid,u.userData||(u.userData={}),u.userData.originalUuid=e.uuid,e.userData&&(u.userData=n({},e.userData),u.userData.componentType||(u.userData.libraryId?u.userData.componentType="component":e.uuid&&e.uuid.toLowerCase().includes("connector")?u.userData.componentType="connector":e.uuid&&e.uuid.toLowerCase().includes("gateway")&&(u.userData.componentType="gateway"))),u.isMesh&&(u.castShadow=!0,u.receiveShadow=!0),e.position&&u.position.set(e.position.x||0,e.position.y||0,e.position.z||0),e.rotation){var s=e.rotation.x*(Math.PI/180),l=e.rotation.y*(Math.PI/180),v=e.rotation.z*(Math.PI/180);u.rotation.set(s,l,v)}return e.scale&&u.scale.set(e.scale.x||1,e.scale.y||1,e.scale.z||1),e.children&&e.children.forEach(function(e){u.add(a.createSceneObject(e,r,t))}),u}},{key:"computeWorldBoundingBoxes",value:function(e){this.sceneViewer.scene.traverse(function(n){if(n.isMesh){var r=null,a=function(e){var r,i=t(e);try{for(i.s();!(r=i.n()).done;){var o,u,c=r.value;if(c.uuid===n.uuid||c.uuid===(null===(o=n.userData)||void 0===o?void 0:o.originalUuid)||n.uuid===(null===(u=c.userData)||void 0===u?void 0:u.originalUuid))return c;if(c.children){var s=a(c.children);if(s)return s}}}catch(e){i.e(e)}finally{i.f()}return null};if(r=a(e.scene.object.children)){var i=(new c.Box3).setFromObject(n);r.userData||(r.userData={}),r.userData.worldBoundingBox={min:i.min.toArray(),max:i.max.toArray()}}}})}},{key:"loadSceneData",value:(h=a(i().m(function e(n){var r,t,a,o,u,s,l,v,f,d,h,m,y=this,w=arguments;return i().w(function(e){for(;;)switch(e.n){case 0:return r=!(w.length>1&&void 0!==w[1])||w[1],t=this.sceneViewer,e.p=1,a=function(e){e.traverse(function(e){if(e.userData&&e.userData.direction){var n=new c.Matrix4;n.copy(e.matrixWorld),e.userData.worldMatrixOriginal=n.elements}})},r&&(t.transformManager&&t.transformManager.transformControls,this.clearSceneObjects()),t.currentSceneData=n,o={},e.p=2,e.n=3,fetch("./library/component-dictionary.json");case 3:return u=e.v,e.n=4,u.json();case 4:o=e.v,e.n=6;break;case 5:e.p=5,e.v;case 6:return e.n=7,this.preloadMissingModels(n,o);case 7:return e.n=8,this.createSceneMaterials(n);case 8:if(s=e.v,l=s.materials,v=s.crosscubeTextureSet,f=this.createSceneGeometries(n,o),d=[],n.scene.object.children.forEach(function(e,n){var r,a,i,u=y.createSceneObject(e,f,l);t.scene.add(u),null!==(r=e.userData)&&void 0!==r&&r.libraryId&&o[null===(a=e.userData)||void 0===a?void 0:a.libraryId]&&d.push({basicObject:u,jsonData:e,componentData:o[null===(i=e.userData)||void 0===i?void 0:i.libraryId]})}),this.computeWorldBoundingBoxes(n),a(t.scene),h=[],d.forEach(function(e,n){var r=e.basicObject,t=e.jsonData,a=e.componentData,i=y.loadLibraryModel(r,t,a).then(function(e){return d[n].glbModel=e,e}).catch(function(e){return r});h.push(i)}),!(h.length>0)){e.n=10;break}return e.n=9,Promise.all(h);case 9:"undefined"!=typeof window&&(m=new CustomEvent("sceneUpdateComplete",{detail:{timestamp:Date.now()}}),window.dispatchEvent(m));case 10:if(d.forEach(function(e,n){e.basicObject;var r=e.jsonData,t=(e.componentData,e.glbModel);t.userData.associatedJsonObject=r;var a=(new c.Box3).setFromObject(t);r.type="Mesh",r.userData.worldBoundingBox.min=a.min.toArray(),r.userData.worldBoundingBox.max=a.max.toArray()}),n.scene.object.children.push({uuid:"GROUND",type:"Mesh",name:"Ground",layers:1,matrix:[1,0,0,0,0,0,-1,0,0,1,0,0,0,-.01,0,1],up:[0,1,0],userData:{worldBoundingBox:{min:[-30,-.01,-30],max:[30,-.01,30]}}}),!t.pathfindingManager){e.n=11;break}return e.n=11,t.pathfindingManager.initializePathfinder(n,v);case 11:t.currentSceneData=n,t.crosscubeTextureSet=v,r&&(t.transformManager&&t.transformManager.transformControls?t.transformManager.transformControls&&(t.transformManager.transformControls.visible=!1):t.initTransformControls(),t.ensureTransformControlsAttached(!1),t.transformManager&&t.transformManager.transformControls&&(t.keepTransformControlsInactive(),t.transformManager.transformControls.visible=!1)),e.n=13;break;case 12:e.p=12,e.v;case 13:return e.a(2)}},e,this,[[2,5],[1,12]])})),function(e){return h.apply(this,arguments)})},{key:"loadScene",value:(d=a(i().m(function e(){var n,r,t,a;return i().w(function(e){for(;;)switch(e.n){case 0:return n=this.sceneViewer,e.p=1,r=n.$config.defaultCentralPlantUrl,e.n=2,fetch(r);case 2:return t=e.v,e.n=3,t.json();case 3:return a=e.v,n.currentSceneData=a,e.n=4,this.loadSceneData(a,!1);case 4:e.n=6;break;case 5:e.p=5,e.v;case 6:return e.a(2)}},e,this,[[1,5]])})),function(){return d.apply(this,arguments)})},{key:"loadSceneFromData",value:(f=a(i().m(function e(n){return i().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,this.loadSceneData(n,!0);case 1:return e.a(2)}},e,this)})),function(e){return f.apply(this,arguments)})},{key:"createEmptyScene",value:function(){var e=this.sceneViewer;e.transformManager&&e.transformManager.transformControls&&e.disableTransformControls(),this.clearSceneObjects(),e.transformManager&&e.transformManager.transformControls&&(e.transformManager.setEnabled(!1),e.transformManager.transformControls.visible=!1,e.transformManager.selectedObject&&e.transformManager.deselectObject())}},{key:"clearModelCache",value:function(){var e=this.sceneViewer;e.modelCache&&e.modelCache.clear(),e.loadingPromises&&e.loadingPromises.clear()}},{key:"deselectObject",value:function(){var e=this.sceneViewer;e.transformManager&&e.transformManager.deselectObject(),e.selectedObjectForTransform=null}},{key:"setupEventListeners",value:function(){var e,n,r,t,o=this;this.sceneViewer;var u=this.loadSceneFromData.bind(this);null===(e=window.$nuxt)||void 0===e||null===(n=e.$on)||void 0===n||n.call(e,"loadNewScene",function(){var e=a(i().m(function e(n){return i().w(function(e){for(;;)switch(e.n){case 0:return e.n=1,u(n);case 1:return e.a(2)}},e)}));return function(n){return e.apply(this,arguments)}}()),null===(r=window.$nuxt)||void 0===r||null===(t=r.$on)||void 0===t||t.call(r,"createNewScene",function(){o.createEmptyScene()})}},{key:"updateSceneDataAfterTransform",value:function(e,r){var t,a,i=!1;if(this.sceneViewer.pathfindingManager.recomputeWorldBoundingBoxes(r),"gateway"===(null===(t=e.userData)||void 0===t?void 0:t.componentType)&&"computed"===(null===(a=e.userData)||void 0===a?void 0:a.origin)){var o;e.userData.origin="declared";for(var u=0;u<r.scene.object.children.length;u++){var s,l,v=r.scene.object.children[u];if(v.uuid===e.uuid||v.uuid===(null===(s=e.userData)||void 0===s?void 0:s.originalUuid)||e.uuid===(null===(l=v.userData)||void 0===l?void 0:l.originalUuid)){v.userData||(v.userData={}),v.userData.origin="declared";break}}if(null!==(o=e.userData)&&void 0!==o&&o.connections&&r.connections){var f=e.userData.connections,d=r.connections;f.removed&&Array.isArray(f.removed)&&(r.connections=d.filter(function(e){var n=f.removed.some(function(n){return n.from===e.from&&n.to===e.to||n.from===e.to&&n.to===e.from});return!n})),f.added&&Array.isArray(f.added)&&f.added.forEach(function(e){r.connections.some(function(n){return n.from===e.from&&n.to===e.to||n.from===e.to&&n.to===e.from})||r.connections.push(e)})}}for(var h=function(){var t,a,o,u,s=r.scene.object.children[m],l=!1;if(s.uuid!==e.uuid&&s.uuid!==(null===(t=e.userData)||void 0===t?void 0:t.originalUuid)&&e.uuid!==(null===(a=s.userData)||void 0===a?void 0:a.originalUuid)||(l=!0),!l&&null!==(o=e.userData)&&void 0!==o&&o.libraryId&&null!==(u=s.userData)&&void 0!==u&&u.libraryId&&e.userData.libraryId===s.userData.libraryId){if(s.position&&e.position){var v=Math.abs(e.position.x-s.position.x),f=Math.abs(e.position.y-s.position.y),d=Math.abs(e.position.z-s.position.z);v<1&&f<1&&d<1&&(l=!0)}}if(l){var h=(new c.Box3).setFromObject(e),y=function(e,r){return e&&r?e.map(function(e){var t=r.find(function(n){var r,t,a,i;if(n.uuid===e.uuid||n.uuid===(null===(r=e.userData)||void 0===r?void 0:r.originalUuid)||(null===(t=n.userData)||void 0===t?void 0:t.originalUuid)===e.uuid)return!0;if(null!==(a=n.userData)&&void 0!==a&&a.componentType&&null!==(i=e.userData)&&void 0!==i&&i.componentType&&n.userData.componentType===e.userData.componentType&&"connector"===n.userData.componentType){if(e.position&&n.position){var o=Math.abs(n.position.x-e.position.x),u=Math.abs(n.position.y-e.position.y),c=Math.abs(n.position.z-e.position.z);if(o<.1&&u<.1&&c<.1)return!0}}return!1});if(t&&t.isMesh){var a=(new c.Box3).setFromObject(t);return n(n({},e),{},{userData:n(n(n({},e.userData),t.userData),{},{worldBoundingBox:{min:a.min.toArray(),max:a.max.toArray()}}),children:e.children?y(e.children,t.children):e.children})}return n(n({},e),{},{children:e.children?y(e.children,r):e.children})}):e};return e.traverse(function(e){if(e.userData&&e.userData.direction&&e.userData.worldMatrixOriginal){e.updateMatrixWorld(!0);var n=new c.Matrix4;n.copy(e.matrixWorld);var r=new c.Matrix4;r.elements=e.userData.worldMatrixOriginal;var t=new c.Matrix4,a=new c.Matrix4;t.extractRotation(n),a.extractRotation(r);var i=new c.Matrix4;i.copy(t),i.multiply(a.invert());var o=(new c.Vector3).fromArray(e.userData.direction);o.applyMatrix4(i),o.normalize();o.x=Math.abs(o.x)>.5?Math.sign(o.x):0,o.y=Math.abs(o.y)>.5?Math.sign(o.y):0,o.z=Math.abs(o.z)>.5?Math.sign(o.z):0,e.userData.direction=o.toArray(),e.userData.worldMatrixOriginal=n.elements}}),r.scene.object.children[m]=n(n({},s),{},{matrix:e.matrix.elements,position:{x:e.position.x,y:e.position.y,z:e.position.z},rotation:{x:e.rotation.x,y:e.rotation.y,z:e.rotation.z},scale:{x:e.scale.x,y:e.scale.y,z:e.scale.z},userData:n(n({},s.userData),{},{worldBoundingBox:{min:h.min.toArray(),max:h.max.toArray()}}),children:s.children?y(s.children,e.children):s.children}),i=!0,1}},m=0;m<r.scene.object.children.length&&!h();m++);return!!i}}]);var f,d,h,m,y,w,k}();export{f as SceneOperationsManager};
1
+ import { createClass as _createClass, objectSpread2 as _objectSpread2, classCallCheck as _classCallCheck, createForOfIteratorHelper as _createForOfIteratorHelper, asyncToGenerator as _asyncToGenerator, regenerator as _regenerator, toConsumableArray as _toConsumableArray, slicedToArray as _slicedToArray } from '../../../_virtual/_rollupPluginBabelHelpers.js';
2
+ import * as THREE from 'three';
3
+ import { loadTextureSet } from '../environment/textureConfig.js';
4
+ import modelPreloader from '../../rendering/modelPreloader.js';
5
+ import { modelLogger } from '../../core/debugLogger.js';
6
+
7
+ var SceneOperationsManager = /*#__PURE__*/function () {
8
+ function SceneOperationsManager(sceneViewer) {
9
+ _classCallCheck(this, SceneOperationsManager);
10
+ this.sceneViewer = sceneViewer;
11
+ }
12
+
13
+ /**
14
+ * Clear scene objects while preserving base environment
15
+ */
16
+ return _createClass(SceneOperationsManager, [{
17
+ key: "clearSceneObjects",
18
+ value: function clearSceneObjects() {
19
+ var component = this.sceneViewer;
20
+ console.log('🧹 Starting scene clear operation...');
21
+
22
+ // First, deselect any currently selected object
23
+ this.deselectObject();
24
+
25
+ // Store reference to transform controls to ensure it's not removed
26
+ var transformControlsRef = null;
27
+ if (component.transformManager && component.transformManager.transformControls) {
28
+ // Explicitly disable transform controls before clearing
29
+ console.log('🔧 Disabling transform controls before scene clear');
30
+ component.transformManager.setEnabled(false);
31
+ component.transformManager.transformControls.visible = false;
32
+ transformControlsRef = component.transformManager.transformControls;
33
+ console.log('🔧 Stored reference to existing transform controls');
34
+ }
35
+ var objectsToRemove = [];
36
+ var transformControlsFound = 0;
37
+ var totalChildren = 0;
38
+ component.scene.traverse(function (child) {
39
+ var _child$userData, _child$userData2, _child$userData3, _child$userData4, _child$geometry;
40
+ totalChildren++;
41
+
42
+ // Check for transform controls using multiple detection methods
43
+ var isTransformControl = child === transformControlsRef || ((_child$userData = child.userData) === null || _child$userData === void 0 ? void 0 : _child$userData.isTransformControls) || child.isTransformControls || child.type && child.type.includes('TransformControls');
44
+ if (isTransformControl) {
45
+ transformControlsFound++;
46
+ console.log('🔧 Found transform controls, preserving:', child.constructor.uuid);
47
+ }
48
+
49
+ // Remove imported scene objects but preserve base ground, walls, lights, and transform controls
50
+ if (child !== component.scene && !((_child$userData2 = child.userData) !== null && _child$userData2 !== void 0 && _child$userData2.isBrickWall) && !((_child$userData3 = child.userData) !== null && _child$userData3 !== void 0 && _child$userData3.isBaseGround) && !((_child$userData4 = child.userData) !== null && _child$userData4 !== void 0 && _child$userData4.isBaseGrid) && !isTransformControl && !child.isLight && ((_child$geometry = child.geometry) === null || _child$geometry === void 0 ? void 0 : _child$geometry.type) !== 'PlaneGeometry') {
51
+ objectsToRemove.push(child);
52
+ }
53
+ });
54
+ console.log("\uD83D\uDCCA Scene analysis: ".concat(totalChildren, " total children, ").concat(transformControlsFound, " transform controls found, ").concat(objectsToRemove.length, " objects to remove"));
55
+ objectsToRemove.forEach(function (obj) {
56
+ component.scene.remove(obj);
57
+ if (obj.geometry) obj.geometry.dispose();
58
+ if (obj.material) {
59
+ if (Array.isArray(obj.material)) {
60
+ obj.material.forEach(function (mat) {
61
+ return mat.dispose();
62
+ });
63
+ } else {
64
+ obj.material.dispose();
65
+ }
66
+ }
67
+ });
68
+
69
+ // Clear any references to removed objects
70
+ component.selectedObjectForTransform = null;
71
+ if (component.transformHistory) {
72
+ component.transformHistory = [];
73
+ }
74
+
75
+ // Make sure transform controls exist after clearing
76
+ if (!component.transformManager || !component.transformManager.transformControls) {
77
+ console.log('🔧 Transform controls missing after scene clear, reinitializing...');
78
+ component.initTransformControls();
79
+ }
80
+
81
+ // Ensure transform controls are still properly attached after scene operations
82
+ this.ensureTransformControlsAttached(false);
83
+ console.log('✅ Scene clear operation completed');
84
+ }
85
+
86
+ /**
87
+ * Ensure transform controls remain properly attached after scene operations
88
+ */
89
+ }, {
90
+ key: "ensureTransformControlsAttached",
91
+ value: function ensureTransformControlsAttached() {
92
+ var allowVisible = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
93
+ var component = this.sceneViewer;
94
+
95
+ // Check if transform manager exists
96
+ if (!component.transformManager) {
97
+ console.log('🔧 No transform manager found, initializing transform controls...');
98
+ component.initTransformControls();
99
+ return;
100
+ }
101
+
102
+ // Check if transform controls exist in the manager
103
+ if (!component.transformManager.transformControls) {
104
+ console.log('🔧 Transform controls not found in manager, reinitializing...');
105
+ component.transformManager.createTransformControls();
106
+ component.transformManager.setupEventListeners();
107
+ console.log('✅ Transform controls recreated in manager');
108
+ return;
109
+ }
110
+
111
+ // Use the TransformControlsManager's built-in method for reattachment
112
+ var wasReattached = component.transformManager.ensureSceneAttachment(allowVisible);
113
+ if (wasReattached) {
114
+ console.log('🔧 Transform controls were reattached after scene operation');
115
+
116
+ // Override visibility based on allowVisible parameter
117
+ if (!allowVisible && component.transformManager.transformControls) {
118
+ component.transformManager.transformControls.visible = false;
119
+ console.log('🔧 Forcing transform controls to be invisible during load');
120
+ }
121
+ } else {
122
+ console.log('✓ Transform controls are properly attached');
123
+
124
+ // Still ensure visibility is set correctly even if not reattached
125
+ if (!allowVisible && component.transformManager.transformControls) {
126
+ component.transformManager.transformControls.visible = false;
127
+ console.log('🔧 Ensuring transform controls remain invisible during load');
128
+ }
129
+ }
130
+ }
131
+
132
+ /**
133
+ * Load GLB model for library objects
134
+ */
135
+ }, {
136
+ key: "loadLibraryModel",
137
+ value: (function () {
138
+ var _loadLibraryModel = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(targetMesh, jsonEntry, componentData) {
139
+ var component, _jsonEntry$userData, _jsonEntry$userData2, _jsonEntry$userData3, _jsonEntry$userData6, _jsonEntry$userData7, _jsonEntry$userData0, _jsonEntry$userData10, _jsonEntry$userData11, _jsonEntry$userData13, originalParent, originalPosition, originalQuaternion, originalScale, originalName, originalUuid, connectorChildren, gltfScene, preloaderStatus, _jsonEntry$userData4, _jsonEntry$userData5, gltf, libraryModel, _jsonEntry$userData8, _jsonEntry$userData9, _jsonEntry$userData1, _jsonEntry$userData12, _jsonEntry$userData14, _t, _t2;
140
+ return _regenerator().w(function (_context) {
141
+ while (1) switch (_context.n) {
142
+ case 0:
143
+ component = this.sceneViewer;
144
+ _context.p = 1;
145
+ modelLogger.info("Loading library GLB model for ".concat((_jsonEntry$userData = jsonEntry.userData) === null || _jsonEntry$userData === void 0 ? void 0 : _jsonEntry$userData.libraryId, "..."));
146
+ modelLogger.debug("Starting to load GLB model from /library/models/".concat(componentData.modelKey));
147
+
148
+ // Store parent reference BEFORE async operation to prevent it from becoming null
149
+ originalParent = targetMesh.parent;
150
+ originalPosition = targetMesh.position.clone();
151
+ originalQuaternion = targetMesh.quaternion.clone();
152
+ originalScale = targetMesh.scale.clone();
153
+ originalName = targetMesh.name;
154
+ originalUuid = targetMesh.uuid; // Store connector children before replacing the mesh
155
+ connectorChildren = [];
156
+ targetMesh.children.forEach(function (child) {
157
+ // More precise detection: check for CONNECTOR-GEO geometry
158
+ var isConnectorGeometry = child.geometry && (child.geometry.uuid === 'CONNECTOR-GEO' || child.geometry.type === 'SphereGeometry' && child.geometry.parameters);
159
+ var isConnectorByName = child.name && child.name.toLowerCase().includes('connector');
160
+ if (isConnectorGeometry && isConnectorByName) {
161
+ var _child$geometry2, _child$geometry3, _child$material, _child$material2;
162
+ console.log("\uD83D\uDD34 Found connector child to preserve:", {
163
+ name: child.name,
164
+ uuid: child.uuid,
165
+ geometryType: (_child$geometry2 = child.geometry) === null || _child$geometry2 === void 0 ? void 0 : _child$geometry2.type,
166
+ geometryUuid: (_child$geometry3 = child.geometry) === null || _child$geometry3 === void 0 ? void 0 : _child$geometry3.uuid,
167
+ materialUuid: (_child$material = child.material) === null || _child$material === void 0 ? void 0 : _child$material.uuid,
168
+ materialColor: (_child$material2 = child.material) === null || _child$material2 === void 0 || (_child$material2 = _child$material2.color) === null || _child$material2 === void 0 ? void 0 : _child$material2.getHex(),
169
+ hasUserData: !!child.userData,
170
+ userDataKeys: child.userData ? Object.keys(child.userData) : []
171
+ });
172
+
173
+ // Compute worldBoundingBox for connector BEFORE cloning
174
+ if (!child.userData) child.userData = {};
175
+
176
+ // Compute and store worldBoundingBox if not already present
177
+ if (!child.userData.worldBoundingBox) {
178
+ var boundingBox = new THREE.Box3().setFromObject(child);
179
+ child.userData.worldBoundingBox = {
180
+ min: boundingBox.min.toArray(),
181
+ max: boundingBox.max.toArray()
182
+ };
183
+ console.log("\uD83D\uDD34 Computed worldBoundingBox for connector ".concat(child.name, ":"), child.userData.worldBoundingBox);
184
+ }
185
+
186
+ // Clone the connector and preserve userData
187
+ var clonedConnector = child.clone();
188
+
189
+ // Preserve pathfinder-critical userData during cloning
190
+ if (child.userData) {
191
+ clonedConnector.userData = {};
192
+
193
+ // Deep copy worldBoundingBox if it exists
194
+ if (child.userData.worldBoundingBox) {
195
+ clonedConnector.userData.worldBoundingBox = {
196
+ min: _toConsumableArray(child.userData.worldBoundingBox.min),
197
+ max: _toConsumableArray(child.userData.worldBoundingBox.max)
198
+ };
199
+ console.log("\uD83D\uDD34 Preserved worldBoundingBox for connector ".concat(child.name, ":"), clonedConnector.userData.worldBoundingBox);
200
+ }
201
+
202
+ // Deep copy direction if it exists
203
+ if (child.userData.direction) {
204
+ clonedConnector.userData.direction = _toConsumableArray(child.userData.direction);
205
+ console.log("\uD83D\uDD34 Preserved direction for connector ".concat(child.name, ":"), clonedConnector.userData.direction);
206
+ }
207
+ // Copy other userData properties
208
+ for (var _i = 0, _Object$entries = Object.entries(child.userData); _i < _Object$entries.length; _i++) {
209
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
210
+ key = _Object$entries$_i[0],
211
+ value = _Object$entries$_i[1];
212
+ if (key !== 'worldBoundingBox' && key !== 'direction') {
213
+ clonedConnector.userData[key] = value;
214
+ }
215
+ }
216
+
217
+ // Preserve the hardcoded UUID from the original connector
218
+ clonedConnector.userData.originalUuid = child.uuid;
219
+ console.log("\uD83D\uDD27 Preserved hardcoded UUID for connector ".concat(child.name, ": ").concat(child.uuid));
220
+
221
+ // Ensure forExport is explicitly set for connectors if not already present
222
+ if (clonedConnector.userData.forExport === undefined) {
223
+ clonedConnector.userData.forExport = true;
224
+ console.log("\uD83D\uDD27 Set forExport=true for preserved connector ".concat(child.name));
225
+ }
226
+
227
+ // Ensure componentType is set for connectors
228
+ if (!clonedConnector.userData.componentType) {
229
+ if (child.name && child.name.toLowerCase().includes('connector')) {
230
+ clonedConnector.userData.componentType = 'connector';
231
+ } else if (child.name && child.name.toLowerCase().includes('gateway')) {
232
+ clonedConnector.userData.componentType = 'gateway';
233
+ }
234
+ console.log("\uD83D\uDD27 Set componentType for ".concat(child.name, ": ").concat(clonedConnector.userData.componentType));
235
+ }
236
+ }
237
+ connectorChildren.push(clonedConnector);
238
+ }
239
+ });
240
+ console.log('🔍 Stored mesh references before async loading:', {
241
+ uuid: originalUuid,
242
+ name: originalName,
243
+ libraryId: (_jsonEntry$userData2 = jsonEntry.userData) === null || _jsonEntry$userData2 === void 0 ? void 0 : _jsonEntry$userData2.libraryId,
244
+ modelKey: componentData.modelKey,
245
+ hasParent: !!originalParent,
246
+ parentType: (originalParent === null || originalParent === void 0 ? void 0 : originalParent.type) || 'null',
247
+ parentUuid: (originalParent === null || originalParent === void 0 ? void 0 : originalParent.uuid) || 'null'
248
+ });
249
+
250
+ // Try to get model from global preloader cache first with dimensions
251
+ gltfScene = modelPreloader.getCachedModelWithDimensions(componentData.modelKey, (_jsonEntry$userData3 = jsonEntry.userData) === null || _jsonEntry$userData3 === void 0 ? void 0 : _jsonEntry$userData3.libraryId);
252
+ if (!gltfScene) {
253
+ _context.n = 2;
254
+ break;
255
+ }
256
+ console.log("\uD83C\uDFAF Using preloaded model from global cache for ".concat(componentData.modelKey));
257
+ _context.n = 8;
258
+ break;
259
+ case 2:
260
+ console.log("\u26A0\uFE0F Model ".concat(componentData.modelKey, " not found in preloader cache, checking preloading status..."));
261
+
262
+ // Check if preloading is still in progress
263
+ preloaderStatus = modelPreloader.getStatus();
264
+ console.log("\uD83D\uDD0D Preloader status:", preloaderStatus);
265
+
266
+ // If preloading is still active, wait for it to complete
267
+ if (!preloaderStatus.isPreloading) {
268
+ _context.n = 6;
269
+ break;
270
+ }
271
+ console.log("\u23F3 Preloading still in progress, waiting for completion...");
272
+ _context.p = 3;
273
+ _context.n = 4;
274
+ return modelPreloader.preloadingPromise;
275
+ case 4:
276
+ console.log("\u2705 Preloading completed, retrying cache lookup...");
277
+
278
+ // Try cache again after preloading completes with dimensions
279
+ gltfScene = modelPreloader.getCachedModelWithDimensions(componentData.modelKey, (_jsonEntry$userData4 = jsonEntry.userData) === null || _jsonEntry$userData4 === void 0 ? void 0 : _jsonEntry$userData4.libraryId);
280
+ if (gltfScene) {
281
+ console.log("\uD83C\uDFAF Successfully retrieved ".concat(componentData.modelKey, " from cache after waiting"));
282
+ }
283
+ _context.n = 6;
284
+ break;
285
+ case 5:
286
+ _context.p = 5;
287
+ _t = _context.v;
288
+ console.warn("\u26A0\uFE0F Preloading failed:", _t);
289
+ case 6:
290
+ if (gltfScene) {
291
+ _context.n = 8;
292
+ break;
293
+ }
294
+ console.log("\u26A0\uFE0F Model ".concat(componentData.modelKey, " still not in cache, falling back to direct load"));
295
+
296
+ // Fallback to direct loading if not in preloader cache
297
+ _context.n = 7;
298
+ return new Promise(function (resolve, reject) {
299
+ component.gltfLoader.load("/library/models/".concat(componentData.modelKey), function (gltf) {
300
+ console.log("\u2705 GLB loaded directly: ".concat(componentData.modelKey));
301
+ resolve(gltf);
302
+ }, function (progress) {
303
+ return console.log("Loading ".concat(componentData.modelKey, ": ").concat((progress.loaded / progress.total * 100).toFixed(0), "%"));
304
+ }, function (error) {
305
+ console.error("\u274C GLB loading error for ".concat(componentData.modelKey, ":"), error);
306
+ reject(error);
307
+ });
308
+ });
309
+ case 7:
310
+ gltf = _context.v;
311
+ gltfScene = gltf.scene;
312
+
313
+ // Add dimensions to the directly loaded model
314
+ if ((_jsonEntry$userData5 = jsonEntry.userData) !== null && _jsonEntry$userData5 !== void 0 && _jsonEntry$userData5.libraryId) {
315
+ gltfScene = modelPreloader.addDimensionsToModel(gltfScene, jsonEntry.userData.libraryId);
316
+ }
317
+ case 8:
318
+ console.log("\u2705 ".concat((_jsonEntry$userData6 = jsonEntry.userData) === null || _jsonEntry$userData6 === void 0 ? void 0 : _jsonEntry$userData6.libraryId, " GLB model ready for use"));
319
+
320
+ // Clone the model for this instance (since getCachedModel already clones, we may not need to clone again)
321
+ libraryModel = gltfScene.isCachedClone ? gltfScene : gltfScene.clone(); // Apply same transform as the original mesh using stored values
322
+ libraryModel.uuid = originalUuid;
323
+ libraryModel.name = originalName;
324
+ libraryModel.quaternion.copy(originalQuaternion);
325
+ libraryModel.scale.copy(originalScale);
326
+
327
+ // Set userData with componentType for export filtering and hardcoded UUID preservation
328
+ if (!libraryModel.userData) {
329
+ libraryModel.userData = {};
330
+ }
331
+ libraryModel.userData.originalUuid = originalUuid; // Preserve hardcoded UUID
332
+ libraryModel.userData.componentType = 'component';
333
+ libraryModel.userData.libraryId = (_jsonEntry$userData7 = jsonEntry.userData) === null || _jsonEntry$userData7 === void 0 ? void 0 : _jsonEntry$userData7.libraryId;
334
+
335
+ // Add dimensions from component dictionary if available
336
+ if (componentData.boundingBox) {
337
+ libraryModel.userData.dimensions = {
338
+ x: componentData.boundingBox.x,
339
+ y: componentData.boundingBox.y,
340
+ z: componentData.boundingBox.z
341
+ };
342
+ console.log("\uD83D\uDCCF Added dimensions to GLB model userData for ".concat((_jsonEntry$userData8 = jsonEntry.userData) === null || _jsonEntry$userData8 === void 0 ? void 0 : _jsonEntry$userData8.libraryId, ":"), libraryModel.userData.dimensions);
343
+ }
344
+ if (componentData.adaptedBoundingBox) {
345
+ libraryModel.userData.adaptedBoundingBox = {
346
+ x: componentData.adaptedBoundingBox.x,
347
+ y: componentData.adaptedBoundingBox.y,
348
+ z: componentData.adaptedBoundingBox.z
349
+ };
350
+ console.log("\uD83D\uDCCF Added dimensions to GLB model userData for ".concat((_jsonEntry$userData9 = jsonEntry.userData) === null || _jsonEntry$userData9 === void 0 ? void 0 : _jsonEntry$userData9.libraryId, ":"), libraryModel.userData.adaptedBoundingBox);
351
+ }
352
+ console.log("\uD83D\uDD27 Set componentType to 'component' for ".concat((_jsonEntry$userData0 = jsonEntry.userData) === null || _jsonEntry$userData0 === void 0 ? void 0 : _jsonEntry$userData0.libraryId, " GLB model"));
353
+
354
+ // Apply explicit position and rotation from JSON data if available
355
+ if (jsonEntry.position && jsonEntry.rotation) {
356
+ console.log("\uD83D\uDD04 Applying ".concat((_jsonEntry$userData1 = jsonEntry.userData) === null || _jsonEntry$userData1 === void 0 ? void 0 : _jsonEntry$userData1.libraryId, " specific position and rotation from JSON"));
357
+
358
+ // Apply explicit position values from JSON
359
+ libraryModel.position.set(jsonEntry.position.x, jsonEntry.position.y, jsonEntry.position.z);
360
+ console.log("\u2705 Applied position from JSON: (".concat(jsonEntry.position.x, ", ").concat(jsonEntry.position.y, ", ").concat(jsonEntry.position.z, ")"));
361
+ libraryModel.rotation.set(THREE.MathUtils.degToRad(jsonEntry.rotation.x), THREE.MathUtils.degToRad(jsonEntry.rotation.y), THREE.MathUtils.degToRad(jsonEntry.rotation.z));
362
+ console.log("\u2705 Applied rotation from JSON: (".concat(jsonEntry.rotation.x, "\xB0, ").concat(jsonEntry.rotation.y, "\xB0, ").concat(jsonEntry.rotation.z, "\xB0)"));
363
+ } else {
364
+ // For objects without position/rotation in JSON, use the original position
365
+ libraryModel.position.copy(originalPosition);
366
+ console.log('⚠️ No position/rotation data in JSON, using original position only');
367
+ }
368
+
369
+ // Enable shadows for all meshes in the model
370
+ libraryModel.traverse(function (child) {
371
+ if (child.isMesh) {
372
+ child.castShadow = true;
373
+ child.receiveShadow = true;
374
+
375
+ // Apply similar material properties if needed
376
+ if (child.material) {
377
+ child.material.envMapIntensity = 1.0;
378
+ }
379
+ }
380
+ });
381
+
382
+ // Add preserved connector children to the GLB model
383
+ connectorChildren.forEach(function (connector) {
384
+ var _connector$userData, _connector$userData2, _connector$userData3, _connector$userData4;
385
+ console.log("\uD83D\uDD34 Adding preserved connector to GLB model:", {
386
+ name: connector.name,
387
+ uuid: connector.uuid,
388
+ hasUserData: !!connector.userData,
389
+ userDataKeys: connector.userData ? Object.keys(connector.userData) : [],
390
+ hasWorldBoundingBox: !!((_connector$userData = connector.userData) !== null && _connector$userData !== void 0 && _connector$userData.worldBoundingBox),
391
+ hasDirection: !!((_connector$userData2 = connector.userData) !== null && _connector$userData2 !== void 0 && _connector$userData2.direction),
392
+ worldBoundingBox: (_connector$userData3 = connector.userData) === null || _connector$userData3 === void 0 ? void 0 : _connector$userData3.worldBoundingBox,
393
+ direction: (_connector$userData4 = connector.userData) === null || _connector$userData4 === void 0 ? void 0 : _connector$userData4.direction
394
+ });
395
+ libraryModel.add(connector);
396
+ });
397
+
398
+ // VERIFICATION: Check that all added connectors have pathfinder data
399
+ console.log("\uD83D\uDD0D VERIFICATION: Checking GLB model ".concat((_jsonEntry$userData10 = jsonEntry.userData) === null || _jsonEntry$userData10 === void 0 ? void 0 : _jsonEntry$userData10.libraryId, " connectors for pathfinder data:"));
400
+ libraryModel.children.forEach(function (child, index) {
401
+ if (child.name && child.name.toLowerCase().includes('connector')) {
402
+ var _child$userData5, _child$userData6, _child$userData7, _child$userData8, _child$userData9;
403
+ console.log(" Connector ".concat(index, " (").concat(child.name, "):"), {
404
+ hasUserData: !!child.userData,
405
+ hasWorldBoundingBox: !!((_child$userData5 = child.userData) !== null && _child$userData5 !== void 0 && _child$userData5.worldBoundingBox),
406
+ hasDirection: !!((_child$userData6 = child.userData) !== null && _child$userData6 !== void 0 && _child$userData6.direction),
407
+ worldBoundingBox: (_child$userData7 = child.userData) === null || _child$userData7 === void 0 ? void 0 : _child$userData7.worldBoundingBox,
408
+ direction: (_child$userData8 = child.userData) === null || _child$userData8 === void 0 ? void 0 : _child$userData8.direction,
409
+ pathfinderReady: !!((_child$userData9 = child.userData) !== null && _child$userData9 !== void 0 && _child$userData9.worldBoundingBox) // Key indicator for pathfinder
410
+ });
411
+ }
412
+ });
413
+
414
+ // DEBUG: Log the structure of the GLB model for transform controls debugging
415
+ console.log("\uD83D\uDD0D GLB Model Structure for ".concat((_jsonEntry$userData11 = jsonEntry.userData) === null || _jsonEntry$userData11 === void 0 ? void 0 : _jsonEntry$userData11.libraryId, ":"), {
416
+ name: libraryModel.name,
417
+ type: libraryModel.type,
418
+ isMesh: libraryModel.isMesh,
419
+ isObject3D: libraryModel.isObject3D,
420
+ isGroup: libraryModel.isGroup,
421
+ childCount: libraryModel.children.length,
422
+ uuid: libraryModel.uuid
423
+ });
424
+ if (libraryModel.children.length > 0) {
425
+ console.log("\uD83D\uDD0D GLB Model children for ".concat((_jsonEntry$userData12 = jsonEntry.userData) === null || _jsonEntry$userData12 === void 0 ? void 0 : _jsonEntry$userData12.libraryId, ":"));
426
+ libraryModel.children.forEach(function (child, index) {
427
+ var _child$geometry4;
428
+ console.log(" Child ".concat(index, ":"), {
429
+ name: child.name,
430
+ type: child.type,
431
+ isMesh: child.isMesh,
432
+ isObject3D: child.isObject3D,
433
+ isGroup: child.isGroup,
434
+ hasGeometry: !!child.geometry,
435
+ geometryType: (_child$geometry4 = child.geometry) === null || _child$geometry4 === void 0 ? void 0 : _child$geometry4.type,
436
+ visible: child.visible
437
+ });
438
+ });
439
+ }
440
+
441
+ // Remove the original simple mesh and add the detailed GLB model
442
+ // Use stored parent reference instead of current targetMesh.parent
443
+ if (originalParent && originalParent.add && typeof originalParent.add === 'function') {
444
+ console.log('🔄 Replacing mesh in stored parent:', originalParent.type || 'Unknown');
445
+ originalParent.remove(targetMesh);
446
+ originalParent.add(libraryModel);
447
+ } else {
448
+ console.log('🔄 Replacing mesh directly in scene (no valid parent found)');
449
+ component.scene.remove(targetMesh);
450
+ component.scene.add(libraryModel);
451
+ }
452
+ console.log("\uD83C\uDF89 ".concat((_jsonEntry$userData13 = jsonEntry.userData) === null || _jsonEntry$userData13 === void 0 ? void 0 : _jsonEntry$userData13.libraryId, " GLB model successfully rendered in scene"));
453
+ return _context.a(2, libraryModel);
454
+ case 9:
455
+ _context.p = 9;
456
+ _t2 = _context.v;
457
+ console.error("\u274C Error loading ".concat((_jsonEntry$userData14 = jsonEntry.userData) === null || _jsonEntry$userData14 === void 0 ? void 0 : _jsonEntry$userData14.libraryId, " GLB model:"), _t2);
458
+ console.log('⚠️ Keeping original mesh as fallback');
459
+ return _context.a(2, targetMesh);
460
+ }
461
+ }, _callee, this, [[3, 5], [1, 9]]);
462
+ }));
463
+ function loadLibraryModel(_x, _x2, _x3) {
464
+ return _loadLibraryModel.apply(this, arguments);
465
+ }
466
+ return loadLibraryModel;
467
+ }()
468
+ /**
469
+ * Helper function to verify model preloader cache
470
+ */
471
+ )
472
+ }, {
473
+ key: "verifyModelPreloaderCache",
474
+ value: (function () {
475
+ var _verifyModelPreloaderCache = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
476
+ var preloaderStatus, _t3;
477
+ return _regenerator().w(function (_context2) {
478
+ while (1) switch (_context2.n) {
479
+ case 0:
480
+ console.log('🔍 Verifying model preloader cache state...');
481
+ preloaderStatus = modelPreloader.getStatus();
482
+ console.log('📊 Current preloader status:', preloaderStatus);
483
+
484
+ // If preloading is still in progress, wait for completion
485
+ if (!preloaderStatus.isPreloading) {
486
+ _context2.n = 4;
487
+ break;
488
+ }
489
+ console.log('⏳ Waiting for model preloading to complete...');
490
+ _context2.p = 1;
491
+ _context2.n = 2;
492
+ return modelPreloader.preloadingPromise;
493
+ case 2:
494
+ console.log('✅ Model preloading completed');
495
+ _context2.n = 4;
496
+ break;
497
+ case 3:
498
+ _context2.p = 3;
499
+ _t3 = _context2.v;
500
+ console.warn('⚠️ Model preloading failed, some models may load directly:', _t3);
501
+ case 4:
502
+ return _context2.a(2, preloaderStatus);
503
+ }
504
+ }, _callee2, null, [[1, 3]]);
505
+ }));
506
+ function verifyModelPreloaderCache() {
507
+ return _verifyModelPreloaderCache.apply(this, arguments);
508
+ }
509
+ return verifyModelPreloaderCache;
510
+ }()
511
+ /**
512
+ * Helper function to preload missing models for a scene
513
+ */
514
+ )
515
+ }, {
516
+ key: "preloadMissingModels",
517
+ value: (function () {
518
+ var _preloadMissingModels = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(data, componentDictionary) {
519
+ var requiredModels, preloaderStatus, cachedModels, missingModels, _iterator, _step, modelKey, _t4, _t5;
520
+ return _regenerator().w(function (_context3) {
521
+ while (1) switch (_context3.n) {
522
+ case 0:
523
+ requiredModels = new Set();
524
+ data.scene.object.children.forEach(function (child) {
525
+ var _child$userData0, _child$userData1;
526
+ if ((_child$userData0 = child.userData) !== null && _child$userData0 !== void 0 && _child$userData0.libraryId && componentDictionary[(_child$userData1 = child.userData) === null || _child$userData1 === void 0 ? void 0 : _child$userData1.libraryId]) {
527
+ var _child$userData10;
528
+ var modelKey = componentDictionary[(_child$userData10 = child.userData) === null || _child$userData10 === void 0 ? void 0 : _child$userData10.libraryId].modelKey;
529
+ if (modelKey) {
530
+ requiredModels.add(modelKey);
531
+ }
532
+ }
533
+ });
534
+ console.log('🔍 Required models for this scene:', Array.from(requiredModels));
535
+ _context3.n = 1;
536
+ return this.verifyModelPreloaderCache();
537
+ case 1:
538
+ preloaderStatus = _context3.v;
539
+ cachedModels = preloaderStatus.cachedModels;
540
+ missingModels = Array.from(requiredModels).filter(function (model) {
541
+ return !cachedModels.includes(model);
542
+ });
543
+ if (!(missingModels.length > 0)) {
544
+ _context3.n = 11;
545
+ break;
546
+ }
547
+ console.warn('⚠️ Some required models are not cached:', missingModels);
548
+ console.log('🔄 Attempting to preload missing models...');
549
+
550
+ // Preload missing models
551
+ _iterator = _createForOfIteratorHelper(missingModels);
552
+ _context3.p = 2;
553
+ _iterator.s();
554
+ case 3:
555
+ if ((_step = _iterator.n()).done) {
556
+ _context3.n = 8;
557
+ break;
558
+ }
559
+ modelKey = _step.value;
560
+ _context3.p = 4;
561
+ _context3.n = 5;
562
+ return modelPreloader.preloadSingleModel(modelKey);
563
+ case 5:
564
+ console.log("\u2705 Successfully preloaded missing model: ".concat(modelKey));
565
+ _context3.n = 7;
566
+ break;
567
+ case 6:
568
+ _context3.p = 6;
569
+ _t4 = _context3.v;
570
+ console.warn("\u274C Failed to preload missing model ".concat(modelKey, ":"), _t4);
571
+ case 7:
572
+ _context3.n = 3;
573
+ break;
574
+ case 8:
575
+ _context3.n = 10;
576
+ break;
577
+ case 9:
578
+ _context3.p = 9;
579
+ _t5 = _context3.v;
580
+ _iterator.e(_t5);
581
+ case 10:
582
+ _context3.p = 10;
583
+ _iterator.f();
584
+ return _context3.f(10);
585
+ case 11:
586
+ return _context3.a(2);
587
+ }
588
+ }, _callee3, this, [[4, 6], [2, 9, 10, 11]]);
589
+ }));
590
+ function preloadMissingModels(_x4, _x5) {
591
+ return _preloadMissingModels.apply(this, arguments);
592
+ }
593
+ return preloadMissingModels;
594
+ }()
595
+ /**
596
+ * Helper function to create materials with texture sets
597
+ */
598
+ )
599
+ }, {
600
+ key: "createSceneMaterials",
601
+ value: (function () {
602
+ var _createSceneMaterials = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4(data) {
603
+ var component, materials, crosscubeTextureSet, _t6, _t7;
604
+ return _regenerator().w(function (_context4) {
605
+ while (1) switch (_context4.n) {
606
+ case 0:
607
+ component = this.sceneViewer;
608
+ materials = {}; // Load texture set for crosscube materials
609
+ crosscubeTextureSet = null;
610
+ _context4.p = 1;
611
+ _context4.n = 2;
612
+ return loadTextureSet('light_metal', component.textureLoader);
613
+ case 2:
614
+ crosscubeTextureSet = _context4.v;
615
+ console.log('Successfully loaded light metallic texture set');
616
+ _context4.n = 7;
617
+ break;
618
+ case 3:
619
+ _context4.p = 3;
620
+ _t6 = _context4.v;
621
+ console.warn('Could not load metallic texture, trying fallback:', _t6);
622
+ _context4.p = 4;
623
+ _context4.n = 5;
624
+ return loadTextureSet('gravel_embedded_concrete', component.textureLoader);
625
+ case 5:
626
+ crosscubeTextureSet = _context4.v;
627
+ console.log('Using fallback texture set');
628
+ _context4.n = 7;
629
+ break;
630
+ case 6:
631
+ _context4.p = 6;
632
+ _t7 = _context4.v;
633
+ console.warn('Could not load any texture set, using plain materials:', _t7);
634
+ case 7:
635
+ return _context4.a(2, {
636
+ materials: materials,
637
+ crosscubeTextureSet: crosscubeTextureSet
638
+ });
639
+ }
640
+ }, _callee4, this, [[4, 6], [1, 3]]);
641
+ }));
642
+ function createSceneMaterials(_x6) {
643
+ return _createSceneMaterials.apply(this, arguments);
644
+ }
645
+ return createSceneMaterials;
646
+ }()
647
+ /**
648
+ * Helper function to create geometries from component library
649
+ */
650
+ )
651
+ }, {
652
+ key: "createSceneGeometries",
653
+ value: function createSceneGeometries(data, componentDictionary) {
654
+ var geometries = {};
655
+
656
+ // Create geometries based on component library bounding boxes instead of JSON scene.geometries
657
+ data.scene.object.children.forEach(function (child) {
658
+ var _child$userData11;
659
+ if ((_child$userData11 = child.userData) !== null && _child$userData11 !== void 0 && _child$userData11.libraryId && componentDictionary[child.userData.libraryId]) {
660
+ var component = componentDictionary[child.userData.libraryId];
661
+ var boundingBox = component.boundingBox;
662
+
663
+ // Create a box geometry based on the component's bounding box
664
+ var geometry = new THREE.BoxGeometry(boundingBox.x || 1, boundingBox.y || 1, boundingBox.z || 1);
665
+
666
+ // Use the child's geometry UUID as the key
667
+ geometries[child.geometry] = geometry;
668
+ console.log("\uD83D\uDCE6 Created placeholder geometry for ".concat(child.userData.libraryId, ":"), boundingBox);
669
+ } else {
670
+ // For non-library objects (connectors, gateways), create shared sphere geometry
671
+ var isConnectorOrGateway = child.uuid && (child.uuid.toLowerCase().includes('connector') || child.uuid.toLowerCase().includes('gateway'));
672
+ if (isConnectorOrGateway) {
673
+ geometries[child.geometry] = new THREE.SphereGeometry(0.1, 16, 16);
674
+ } else {
675
+ // Default fallback geometry
676
+ geometries[child.geometry] = new THREE.BoxGeometry(1, 1, 1);
677
+ }
678
+ }
679
+ });
680
+ return geometries;
681
+ }
682
+
683
+ /**
684
+ * Helper function to create object from scene data
685
+ */
686
+ }, {
687
+ key: "createSceneObject",
688
+ value: function createSceneObject(obj, geometries, materials) {
689
+ var _this = this;
690
+ // Get geometry from our generated geometries
691
+ var geometry = geometries[obj.geometry];
692
+
693
+ // Create a default material if none exists for this object
694
+ var material = materials[obj.material];
695
+ if (!material) {
696
+ material = new THREE.MeshPhysicalMaterial({
697
+ color: 0xC0C0C0,
698
+ roughness: 0.15,
699
+ metalness: 0.9,
700
+ emissive: 0x000000,
701
+ envMapIntensity: 1.5,
702
+ transparent: true,
703
+ opacity: 0.8
704
+ });
705
+ }
706
+ var mesh = new THREE.Mesh(geometry, material);
707
+
708
+ // ALWAYS use the hardcoded UUID from JSON, never let Three.js auto-generate
709
+ mesh.uuid = obj.uuid;
710
+ mesh.name = obj.name || obj.uuid; // Prefer original name, fallback to UUID
711
+
712
+ // Store the original hardcoded UUID in userData for reference
713
+ if (!mesh.userData) mesh.userData = {};
714
+ mesh.userData.originalUuid = obj.uuid;
715
+
716
+ // Copy userData from JSON object to Three.js mesh
717
+ if (obj.userData) {
718
+ mesh.userData = _objectSpread2({}, obj.userData);
719
+ // Ensure componentType is set if missing (backward compatibility)
720
+ if (!mesh.userData.componentType) {
721
+ if (mesh.userData.libraryId) {
722
+ mesh.userData.componentType = 'component';
723
+ } else if (obj.uuid && obj.uuid.toLowerCase().includes('connector')) {
724
+ mesh.userData.componentType = 'connector';
725
+ } else if (obj.uuid && obj.uuid.toLowerCase().includes('gateway')) {
726
+ mesh.userData.componentType = 'gateway';
727
+ }
728
+ }
729
+ }
730
+ if (mesh.isMesh) {
731
+ mesh.castShadow = true;
732
+ mesh.receiveShadow = true;
733
+ }
734
+
735
+ // Use direct position, rotation, and scale attributes instead of matrix
736
+ if (obj.position) {
737
+ mesh.position.set(obj.position.x || 0, obj.position.y || 0, obj.position.z || 0);
738
+ }
739
+ if (obj.rotation) {
740
+ // Convert degrees to radians if rotation values are in degrees (common in JSON exports)
741
+ var rotX = obj.rotation.x * (Math.PI / 180);
742
+ var rotY = obj.rotation.y * (Math.PI / 180);
743
+ var rotZ = obj.rotation.z * (Math.PI / 180);
744
+ mesh.rotation.set(rotX, rotY, rotZ);
745
+ }
746
+ if (obj.scale) {
747
+ mesh.scale.set(obj.scale.x || 1, obj.scale.y || 1, obj.scale.z || 1);
748
+ }
749
+ if (obj.children) {
750
+ obj.children.forEach(function (child) {
751
+ mesh.add(_this.createSceneObject(child, geometries, materials));
752
+ });
753
+ }
754
+ return mesh;
755
+ }
756
+
757
+ /**
758
+ * Helper function to compute world bounding boxes
759
+ */
760
+ }, {
761
+ key: "computeWorldBoundingBoxes",
762
+ value: function computeWorldBoundingBoxes(data) {
763
+ var component = this.sceneViewer;
764
+ component.scene.traverse(function (object) {
765
+ if (object.isMesh) {
766
+ // Find the corresponding JSON object
767
+ var jsonObject = null;
768
+ var _findJsonObject = function findJsonObject(children) {
769
+ var _iterator2 = _createForOfIteratorHelper(children),
770
+ _step2;
771
+ try {
772
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
773
+ var _object$userData, _child$userData12;
774
+ var child = _step2.value;
775
+ // Enhanced matching logic with hardcoded UUID priority
776
+
777
+ // Strategy 1: Direct hardcoded UUID match (HIGHEST PRIORITY)
778
+ if (child.uuid === object.uuid || child.uuid === ((_object$userData = object.userData) === null || _object$userData === void 0 ? void 0 : _object$userData.originalUuid) || object.uuid === ((_child$userData12 = child.userData) === null || _child$userData12 === void 0 ? void 0 : _child$userData12.originalUuid)) {
779
+ return child;
780
+ }
781
+
782
+ // Recursively search children
783
+ if (child.children) {
784
+ var found = _findJsonObject(child.children);
785
+ if (found) return found;
786
+ }
787
+ }
788
+ } catch (err) {
789
+ _iterator2.e(err);
790
+ } finally {
791
+ _iterator2.f();
792
+ }
793
+ return null;
794
+ };
795
+ jsonObject = _findJsonObject(data.scene.object.children);
796
+ if (jsonObject) {
797
+ // Compute world bounding box
798
+ var boundingBox = new THREE.Box3().setFromObject(object);
799
+
800
+ // Store in JSON userData for pathfinder
801
+ if (!jsonObject.userData) jsonObject.userData = {};
802
+ jsonObject.userData.worldBoundingBox = {
803
+ min: boundingBox.min.toArray(),
804
+ max: boundingBox.max.toArray()
805
+ };
806
+ console.log("Added world bounding box:", jsonObject.userData.worldBoundingBox);
807
+ }
808
+ }
809
+ });
810
+ }
811
+
812
+ /**
813
+ * Consolidated scene loading function
814
+ */
815
+ }, {
816
+ key: "loadSceneData",
817
+ value: (function () {
818
+ var _loadSceneData = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5(data) {
819
+ var _this2 = this;
820
+ var isImported,
821
+ component,
822
+ saveOriginalWorldMatrix,
823
+ componentDictionary,
824
+ dictResponse,
825
+ _yield$this$createSce,
826
+ materials,
827
+ crosscubeTextureSet,
828
+ geometries,
829
+ libraryObjectsToReplace,
830
+ glbLoadingPromises,
831
+ sceneCompleteEvent,
832
+ _args5 = arguments,
833
+ _t8,
834
+ _t9;
835
+ return _regenerator().w(function (_context5) {
836
+ while (1) switch (_context5.n) {
837
+ case 0:
838
+ isImported = _args5.length > 1 && _args5[1] !== undefined ? _args5[1] : true;
839
+ component = this.sceneViewer; // TODO: Loading scene should awlays clear the scene first
840
+ _context5.p = 1;
841
+ saveOriginalWorldMatrix = function saveOriginalWorldMatrix(scene) {
842
+ scene.traverse(function (object) {
843
+ if (object.userData && object.userData.direction) {
844
+ // Create a new matrix to store the original world matrix
845
+ var originalMatrix = new THREE.Matrix4();
846
+ originalMatrix.copy(object.matrixWorld);
847
+
848
+ // Store in userData
849
+ object.userData.worldMatrixOriginal = originalMatrix.elements;
850
+ }
851
+ });
852
+ };
853
+ console.log("Loading scene data (".concat(isImported ? 'imported' : 'default', ")..."));
854
+
855
+ // Manage transform controls for imported scenes
856
+ if (isImported) {
857
+ if (component.transformManager && component.transformManager.transformControls) {
858
+ console.log('🔒 Preemptively disabling transform controls during scene load');
859
+ // component.keepTransformControlsInactive()
860
+ }
861
+ this.clearSceneObjects();
862
+ }
863
+
864
+ // Store current scene data
865
+ component.currentSceneData = data;
866
+
867
+ // Load component dictionary for GLB model lookup
868
+ componentDictionary = {};
869
+ _context5.p = 2;
870
+ _context5.n = 3;
871
+ return fetch('./library/component-dictionary.json');
872
+ case 3:
873
+ dictResponse = _context5.v;
874
+ _context5.n = 4;
875
+ return dictResponse.json();
876
+ case 4:
877
+ componentDictionary = _context5.v;
878
+ console.log('✅ Component dictionary loaded:', componentDictionary);
879
+ _context5.n = 6;
880
+ break;
881
+ case 5:
882
+ _context5.p = 5;
883
+ _t8 = _context5.v;
884
+ console.warn('⚠️ Could not load component dictionary:', _t8);
885
+ case 6:
886
+ _context5.n = 7;
887
+ return this.preloadMissingModels(data, componentDictionary);
888
+ case 7:
889
+ _context5.n = 8;
890
+ return this.createSceneMaterials(data);
891
+ case 8:
892
+ _yield$this$createSce = _context5.v;
893
+ materials = _yield$this$createSce.materials;
894
+ crosscubeTextureSet = _yield$this$createSce.crosscubeTextureSet;
895
+ // Create geometries from component library instead of scene.geometries
896
+ geometries = this.createSceneGeometries(data, componentDictionary); // PHASE 1: Add basic scene objects first (for pathfinding)
897
+ console.log('🔍 PHASE 1: Creating basic scene objects for pathfinding. Total children:', data.scene.object.children.length);
898
+ libraryObjectsToReplace = [];
899
+ data.scene.object.children.forEach(function (child, index) {
900
+ var _child$userData13, _child$userData14;
901
+ console.log("\uD83D\uDD0D Processing child ".concat(index, ":"), child.uuid);
902
+ var createdObject = _this2.createSceneObject(child, geometries, materials);
903
+ component.scene.add(createdObject);
904
+
905
+ // Track objects that need GLB model replacement for later
906
+ if ((_child$userData13 = child.userData) !== null && _child$userData13 !== void 0 && _child$userData13.libraryId && componentDictionary[(_child$userData14 = child.userData) === null || _child$userData14 === void 0 ? void 0 : _child$userData14.libraryId]) {
907
+ var _child$userData15, _child$userData16;
908
+ console.log("\uD83D\uDCDD Marked ".concat((_child$userData15 = child.userData) === null || _child$userData15 === void 0 ? void 0 : _child$userData15.libraryId, " for GLB replacement after pathfinding"));
909
+ libraryObjectsToReplace.push({
910
+ basicObject: createdObject,
911
+ jsonData: child,
912
+ componentData: componentDictionary[(_child$userData16 = child.userData) === null || _child$userData16 === void 0 ? void 0 : _child$userData16.libraryId]
913
+ });
914
+ }
915
+ });
916
+
917
+ // PHASE 2: Compute world bounding boxes on basic objects
918
+ console.log('🔍 PHASE 2: Computing bounding boxes on basic objects for pathfinding');
919
+ this.computeWorldBoundingBoxes(data);
920
+ saveOriginalWorldMatrix(component.scene);
921
+
922
+ // PHASE 4: Now replace basic objects with detailed GLB models
923
+ console.log('🔍 PHASE 4: Starting GLB model replacements after pathfinding');
924
+ glbLoadingPromises = [];
925
+ libraryObjectsToReplace.forEach(function (_ref, index) {
926
+ var _jsonData$userData;
927
+ var basicObject = _ref.basicObject,
928
+ jsonData = _ref.jsonData,
929
+ componentData = _ref.componentData;
930
+ console.log("\uD83C\uDFAF Starting GLB model replacement for ".concat((_jsonData$userData = jsonData.userData) === null || _jsonData$userData === void 0 ? void 0 : _jsonData$userData.libraryId, "..."));
931
+ var glbPromise = _this2.loadLibraryModel(basicObject, jsonData, componentData).then(function (libraryModel) {
932
+ var _jsonData$userData2;
933
+ console.log("\uD83D\uDEB0 ".concat((_jsonData$userData2 = jsonData.userData) === null || _jsonData$userData2 === void 0 ? void 0 : _jsonData$userData2.libraryId, " GLB model successfully replaced"));
934
+ libraryObjectsToReplace[index].glbModel = libraryModel;
935
+ return libraryModel;
936
+ }).catch(function (error) {
937
+ var _jsonData$userData3;
938
+ console.error("Failed to load ".concat((_jsonData$userData3 = jsonData.userData) === null || _jsonData$userData3 === void 0 ? void 0 : _jsonData$userData3.libraryId, " GLB model:"), error);
939
+ return basicObject; // Return original object as fallback
940
+ });
941
+ glbLoadingPromises.push(glbPromise);
942
+ });
943
+
944
+ // Wait for all GLB models to load
945
+ if (!(glbLoadingPromises.length > 0)) {
946
+ _context5.n = 10;
947
+ break;
948
+ }
949
+ console.log("\u23F3 Waiting for ".concat(glbLoadingPromises.length, " GLB models to load..."));
950
+ _context5.n = 9;
951
+ return Promise.all(glbLoadingPromises);
952
+ case 9:
953
+ console.log('✅ All GLB models loaded after pathfinding');
954
+ if (typeof window !== 'undefined') {
955
+ // Also dispatch a general scene initialization complete event
956
+ console.log('📡 Dispatching sceneUpdateComplete event');
957
+ sceneCompleteEvent = new CustomEvent('sceneUpdateComplete', {
958
+ detail: {
959
+ timestamp: Date.now()
960
+ }
961
+ });
962
+ window.dispatchEvent(sceneCompleteEvent);
963
+ }
964
+ case 10:
965
+ console.log('Scene loaded successfully');
966
+ console.log('[loadSceneData] Scene loaded successfully', component.scene);
967
+ libraryObjectsToReplace.forEach(function (_ref2, index) {
968
+ var basicObject = _ref2.basicObject,
969
+ jsonData = _ref2.jsonData,
970
+ componentData = _ref2.componentData,
971
+ glbModel = _ref2.glbModel;
972
+ // Display name
973
+ console.log('[loadSceneData] name', jsonData.uuid);
974
+ console.log('[loadSceneData] basicObject', basicObject);
975
+ console.log('[loadSceneData] jsonData', jsonData);
976
+ console.log('[loadSceneData] componentData', componentData);
977
+ console.log('[loadSceneData] glbModel', glbModel);
978
+ glbModel.userData.associatedJsonObject = jsonData;
979
+
980
+ // Build worldBoundingBox from glbModel
981
+ var worldBoundingBox = new THREE.Box3().setFromObject(glbModel);
982
+ console.log('[loadSceneData] worldBoundingBox', worldBoundingBox);
983
+ jsonData.type = 'Mesh';
984
+
985
+ // Update jsonData.userData.worldBoundingBox as array of numbers
986
+ jsonData.userData.worldBoundingBox.min = worldBoundingBox.min.toArray();
987
+ jsonData.userData.worldBoundingBox.max = worldBoundingBox.max.toArray();
988
+ });
989
+ console.log('[loadSceneData] data', data);
990
+
991
+ // Add ground to the data
992
+ data.scene.object.children.push({
993
+ uuid: "GROUND",
994
+ type: "Mesh",
995
+ name: "Ground",
996
+ layers: 1,
997
+ matrix: [1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, -0.01, 0, 1],
998
+ up: [0, 1, 0],
999
+ userData: {
1000
+ worldBoundingBox: {
1001
+ min: [-30, -0.01, -30],
1002
+ max: [30, -0.01, 30]
1003
+ }
1004
+ }
1005
+ });
1006
+
1007
+ // PHASE 3: Initialize pathfinder and create paths BEFORE loading GLB models
1008
+ console.log('🔍 PHASE 3: Running pathfinder on basic scene geometry');
1009
+
1010
+ // Use pathfinding manager to handle pathfinding logic
1011
+ if (!component.pathfindingManager) {
1012
+ _context5.n = 11;
1013
+ break;
1014
+ }
1015
+ _context5.n = 11;
1016
+ return component.pathfindingManager.initializePathfinder(data, crosscubeTextureSet);
1017
+ case 11:
1018
+ console.log('✅ Pathfinding completed, pipes created');
1019
+ component.currentSceneData = data;
1020
+ component.crosscubeTextureSet = crosscubeTextureSet;
1021
+
1022
+ // Handle transform controls for imported scenes
1023
+ if (isImported) {
1024
+ // Ensure transform controls are properly initialized after scene load
1025
+ if (!component.transformManager || !component.transformManager.transformControls) {
1026
+ console.log('🔧 Re-initializing transform controls after scene load');
1027
+ component.initTransformControls();
1028
+ } else {
1029
+ // Keep transform controls invisible
1030
+ if (component.transformManager.transformControls) {
1031
+ component.transformManager.transformControls.visible = false;
1032
+ console.log('🔧 Making transform controls invisible after scene load');
1033
+ }
1034
+ }
1035
+
1036
+ // Ensure transform controls are still properly attached to the scene after import
1037
+ component.ensureTransformControlsAttached(false);
1038
+
1039
+ // Keep transform controls inactive after loading scene data
1040
+ if (component.transformManager && component.transformManager.transformControls) {
1041
+ console.log('🔧 Keeping transform controls inactive after scene data load');
1042
+ component.keepTransformControlsInactive();
1043
+ component.transformManager.transformControls.visible = false;
1044
+ console.log('🔒 Final verification: transform controls visibility forced to false');
1045
+ }
1046
+ }
1047
+ _context5.n = 13;
1048
+ break;
1049
+ case 12:
1050
+ _context5.p = 12;
1051
+ _t9 = _context5.v;
1052
+ console.error('Error loading scene data:', _t9);
1053
+ case 13:
1054
+ return _context5.a(2);
1055
+ }
1056
+ }, _callee5, this, [[2, 5], [1, 12]]);
1057
+ }));
1058
+ function loadSceneData(_x7) {
1059
+ return _loadSceneData.apply(this, arguments);
1060
+ }
1061
+ return loadSceneData;
1062
+ }()
1063
+ /**
1064
+ * Load default scene
1065
+ */
1066
+ )
1067
+ }, {
1068
+ key: "loadScene",
1069
+ value: (function () {
1070
+ var _loadScene = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6() {
1071
+ var component, defaultCentralPlantUrl, response, data, _t0;
1072
+ return _regenerator().w(function (_context6) {
1073
+ while (1) switch (_context6.n) {
1074
+ case 0:
1075
+ component = this.sceneViewer;
1076
+ _context6.p = 1;
1077
+ defaultCentralPlantUrl = component.$config.defaultCentralPlantUrl;
1078
+ _context6.n = 2;
1079
+ return fetch(defaultCentralPlantUrl);
1080
+ case 2:
1081
+ response = _context6.v;
1082
+ _context6.n = 3;
1083
+ return response.json();
1084
+ case 3:
1085
+ data = _context6.v;
1086
+ // Store current scene data even for default scene
1087
+ component.currentSceneData = data;
1088
+
1089
+ // Use the consolidated scene loading function
1090
+ _context6.n = 4;
1091
+ return this.loadSceneData(data, false);
1092
+ case 4:
1093
+ _context6.n = 6;
1094
+ break;
1095
+ case 5:
1096
+ _context6.p = 5;
1097
+ _t0 = _context6.v;
1098
+ console.error('Error loading default scene:', _t0);
1099
+ case 6:
1100
+ return _context6.a(2);
1101
+ }
1102
+ }, _callee6, this, [[1, 5]]);
1103
+ }));
1104
+ function loadScene() {
1105
+ return _loadScene.apply(this, arguments);
1106
+ }
1107
+ return loadScene;
1108
+ }()
1109
+ /**
1110
+ * Load scene from imported JSON data
1111
+ */
1112
+ )
1113
+ }, {
1114
+ key: "loadSceneFromData",
1115
+ value: (function () {
1116
+ var _loadSceneFromData = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee7(data) {
1117
+ return _regenerator().w(function (_context7) {
1118
+ while (1) switch (_context7.n) {
1119
+ case 0:
1120
+ _context7.n = 1;
1121
+ return this.loadSceneData(data, true);
1122
+ case 1:
1123
+ return _context7.a(2);
1124
+ }
1125
+ }, _callee7, this);
1126
+ }));
1127
+ function loadSceneFromData(_x8) {
1128
+ return _loadSceneFromData.apply(this, arguments);
1129
+ }
1130
+ return loadSceneFromData;
1131
+ }()
1132
+ /**
1133
+ * Create empty scene with just the base environment
1134
+ */
1135
+ )
1136
+ }, {
1137
+ key: "createEmptyScene",
1138
+ value: function createEmptyScene() {
1139
+ var component = this.sceneViewer;
1140
+ // Explicitly disable transform controls before clearing scene
1141
+ if (component.transformManager && component.transformManager.transformControls) {
1142
+ component.disableTransformControls();
1143
+ }
1144
+ this.clearSceneObjects();
1145
+
1146
+ // Make sure transform controls are fully disabled for empty scene
1147
+ if (component.transformManager && component.transformManager.transformControls) {
1148
+ // Double-check that transform controls are disabled and hidden
1149
+ component.transformManager.setEnabled(false);
1150
+ component.transformManager.transformControls.visible = false;
1151
+
1152
+ // Detach any selected object
1153
+ if (component.transformManager.selectedObject) {
1154
+ component.transformManager.deselectObject();
1155
+ }
1156
+ }
1157
+ console.log('Created new empty scene with hidden transform controls');
1158
+ }
1159
+
1160
+ /**
1161
+ * Clear the model cache to free up memory
1162
+ */
1163
+ }, {
1164
+ key: "clearModelCache",
1165
+ value: function clearModelCache() {
1166
+ var component = this.sceneViewer;
1167
+ console.log('🧹 Clearing GLB model cache...');
1168
+ if (component.modelCache) {
1169
+ component.modelCache.clear();
1170
+ }
1171
+ if (component.loadingPromises) {
1172
+ component.loadingPromises.clear();
1173
+ }
1174
+ console.log('✅ Model cache cleared');
1175
+ }
1176
+
1177
+ /**
1178
+ * Deselect currently selected object
1179
+ */
1180
+ }, {
1181
+ key: "deselectObject",
1182
+ value: function deselectObject() {
1183
+ var component = this.sceneViewer;
1184
+ if (component.transformManager) {
1185
+ component.transformManager.deselectObject();
1186
+ }
1187
+ component.selectedObjectForTransform = null;
1188
+ }
1189
+
1190
+ /**
1191
+ * Setup event listeners for scene loading
1192
+ */
1193
+ }, {
1194
+ key: "setupEventListeners",
1195
+ value: function setupEventListeners() {
1196
+ var _window$$nuxt,
1197
+ _window$$nuxt$$on,
1198
+ _window$$nuxt2,
1199
+ _window$$nuxt2$$on,
1200
+ _this3 = this;
1201
+ this.sceneViewer;
1202
+
1203
+ // Listen for new scene data loading - bind 'this' to ensure proper context
1204
+ var boundLoadSceneFromData = this.loadSceneFromData.bind(this);
1205
+
1206
+ // Listen for loading new scene data
1207
+ (_window$$nuxt = window.$nuxt) === null || _window$$nuxt === void 0 || (_window$$nuxt$$on = _window$$nuxt.$on) === null || _window$$nuxt$$on === void 0 || _window$$nuxt$$on.call(_window$$nuxt, 'loadNewScene', /*#__PURE__*/function () {
1208
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee8(newSceneData) {
1209
+ return _regenerator().w(function (_context8) {
1210
+ while (1) switch (_context8.n) {
1211
+ case 0:
1212
+ _context8.n = 1;
1213
+ return boundLoadSceneFromData(newSceneData);
1214
+ case 1:
1215
+ return _context8.a(2);
1216
+ }
1217
+ }, _callee8);
1218
+ }));
1219
+ return function (_x9) {
1220
+ return _ref3.apply(this, arguments);
1221
+ };
1222
+ }());
1223
+
1224
+ // Listen for creating new empty scene
1225
+ (_window$$nuxt2 = window.$nuxt) === null || _window$$nuxt2 === void 0 || (_window$$nuxt2$$on = _window$$nuxt2.$on) === null || _window$$nuxt2$$on === void 0 || _window$$nuxt2$$on.call(_window$$nuxt2, 'createNewScene', function () {
1226
+ _this3.createEmptyScene();
1227
+ });
1228
+ }
1229
+
1230
+ /**
1231
+ * Update scene data after object transform
1232
+ */
1233
+ }, {
1234
+ key: "updateSceneDataAfterTransform",
1235
+ value: function updateSceneDataAfterTransform(object, currentSceneData) {
1236
+ var _object$userData2, _object$userData3;
1237
+ var objectFound = false;
1238
+ console.log("onTransformEnd object.uuid:", object.uuid);
1239
+
1240
+ // Fix the bug of overlapping pipes connecting newly generated gateways
1241
+ this.sceneViewer.pathfindingManager.recomputeWorldBoundingBoxes(currentSceneData);
1242
+
1243
+ // Check if the object is a gateway and claim it as declared if origin is computed
1244
+ if (((_object$userData2 = object.userData) === null || _object$userData2 === void 0 ? void 0 : _object$userData2.componentType) === 'gateway' && ((_object$userData3 = object.userData) === null || _object$userData3 === void 0 ? void 0 : _object$userData3.origin) === 'computed') {
1245
+ var _object$userData5;
1246
+ console.log('🔧 Gateway with computed origin detected, claiming as declared:', object.uuid);
1247
+ object.userData.origin = 'declared';
1248
+
1249
+ // Also update the corresponding scene data object
1250
+ for (var i = 0; i < currentSceneData.scene.object.children.length; i++) {
1251
+ var _object$userData4, _child$userData17;
1252
+ var child = currentSceneData.scene.object.children[i];
1253
+ if (child.uuid === object.uuid || child.uuid === ((_object$userData4 = object.userData) === null || _object$userData4 === void 0 ? void 0 : _object$userData4.originalUuid) || object.uuid === ((_child$userData17 = child.userData) === null || _child$userData17 === void 0 ? void 0 : _child$userData17.originalUuid)) {
1254
+ if (!child.userData) child.userData = {};
1255
+ child.userData.origin = 'declared';
1256
+ break;
1257
+ }
1258
+ }
1259
+
1260
+ // Grab connections from the gateway's userData and filter removed/added connections
1261
+ if ((_object$userData5 = object.userData) !== null && _object$userData5 !== void 0 && _object$userData5.connections && currentSceneData.connections) {
1262
+ console.log('🔗 Processing gateway connections for filtering:', object.userData.connections);
1263
+ var gatewayConnections = object.userData.connections;
1264
+ var currentConnections = currentSceneData.connections;
1265
+
1266
+ // Filter out removed connections
1267
+ if (gatewayConnections.removed && Array.isArray(gatewayConnections.removed)) {
1268
+ console.log('🗑️ Filtering out removed connections:', gatewayConnections.removed);
1269
+ currentSceneData.connections = currentConnections.filter(function (connection) {
1270
+ var isRemoved = gatewayConnections.removed.some(function (removedConn) {
1271
+ return removedConn.from === connection.from && removedConn.to === connection.to || removedConn.from === connection.to && removedConn.to === connection.from;
1272
+ });
1273
+ if (isRemoved) {
1274
+ console.log("\uD83D\uDDD1\uFE0F Removed connection: ".concat(connection.from, " \u2192 ").concat(connection.to));
1275
+ }
1276
+ return !isRemoved;
1277
+ });
1278
+ }
1279
+
1280
+ // Add new connections
1281
+ if (gatewayConnections.added && Array.isArray(gatewayConnections.added)) {
1282
+ console.log('➕ Adding new connections:', gatewayConnections.added);
1283
+ gatewayConnections.added.forEach(function (newConnection) {
1284
+ // Check if connection already exists to avoid duplicates
1285
+ var alreadyExists = currentSceneData.connections.some(function (conn) {
1286
+ return conn.from === newConnection.from && conn.to === newConnection.to || conn.from === newConnection.to && conn.to === newConnection.from;
1287
+ });
1288
+ if (!alreadyExists) {
1289
+ currentSceneData.connections.push(newConnection);
1290
+ console.log("\u2795 Added new connection: ".concat(newConnection.from, " \u2192 ").concat(newConnection.to));
1291
+ } else {
1292
+ console.log("\u26A0\uFE0F Connection already exists, skipping: ".concat(newConnection.from, " \u2192 ").concat(newConnection.to));
1293
+ }
1294
+ });
1295
+ }
1296
+ console.log('✅ Gateway connections processing completed. Total connections:', currentSceneData.connections.length);
1297
+ }
1298
+ }
1299
+
1300
+ // Update the corresponding child in currentSceneData with the transformed object
1301
+ var _loop = function _loop() {
1302
+ var _object$userData6, _child$userData18, _object$userData7, _child$userData19;
1303
+ var child = currentSceneData.scene.object.children[_i2];
1304
+ console.log("onTransformEnd child.uuid:", child.uuid);
1305
+ // Enhanced matching logic with hardcoded UUID priority
1306
+ var isMatch = false;
1307
+
1308
+ // Strategy 1: Direct hardcoded UUID match (HIGHEST PRIORITY)
1309
+ if (child.uuid === object.uuid || child.uuid === ((_object$userData6 = object.userData) === null || _object$userData6 === void 0 ? void 0 : _object$userData6.originalUuid) || object.uuid === ((_child$userData18 = child.userData) === null || _child$userData18 === void 0 ? void 0 : _child$userData18.originalUuid)) {
1310
+ isMatch = true;
1311
+ console.log('🎯 Matched by hardcoded UUID');
1312
+ }
1313
+
1314
+ // Strategy 4: Component type and library ID match
1315
+ if (!isMatch && (_object$userData7 = object.userData) !== null && _object$userData7 !== void 0 && _object$userData7.libraryId && (_child$userData19 = child.userData) !== null && _child$userData19 !== void 0 && _child$userData19.libraryId && object.userData.libraryId === child.userData.libraryId) {
1316
+ // For library components, also check position similarity
1317
+ var positionTolerance = 1.0; // Larger tolerance for main components
1318
+ if (child.position && object.position) {
1319
+ var dx = Math.abs(object.position.x - child.position.x);
1320
+ var dy = Math.abs(object.position.y - child.position.y);
1321
+ var dz = Math.abs(object.position.z - child.position.z);
1322
+ if (dx < positionTolerance && dy < positionTolerance && dz < positionTolerance) {
1323
+ isMatch = true;
1324
+ console.log('🎯 Matched by library ID and position similarity');
1325
+ }
1326
+ }
1327
+ }
1328
+ if (isMatch) {
1329
+ console.log('onTransformEnd found matching object:', 'UUID:', child.uuid);
1330
+
1331
+ // Also update the world bounding box directly from the transformed Three.js object
1332
+ var boundingBox = new THREE.Box3().setFromObject(object);
1333
+
1334
+ // Helper function to update children's world bounding boxes recursively
1335
+ var _updateChildrenBoundingBoxes = function updateChildrenBoundingBoxes(sceneDataChildren, threeJSChildren) {
1336
+ if (!sceneDataChildren || !threeJSChildren) return sceneDataChildren;
1337
+ return sceneDataChildren.map(function (sceneChild) {
1338
+ // Enhanced matching logic with hardcoded UUID priority
1339
+ var matchingThreeChild = threeJSChildren.find(function (threeChild) {
1340
+ var _sceneChild$userData, _threeChild$userData, _threeChild$userData2, _sceneChild$userData2;
1341
+ // Strategy 1: Direct hardcoded UUID match (HIGHEST PRIORITY)
1342
+ if (threeChild.uuid === sceneChild.uuid || threeChild.uuid === ((_sceneChild$userData = sceneChild.userData) === null || _sceneChild$userData === void 0 ? void 0 : _sceneChild$userData.originalUuid) || ((_threeChild$userData = threeChild.userData) === null || _threeChild$userData === void 0 ? void 0 : _threeChild$userData.originalUuid) === sceneChild.uuid) {
1343
+ return true;
1344
+ }
1345
+
1346
+ // Strategy 4: Component type and position match (for connectors)
1347
+ if ((_threeChild$userData2 = threeChild.userData) !== null && _threeChild$userData2 !== void 0 && _threeChild$userData2.componentType && (_sceneChild$userData2 = sceneChild.userData) !== null && _sceneChild$userData2 !== void 0 && _sceneChild$userData2.componentType && threeChild.userData.componentType === sceneChild.userData.componentType && threeChild.userData.componentType === 'connector') {
1348
+ // For connectors, also check position similarity (within tolerance)
1349
+ var _positionTolerance = 0.1;
1350
+ if (sceneChild.position && threeChild.position) {
1351
+ var _dx = Math.abs(threeChild.position.x - sceneChild.position.x);
1352
+ var _dy = Math.abs(threeChild.position.y - sceneChild.position.y);
1353
+ var _dz = Math.abs(threeChild.position.z - sceneChild.position.z);
1354
+ if (_dx < _positionTolerance && _dy < _positionTolerance && _dz < _positionTolerance) {
1355
+ return true;
1356
+ }
1357
+ }
1358
+ }
1359
+ return false;
1360
+ });
1361
+ if (matchingThreeChild && matchingThreeChild.isMesh) {
1362
+ // Calculate world bounding box for this child
1363
+ var childBoundingBox = new THREE.Box3().setFromObject(matchingThreeChild);
1364
+ console.log("\uD83D\uDD04 Updated bounding box for child: ".concat(sceneChild.uuid));
1365
+ return _objectSpread2(_objectSpread2({}, sceneChild), {}, {
1366
+ userData: _objectSpread2(_objectSpread2(_objectSpread2({}, sceneChild.userData), matchingThreeChild.userData), {}, {
1367
+ worldBoundingBox: {
1368
+ min: childBoundingBox.min.toArray(),
1369
+ max: childBoundingBox.max.toArray()
1370
+ }
1371
+ }),
1372
+ // Recursively update nested children if they exist
1373
+ children: sceneChild.children ? _updateChildrenBoundingBoxes(sceneChild.children, matchingThreeChild.children) : sceneChild.children
1374
+ });
1375
+ }
1376
+
1377
+ // If no matching Three.js object found, recurse into children anyway
1378
+ console.log("\u26A0\uFE0F No matching Three.js object found for scene child: (UUID: ".concat(sceneChild.uuid, ")"));
1379
+ return _objectSpread2(_objectSpread2({}, sceneChild), {}, {
1380
+ children: sceneChild.children ? _updateChildrenBoundingBoxes(sceneChild.children, threeJSChildren) : sceneChild.children
1381
+ });
1382
+ });
1383
+ };
1384
+ object.traverse(function (child) {
1385
+ if (child.userData && child.userData.direction && child.userData.worldMatrixOriginal) {
1386
+ // Get current world matrix
1387
+ child.updateMatrixWorld(true);
1388
+ var currentMatrix = new THREE.Matrix4();
1389
+ currentMatrix.copy(child.matrixWorld);
1390
+
1391
+ // Get original world matrix
1392
+ var originalMatrix = new THREE.Matrix4();
1393
+ originalMatrix.elements = child.userData.worldMatrixOriginal;
1394
+ console.log('onTransformEnd currentMatrix', currentMatrix);
1395
+ console.log('onTransformEnd originalMatrix', originalMatrix);
1396
+
1397
+ // Extract rotation matrices
1398
+ var currentRotation = new THREE.Matrix4();
1399
+ var originalRotation = new THREE.Matrix4();
1400
+ currentRotation.extractRotation(currentMatrix);
1401
+ originalRotation.extractRotation(originalMatrix);
1402
+
1403
+ // Calculate the rotational difference matrix
1404
+ var rotationDifference = new THREE.Matrix4();
1405
+ rotationDifference.copy(currentRotation);
1406
+ rotationDifference.multiply(originalRotation.invert());
1407
+
1408
+ // Create direction vector from array
1409
+ var directionVector = new THREE.Vector3().fromArray(child.userData.direction);
1410
+
1411
+ // Apply only the rotational difference to the direction vector
1412
+ directionVector.applyMatrix4(rotationDifference);
1413
+
1414
+ // Ensure the vector remains orthogonal and has only 0 or 1 components
1415
+ directionVector.normalize();
1416
+ console.log('onTransformEnd directionVector', directionVector);
1417
+
1418
+ // Round components to either 0 or 1
1419
+ var threshold = 0.5;
1420
+ directionVector.x = Math.abs(directionVector.x) > threshold ? Math.sign(directionVector.x) : 0;
1421
+ directionVector.y = Math.abs(directionVector.y) > threshold ? Math.sign(directionVector.y) : 0;
1422
+ directionVector.z = Math.abs(directionVector.z) > threshold ? Math.sign(directionVector.z) : 0;
1423
+
1424
+ // Update the direction in userData
1425
+ child.userData.direction = directionVector.toArray();
1426
+
1427
+ // Update the original world matrix for next transformation
1428
+ child.userData.worldMatrixOriginal = currentMatrix.elements;
1429
+ console.log('Updated direction:', {
1430
+ name: child.name,
1431
+ uuid: child.uuid,
1432
+ originalDirection: child.userData.direction,
1433
+ newDirection: directionVector.toArray(),
1434
+ rotationDifference: rotationDifference.elements
1435
+ });
1436
+ }
1437
+ });
1438
+
1439
+ // Update the main object and its children
1440
+ currentSceneData.scene.object.children[_i2] = _objectSpread2(_objectSpread2({}, child), {}, {
1441
+ matrix: object.matrix.elements,
1442
+ position: {
1443
+ x: object.position.x,
1444
+ y: object.position.y,
1445
+ z: object.position.z
1446
+ },
1447
+ rotation: {
1448
+ x: object.rotation.x,
1449
+ y: object.rotation.y,
1450
+ z: object.rotation.z
1451
+ },
1452
+ scale: {
1453
+ x: object.scale.x,
1454
+ y: object.scale.y,
1455
+ z: object.scale.z
1456
+ },
1457
+ userData: _objectSpread2(_objectSpread2({}, child.userData), {}, {
1458
+ worldBoundingBox: {
1459
+ min: boundingBox.min.toArray(),
1460
+ max: boundingBox.max.toArray()
1461
+ }
1462
+ }),
1463
+ // Update children's bounding boxes if they exist
1464
+ children: child.children ? _updateChildrenBoundingBoxes(child.children, object.children) : child.children
1465
+ });
1466
+ console.log('onTransformEnd updated child at index:', _i2, 'and its children');
1467
+ objectFound = true;
1468
+ return 1; // break
1469
+ // Exit loop once we find the match
1470
+ }
1471
+ };
1472
+ for (var _i2 = 0; _i2 < currentSceneData.scene.object.children.length; _i2++) {
1473
+ if (_loop()) break;
1474
+ }
1475
+ if (!objectFound) {
1476
+ console.warn('⚠️ Could not find matching object in scene data for:', object.uuid);
1477
+ return false; // Don't proceed with pathfinding if we couldn't update the data
1478
+ }
1479
+ console.log('onTransformEnd worldBoundBox after:', JSON.parse(JSON.stringify(currentSceneData.scene.object.children[2].children[0].userData.worldBoundingBox)));
1480
+ return true;
1481
+ }
1482
+ }]);
1483
+ }();
1484
+
1485
+ export { SceneOperationsManager };