@2112-lab/central-plant 0.1.4 → 0.1.5

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 (87) hide show
  1. package/dist/cjs/_virtual/_rollupPluginBabelHelpers.js +432 -1
  2. package/dist/cjs/node_modules/@2112-lab/pathfinder/dist/index.esm.js +1448 -1
  3. package/dist/cjs/node_modules/three/examples/jsm/controls/OrbitControls.js +1853 -1
  4. package/dist/cjs/node_modules/three/examples/jsm/exporters/GLTFExporter.js +3537 -1
  5. package/dist/cjs/node_modules/three/examples/jsm/exporters/OBJExporter.js +305 -1
  6. package/dist/cjs/node_modules/three/examples/jsm/exporters/PLYExporter.js +542 -1
  7. package/dist/cjs/node_modules/three/examples/jsm/exporters/STLExporter.js +218 -1
  8. package/dist/cjs/node_modules/three/examples/jsm/loaders/DRACOLoader.js +683 -1
  9. package/dist/cjs/node_modules/three/examples/jsm/loaders/GLTFLoader.js +4811 -1
  10. package/dist/cjs/node_modules/three/examples/jsm/loaders/RGBELoader.js +480 -1
  11. package/dist/cjs/node_modules/three/examples/jsm/renderers/CSS2DRenderer.js +309 -1
  12. package/dist/cjs/node_modules/three/examples/jsm/utils/BufferGeometryUtils.js +120 -1
  13. package/dist/cjs/src/analysis/analysis.js +560 -1
  14. package/dist/cjs/src/analysis/testing.js +958 -1
  15. package/dist/cjs/src/core/centralPlant.js +1149 -1
  16. package/dist/cjs/src/core/debugLogger.js +175 -1
  17. package/dist/cjs/src/core/mathUtils.js +574 -1
  18. package/dist/cjs/src/core/nameUtils.js +93 -1
  19. package/dist/cjs/src/data/export.js +716 -1
  20. package/dist/cjs/src/data/import.js +380 -1
  21. package/dist/cjs/src/data/numerics.js +522 -1
  22. package/dist/cjs/src/helpers/sceneHelper.js +572 -1
  23. package/dist/cjs/src/index.js +69 -1
  24. package/dist/cjs/src/managers/components/animationManager.js +123 -1
  25. package/dist/cjs/src/managers/components/componentManager.js +332 -1
  26. package/dist/cjs/src/managers/components/pathfindingManager.js +1441 -1
  27. package/dist/cjs/src/managers/controls/TransformControls.js +1063 -1
  28. package/dist/cjs/src/managers/controls/cameraControlsManager.js +79 -1
  29. package/dist/cjs/src/managers/controls/dragDropManager.js +1026 -1
  30. package/dist/cjs/src/managers/controls/keyboardControlsManager.js +395 -1
  31. package/dist/cjs/src/managers/controls/transformControlsManager.js +1807 -1
  32. package/dist/cjs/src/managers/environment/environmentManager.js +714 -1
  33. package/dist/cjs/src/managers/environment/textureConfig.js +229 -1
  34. package/dist/cjs/src/managers/scene/sceneExportManager.js +264 -1
  35. package/dist/cjs/src/managers/scene/sceneInitializationManager.js +346 -1
  36. package/dist/cjs/src/managers/scene/sceneOperationsManager.js +1509 -1
  37. package/dist/cjs/src/managers/scene/sceneTooltipsManager.js +661 -1
  38. package/dist/cjs/src/managers/system/disposalManager.js +444 -1
  39. package/dist/cjs/src/managers/system/hotReloadManager.js +291 -1
  40. package/dist/cjs/src/managers/system/performanceMonitor.js +863 -1
  41. package/dist/cjs/src/rendering/modelPreloader.js +369 -1
  42. package/dist/cjs/src/rendering/rendering2D.js +631 -1
  43. package/dist/cjs/src/rendering/rendering3D.js +685 -1
  44. package/dist/esm/_virtual/_rollupPluginBabelHelpers.js +396 -1
  45. package/dist/esm/node_modules/@2112-lab/pathfinder/dist/index.esm.js +1444 -1
  46. package/dist/esm/node_modules/three/examples/jsm/controls/OrbitControls.js +1849 -1
  47. package/dist/esm/node_modules/three/examples/jsm/exporters/GLTFExporter.js +3533 -1
  48. package/dist/esm/node_modules/three/examples/jsm/exporters/OBJExporter.js +301 -1
  49. package/dist/esm/node_modules/three/examples/jsm/exporters/PLYExporter.js +538 -1
  50. package/dist/esm/node_modules/three/examples/jsm/exporters/STLExporter.js +214 -1
  51. package/dist/esm/node_modules/three/examples/jsm/loaders/DRACOLoader.js +679 -1
  52. package/dist/esm/node_modules/three/examples/jsm/loaders/GLTFLoader.js +4807 -1
  53. package/dist/esm/node_modules/three/examples/jsm/loaders/RGBELoader.js +476 -1
  54. package/dist/esm/node_modules/three/examples/jsm/renderers/CSS2DRenderer.js +304 -1
  55. package/dist/esm/node_modules/three/examples/jsm/utils/BufferGeometryUtils.js +116 -1
  56. package/dist/esm/src/analysis/analysis.js +536 -1
  57. package/dist/esm/src/analysis/testing.js +954 -1
  58. package/dist/esm/src/core/centralPlant.js +1144 -1
  59. package/dist/esm/src/core/debugLogger.js +167 -1
  60. package/dist/esm/src/core/mathUtils.js +570 -1
  61. package/dist/esm/src/core/nameUtils.js +87 -1
  62. package/dist/esm/src/data/export.js +712 -1
  63. package/dist/esm/src/data/import.js +356 -1
  64. package/dist/esm/src/data/numerics.js +518 -1
  65. package/dist/esm/src/helpers/sceneHelper.js +547 -1
  66. package/dist/esm/src/index.js +35 -1
  67. package/dist/esm/src/managers/components/animationManager.js +119 -1
  68. package/dist/esm/src/managers/components/componentManager.js +328 -1
  69. package/dist/esm/src/managers/components/pathfindingManager.js +1417 -1
  70. package/dist/esm/src/managers/controls/TransformControls.js +1057 -1
  71. package/dist/esm/src/managers/controls/cameraControlsManager.js +75 -1
  72. package/dist/esm/src/managers/controls/dragDropManager.js +1002 -1
  73. package/dist/esm/src/managers/controls/keyboardControlsManager.js +371 -1
  74. package/dist/esm/src/managers/controls/transformControlsManager.js +1782 -1
  75. package/dist/esm/src/managers/environment/environmentManager.js +690 -1
  76. package/dist/esm/src/managers/environment/textureConfig.js +202 -1
  77. package/dist/esm/src/managers/scene/sceneExportManager.js +260 -1
  78. package/dist/esm/src/managers/scene/sceneInitializationManager.js +322 -1
  79. package/dist/esm/src/managers/scene/sceneOperationsManager.js +1485 -1
  80. package/dist/esm/src/managers/scene/sceneTooltipsManager.js +637 -1
  81. package/dist/esm/src/managers/system/disposalManager.js +440 -1
  82. package/dist/esm/src/managers/system/hotReloadManager.js +287 -1
  83. package/dist/esm/src/managers/system/performanceMonitor.js +858 -1
  84. package/dist/esm/src/rendering/modelPreloader.js +364 -1
  85. package/dist/esm/src/rendering/rendering2D.js +627 -1
  86. package/dist/esm/src/rendering/rendering3D.js +661 -1
  87. package/package.json +1 -1
@@ -1 +1,1026 @@
1
- "use strict";Object.defineProperty(exports,"t",{value:!0});var t=require("../../../_virtual/_rollupPluginBabelHelpers.js");function e(t){if(t&&t.t)return t;var e=Object.create(null);return t&&Object.keys(t).forEach(function(i){if("default"!==i){var n=Object.getOwnPropertyDescriptor(t,i);Object.defineProperty(e,i,n.get?n:{enumerable:!0,get:function(){return t[i]}})}}),e.default=t,Object.freeze(e)}var i=e(require("three")),n=function(){return t.createClass(function e(i){t.classCallCheck(this,e),this.scene=i.scene,this.camera=i.camera,this.transformManager=i.transformManager,this.modelPreloader=i.modelPreloader,this.componentManager=i.componentManager,this.currentDragComponentData=null,this.dragPreviewSize=null,this.isCreatingDragPreview=!1,this.dragPreviewMesh=null,this.dragPreviewBoundingBox=null,this.dragTargetPosition=null,this.isDragOverScene=!1,this.onComponentDragStart=this.onComponentDragStart.bind(this),this.onComponentDragEnd=this.onComponentDragEnd.bind(this),this.onDragEnter=this.onDragEnter.bind(this),this.onDragLeave=this.onDragLeave.bind(this),this.onDragOver=this.onDragOver.bind(this),this.onDrop=this.onDrop.bind(this)},[{key:"onComponentDragStart",value:(o=t.asyncToGenerator(t.regenerator().m(function e(i,n){return t.regenerator().w(function(t){for(;;)switch(t.n){case 0:return this.currentDragComponentData=i,t.n=1,this.calculateDragPreviewSize(i);case 1:return t.a(2,!0)}},e,this)})),function(t,e){return o.apply(this,arguments)})},{key:"onComponentDragEnd",value:function(){return this.currentDragComponentData=null,this.dragPreviewSize=null,this.isCreatingDragPreview=!1,this.clearDragPreview(),this.cleanupDragPreview(),this.dragTargetPosition=null,this.isDragOverScene=!1,!0}},{key:"onDragEnter",value:(u=t.asyncToGenerator(t.regenerator().m(function e(i,n){var r;return t.regenerator().w(function(t){for(;;)switch(t.n){case 0:if(i.preventDefault(),this.isDragOverScene=!0,!this.currentDragComponentData)try{(r=i.dataTransfer.getData("application/json"))&&(this.currentDragComponentData=JSON.parse(r))}catch(t){}if(this.dragPreviewSize||!this.currentDragComponentData){t.n=1;break}return t.n=1,this.calculateDragPreviewSize(this.currentDragComponentData);case 1:if(this.dragPreviewMesh||!this.currentDragComponentData||this.isCreatingDragPreview){t.n=4;break}return this.isCreatingDragPreview=!0,t.p=2,t.n=3,this.createDragPreview();case 3:return t.p=3,this.isCreatingDragPreview=!1,t.f(3);case 4:case 5:return t.a(2)}},e,this,[[2,,3,4]])})),function(t,e){return u.apply(this,arguments)})},{key:"onDragLeave",value:function(t,e){e.contains(t.relatedTarget)||(this.isDragOverScene=!1,this.clearDragPreview())}},{key:"onDragOver",value:(h=t.asyncToGenerator(t.regenerator().m(function e(i,n){var r,s,a,h;return t.regenerator().w(function(t){for(;;)switch(t.n){case 0:if(i.preventDefault(),i.dataTransfer.dropEffect="copy",this.currentDragComponentData){t.n=4;break}if(t.p=1,!(r=i.dataTransfer.getData("application/json"))){t.n=2;break}if(this.currentDragComponentData=JSON.parse(r),this.dragPreviewSize){t.n=2;break}return t.n=2,this.calculateDragPreviewSize(this.currentDragComponentData);case 2:t.n=4;break;case 3:t.p=3,t.v;case 4:if(!(s=this.calculateDropPosition(i,n))){t.n=6;break}return this.dragTargetPosition=s,t.n=5,this.updateDragPreview(s);case 5:this.dragPreviewMesh&&this.dragPreviewMesh.userData.isFallback&&(a=this.checkBoundingBoxOverlap(),h=a?16711680:65280,this.dragPreviewMesh.material.color.set(h));case 6:return t.a(2)}},e,this,[[1,3]])})),function(t,e){return h.apply(this,arguments)})},{key:"onDrop",value:(a=t.asyncToGenerator(t.regenerator().m(function e(i,n){var r,s,a,h,u,o,c=arguments;return t.regenerator().w(function(t){for(;;)switch(t.n){case 0:if(r=c.length>2&&void 0!==c[2]?c[2]:{},i.preventDefault(),this.isDragOverScene=!1,t.p=1,s=i.dataTransfer.getData("application/json")){t.n=2;break}return r.onPlacementCanceled&&r.onPlacementCanceled({reason:"invalid-data",message:"No component data found in drop event"}),t.a(2,!1);case 2:t.p=2,a=JSON.parse(s),t.n=4;break;case 3:return t.p=3,t.v,r.onPlacementCanceled&&r.onPlacementCanceled({reason:"parse-error",message:"Could not parse component data"}),t.a(2,!1);case 4:if(a&&a.libraryId&&a.modelKey){t.n=5;break}return r.onPlacementCanceled&&r.onPlacementCanceled({reason:"invalid-data",message:"Component data missing required fields"}),t.a(2,!1);case 5:if(h=this.calculateDropPosition(i,n)){t.n=6;break}return r.onPlacementCanceled&&r.onPlacementCanceled({reason:"position-error",message:"Could not calculate drop position",componentData:a}),t.a(2,!1);case 6:if(a.position={x:h.x,y:h.y,z:h.z},u=this.checkBoundingBoxOverlap(),o=!1,!u){t.n=7;break}return r.onPlacementCanceled&&r.onPlacementCanceled({reason:"overlap",componentData:a}),t.a(2,!1);case 7:if(!r.onAddComponent){t.n=9;break}return t.n=8,r.onAddComponent(a);case 8:o=t.v,t.n=11;break;case 9:if(!this.componentManager){t.n=11;break}return t.n=10,this.componentManager.addComponentToScene(a);case 10:o=t.v;case 11:return o&&r.onComponentAdded&&r.onComponentAdded({componentData:a,position:h}),t.a(2,o);case 12:return t.p=12,t.v,t.a(2,!1);case 13:return t.p=13,this.clearDragPreview(),this.cleanupDragPreview(),this.currentDragComponentData=null,this.dragPreviewSize=null,this.dragTargetPosition=null,this.isDragOverScene=!1,t.f(13);case 14:return t.a(2)}},e,this,[[2,3],[1,12,13,14]])})),function(t,e){return a.apply(this,arguments)})},{key:"calculateDropPosition",value:function(t,e){if(!this.camera||!e)return null;try{var n,r=e.getBoundingClientRect(),s=(t.clientX-r.left)/r.width*2-1,a=-(t.clientY-r.top)/r.height*2+1,h=new i.Raycaster;h.setFromCamera({x:s,y:a},this.camera);var u=1/((null===(n=this.transformManager)||void 0===n||null===(n=n.snapValues)||void 0===n?void 0:n.translation)||.5),o=null;if(this.scene.traverse(function(t){var e;t.isMesh&&null!==(e=t.userData)&&void 0!==e&&e.isBaseGround&&(o=t)}),o){var c=h.intersectObject(o,!1);if(c.length>0){var l=c[0];return{x:Math.round(l.point.x*u)/u,y:Math.max(0,l.point.y),z:Math.round(l.point.z*u)/u}}}var f=new i.Plane(new i.Vector3(0,1,0),0),v=new i.Vector3;return h.ray.intersectPlane(f,v)&&v?{x:Math.round(v.x*u)/u,y:0,z:Math.round(v.z*u)/u}:{x:0,y:0,z:0}}catch(t){}return null}},{key:"calculateDragPreviewSize",value:(s=t.asyncToGenerator(t.regenerator().m(function e(i){var n,r,s,a,h,u;return t.regenerator().w(function(t){for(;;)switch(t.n){case 0:return n=1,r=1,s=1,t.p=1,t.p=2,t.n=3,this.getModelBoundingBox(i);case 3:if(!(a=t.v)){t.n=4;break}n=a.width,r=a.height,s=a.depth,t.n=5;break;case 4:throw new Error("Could not get model bounding box");case 5:t.n=7;break;case 6:t.p=6,t.v,i.dimensions?(n=i.dimensions.width||i.dimensions.x||1,r=i.dimensions.height||i.dimensions.y||1,s=i.dimensions.depth||i.dimensions.z||1):i.boundingBox?(h=i.boundingBox).max&&h.min?(n=Math.abs(h.max.x-h.min.x)||1,r=Math.abs(h.max.y-h.min.y)||1,s=Math.abs(h.max.z-h.min.z)||1):void 0!==h.width&&void 0!==h.height&&void 0!==h.depth?(n=h.width||1,r=h.height||1,s=h.depth||1):"number"==typeof h.x&&"number"==typeof h.y&&"number"==typeof h.z&&(n=h.x||1,r=h.y||1,s=h.z||1):(u=i.type||"").toLowerCase().includes("chiller")?(n=2,r=2,s=2):u.toLowerCase().includes("pump")?(n=1,r=1,s=1):u.toLowerCase().includes("tower")?(n=3,r=4,s=3):(n=1,r=1,s=1);case 7:n=Math.max(n,.5),r=Math.max(r,.5),s=Math.max(s,.5),this.dragPreviewSize={width:n,height:r,depth:s},t.n=9;break;case 8:t.p=8,t.v,this.dragPreviewSize={width:1,height:1,depth:1};case 9:return t.a(2)}},e,this,[[2,6],[1,8]])})),function(t){return s.apply(this,arguments)})},{key:"getModelBoundingBox",value:(r=t.asyncToGenerator(t.regenerator().m(function e(n){var r,s,a,h,u,o,c;return t.regenerator().w(function(t){for(;;)switch(t.n){case 0:if(n.libraryId){t.n=1;break}return t.a(2,null);case 1:return t.p=1,s={},t.p=2,t.n=3,fetch("./library/component-dictionary.json");case 3:return a=t.v,t.n=4,a.json();case 4:s=t.v,t.n=6;break;case 5:return t.p=5,t.v,t.a(2,null);case 6:if((h=s[n.libraryId])&&h.modelKey){t.n=7;break}return t.a(2,null);case 7:if(u=null===(r=this.modelPreloader)||void 0===r?void 0:r.getCachedModel(h.modelKey)){t.n=8;break}return t.a(2,null);case 8:return o=(new i.Box3).setFromObject(u),c=o.getSize(new i.Vector3),t.a(2,{width:c.x,height:c.y,depth:c.z});case 9:return t.p=9,t.v,t.a(2,null)}},e,this,[[2,5],[1,9]])})),function(t){return r.apply(this,arguments)})},{key:"updateDragPreview",value:(n=t.asyncToGenerator(t.regenerator().m(function e(i){return t.regenerator().w(function(t){for(;;)switch(t.n){case 0:if(this.dragPreviewMesh||this.isCreatingDragPreview){t.n=3;break}return this.isCreatingDragPreview=!0,t.p=1,t.n=2,this.createDragPreview();case 2:return t.p=2,this.isCreatingDragPreview=!1,t.f(2);case 3:this.dragPreviewMesh&&i&&(this.dragPreviewMesh.position.set(i.x,i.y,i.z),this.dragPreviewMesh.visible=!0,this.dragPreviewBoundingBox&&(this.dragPreviewBoundingBox.position.set(i.x,i.y,i.z),this.dragPreviewBoundingBox.visible=!0));case 4:return t.a(2)}},e,this,[[1,,2,3]])})),function(t){return n.apply(this,arguments)})},{key:"createDragPreview",value:(e=t.asyncToGenerator(t.regenerator().m(function e(){var n,r,s,a,h,u,o,c,l;return t.regenerator().w(function(t){for(;;)switch(t.n){case 0:if(this.clearDragPreview(),this.scene&&this.currentDragComponentData){t.n=1;break}return t.a(2);case 1:return t.p=1,n={},t.p=2,t.n=3,fetch("./library/component-dictionary.json");case 3:return r=t.v,t.n=4,r.json();case 4:n=t.v,t.n=6;break;case 5:t.p=5,t.v;case 6:if(s=this.currentDragComponentData.libraryId,a=n[s],h=null,a&&a.modelKey&&this.modelPreloader)try{(u=this.modelPreloader.getCachedModel(a.modelKey))&&((h=u.clone()).traverse(function(t){t.isMesh&&(t.material=t.material.clone(),t.material.transparent=!0,t.material.opacity=.4,t.material.depthTest=!0,t.material.depthWrite=!0,t.material.needsUpdate=!0)}),h.userData.isPreview=!0)}catch(t){h=null}return h||(o=this.dragPreviewSize||{width:1,height:1,depth:1},c=new i.BoxGeometry(o.width,o.height,o.depth),l=new i.MeshBasicMaterial({color:65280,wireframe:!0,transparent:!0,opacity:.6}),(h=new i.Mesh(c,l)).userData.isFallback=!0,h.userData.isPreview=!0),this.scene.add(h),this.dragPreviewMesh=h,this.dragPreviewMesh.visible=!1,this.createBoundingBoxHelper(),t.a(2,!0);case 7:return t.p=7,t.v,t.a(2,!1)}},e,this,[[2,5],[1,7]])})),function(){return e.apply(this,arguments)})},{key:"createBoundingBoxHelper",value:function(){if(this.dragPreviewMesh){var t=(new i.Box3).setFromObject(this.dragPreviewMesh),e=t.getSize(new i.Vector3);t.getCenter(new i.Vector3);var n=new i.BoxGeometry(e.x,e.y,e.z),r=new i.LineBasicMaterial({color:16776960,transparent:!0,opacity:.3}),s=new i.EdgesGeometry(n),a=new i.LineSegments(s,r);a.position.copy(this.dragPreviewMesh.position),this.scene.add(a),this.dragPreviewBoundingBox=a,this.dragPreviewBoundingBox.visible=!1}}},{key:"checkBoundingBoxOverlap",value:function(){var t=this;if(!this.dragPreviewMesh||!this.scene)return!1;var e=(new i.Box3).setFromObject(this.dragPreviewMesh),n=[];this.scene.traverse(function(e){!e.isMesh||e===t.dragPreviewMesh||e===t.dragPreviewBoundingBox||e.userData.isBaseGround||e.userData.isBrickWall||e.userData.isBaseGrid||e.userData&&("component"===e.userData.componentType||"connector"===e.userData.componentType||"gateway"===e.userData.componentType)&&n.push(e)});for(var r=0,s=n;r<s.length;r++){var a=s[r],h=(new i.Box3).setFromObject(a);if(e.intersectsBox(h))return!0}return!1}},{key:"clearDragPreview",value:function(){this.dragPreviewMesh&&(this.dragPreviewMesh.visible=!1),this.dragPreviewBoundingBox&&(this.dragPreviewBoundingBox.visible=!1)}},{key:"cleanupDragPreview",value:function(){this.dragPreviewMesh&&(this.scene.remove(this.dragPreviewMesh),this.dragPreviewMesh.geometry&&this.dragPreviewMesh.geometry.dispose(),this.dragPreviewMesh.material&&(Array.isArray(this.dragPreviewMesh.material)?this.dragPreviewMesh.material.forEach(function(t){return t.dispose()}):this.dragPreviewMesh.material.dispose()),this.dragPreviewMesh=null),this.dragPreviewBoundingBox&&(this.scene.remove(this.dragPreviewBoundingBox),this.dragPreviewBoundingBox.geometry&&this.dragPreviewBoundingBox.geometry.dispose(),this.dragPreviewBoundingBox.material&&this.dragPreviewBoundingBox.material.dispose(),this.dragPreviewBoundingBox=null)}},{key:"dispose",value:function(){this.cleanupDragPreview(),this.currentDragComponentData=null,this.dragPreviewSize=null,this.isDragOverScene=!1,this.dragTargetPosition=null}},{key:"getDragState",value:function(){return{isDragging:!!this.currentDragComponentData,isDragOverScene:this.isDragOverScene,dragComponentData:this.currentDragComponentData,dragTargetPosition:this.dragTargetPosition}}}]);var e,n,r,s,a,h,u,o}();exports.default=n;
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _rollupPluginBabelHelpers = require('../../../_virtual/_rollupPluginBabelHelpers.js');
6
+ var THREE = require('three');
7
+
8
+ function _interopNamespace(e) {
9
+ if (e && e.__esModule) return e;
10
+ var n = Object.create(null);
11
+ if (e) {
12
+ Object.keys(e).forEach(function (k) {
13
+ if (k !== 'default') {
14
+ var d = Object.getOwnPropertyDescriptor(e, k);
15
+ Object.defineProperty(n, k, d.get ? d : {
16
+ enumerable: true,
17
+ get: function () { return e[k]; }
18
+ });
19
+ }
20
+ });
21
+ }
22
+ n["default"] = e;
23
+ return Object.freeze(n);
24
+ }
25
+
26
+ var THREE__namespace = /*#__PURE__*/_interopNamespace(THREE);
27
+
28
+ /**
29
+ * DragDropManager - Manages 3D drag and drop operations for scene components
30
+ */
31
+ var DragDropManager = /*#__PURE__*/function () {
32
+ function DragDropManager(params) {
33
+ _rollupPluginBabelHelpers.classCallCheck(this, DragDropManager);
34
+ // Store references to essential scene components
35
+ this.scene = params.scene;
36
+ this.camera = params.camera;
37
+ this.transformManager = params.transformManager;
38
+ this.modelPreloader = params.modelPreloader;
39
+ this.componentManager = params.componentManager;
40
+
41
+ // Internal state
42
+ this.currentDragComponentData = null;
43
+ this.dragPreviewSize = null;
44
+ this.isCreatingDragPreview = false;
45
+ this.dragPreviewMesh = null;
46
+ this.dragPreviewBoundingBox = null;
47
+ this.dragTargetPosition = null;
48
+ this.isDragOverScene = false;
49
+
50
+ // Bind methods to preserve context
51
+ this.onComponentDragStart = this.onComponentDragStart.bind(this);
52
+ this.onComponentDragEnd = this.onComponentDragEnd.bind(this);
53
+ this.onDragEnter = this.onDragEnter.bind(this);
54
+ this.onDragLeave = this.onDragLeave.bind(this);
55
+ this.onDragOver = this.onDragOver.bind(this);
56
+ this.onDrop = this.onDrop.bind(this);
57
+ }
58
+
59
+ /**
60
+ * Handle component drag start with component data
61
+ */
62
+ return _rollupPluginBabelHelpers.createClass(DragDropManager, [{
63
+ key: "onComponentDragStart",
64
+ value: (function () {
65
+ var _onComponentDragStart = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee(componentData, containerRef) {
66
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context) {
67
+ while (1) switch (_context.n) {
68
+ case 0:
69
+ console.log('🎯 Component drag started with data:', componentData);
70
+ this.currentDragComponentData = componentData;
71
+
72
+ // Calculate size immediately since we have the data
73
+ _context.n = 1;
74
+ return this.calculateDragPreviewSize(componentData);
75
+ case 1:
76
+ return _context.a(2, true);
77
+ }
78
+ }, _callee, this);
79
+ }));
80
+ function onComponentDragStart(_x, _x2) {
81
+ return _onComponentDragStart.apply(this, arguments);
82
+ }
83
+ return onComponentDragStart;
84
+ }()
85
+ /**
86
+ * Handle component drag end
87
+ */
88
+ )
89
+ }, {
90
+ key: "onComponentDragEnd",
91
+ value: function onComponentDragEnd() {
92
+ console.log('🎯 Component drag ended');
93
+ // IMPORTANT: Full cleanup of all drag-related state
94
+ this.currentDragComponentData = null;
95
+ this.dragPreviewSize = null;
96
+ this.isCreatingDragPreview = false;
97
+ this.clearDragPreview();
98
+ this.cleanupDragPreview();
99
+ this.dragTargetPosition = null;
100
+ this.isDragOverScene = false;
101
+ return true;
102
+ }
103
+
104
+ /**
105
+ * Handle drag enter event
106
+ */
107
+ }, {
108
+ key: "onDragEnter",
109
+ value: (function () {
110
+ var _onDragEnter = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee2(event, containerRef) {
111
+ var componentDataStr;
112
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context2) {
113
+ while (1) switch (_context2.n) {
114
+ case 0:
115
+ event.preventDefault();
116
+ this.isDragOverScene = true;
117
+
118
+ // Try to get component data from the drag event first if we don't have it
119
+ if (!this.currentDragComponentData) {
120
+ try {
121
+ componentDataStr = event.dataTransfer.getData('application/json');
122
+ if (componentDataStr) {
123
+ this.currentDragComponentData = JSON.parse(componentDataStr);
124
+ console.log('🎯 Retrieved component data from drag event:', this.currentDragComponentData);
125
+ }
126
+ } catch (error) {
127
+ console.warn('⚠️ Could not parse component data from drag event:', error);
128
+ }
129
+ }
130
+
131
+ // If we don't have size calculated yet and we have component data, calculate it now
132
+ if (!(!this.dragPreviewSize && this.currentDragComponentData)) {
133
+ _context2.n = 1;
134
+ break;
135
+ }
136
+ _context2.n = 1;
137
+ return this.calculateDragPreviewSize(this.currentDragComponentData);
138
+ case 1:
139
+ if (!(!this.dragPreviewMesh && this.currentDragComponentData && !this.isCreatingDragPreview)) {
140
+ _context2.n = 4;
141
+ break;
142
+ }
143
+ this.isCreatingDragPreview = true;
144
+ _context2.p = 2;
145
+ _context2.n = 3;
146
+ return this.createDragPreview();
147
+ case 3:
148
+ _context2.p = 3;
149
+ this.isCreatingDragPreview = false;
150
+ return _context2.f(3);
151
+ case 4:
152
+ console.log('🎯 Component drag entered scene area');
153
+ case 5:
154
+ return _context2.a(2);
155
+ }
156
+ }, _callee2, this, [[2,, 3, 4]]);
157
+ }));
158
+ function onDragEnter(_x3, _x4) {
159
+ return _onDragEnter.apply(this, arguments);
160
+ }
161
+ return onDragEnter;
162
+ }()
163
+ /**
164
+ * Handle drag leave event
165
+ */
166
+ )
167
+ }, {
168
+ key: "onDragLeave",
169
+ value: function onDragLeave(event, containerRef) {
170
+ // Only set to false if we're actually leaving the scene container
171
+ if (!containerRef.contains(event.relatedTarget)) {
172
+ this.isDragOverScene = false;
173
+ this.clearDragPreview();
174
+ console.log('🎯 Component drag left scene area');
175
+ }
176
+ }
177
+
178
+ /**
179
+ * Handle drag over event to calculate 3D position
180
+ */
181
+ }, {
182
+ key: "onDragOver",
183
+ value: (function () {
184
+ var _onDragOver = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee3(event, containerRef) {
185
+ var componentDataStr, targetPosition, isOverlapping, meshColor, _t;
186
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context3) {
187
+ while (1) switch (_context3.n) {
188
+ case 0:
189
+ event.preventDefault();
190
+ event.dataTransfer.dropEffect = 'copy';
191
+
192
+ // Try to get component data from the drag event if we don't have it
193
+ if (this.currentDragComponentData) {
194
+ _context3.n = 4;
195
+ break;
196
+ }
197
+ _context3.p = 1;
198
+ componentDataStr = event.dataTransfer.getData('application/json');
199
+ if (!componentDataStr) {
200
+ _context3.n = 2;
201
+ break;
202
+ }
203
+ this.currentDragComponentData = JSON.parse(componentDataStr);
204
+ console.log('🎯 Retrieved component data from drag over event:', this.currentDragComponentData);
205
+
206
+ // Calculate size now that we have the data
207
+ if (this.dragPreviewSize) {
208
+ _context3.n = 2;
209
+ break;
210
+ }
211
+ _context3.n = 2;
212
+ return this.calculateDragPreviewSize(this.currentDragComponentData);
213
+ case 2:
214
+ _context3.n = 4;
215
+ break;
216
+ case 3:
217
+ _context3.p = 3;
218
+ _t = _context3.v;
219
+ console.warn('⚠️ Could not parse component data from drag over event:', _t);
220
+ case 4:
221
+ // Calculate 3D world position from mouse coordinates
222
+ targetPosition = this.calculateDropPosition(event, containerRef);
223
+ if (!targetPosition) {
224
+ _context3.n = 6;
225
+ break;
226
+ }
227
+ this.dragTargetPosition = targetPosition;
228
+ _context3.n = 5;
229
+ return this.updateDragPreview(targetPosition);
230
+ case 5:
231
+ // Update fallback mesh color if using wireframe preview
232
+ if (this.dragPreviewMesh && this.dragPreviewMesh.userData.isFallback) {
233
+ isOverlapping = this.checkBoundingBoxOverlap();
234
+ meshColor = isOverlapping ? 0xff0000 : 0x00ff00; // Red if overlapping, green otherwise
235
+ this.dragPreviewMesh.material.color.set(meshColor);
236
+ }
237
+ case 6:
238
+ return _context3.a(2);
239
+ }
240
+ }, _callee3, this, [[1, 3]]);
241
+ }));
242
+ function onDragOver(_x5, _x6) {
243
+ return _onDragOver.apply(this, arguments);
244
+ }
245
+ return onDragOver;
246
+ }()
247
+ /**
248
+ * Handle drop event to add component to scene
249
+ */
250
+ )
251
+ }, {
252
+ key: "onDrop",
253
+ value: (function () {
254
+ var _onDrop = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee4(event, containerRef) {
255
+ var callbacks,
256
+ componentDataStr,
257
+ componentData,
258
+ dropPosition,
259
+ isOverlapping,
260
+ success,
261
+ _args4 = arguments,
262
+ _t2,
263
+ _t3;
264
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context4) {
265
+ while (1) switch (_context4.n) {
266
+ case 0:
267
+ callbacks = _args4.length > 2 && _args4[2] !== undefined ? _args4[2] : {};
268
+ event.preventDefault();
269
+ this.isDragOverScene = false;
270
+ _context4.p = 1;
271
+ // IMPORTANT: Always get fresh component data from the event
272
+ // Don't rely on this.currentDragComponentData which might be stale
273
+ componentDataStr = event.dataTransfer.getData('application/json');
274
+ if (componentDataStr) {
275
+ _context4.n = 2;
276
+ break;
277
+ }
278
+ console.warn('⚠️ No component data found in drop event');
279
+ // Notify parent about the error
280
+ if (callbacks.onPlacementCanceled) {
281
+ callbacks.onPlacementCanceled({
282
+ reason: 'invalid-data',
283
+ message: 'No component data found in drop event'
284
+ });
285
+ }
286
+ return _context4.a(2, false);
287
+ case 2:
288
+ _context4.p = 2;
289
+ componentData = JSON.parse(componentDataStr);
290
+ console.log('🎯 Component dropped:', componentData);
291
+ _context4.n = 4;
292
+ break;
293
+ case 3:
294
+ _context4.p = 3;
295
+ _t2 = _context4.v;
296
+ console.error('❌ Error parsing component data:', _t2);
297
+ // Notify parent about the error
298
+ if (callbacks.onPlacementCanceled) {
299
+ callbacks.onPlacementCanceled({
300
+ reason: 'parse-error',
301
+ message: 'Could not parse component data'
302
+ });
303
+ }
304
+ return _context4.a(2, false);
305
+ case 4:
306
+ if (!(!componentData || !componentData.libraryId || !componentData.modelKey)) {
307
+ _context4.n = 5;
308
+ break;
309
+ }
310
+ console.error('❌ Invalid component data, missing required fields');
311
+ // Notify parent about the error
312
+ if (callbacks.onPlacementCanceled) {
313
+ callbacks.onPlacementCanceled({
314
+ reason: 'invalid-data',
315
+ message: 'Component data missing required fields'
316
+ });
317
+ }
318
+ return _context4.a(2, false);
319
+ case 5:
320
+ // Calculate 3D world position
321
+ dropPosition = this.calculateDropPosition(event, containerRef); // We always get a valid position now due to the improved calculateDropPosition method,
322
+ // but let's still check for safety
323
+ if (dropPosition) {
324
+ _context4.n = 6;
325
+ break;
326
+ }
327
+ console.warn('⚠️ Could not calculate drop position');
328
+ if (callbacks.onPlacementCanceled) {
329
+ callbacks.onPlacementCanceled({
330
+ reason: 'position-error',
331
+ message: 'Could not calculate drop position',
332
+ componentData: componentData
333
+ });
334
+ }
335
+ return _context4.a(2, false);
336
+ case 6:
337
+ // Update component position
338
+ componentData.position = {
339
+ x: dropPosition.x,
340
+ y: dropPosition.y,
341
+ z: dropPosition.z
342
+ };
343
+ console.log('🎯 Dropping component at position:', dropPosition);
344
+
345
+ // Check for component overlap before adding
346
+ isOverlapping = this.checkBoundingBoxOverlap(); // Only add component to scene if not overlapping
347
+ success = false;
348
+ if (!isOverlapping) {
349
+ _context4.n = 7;
350
+ break;
351
+ }
352
+ console.warn('⚠️ Canceling component placement due to overlap');
353
+ // Emit an event to inform the user
354
+ if (callbacks.onPlacementCanceled) {
355
+ callbacks.onPlacementCanceled({
356
+ reason: 'overlap',
357
+ componentData: componentData
358
+ });
359
+ }
360
+ return _context4.a(2, false);
361
+ case 7:
362
+ if (!callbacks.onAddComponent) {
363
+ _context4.n = 9;
364
+ break;
365
+ }
366
+ _context4.n = 8;
367
+ return callbacks.onAddComponent(componentData);
368
+ case 8:
369
+ success = _context4.v;
370
+ _context4.n = 11;
371
+ break;
372
+ case 9:
373
+ if (!this.componentManager) {
374
+ _context4.n = 11;
375
+ break;
376
+ }
377
+ _context4.n = 10;
378
+ return this.componentManager.addComponentToScene(componentData);
379
+ case 10:
380
+ success = _context4.v;
381
+ case 11:
382
+ if (success) {
383
+ console.log('✅ Component successfully added to scene via drag & drop');
384
+ // Pass properly structured data with position and componentData properties
385
+ if (callbacks.onComponentAdded) {
386
+ callbacks.onComponentAdded({
387
+ componentData: componentData,
388
+ position: dropPosition
389
+ });
390
+ }
391
+ } else {
392
+ console.error('❌ Failed to add component to scene via drag & drop');
393
+ }
394
+ return _context4.a(2, success);
395
+ case 12:
396
+ _context4.p = 12;
397
+ _t3 = _context4.v;
398
+ console.error('❌ Error handling component drop:', _t3);
399
+ return _context4.a(2, false);
400
+ case 13:
401
+ _context4.p = 13;
402
+ // IMPORTANT: Explicitly reset all drag-related state to prevent reuse
403
+ this.clearDragPreview();
404
+ this.cleanupDragPreview();
405
+ this.currentDragComponentData = null;
406
+ this.dragPreviewSize = null;
407
+ this.dragTargetPosition = null;
408
+ this.isDragOverScene = false;
409
+ return _context4.f(13);
410
+ case 14:
411
+ return _context4.a(2);
412
+ }
413
+ }, _callee4, this, [[2, 3], [1, 12, 13, 14]]);
414
+ }));
415
+ function onDrop(_x7, _x8) {
416
+ return _onDrop.apply(this, arguments);
417
+ }
418
+ return onDrop;
419
+ }()
420
+ /**
421
+ * Calculate 3D world position from mouse coordinates
422
+ */
423
+ )
424
+ }, {
425
+ key: "calculateDropPosition",
426
+ value: function calculateDropPosition(event, containerRef) {
427
+ console.log("calculateDropPosition started");
428
+ if (!this.camera || !containerRef) {
429
+ return null;
430
+ }
431
+ try {
432
+ var _this$transformManage;
433
+ // Get mouse position relative to the scene container
434
+ var rect = containerRef.getBoundingClientRect();
435
+ var mouseX = (event.clientX - rect.left) / rect.width * 2 - 1;
436
+ var mouseY = -((event.clientY - rect.top) / rect.height) * 2 + 1;
437
+
438
+ // Create raycaster
439
+ var raycaster = new THREE__namespace.Raycaster();
440
+ raycaster.setFromCamera({
441
+ x: mouseX,
442
+ y: mouseY
443
+ }, this.camera);
444
+
445
+ // Get the translation snap value from transform manager, default to 0.5 if not available
446
+ var snapGrid = ((_this$transformManage = this.transformManager) === null || _this$transformManage === void 0 || (_this$transformManage = _this$transformManage.snapValues) === null || _this$transformManage === void 0 ? void 0 : _this$transformManage.translation) || 0.5;
447
+ var snapFactor = 1 / snapGrid;
448
+
449
+ // Find only the ground mesh for intersection
450
+ var groundMesh = null;
451
+ this.scene.traverse(function (child) {
452
+ var _child$userData;
453
+ if (child.isMesh && (_child$userData = child.userData) !== null && _child$userData !== void 0 && _child$userData.isBaseGround) {
454
+ groundMesh = child;
455
+ }
456
+ });
457
+ if (groundMesh) {
458
+ // Intersect only with the ground mesh
459
+ var intersections = raycaster.intersectObject(groundMesh, false);
460
+ if (intersections.length > 0) {
461
+ var intersection = intersections[0];
462
+ return {
463
+ x: Math.round(intersection.point.x * snapFactor) / snapFactor,
464
+ // Snap to grid
465
+ y: Math.max(0, intersection.point.y),
466
+ // Ensure above ground
467
+ z: Math.round(intersection.point.z * snapFactor) / snapFactor // Snap to grid
468
+ };
469
+ }
470
+ }
471
+
472
+ // If no ground mesh found or no intersection, project onto a plane at Y=0 (ground level) as fallback
473
+ var groundPlane = new THREE__namespace.Plane(new THREE__namespace.Vector3(0, 1, 0), 0);
474
+ var intersectionPoint = new THREE__namespace.Vector3();
475
+ var didIntersect = raycaster.ray.intersectPlane(groundPlane, intersectionPoint);
476
+ if (didIntersect && intersectionPoint) {
477
+ return {
478
+ x: Math.round(intersectionPoint.x * snapFactor) / snapFactor,
479
+ // Snap to grid
480
+ y: 0,
481
+ // Ground level
482
+ z: Math.round(intersectionPoint.z * snapFactor) / snapFactor // Snap to grid
483
+ };
484
+ } else {
485
+ // Provide a reasonable default position if we can't determine one
486
+ console.log('⚠️ Could not determine intersection, using default position');
487
+ return {
488
+ x: 0,
489
+ y: 0,
490
+ z: 0
491
+ };
492
+ }
493
+ } catch (error) {
494
+ console.error('❌ Error calculating drop position:', error);
495
+ }
496
+ return null;
497
+ }
498
+
499
+ /**
500
+ * Calculate drag preview size once based on component data
501
+ */
502
+ }, {
503
+ key: "calculateDragPreviewSize",
504
+ value: (function () {
505
+ var _calculateDragPreviewSize = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee5(componentData) {
506
+ var width, height, depth, actualSize, bbox, type, _t5;
507
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context5) {
508
+ while (1) switch (_context5.n) {
509
+ case 0:
510
+ // Use component dimensions if available, otherwise use defaults
511
+ width = 1, height = 1, depth = 1;
512
+ _context5.p = 1;
513
+ console.log('🎯 Calculating preview size for:', componentData);
514
+
515
+ // First try to get accurate size from the actual model
516
+ _context5.p = 2;
517
+ _context5.n = 3;
518
+ return this.getModelBoundingBox(componentData);
519
+ case 3:
520
+ actualSize = _context5.v;
521
+ if (!actualSize) {
522
+ _context5.n = 4;
523
+ break;
524
+ }
525
+ width = actualSize.width;
526
+ height = actualSize.height;
527
+ depth = actualSize.depth;
528
+ console.log('📐 Using actual model dimensions:', {
529
+ width: width,
530
+ height: height,
531
+ depth: depth
532
+ });
533
+ _context5.n = 5;
534
+ break;
535
+ case 4:
536
+ throw new Error('Could not get model bounding box');
537
+ case 5:
538
+ _context5.n = 7;
539
+ break;
540
+ case 6:
541
+ _context5.p = 6;
542
+ _context5.v;
543
+ console.log('📐 Falling back to metadata-based sizing');
544
+
545
+ // Check if component has explicit dimensions
546
+ if (componentData.dimensions) {
547
+ width = componentData.dimensions.width || componentData.dimensions.x || 1;
548
+ height = componentData.dimensions.height || componentData.dimensions.y || 1;
549
+ depth = componentData.dimensions.depth || componentData.dimensions.z || 1;
550
+ console.log('📐 Using explicit dimensions:', {
551
+ width: width,
552
+ height: height,
553
+ depth: depth
554
+ });
555
+ }
556
+ // Check if component has boundingBox data
557
+ else if (componentData.boundingBox) {
558
+ bbox = componentData.boundingBox;
559
+ console.log('📐 Using boundingBox data:', bbox);
560
+ if (bbox.max && bbox.min) {
561
+ width = Math.abs(bbox.max.x - bbox.min.x) || 1;
562
+ height = Math.abs(bbox.max.y - bbox.min.y) || 1;
563
+ depth = Math.abs(bbox.max.z - bbox.min.z) || 1;
564
+ } else if (bbox.width !== undefined && bbox.height !== undefined && bbox.depth !== undefined) {
565
+ width = bbox.width || 1;
566
+ height = bbox.height || 1;
567
+ depth = bbox.depth || 1;
568
+ } else if (typeof bbox.x === 'number' && typeof bbox.y === 'number' && typeof bbox.z === 'number') {
569
+ width = bbox.x || 1;
570
+ height = bbox.y || 1;
571
+ depth = bbox.z || 1;
572
+ }
573
+ }
574
+ // Use default size based on component type
575
+ else {
576
+ // Default sizes based on component type
577
+ type = componentData.type || '';
578
+ if (type.toLowerCase().includes('chiller')) {
579
+ width = 2;
580
+ height = 2;
581
+ depth = 2;
582
+ } else if (type.toLowerCase().includes('pump')) {
583
+ width = 1;
584
+ height = 1;
585
+ depth = 1;
586
+ } else if (type.toLowerCase().includes('tower')) {
587
+ width = 3;
588
+ height = 4;
589
+ depth = 3;
590
+ } else {
591
+ width = 1;
592
+ height = 1;
593
+ depth = 1;
594
+ }
595
+ console.log('📐 Using type-based default dimensions:', {
596
+ width: width,
597
+ height: height,
598
+ depth: depth
599
+ });
600
+ }
601
+ case 7:
602
+ // Ensure minimum size
603
+ width = Math.max(width, 0.5);
604
+ height = Math.max(height, 0.5);
605
+ depth = Math.max(depth, 0.5);
606
+ this.dragPreviewSize = {
607
+ width: width,
608
+ height: height,
609
+ depth: depth
610
+ };
611
+ console.log('🎯 Final calculated drag preview size:', this.dragPreviewSize);
612
+ _context5.n = 9;
613
+ break;
614
+ case 8:
615
+ _context5.p = 8;
616
+ _t5 = _context5.v;
617
+ console.warn('⚠️ Error calculating preview size, using defaults:', _t5);
618
+ this.dragPreviewSize = {
619
+ width: 1,
620
+ height: 1,
621
+ depth: 1
622
+ };
623
+ case 9:
624
+ return _context5.a(2);
625
+ }
626
+ }, _callee5, this, [[2, 6], [1, 8]]);
627
+ }));
628
+ function calculateDragPreviewSize(_x9) {
629
+ return _calculateDragPreviewSize.apply(this, arguments);
630
+ }
631
+ return calculateDragPreviewSize;
632
+ }()
633
+ /**
634
+ * Get the actual bounding box of a model
635
+ */
636
+ )
637
+ }, {
638
+ key: "getModelBoundingBox",
639
+ value: (function () {
640
+ var _getModelBoundingBox = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee6(componentData) {
641
+ var _this$modelPreloader, componentDictionary, dictResponse, libraryComponent, gltfScene, boundingBox, size, _t7;
642
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context6) {
643
+ while (1) switch (_context6.n) {
644
+ case 0:
645
+ if (componentData.libraryId) {
646
+ _context6.n = 1;
647
+ break;
648
+ }
649
+ return _context6.a(2, null);
650
+ case 1:
651
+ _context6.p = 1;
652
+ // Get the component dictionary for model information
653
+ componentDictionary = {};
654
+ _context6.p = 2;
655
+ _context6.n = 3;
656
+ return fetch('./library/component-dictionary.json');
657
+ case 3:
658
+ dictResponse = _context6.v;
659
+ _context6.n = 4;
660
+ return dictResponse.json();
661
+ case 4:
662
+ componentDictionary = _context6.v;
663
+ _context6.n = 6;
664
+ break;
665
+ case 5:
666
+ _context6.p = 5;
667
+ _context6.v;
668
+ console.warn('⚠️ Could not load component dictionary for size calculation');
669
+ return _context6.a(2, null);
670
+ case 6:
671
+ libraryComponent = componentDictionary[componentData.libraryId];
672
+ if (!(!libraryComponent || !libraryComponent.modelKey)) {
673
+ _context6.n = 7;
674
+ break;
675
+ }
676
+ return _context6.a(2, null);
677
+ case 7:
678
+ // Try to get the model from the preloader cache first
679
+ gltfScene = (_this$modelPreloader = this.modelPreloader) === null || _this$modelPreloader === void 0 ? void 0 : _this$modelPreloader.getCachedModel(libraryComponent.modelKey);
680
+ if (gltfScene) {
681
+ _context6.n = 8;
682
+ break;
683
+ }
684
+ console.log('📐 Model not in cache, cannot get accurate size');
685
+ return _context6.a(2, null);
686
+ case 8:
687
+ // Calculate the bounding box
688
+ boundingBox = new THREE__namespace.Box3().setFromObject(gltfScene);
689
+ size = boundingBox.getSize(new THREE__namespace.Vector3());
690
+ return _context6.a(2, {
691
+ width: size.x,
692
+ height: size.y,
693
+ depth: size.z
694
+ });
695
+ case 9:
696
+ _context6.p = 9;
697
+ _t7 = _context6.v;
698
+ console.warn('⚠️ Error getting model bounding box:', _t7);
699
+ return _context6.a(2, null);
700
+ }
701
+ }, _callee6, this, [[2, 5], [1, 9]]);
702
+ }));
703
+ function getModelBoundingBox(_x0) {
704
+ return _getModelBoundingBox.apply(this, arguments);
705
+ }
706
+ return getModelBoundingBox;
707
+ }()
708
+ /**
709
+ * Update drag preview visualization
710
+ */
711
+ )
712
+ }, {
713
+ key: "updateDragPreview",
714
+ value: (function () {
715
+ var _updateDragPreview = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee7(position) {
716
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context7) {
717
+ while (1) switch (_context7.n) {
718
+ case 0:
719
+ if (!(!this.dragPreviewMesh && !this.isCreatingDragPreview)) {
720
+ _context7.n = 3;
721
+ break;
722
+ }
723
+ this.isCreatingDragPreview = true;
724
+ _context7.p = 1;
725
+ _context7.n = 2;
726
+ return this.createDragPreview();
727
+ case 2:
728
+ _context7.p = 2;
729
+ this.isCreatingDragPreview = false;
730
+ return _context7.f(2);
731
+ case 3:
732
+ if (this.dragPreviewMesh && position) {
733
+ // Update mesh position
734
+ this.dragPreviewMesh.position.set(position.x, position.y, position.z);
735
+ this.dragPreviewMesh.visible = true;
736
+
737
+ // Update bounding box position if it exists
738
+ if (this.dragPreviewBoundingBox) {
739
+ this.dragPreviewBoundingBox.position.set(position.x, position.y, position.z);
740
+ this.dragPreviewBoundingBox.visible = true;
741
+ }
742
+ }
743
+ case 4:
744
+ return _context7.a(2);
745
+ }
746
+ }, _callee7, this, [[1,, 2, 3]]);
747
+ }));
748
+ function updateDragPreview(_x1) {
749
+ return _updateDragPreview.apply(this, arguments);
750
+ }
751
+ return updateDragPreview;
752
+ }()
753
+ /**
754
+ * Create drag preview mesh with actual model or fallback box
755
+ */
756
+ )
757
+ }, {
758
+ key: "createDragPreview",
759
+ value: (function () {
760
+ var _createDragPreview = _rollupPluginBabelHelpers.asyncToGenerator(/*#__PURE__*/_rollupPluginBabelHelpers.regenerator().m(function _callee8() {
761
+ var componentDictionary, dictResponse, libraryId, libraryComponent, previewMesh, cachedModel, size, geometry, material, _t9;
762
+ return _rollupPluginBabelHelpers.regenerator().w(function (_context8) {
763
+ while (1) switch (_context8.n) {
764
+ case 0:
765
+ // Clean up any existing preview
766
+ this.clearDragPreview();
767
+ if (!(!this.scene || !this.currentDragComponentData)) {
768
+ _context8.n = 1;
769
+ break;
770
+ }
771
+ return _context8.a(2);
772
+ case 1:
773
+ _context8.p = 1;
774
+ console.log('🎯 Creating drag preview for:', this.currentDragComponentData);
775
+
776
+ // Get the component dictionary for model information
777
+ componentDictionary = {};
778
+ _context8.p = 2;
779
+ _context8.n = 3;
780
+ return fetch('./library/component-dictionary.json');
781
+ case 3:
782
+ dictResponse = _context8.v;
783
+ _context8.n = 4;
784
+ return dictResponse.json();
785
+ case 4:
786
+ componentDictionary = _context8.v;
787
+ _context8.n = 6;
788
+ break;
789
+ case 5:
790
+ _context8.p = 5;
791
+ _context8.v;
792
+ console.warn('⚠️ Could not load component dictionary for preview');
793
+ case 6:
794
+ libraryId = this.currentDragComponentData.libraryId;
795
+ libraryComponent = componentDictionary[libraryId];
796
+ previewMesh = null; // Try to create a preview from the actual model if available
797
+ if (libraryComponent && libraryComponent.modelKey && this.modelPreloader) {
798
+ try {
799
+ // Get the cached model if available
800
+ cachedModel = this.modelPreloader.getCachedModel(libraryComponent.modelKey);
801
+ if (cachedModel) {
802
+ // Clone the model for preview
803
+ previewMesh = cachedModel.clone();
804
+
805
+ // Make it semi-transparent
806
+ previewMesh.traverse(function (child) {
807
+ if (child.isMesh) {
808
+ // Create a clone of the material to avoid affecting the original
809
+ child.material = child.material.clone();
810
+ child.material.transparent = true;
811
+ child.material.opacity = 0.4;
812
+ child.material.depthTest = true;
813
+ child.material.depthWrite = true;
814
+ child.material.needsUpdate = true;
815
+ }
816
+ });
817
+ previewMesh.userData.isPreview = true;
818
+ console.log('🎯 Created model-based preview');
819
+ }
820
+ } catch (modelError) {
821
+ console.warn('⚠️ Could not create model-based preview:', modelError);
822
+ previewMesh = null;
823
+ }
824
+ }
825
+
826
+ // If we couldn't create a preview from the model, use a fallback box
827
+ if (!previewMesh) {
828
+ console.log('🎯 Creating fallback box preview');
829
+
830
+ // Use the calculated size or defaults
831
+ size = this.dragPreviewSize || {
832
+ width: 1,
833
+ height: 1,
834
+ depth: 1
835
+ }; // Create a box with wireframe material
836
+ geometry = new THREE__namespace.BoxGeometry(size.width, size.height, size.depth);
837
+ material = new THREE__namespace.MeshBasicMaterial({
838
+ color: 0x00ff00,
839
+ // Green by default
840
+ wireframe: true,
841
+ transparent: true,
842
+ opacity: 0.6
843
+ });
844
+ previewMesh = new THREE__namespace.Mesh(geometry, material);
845
+ previewMesh.userData.isFallback = true;
846
+ previewMesh.userData.isPreview = true;
847
+ }
848
+
849
+ // Add to scene
850
+ this.scene.add(previewMesh);
851
+ this.dragPreviewMesh = previewMesh;
852
+
853
+ // Initially hide the preview
854
+ this.dragPreviewMesh.visible = false;
855
+
856
+ // Also create a bounding box for overlap detection
857
+ this.createBoundingBoxHelper();
858
+ return _context8.a(2, true);
859
+ case 7:
860
+ _context8.p = 7;
861
+ _t9 = _context8.v;
862
+ console.error('❌ Error creating drag preview:', _t9);
863
+ return _context8.a(2, false);
864
+ }
865
+ }, _callee8, this, [[2, 5], [1, 7]]);
866
+ }));
867
+ function createDragPreview() {
868
+ return _createDragPreview.apply(this, arguments);
869
+ }
870
+ return createDragPreview;
871
+ }()
872
+ /**
873
+ * Create a bounding box helper for the preview mesh
874
+ */
875
+ )
876
+ }, {
877
+ key: "createBoundingBoxHelper",
878
+ value: function createBoundingBoxHelper() {
879
+ if (!this.dragPreviewMesh) return;
880
+
881
+ // Create a bounding box for overlap detection
882
+ var bbox = new THREE__namespace.Box3().setFromObject(this.dragPreviewMesh);
883
+ var size = bbox.getSize(new THREE__namespace.Vector3());
884
+ bbox.getCenter(new THREE__namespace.Vector3());
885
+
886
+ // Create a wireframe box to represent the bounding box
887
+ var geometry = new THREE__namespace.BoxGeometry(size.x, size.y, size.z);
888
+ var material = new THREE__namespace.LineBasicMaterial({
889
+ color: 0xffff00,
890
+ transparent: true,
891
+ opacity: 0.3
892
+ });
893
+
894
+ // Use edges to create a wireframe
895
+ var edges = new THREE__namespace.EdgesGeometry(geometry);
896
+ var bboxMesh = new THREE__namespace.LineSegments(edges, material);
897
+
898
+ // Position relative to the preview mesh
899
+ bboxMesh.position.copy(this.dragPreviewMesh.position);
900
+
901
+ // Add to scene
902
+ this.scene.add(bboxMesh);
903
+ this.dragPreviewBoundingBox = bboxMesh;
904
+ this.dragPreviewBoundingBox.visible = false;
905
+ }
906
+
907
+ /**
908
+ * Check if the preview mesh overlaps with any existing scene objects
909
+ */
910
+ }, {
911
+ key: "checkBoundingBoxOverlap",
912
+ value: function checkBoundingBoxOverlap() {
913
+ var _this = this;
914
+ if (!this.dragPreviewMesh || !this.scene) return false;
915
+
916
+ // Create a bounding box for the preview mesh
917
+ var previewBBox = new THREE__namespace.Box3().setFromObject(this.dragPreviewMesh);
918
+
919
+ // Get all meshes in the scene
920
+ var sceneMeshes = [];
921
+ this.scene.traverse(function (object) {
922
+ // Only check meshes that:
923
+ // 1. Are not the preview mesh itself
924
+ // 2. Are not marked as ground, grid, or wall
925
+ // 3. Have component or connector type
926
+ if (object.isMesh && object !== _this.dragPreviewMesh && object !== _this.dragPreviewBoundingBox && !object.userData.isBaseGround && !object.userData.isBrickWall && !object.userData.isBaseGrid) {
927
+ // Check for component objects by userData
928
+ var isComponent = object.userData && (object.userData.componentType === 'component' || object.userData.componentType === 'connector' || object.userData.componentType === 'gateway');
929
+ if (isComponent) {
930
+ sceneMeshes.push(object);
931
+ }
932
+ }
933
+ });
934
+
935
+ // Check for overlaps
936
+ for (var _i = 0, _sceneMeshes = sceneMeshes; _i < _sceneMeshes.length; _i++) {
937
+ var mesh = _sceneMeshes[_i];
938
+ var meshBBox = new THREE__namespace.Box3().setFromObject(mesh);
939
+ if (previewBBox.intersectsBox(meshBBox)) {
940
+ console.log('⚠️ Overlap detected with:', mesh.uuid);
941
+ return true;
942
+ }
943
+ }
944
+ return false;
945
+ }
946
+
947
+ /**
948
+ * Clear the drag preview
949
+ */
950
+ }, {
951
+ key: "clearDragPreview",
952
+ value: function clearDragPreview() {
953
+ if (this.dragPreviewMesh) {
954
+ this.dragPreviewMesh.visible = false;
955
+ }
956
+ if (this.dragPreviewBoundingBox) {
957
+ this.dragPreviewBoundingBox.visible = false;
958
+ }
959
+ }
960
+
961
+ /**
962
+ * Cleanup and remove the drag preview meshes
963
+ */
964
+ }, {
965
+ key: "cleanupDragPreview",
966
+ value: function cleanupDragPreview() {
967
+ if (this.dragPreviewMesh) {
968
+ this.scene.remove(this.dragPreviewMesh);
969
+
970
+ // Dispose of geometries and materials
971
+ if (this.dragPreviewMesh.geometry) {
972
+ this.dragPreviewMesh.geometry.dispose();
973
+ }
974
+ if (this.dragPreviewMesh.material) {
975
+ if (Array.isArray(this.dragPreviewMesh.material)) {
976
+ this.dragPreviewMesh.material.forEach(function (material) {
977
+ return material.dispose();
978
+ });
979
+ } else {
980
+ this.dragPreviewMesh.material.dispose();
981
+ }
982
+ }
983
+ this.dragPreviewMesh = null;
984
+ }
985
+ if (this.dragPreviewBoundingBox) {
986
+ this.scene.remove(this.dragPreviewBoundingBox);
987
+ if (this.dragPreviewBoundingBox.geometry) {
988
+ this.dragPreviewBoundingBox.geometry.dispose();
989
+ }
990
+ if (this.dragPreviewBoundingBox.material) {
991
+ this.dragPreviewBoundingBox.material.dispose();
992
+ }
993
+ this.dragPreviewBoundingBox = null;
994
+ }
995
+ }
996
+
997
+ /**
998
+ * Clean up all resources
999
+ */
1000
+ }, {
1001
+ key: "dispose",
1002
+ value: function dispose() {
1003
+ this.cleanupDragPreview();
1004
+ this.currentDragComponentData = null;
1005
+ this.dragPreviewSize = null;
1006
+ this.isDragOverScene = false;
1007
+ this.dragTargetPosition = null;
1008
+ }
1009
+
1010
+ /**
1011
+ * Get current drag state
1012
+ */
1013
+ }, {
1014
+ key: "getDragState",
1015
+ value: function getDragState() {
1016
+ return {
1017
+ isDragging: !!this.currentDragComponentData,
1018
+ isDragOverScene: this.isDragOverScene,
1019
+ dragComponentData: this.currentDragComponentData,
1020
+ dragTargetPosition: this.dragTargetPosition
1021
+ };
1022
+ }
1023
+ }]);
1024
+ }();
1025
+
1026
+ exports["default"] = DragDropManager;