@planara/core 2.7.1 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/README.md +5 -0
  2. package/dist/api/modules/controls-state-api.d.ts +23 -0
  3. package/dist/api/modules/controls-state-api.d.ts.map +1 -0
  4. package/dist/api/modules/mesh-api.d.ts +30 -0
  5. package/dist/api/modules/mesh-api.d.ts.map +1 -0
  6. package/dist/api/modules/raycast-api.d.ts +28 -0
  7. package/dist/api/modules/raycast-api.d.ts.map +1 -0
  8. package/dist/api/modules/transform-api.d.ts +33 -0
  9. package/dist/api/modules/transform-api.d.ts.map +1 -0
  10. package/dist/api/renderer/camera-api.d.ts +26 -0
  11. package/dist/api/renderer/camera-api.d.ts.map +1 -0
  12. package/dist/api/renderer/dom-api.d.ts +24 -0
  13. package/dist/api/renderer/dom-api.d.ts.map +1 -0
  14. package/dist/api/renderer/scene-api.d.ts +26 -0
  15. package/dist/api/renderer/scene-api.d.ts.map +1 -0
  16. package/dist/constants/colors.d.ts +12 -0
  17. package/dist/constants/colors.d.ts.map +1 -1
  18. package/dist/constants/figure-geometries.d.ts +55 -4
  19. package/dist/constants/figure-geometries.d.ts.map +1 -1
  20. package/dist/constants/layers.d.ts +12 -0
  21. package/dist/constants/layers.d.ts.map +1 -1
  22. package/dist/constants/messages.d.ts +18 -0
  23. package/dist/constants/messages.d.ts.map +1 -0
  24. package/dist/constants/threshold.d.ts +42 -2
  25. package/dist/constants/threshold.d.ts.map +1 -1
  26. package/dist/controllers/renderer-controller.d.ts +74 -0
  27. package/dist/controllers/renderer-controller.d.ts.map +1 -0
  28. package/dist/core/renderer.d.ts +110 -78
  29. package/dist/core/renderer.d.ts.map +1 -1
  30. package/dist/decorators/use-policy.d.ts +5 -0
  31. package/dist/decorators/use-policy.d.ts.map +1 -0
  32. package/dist/errors/policy-error.d.ts +9 -0
  33. package/dist/errors/policy-error.d.ts.map +1 -0
  34. package/dist/events/editor-events.d.ts +2 -6
  35. package/dist/events/editor-events.d.ts.map +1 -1
  36. package/dist/events/event-bus.d.ts +102 -5
  37. package/dist/events/event-bus.d.ts.map +1 -1
  38. package/dist/events/event-topics.d.ts +3 -3
  39. package/dist/events/event-topics.d.ts.map +1 -1
  40. package/dist/handlers/display/wireframe-handler.d.ts +3 -1
  41. package/dist/handlers/display/wireframe-handler.d.ts.map +1 -1
  42. package/dist/handlers/scene/add-figure-scene-handler.d.ts +2 -0
  43. package/dist/handlers/scene/add-figure-scene-handler.d.ts.map +1 -1
  44. package/dist/handlers/scene/delete-figure-scene-handler.d.ts +2 -2
  45. package/dist/handlers/scene/delete-figure-scene-handler.d.ts.map +1 -1
  46. package/dist/handlers/select/edge-select-handler.d.ts +10 -4
  47. package/dist/handlers/select/edge-select-handler.d.ts.map +1 -1
  48. package/dist/handlers/select/face-select-handler.d.ts +65 -6
  49. package/dist/handlers/select/face-select-handler.d.ts.map +1 -1
  50. package/dist/handlers/select/mesh-select-handler.d.ts +5 -3
  51. package/dist/handlers/select/mesh-select-handler.d.ts.map +1 -1
  52. package/dist/handlers/select/vertex-select-handler.d.ts +10 -4
  53. package/dist/handlers/select/vertex-select-handler.d.ts.map +1 -1
  54. package/dist/handlers/tool/base-tool-handler.d.ts +9 -6
  55. package/dist/handlers/tool/base-tool-handler.d.ts.map +1 -1
  56. package/dist/handlers/tool/rotate-tool-handler.d.ts +4 -3
  57. package/dist/handlers/tool/rotate-tool-handler.d.ts.map +1 -1
  58. package/dist/handlers/tool/scale-tool-handler.d.ts +4 -3
  59. package/dist/handlers/tool/scale-tool-handler.d.ts.map +1 -1
  60. package/dist/handlers/tool/translate-tool-handler.d.ts +4 -3
  61. package/dist/handlers/tool/translate-tool-handler.d.ts.map +1 -1
  62. package/dist/hub/app-hub.d.ts +1 -0
  63. package/dist/hub/app-hub.d.ts.map +1 -1
  64. package/dist/hub/editor-hub.d.ts +22 -17
  65. package/dist/hub/editor-hub.d.ts.map +1 -1
  66. package/dist/index.cjs.js +2 -2
  67. package/dist/index.d.ts +15 -8
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.es.js +1750 -1378
  70. package/dist/index.full.d.ts +635 -229
  71. package/dist/index.public.d.ts +653 -147
  72. package/dist/index.umd.js +2 -2
  73. package/dist/interfaces/api/camera-api.d.ts +64 -0
  74. package/dist/interfaces/api/camera-api.d.ts.map +1 -0
  75. package/dist/interfaces/api/controls-state-api.d.ts +63 -0
  76. package/dist/interfaces/api/controls-state-api.d.ts.map +1 -0
  77. package/dist/interfaces/api/dom-api.d.ts +49 -0
  78. package/dist/interfaces/api/dom-api.d.ts.map +1 -0
  79. package/dist/interfaces/api/mesh-api.d.ts +93 -12
  80. package/dist/interfaces/api/mesh-api.d.ts.map +1 -1
  81. package/dist/interfaces/api/raycast-api.d.ts +6 -1
  82. package/dist/interfaces/api/raycast-api.d.ts.map +1 -1
  83. package/dist/interfaces/api/renderer/renderable.d.ts +45 -0
  84. package/dist/interfaces/api/renderer/renderable.d.ts.map +1 -0
  85. package/dist/interfaces/api/renderer/renderer-access.d.ts +34 -0
  86. package/dist/interfaces/api/renderer/renderer-access.d.ts.map +1 -0
  87. package/dist/interfaces/api/renderer/renderer-camera-access.d.ts +37 -0
  88. package/dist/interfaces/api/renderer/renderer-camera-access.d.ts.map +1 -0
  89. package/dist/interfaces/api/renderer/renderer-dom-access.d.ts +51 -0
  90. package/dist/interfaces/api/renderer/renderer-dom-access.d.ts.map +1 -0
  91. package/dist/interfaces/api/renderer/renderer-scene-access.d.ts +45 -0
  92. package/dist/interfaces/api/renderer/renderer-scene-access.d.ts.map +1 -0
  93. package/dist/interfaces/api/renderer-api.d.ts +35 -0
  94. package/dist/interfaces/api/renderer-api.d.ts.map +1 -0
  95. package/dist/interfaces/api/scene-api.d.ts +66 -26
  96. package/dist/interfaces/api/scene-api.d.ts.map +1 -1
  97. package/dist/interfaces/api/transform-api.d.ts +120 -0
  98. package/dist/interfaces/api/transform-api.d.ts.map +1 -0
  99. package/dist/interfaces/command/index.d.ts +9 -0
  100. package/dist/interfaces/command/index.d.ts.map +1 -0
  101. package/dist/interfaces/controller/controller.d.ts +38 -0
  102. package/dist/interfaces/controller/controller.d.ts.map +1 -0
  103. package/dist/interfaces/handler/display-handler.d.ts +9 -1
  104. package/dist/interfaces/handler/display-handler.d.ts.map +1 -1
  105. package/dist/interfaces/handler/handler.d.ts +2 -0
  106. package/dist/interfaces/handler/handler.d.ts.map +1 -1
  107. package/dist/interfaces/handler/scene-handler.d.ts +1 -0
  108. package/dist/interfaces/handler/scene-handler.d.ts.map +1 -1
  109. package/dist/interfaces/handler/select-handler.d.ts +1 -0
  110. package/dist/interfaces/handler/select-handler.d.ts.map +1 -1
  111. package/dist/interfaces/handler/tool-handler.d.ts +1 -0
  112. package/dist/interfaces/handler/tool-handler.d.ts.map +1 -1
  113. package/dist/interfaces/manager/display-manager.d.ts +3 -1
  114. package/dist/interfaces/manager/display-manager.d.ts.map +1 -1
  115. package/dist/interfaces/manager/manager.d.ts +12 -1
  116. package/dist/interfaces/manager/manager.d.ts.map +1 -1
  117. package/dist/interfaces/manager/scene-manager.d.ts +3 -1
  118. package/dist/interfaces/manager/scene-manager.d.ts.map +1 -1
  119. package/dist/interfaces/manager/select-manager.d.ts +3 -1
  120. package/dist/interfaces/manager/select-manager.d.ts.map +1 -1
  121. package/dist/interfaces/manager/tool-manager.d.ts +3 -1
  122. package/dist/interfaces/manager/tool-manager.d.ts.map +1 -1
  123. package/dist/interfaces/mediator/index.d.ts +51 -0
  124. package/dist/interfaces/mediator/index.d.ts.map +1 -0
  125. package/dist/interfaces/middleware/index.d.ts +50 -0
  126. package/dist/interfaces/middleware/index.d.ts.map +1 -0
  127. package/dist/interfaces/module/renderable-module.d.ts +27 -0
  128. package/dist/interfaces/module/renderable-module.d.ts.map +1 -0
  129. package/dist/interfaces/module/runtime-module.d.ts +54 -0
  130. package/dist/interfaces/module/runtime-module.d.ts.map +1 -0
  131. package/dist/interfaces/module/updatable-module.d.ts +48 -0
  132. package/dist/interfaces/module/updatable-module.d.ts.map +1 -0
  133. package/dist/interfaces/policy/index.d.ts +21 -0
  134. package/dist/interfaces/policy/index.d.ts.map +1 -0
  135. package/dist/interfaces/response/index.d.ts +22 -0
  136. package/dist/interfaces/response/index.d.ts.map +1 -0
  137. package/dist/interfaces/store/display-store.d.ts +21 -0
  138. package/dist/interfaces/store/display-store.d.ts.map +1 -0
  139. package/dist/interfaces/store/{editor-store.d.ts → select-store.d.ts} +16 -24
  140. package/dist/interfaces/store/select-store.d.ts.map +1 -0
  141. package/dist/interfaces/store/tool-store.d.ts +27 -0
  142. package/dist/interfaces/store/tool-store.d.ts.map +1 -0
  143. package/dist/interfaces/store/transform-store.d.ts +11 -0
  144. package/dist/interfaces/store/transform-store.d.ts.map +1 -0
  145. package/dist/ioc/container.d.ts.map +1 -1
  146. package/dist/managers/display/display-manager.d.ts +5 -2
  147. package/dist/managers/display/display-manager.d.ts.map +1 -1
  148. package/dist/managers/scene/scene-manager.d.ts +3 -0
  149. package/dist/managers/scene/scene-manager.d.ts.map +1 -1
  150. package/dist/managers/select/select-manager.d.ts +5 -2
  151. package/dist/managers/select/select-manager.d.ts.map +1 -1
  152. package/dist/managers/tool/tool-manager.d.ts +7 -4
  153. package/dist/managers/tool/tool-manager.d.ts.map +1 -1
  154. package/dist/mediator/index.d.ts +14 -0
  155. package/dist/mediator/index.d.ts.map +1 -0
  156. package/dist/middlewares/exception-middleware.d.ts +7 -0
  157. package/dist/middlewares/exception-middleware.d.ts.map +1 -0
  158. package/dist/modules/controls-module.d.ts +58 -0
  159. package/dist/modules/controls-module.d.ts.map +1 -0
  160. package/dist/modules/gizmo-module.d.ts +34 -0
  161. package/dist/modules/gizmo-module.d.ts.map +1 -0
  162. package/dist/modules/raycast-module.d.ts +91 -0
  163. package/dist/modules/raycast-module.d.ts.map +1 -0
  164. package/dist/modules/scene-module.d.ts +32 -0
  165. package/dist/modules/scene-module.d.ts.map +1 -0
  166. package/dist/policy/tool-policy.d.ts +18 -0
  167. package/dist/policy/tool-policy.d.ts.map +1 -0
  168. package/dist/store/index.d.ts +4 -14
  169. package/dist/store/index.d.ts.map +1 -1
  170. package/dist/types/feature/feature-type.d.ts +16 -0
  171. package/dist/types/feature/feature-type.d.ts.map +1 -0
  172. package/dist/types/response/response-type.d.ts +19 -0
  173. package/dist/types/response/response-type.d.ts.map +1 -0
  174. package/dist/types/select/face-group.d.ts +24 -0
  175. package/dist/types/select/face-group.d.ts.map +1 -0
  176. package/package.json +2 -2
  177. package/dist/core/editor-renderer.d.ts +0 -79
  178. package/dist/core/editor-renderer.d.ts.map +0 -1
  179. package/dist/core/preview-renderer.d.ts +0 -16
  180. package/dist/core/preview-renderer.d.ts.map +0 -1
  181. package/dist/interfaces/api/transform-helpers-api.d.ts +0 -26
  182. package/dist/interfaces/api/transform-helpers-api.d.ts.map +0 -1
  183. package/dist/interfaces/policy/tool-availability-policy.d.ts +0 -12
  184. package/dist/interfaces/policy/tool-availability-policy.d.ts.map +0 -1
  185. package/dist/interfaces/store/editor-store.d.ts.map +0 -1
  186. package/dist/policy/tool-availability-policy.d.ts +0 -13
  187. package/dist/policy/tool-availability-policy.d.ts.map +0 -1
  188. package/dist/types/api/editor-api.d.ts +0 -4
  189. package/dist/types/api/editor-api.d.ts.map +0 -1
  190. package/dist/utils/renderer-api.d.ts +0 -43
  191. package/dist/utils/renderer-api.d.ts.map +0 -1
package/dist/index.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- (function(d,x){typeof exports=="object"&&typeof module<"u"?x(exports,require("reflect-metadata"),require("three"),require("@planara/types"),require("@planara/three"),require("tsyringe"),require("events"),require("mobx")):typeof define=="function"&&define.amd?define(["exports","reflect-metadata","three","@planara/types","@planara/three","tsyringe","events","mobx"],x):(d=typeof globalThis<"u"?globalThis:d||self,x(d.PlanaraCore={},d.Reflect,d.THREE,d.PlanaraTypes,d.PlanaraThree,d.tsyringe,d.events,d.mobx))})(this,(function(d,x,c,l,I,h,Ee,je){"use strict";function Ae(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const s in t)if(s!=="default"){const i=Object.getOwnPropertyDescriptor(t,s);Object.defineProperty(e,s,i.get?i:{enumerable:!0,get:()=>t[s]})}}return e.default=t,Object.freeze(e)}const a=Ae(c),xe={[l.FigureType.Plane]:()=>new a.PlaneGeometry(1,1,1,1),[l.FigureType.Cube]:()=>new a.BoxGeometry(1,1,1,1,1,1),[l.FigureType.UVSphere]:()=>new a.SphereGeometry(.5,32,16),[l.FigureType.Icosphere]:()=>new a.IcosahedronGeometry(.5,0),[l.FigureType.Cylinder]:()=>new a.CylinderGeometry(.5,.5,1,32,1,!1),[l.FigureType.Cone]:()=>new a.ConeGeometry(.5,1,32,1,!1),[l.FigureType.Torus]:()=>new a.TorusGeometry(.5,.2,16,64),[l.FigureType.Circle]:()=>new a.CircleGeometry(.5,32),[l.FigureType.Sphere]:()=>new a.SphereGeometry(.5,32,16),[l.FigureType.Custom]:function(){throw new Error("Custom geometry is not generated here.")}},he=new a.MeshStandardMaterial({color:12566463,metalness:0,roughness:.6}),Ie=8;class N{scene;camera;renderer;canvas;meshes=[];constructor(e){this.canvas=e,this.scene=new a.Scene,this.scene.background=new a.Color(1710618),this.camera=new a.PerspectiveCamera(45,e.clientWidth/e.clientHeight,.1,1e3),this.camera.position.set(1,1,7),this.renderer=new a.WebGLRenderer({canvas:e,antialias:!0}),this.renderer.setSize(e.clientWidth,e.clientHeight);const s=new a.AmbientLight(16777215,.5);this.scene.add(s);const i=new a.DirectionalLight(16777215,1);i.position.set(5,10,7),this.scene.add(i)}resize(){this.camera.aspect=this.canvas.clientWidth/this.canvas.clientHeight,this.camera.updateProjectionMatrix(),this.renderer.setSize(this.canvas.clientWidth,this.canvas.clientHeight)}render(){this.renderer.render(this.scene,this.camera)}update(){}loop(){this.update(),this.render(),requestAnimationFrame(()=>this.loop())}addFigure(e){const s=new a.BufferGeometry;s.setAttribute("position",new a.Float32BufferAttribute(e.position,3)),e.normal&&s.setAttribute("normal",new a.Float32BufferAttribute(e.normal,3)),e.uv&&s.setAttribute("uv",new a.Float32BufferAttribute(e.uv,2));const i=new a.Mesh(s,he);return this.scene.add(i),this.meshes.push(i),i}addMesh(e){this.scene&&(this.scene.add(e),this.meshes.push(e))}removeMesh(e){this.scene&&(this.scene.remove(e),this.meshes=this.meshes.filter(s=>s!==e))}getMeshes(){return this.meshes}addObject(e,s){this.scene&&(typeof s=="number"&&e.layers.set(s),this.scene.add(e))}removeObject(e){this.scene&&(e.parent?e.parent.remove(e):this.scene.remove(e))}enableCameraLayer(e){this.camera&&this.camera.layers.enable(e)}dispose(){this.meshes&&(this.meshes.length=0,this.meshes=[]),this.scene=null,this.camera=null,this.renderer?.dispose(),this.canvas=null}}var Re=Object.getOwnPropertyDescriptor,Ve=(t,e,s,i)=>{for(var r=i>1?void 0:i?Re(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r};d.EventBus=class{_emitter;constructor(){this._emitter=new Ee.EventEmitter}emit(e,s){this._emitter.emit(e,s)}on(e,s){this._emitter.on(e,s)}off(e,s){this._emitter.off(e,s)}},d.EventBus=Ve([h.injectable()],d.EventBus);var T=(t=>(t.SelectHover="select.hover",t.SelectClick="select.click",t.ToolSelect="tool.select",t))(T||{});const ke=.03,He=.05,le=0,Ue=1,Ne=2,L=31,R=16776960,V=16755200,ze=2236962,Fe=2236962,Ye=t=>!!t&&t.isMesh,ce=t=>{let e=t;for(;e;){if(e.isMesh)return e;e=e.parent}return null},de=t=>{const e=new a.BufferGeometry;e.setAttribute("position",t.getAttribute("position")),e.computeBoundingSphere(),e.computeBoundingBox();const s=new a.PointsMaterial({color:Fe,size:6,sizeAttenuation:!1,depthTest:!1,depthWrite:!1,transparent:!0,opacity:.9}),i=new a.Points(e,s);return i.layers.set(Ne),i.renderOrder=1e3,i.visible=!1,i},_e=t=>{const e=new a.EdgesGeometry(t),s=new a.LineSegments(e,new a.LineBasicMaterial({color:ze,linewidth:1}));return s.layers.set(Ue),s},We=t=>{const e={x:t.position.x,y:t.position.y,z:t.position.z},s={x:t.rotation.x,y:t.rotation.y,z:t.rotation.z},i={x:t.scale.x,y:t.scale.y,z:t.scale.z},r=new a.Box3().setFromObject(t),o=new a.Vector3;r.getSize(o);const n={x:o.x,y:o.y,z:o.z};return{position:e,rotation:s,scale:i,size:n}};var Be=Object.getOwnPropertyDescriptor,Ze=(t,e,s,i)=>{for(var r=i>1?void 0:i?Be(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},ue=(t,e)=>(s,i)=>e(s,i,t);d.EditorRenderer=class extends N{constructor(e,s){super(e),this._canvas=e,this._bus=s;const i=new a.GridHelper(10,10);i.position.y=-.001,this.scene.add(i);const r=new I.SymmetricAxesHelper(6);this.scene.add(r),this._orbit=new I.OrbitWithState(this.camera,this.renderer.domElement),this._orbit.enableDamping=!0,this._orbit.dampingFactor=.05,this._cameraGizmo=new I.CameraAxesGizmo(this.renderer,this.camera,{size:96,margin:36}),this._raycaster=new a.Raycaster,this._mouse=new a.Vector2,this.scene.add(new a.HemisphereLight(16777215,4473924,.6)),this.camera.layers.enable(0),this.camera.layers.enable(1),this._transform=new I.ModelingTransformControls(this.camera,this.renderer.domElement),this._transformHelper=this._transform.getHelper(),this.scene.add(this._transformHelper),this._isEventListenersAdded||this._initMouseListeners()}_orbit;_transform;_transformHelper;_raycaster;_mouse;_isEventListenersAdded=!1;_lastHovered=null;_cameraGizmo;_transformListeners=new Set;update(){this._orbit.update()}addFigure(e){const s=super.addFigure(e);s.layers.enable(le);const i=_e(s.geometry);s.add(i);const r=de(s.geometry);return s.add(r),s}setTransformControlsMode(e){this._transform.setMode(e)}attachTransformControls(e){this._transform.attach(e)}detachTransformControls(){this._transform.detach()}onTransformChange(e){return this._transformListeners.add(e),()=>this._transformListeners.delete(e)}setRaycastMode(e){const s=this._raycaster;switch(s.params.Line.threshold=0,s.params.Points.threshold=0,e){case l.SelectMode.Mesh:case l.SelectMode.Face:s.layers.set(0);break;case l.SelectMode.Edge:s.layers.set(1),s.params.Line.threshold=ke;break;case l.SelectMode.Vertex:s.layers.set(2),s.params.Points.threshold=He;break}}dispose(){this._isEventListenersAdded&&(this.canvas.removeEventListener("mousemove",this._handleMouseMove,!1),this.canvas.removeEventListener("click",this._handleMouseClick,!1),this.canvas.removeEventListener("pointerdown",e=>this._transform.pointerDown(e)),this.canvas.removeEventListener("pointermove",e=>this._transform.pointerMove(e)),this.canvas.removeEventListener("pointerup",e=>this._transform.pointerUp(e)),this.canvas.removeEventListener("pointerleave",()=>this._transform.pointerHover(null)),this._transform.removeEventListener("dragging-changed",()=>{this._orbit.enabled=!this._transform.dragging}),this._transformListeners.clear(),this._isEventListenersAdded=!1),this._orbit?.dispose(),this._transform?.dispose(),this._transformHelper?.parent&&this._transformHelper.parent.remove(this._transformHelper),this._lastHovered=null,super.dispose()}render(){super.render(),this._cameraGizmo.render(this.canvas.width,this.canvas.height)}_initMouseListeners(){this.canvas.addEventListener("mousemove",this._handleMouseMove,!1),this.canvas.addEventListener("click",this._handleMouseClick,!1),this.canvas.addEventListener("pointerdown",e=>this._transform.pointerDown(e)),this.canvas.addEventListener("pointermove",e=>this._transform.pointerMove(e)),this.canvas.addEventListener("pointerup",e=>this._transform.pointerUp(e)),this.canvas.addEventListener("pointerleave",()=>this._transform.pointerHover(null)),this._transform.addEventListener("dragging-changed",()=>{this._orbit.enabled=!this._transform.dragging}),this._transform.addEventListener("objectChange",()=>{for(const e of this._transformListeners)e()}),this._isEventListenersAdded=!0}_handleMouseMove=e=>{this._processRaycastEvent(e,T.SelectHover,!0)};_handleMouseClick=e=>{this._processRaycastEvent(e,T.SelectClick,!1)};_processRaycastEvent(e,s,i){if(this._orbit.isInteracting||this._transform.dragging)return;const r=this._canvas.getBoundingClientRect();this._mouse.x=(e.clientX-r.left)/r.width*2-1,this._mouse.y=-((e.clientY-r.top)/r.height)*2+1,this._raycaster.setFromCamera(this._mouse,this.camera);const n=this._raycaster.intersectObjects(this.meshes,!0)[0]??null,u=n?.object??null;i?u!==this._lastHovered&&(this.meshes.forEach(p=>p.userData.isHit=!1),u&&(u.userData.isHit=!0),this._lastHovered=u,this._bus.emit(s,n?{intersection:n}:null)):this._bus.emit(s,n?{intersection:n}:null)}},d.EditorRenderer=Ze([h.injectable(),ue(0,h.inject("Canvas")),ue(1,h.inject("EventBus"))],d.EditorRenderer);const pe={type:"change"},z={type:"start"},me={type:"end"},k=new c.Ray,fe=new c.Plane,$e=Math.cos(70*c.MathUtils.DEG2RAD),f=new c.Vector3,v=2*Math.PI,_={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6},F=1e-6;class Xe extends c.Controls{constructor(e,s=null){super(e,s),this.state=_.NONE,this.target=new c.Vector3,this.cursor=new c.Vector3,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minTargetRadius=0,this.maxTargetRadius=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.05,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.keyRotateSpeed=1,this.enablePan=!0,this.panSpeed=1,this.screenSpacePanning=!0,this.keyPanSpeed=7,this.zoomToCursor=!1,this.autoRotate=!1,this.autoRotateSpeed=2,this.keys={LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",BOTTOM:"ArrowDown"},this.mouseButtons={LEFT:c.MOUSE.ROTATE,MIDDLE:c.MOUSE.DOLLY,RIGHT:c.MOUSE.PAN},this.touches={ONE:c.TOUCH.ROTATE,TWO:c.TOUCH.DOLLY_PAN},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this._domElementKeyEvents=null,this._lastPosition=new c.Vector3,this._lastQuaternion=new c.Quaternion,this._lastTargetPosition=new c.Vector3,this._quat=new c.Quaternion().setFromUnitVectors(e.up,new c.Vector3(0,1,0)),this._quatInverse=this._quat.clone().invert(),this._spherical=new c.Spherical,this._sphericalDelta=new c.Spherical,this._scale=1,this._panOffset=new c.Vector3,this._rotateStart=new c.Vector2,this._rotateEnd=new c.Vector2,this._rotateDelta=new c.Vector2,this._panStart=new c.Vector2,this._panEnd=new c.Vector2,this._panDelta=new c.Vector2,this._dollyStart=new c.Vector2,this._dollyEnd=new c.Vector2,this._dollyDelta=new c.Vector2,this._dollyDirection=new c.Vector3,this._mouse=new c.Vector2,this._performCursorZoom=!1,this._pointers=[],this._pointerPositions={},this._controlActive=!1,this._onPointerMove=Ke.bind(this),this._onPointerDown=Ge.bind(this),this._onPointerUp=qe.bind(this),this._onContextMenu=rt.bind(this),this._onMouseWheel=et.bind(this),this._onKeyDown=tt.bind(this),this._onTouchStart=st.bind(this),this._onTouchMove=it.bind(this),this._onMouseDown=Qe.bind(this),this._onMouseMove=Je.bind(this),this._interceptControlDown=ot.bind(this),this._interceptControlUp=nt.bind(this),this.domElement!==null&&this.connect(this.domElement),this.update()}connect(e){super.connect(e),this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointercancel",this._onPointerUp),this.domElement.addEventListener("contextmenu",this._onContextMenu),this.domElement.addEventListener("wheel",this._onMouseWheel,{passive:!1}),this.domElement.getRootNode().addEventListener("keydown",this._interceptControlDown,{passive:!0,capture:!0}),this.domElement.style.touchAction="none"}disconnect(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.domElement.removeEventListener("pointercancel",this._onPointerUp),this.domElement.removeEventListener("wheel",this._onMouseWheel),this.domElement.removeEventListener("contextmenu",this._onContextMenu),this.stopListenToKeyEvents(),this.domElement.getRootNode().removeEventListener("keydown",this._interceptControlDown,{capture:!0}),this.domElement.style.touchAction="auto"}dispose(){this.disconnect()}getPolarAngle(){return this._spherical.phi}getAzimuthalAngle(){return this._spherical.theta}getDistance(){return this.object.position.distanceTo(this.target)}listenToKeyEvents(e){e.addEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=e}stopListenToKeyEvents(){this._domElementKeyEvents!==null&&(this._domElementKeyEvents.removeEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=null)}saveState(){this.target0.copy(this.target),this.position0.copy(this.object.position),this.zoom0=this.object.zoom}reset(){this.target.copy(this.target0),this.object.position.copy(this.position0),this.object.zoom=this.zoom0,this.object.updateProjectionMatrix(),this.dispatchEvent(pe),this.update(),this.state=_.NONE}update(e=null){const s=this.object.position;f.copy(s).sub(this.target),f.applyQuaternion(this._quat),this._spherical.setFromVector3(f),this.autoRotate&&this.state===_.NONE&&this._rotateLeft(this._getAutoRotationAngle(e)),this.enableDamping?(this._spherical.theta+=this._sphericalDelta.theta*this.dampingFactor,this._spherical.phi+=this._sphericalDelta.phi*this.dampingFactor):(this._spherical.theta+=this._sphericalDelta.theta,this._spherical.phi+=this._sphericalDelta.phi);let i=this.minAzimuthAngle,r=this.maxAzimuthAngle;isFinite(i)&&isFinite(r)&&(i<-Math.PI?i+=v:i>Math.PI&&(i-=v),r<-Math.PI?r+=v:r>Math.PI&&(r-=v),i<=r?this._spherical.theta=Math.max(i,Math.min(r,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(i+r)/2?Math.max(i,this._spherical.theta):Math.min(r,this._spherical.theta)),this._spherical.phi=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,this._spherical.phi)),this._spherical.makeSafe(),this.enableDamping===!0?this.target.addScaledVector(this._panOffset,this.dampingFactor):this.target.add(this._panOffset),this.target.sub(this.cursor),this.target.clampLength(this.minTargetRadius,this.maxTargetRadius),this.target.add(this.cursor);let o=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{const n=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),o=n!=this._spherical.radius}if(f.setFromSpherical(this._spherical),f.applyQuaternion(this._quatInverse),s.copy(this.target).add(f),this.object.lookAt(this.target),this.enableDamping===!0?(this._sphericalDelta.theta*=1-this.dampingFactor,this._sphericalDelta.phi*=1-this.dampingFactor,this._panOffset.multiplyScalar(1-this.dampingFactor)):(this._sphericalDelta.set(0,0,0),this._panOffset.set(0,0,0)),this.zoomToCursor&&this._performCursorZoom){let n=null;if(this.object.isPerspectiveCamera){const u=f.length();n=this._clampDistance(u*this._scale);const p=u-n;this.object.position.addScaledVector(this._dollyDirection,p),this.object.updateMatrixWorld(),o=!!p}else if(this.object.isOrthographicCamera){const u=new c.Vector3(this._mouse.x,this._mouse.y,0);u.unproject(this.object);const p=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),o=p!==this.object.zoom;const g=new c.Vector3(this._mouse.x,this._mouse.y,0);g.unproject(this.object),this.object.position.sub(g).add(u),this.object.updateMatrixWorld(),n=f.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),this.zoomToCursor=!1;n!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(n).add(this.object.position):(k.origin.copy(this.object.position),k.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(k.direction))<$e?this.object.lookAt(this.target):(fe.setFromNormalAndCoplanarPoint(this.object.up,this.target),k.intersectPlane(fe,this.target))))}else if(this.object.isOrthographicCamera){const n=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),n!==this.object.zoom&&(this.object.updateProjectionMatrix(),o=!0)}return this._scale=1,this._performCursorZoom=!1,o||this._lastPosition.distanceToSquared(this.object.position)>F||8*(1-this._lastQuaternion.dot(this.object.quaternion))>F||this._lastTargetPosition.distanceToSquared(this.target)>F?(this.dispatchEvent(pe),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(e){return e!==null?v/60*this.autoRotateSpeed*e:v/60/60*this.autoRotateSpeed}_getZoomScale(e){const s=Math.abs(e*.01);return Math.pow(.95,this.zoomSpeed*s)}_rotateLeft(e){this._sphericalDelta.theta-=e}_rotateUp(e){this._sphericalDelta.phi-=e}_panLeft(e,s){f.setFromMatrixColumn(s,0),f.multiplyScalar(-e),this._panOffset.add(f)}_panUp(e,s){this.screenSpacePanning===!0?f.setFromMatrixColumn(s,1):(f.setFromMatrixColumn(s,0),f.crossVectors(this.object.up,f)),f.multiplyScalar(e),this._panOffset.add(f)}_pan(e,s){const i=this.domElement;if(this.object.isPerspectiveCamera){const r=this.object.position;f.copy(r).sub(this.target);let o=f.length();o*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*e*o/i.clientHeight,this.object.matrix),this._panUp(2*s*o/i.clientHeight,this.object.matrix)}else this.object.isOrthographicCamera?(this._panLeft(e*(this.object.right-this.object.left)/this.object.zoom/i.clientWidth,this.object.matrix),this._panUp(s*(this.object.top-this.object.bottom)/this.object.zoom/i.clientHeight,this.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),this.enablePan=!1)}_dollyOut(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale/=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_dollyIn(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale*=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_updateZoomParameters(e,s){if(!this.zoomToCursor)return;this._performCursorZoom=!0;const i=this.domElement.getBoundingClientRect(),r=e-i.left,o=s-i.top,n=i.width,u=i.height;this._mouse.x=r/n*2-1,this._mouse.y=-(o/u)*2+1,this._dollyDirection.set(this._mouse.x,this._mouse.y,1).unproject(this.object).sub(this.object.position).normalize()}_clampDistance(e){return Math.max(this.minDistance,Math.min(this.maxDistance,e))}_handleMouseDownRotate(e){this._rotateStart.set(e.clientX,e.clientY)}_handleMouseDownDolly(e){this._updateZoomParameters(e.clientX,e.clientX),this._dollyStart.set(e.clientX,e.clientY)}_handleMouseDownPan(e){this._panStart.set(e.clientX,e.clientY)}_handleMouseMoveRotate(e){this._rotateEnd.set(e.clientX,e.clientY),this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const s=this.domElement;this._rotateLeft(v*this._rotateDelta.x/s.clientHeight),this._rotateUp(v*this._rotateDelta.y/s.clientHeight),this._rotateStart.copy(this._rotateEnd),this.update()}_handleMouseMoveDolly(e){this._dollyEnd.set(e.clientX,e.clientY),this._dollyDelta.subVectors(this._dollyEnd,this._dollyStart),this._dollyDelta.y>0?this._dollyOut(this._getZoomScale(this._dollyDelta.y)):this._dollyDelta.y<0&&this._dollyIn(this._getZoomScale(this._dollyDelta.y)),this._dollyStart.copy(this._dollyEnd),this.update()}_handleMouseMovePan(e){this._panEnd.set(e.clientX,e.clientY),this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd),this.update()}_handleMouseWheel(e){this._updateZoomParameters(e.clientX,e.clientY),e.deltaY<0?this._dollyIn(this._getZoomScale(e.deltaY)):e.deltaY>0&&this._dollyOut(this._getZoomScale(e.deltaY)),this.update()}_handleKeyDown(e){let s=!1;switch(e.code){case this.keys.UP:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(v*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,this.keyPanSpeed),s=!0;break;case this.keys.BOTTOM:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(-v*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,-this.keyPanSpeed),s=!0;break;case this.keys.LEFT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(v*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(this.keyPanSpeed,0),s=!0;break;case this.keys.RIGHT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(-v*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(-this.keyPanSpeed,0),s=!0;break}s&&(e.preventDefault(),this.update())}_handleTouchStartRotate(e){if(this._pointers.length===1)this._rotateStart.set(e.pageX,e.pageY);else{const s=this._getSecondPointerPosition(e),i=.5*(e.pageX+s.x),r=.5*(e.pageY+s.y);this._rotateStart.set(i,r)}}_handleTouchStartPan(e){if(this._pointers.length===1)this._panStart.set(e.pageX,e.pageY);else{const s=this._getSecondPointerPosition(e),i=.5*(e.pageX+s.x),r=.5*(e.pageY+s.y);this._panStart.set(i,r)}}_handleTouchStartDolly(e){const s=this._getSecondPointerPosition(e),i=e.pageX-s.x,r=e.pageY-s.y,o=Math.sqrt(i*i+r*r);this._dollyStart.set(0,o)}_handleTouchStartDollyPan(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enablePan&&this._handleTouchStartPan(e)}_handleTouchStartDollyRotate(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enableRotate&&this._handleTouchStartRotate(e)}_handleTouchMoveRotate(e){if(this._pointers.length==1)this._rotateEnd.set(e.pageX,e.pageY);else{const i=this._getSecondPointerPosition(e),r=.5*(e.pageX+i.x),o=.5*(e.pageY+i.y);this._rotateEnd.set(r,o)}this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const s=this.domElement;this._rotateLeft(v*this._rotateDelta.x/s.clientHeight),this._rotateUp(v*this._rotateDelta.y/s.clientHeight),this._rotateStart.copy(this._rotateEnd)}_handleTouchMovePan(e){if(this._pointers.length===1)this._panEnd.set(e.pageX,e.pageY);else{const s=this._getSecondPointerPosition(e),i=.5*(e.pageX+s.x),r=.5*(e.pageY+s.y);this._panEnd.set(i,r)}this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd)}_handleTouchMoveDolly(e){const s=this._getSecondPointerPosition(e),i=e.pageX-s.x,r=e.pageY-s.y,o=Math.sqrt(i*i+r*r);this._dollyEnd.set(0,o),this._dollyDelta.set(0,Math.pow(this._dollyEnd.y/this._dollyStart.y,this.zoomSpeed)),this._dollyOut(this._dollyDelta.y),this._dollyStart.copy(this._dollyEnd);const n=(e.pageX+s.x)*.5,u=(e.pageY+s.y)*.5;this._updateZoomParameters(n,u)}_handleTouchMoveDollyPan(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enablePan&&this._handleTouchMovePan(e)}_handleTouchMoveDollyRotate(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enableRotate&&this._handleTouchMoveRotate(e)}_addPointer(e){this._pointers.push(e.pointerId)}_removePointer(e){delete this._pointerPositions[e.pointerId];for(let s=0;s<this._pointers.length;s++)if(this._pointers[s]==e.pointerId){this._pointers.splice(s,1);return}}_isTrackingPointer(e){for(let s=0;s<this._pointers.length;s++)if(this._pointers[s]==e.pointerId)return!0;return!1}_trackPointer(e){let s=this._pointerPositions[e.pointerId];s===void 0&&(s=new c.Vector2,this._pointerPositions[e.pointerId]=s),s.set(e.pageX,e.pageY)}_getSecondPointerPosition(e){const s=e.pointerId===this._pointers[0]?this._pointers[1]:this._pointers[0];return this._pointerPositions[s]}_customWheelEvent(e){const s=e.deltaMode,i={clientX:e.clientX,clientY:e.clientY,deltaY:e.deltaY};switch(s){case 1:i.deltaY*=16;break;case 2:i.deltaY*=100;break}return e.ctrlKey&&!this._controlActive&&(i.deltaY*=10),i}}function Ge(t){this.enabled!==!1&&(this._pointers.length===0&&(this.domElement.setPointerCapture(t.pointerId),this.domElement.addEventListener("pointermove",this._onPointerMove),this.domElement.addEventListener("pointerup",this._onPointerUp)),!this._isTrackingPointer(t)&&(this._addPointer(t),t.pointerType==="touch"?this._onTouchStart(t):this._onMouseDown(t)))}function Ke(t){this.enabled!==!1&&(t.pointerType==="touch"?this._onTouchMove(t):this._onMouseMove(t))}function qe(t){switch(this._removePointer(t),this._pointers.length){case 0:this.domElement.releasePointerCapture(t.pointerId),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.dispatchEvent(me),this.state=_.NONE;break;case 1:const e=this._pointers[0],s=this._pointerPositions[e];this._onTouchStart({pointerId:e,pageX:s.x,pageY:s.y});break}}function Qe(t){let e;switch(t.button){case 0:e=this.mouseButtons.LEFT;break;case 1:e=this.mouseButtons.MIDDLE;break;case 2:e=this.mouseButtons.RIGHT;break;default:e=-1}switch(e){case c.MOUSE.DOLLY:if(this.enableZoom===!1)return;this._handleMouseDownDolly(t),this.state=_.DOLLY;break;case c.MOUSE.ROTATE:if(t.ctrlKey||t.metaKey||t.shiftKey){if(this.enablePan===!1)return;this._handleMouseDownPan(t),this.state=_.PAN}else{if(this.enableRotate===!1)return;this._handleMouseDownRotate(t),this.state=_.ROTATE}break;case c.MOUSE.PAN:if(t.ctrlKey||t.metaKey||t.shiftKey){if(this.enableRotate===!1)return;this._handleMouseDownRotate(t),this.state=_.ROTATE}else{if(this.enablePan===!1)return;this._handleMouseDownPan(t),this.state=_.PAN}break;default:this.state=_.NONE}this.state!==_.NONE&&this.dispatchEvent(z)}function Je(t){switch(this.state){case _.ROTATE:if(this.enableRotate===!1)return;this._handleMouseMoveRotate(t);break;case _.DOLLY:if(this.enableZoom===!1)return;this._handleMouseMoveDolly(t);break;case _.PAN:if(this.enablePan===!1)return;this._handleMouseMovePan(t);break}}function et(t){this.enabled===!1||this.enableZoom===!1||this.state!==_.NONE||(t.preventDefault(),this.dispatchEvent(z),this._handleMouseWheel(this._customWheelEvent(t)),this.dispatchEvent(me))}function tt(t){this.enabled!==!1&&this._handleKeyDown(t)}function st(t){switch(this._trackPointer(t),this._pointers.length){case 1:switch(this.touches.ONE){case c.TOUCH.ROTATE:if(this.enableRotate===!1)return;this._handleTouchStartRotate(t),this.state=_.TOUCH_ROTATE;break;case c.TOUCH.PAN:if(this.enablePan===!1)return;this._handleTouchStartPan(t),this.state=_.TOUCH_PAN;break;default:this.state=_.NONE}break;case 2:switch(this.touches.TWO){case c.TOUCH.DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchStartDollyPan(t),this.state=_.TOUCH_DOLLY_PAN;break;case c.TOUCH.DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchStartDollyRotate(t),this.state=_.TOUCH_DOLLY_ROTATE;break;default:this.state=_.NONE}break;default:this.state=_.NONE}this.state!==_.NONE&&this.dispatchEvent(z)}function it(t){switch(this._trackPointer(t),this.state){case _.TOUCH_ROTATE:if(this.enableRotate===!1)return;this._handleTouchMoveRotate(t),this.update();break;case _.TOUCH_PAN:if(this.enablePan===!1)return;this._handleTouchMovePan(t),this.update();break;case _.TOUCH_DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchMoveDollyPan(t),this.update();break;case _.TOUCH_DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchMoveDollyRotate(t),this.update();break;default:this.state=_.NONE}}function rt(t){this.enabled!==!1&&t.preventDefault()}function ot(t){t.key==="Control"&&(this._controlActive=!0,this.domElement.getRootNode().addEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}function nt(t){t.key==="Control"&&(this._controlActive=!1,this.domElement.getRootNode().removeEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}class at extends N{_orbit;constructor(e){super(e),this.camera.position.set(1,1,7),this.camera.lookAt(0,0,0),this._orbit=new Xe(this.camera,this.canvas),this._orbit.target.set(0,0,0),this._orbit.minPolarAngle=Math.PI/2,this._orbit.maxPolarAngle=Math.PI/2,this._orbit.enableRotate=!0,this._orbit.enableZoom=!1,this._orbit.enablePan=!1}update(){this._orbit?.update()}}class ht{_positions=[];_normals=[];_uvs=[];_tmpPositions=[];_tmpNormals=[];_tmpUVs=[];load(e){const s=e.split(`
2
- `);for(const r of s){if(!r.trim()||r.startsWith("#"))continue;const o=r.trim().split(/\s+/);switch(o[0]){case"v":this._tmpPositions.push(o.slice(1).map(Number));break;case"vn":this._tmpNormals.push(o.slice(1).map(Number));break;case"vt":this._tmpUVs.push(o.slice(1).map(Number));break;case"f":this.processFaceLine(o);break}}const i={type:l.FigureType.Custom,position:this._positions,...this._normals.length>0&&{normal:this._normals},...this._uvs.length>0&&{uv:this._uvs}};return new l.Figure(i)}processFaceLine(e){for(let s=1;s<e.length;s++){const i=e[s];if(!i)continue;const[r,o,n]=i.split("/"),u=r?parseInt(r,10):void 0,p=o?parseInt(o,10):void 0,g=n?parseInt(n,10):void 0;if(u!==void 0){const b=this._tmpPositions[u-1];b&&this._positions.push(...b)}if(p!==void 0){const b=this._tmpUVs[p-1];b&&this._uvs.push(...b)}if(g!==void 0){const b=this._tmpNormals[g-1];b&&this._normals.push(...b)}}}}var lt=Object.getOwnPropertyDescriptor,ct=(t,e,s,i)=>{for(var r=i>1?void 0:i?lt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},ge=(t,e)=>(s,i)=>e(s,i,t);let Y=class{constructor(t,e){this._store=e,this._handlers=new Map(t.map(s=>[s.mode,s]))}_currentMode=l.DisplayMode.Plane;_handlers;manage(t){t!==this._currentMode&&(this._handlers.get(this._currentMode)?.rollback(),t!==l.DisplayMode.Plane&&this._handlers.get(t)?.handle(),this._currentMode=t,this._store.setDisplayMode(this._currentMode))}dispose(){this._handlers&&this._handlers.clear(),this._currentMode=l.DisplayMode.Plane,this._store.setDisplayMode(this._currentMode)}};Y=ct([h.injectable(),ge(0,h.injectAll("IDisplayHandler")),ge(1,h.inject("IEditorStore"))],Y);var y=(t=>(t.Hover="hover",t.Click="click",t))(y||{}),dt=Object.getOwnPropertyDescriptor,_t=(t,e,s,i)=>{for(var r=i>1?void 0:i?dt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},W=(t,e)=>(s,i)=>e(s,i,t);let B=class{constructor(t,e,s){this._eventBus=t,this._store=s,this._handlers=new Map(e.map(i=>[i.mode,i])),this._eventBus.on(T.SelectHover,this._onHover),this._eventBus.on(T.SelectClick,this._onClick)}_currentMode=l.SelectMode.Mesh;_handlers;manage(t){t!==this._currentMode&&(this._handlers.get(this._currentMode)?.rollback(),this._currentMode=t,this._store.setSelectMode(this._currentMode))}_onHover=t=>{this._handlers.get(this._currentMode)?.handle(t,y.Hover)};_onClick=t=>{this._handlers.get(this._currentMode)?.handle(t,y.Click)};dispose(){this._handlers&&this._handlers.clear(),this._eventBus.off(T.SelectHover,this._onHover),this._currentMode=l.SelectMode.Mesh,this._store.setSelectMode(this._currentMode)}};B=_t([h.injectable(),W(0,h.inject("EventBus")),W(1,h.injectAll("ISelectHandler")),W(2,h.inject("IEditorStore"))],B);class ut{isToolEnabled(e,s){return l.DEFAULT_TOOL_RULES[s].includes(e)}getEnabledTools(e){return l.DEFAULT_TOOL_RULES[e]}}var pt=Object.getOwnPropertyDescriptor,mt=(t,e,s,i)=>{for(var r=i>1?void 0:i?pt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},be=(t,e)=>(s,i)=>e(s,i,t);let Z=class{constructor(t,e){this._store=e,this._handlers=new Map(t.map(s=>[s.mode,s])),this._unsubSelected=this._store.onSelectedObjectChange(()=>{this._handlers.get(this._currentTool)?.handle()}),this._policy=new ut}_currentTool=l.ToolType.Translate;_handlers;_unsubSelected;_policy;manage(t){if(this._currentTool===t)return;const e=this._store.getSelectMode();this._policy.isToolEnabled(t,e)&&(this._handlers.get(this._currentTool)?.rollback(),this._currentTool=t,this._store.setToolType(this._currentTool),this._handlers.get(this._currentTool)?.handle())}dispose(){this._unsubSelected?.(),this._handlers&&this._handlers.clear(),this._currentTool=l.ToolType.Translate,this._store.setToolType(this._currentTool)}};Z=mt([h.injectable(),be(0,h.injectAll("IToolHandler")),be(1,h.inject("IEditorStore"))],Z);var ft=Object.getOwnPropertyDescriptor,gt=(t,e,s,i)=>{for(var r=i>1?void 0:i?ft(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},bt=(t,e)=>(s,i)=>e(s,i,t);let $=class{_currentMode=l.SceneMode.AddFigure;_handlers;constructor(t){this._handlers=new Map(t.map(e=>[e.mode,e]))}manage(t,e){t===l.SceneMode.AddFigure?this._handlers.get(t)?.handle(e):this._handlers.get(t)?.handle(),this._currentMode=t}dispose(){this._handlers&&this._handlers.clear(),this._currentMode=l.SceneMode.AddFigure}};$=gt([h.injectable(),bt(0,h.injectAll("ISceneHandler"))],$);var vt=Object.getOwnPropertyDescriptor,Mt=(t,e,s,i)=>{for(var r=i>1?void 0:i?vt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},yt=(t,e)=>(s,i)=>e(s,i,t);let X=class{constructor(t){this._api=t}mode=l.DisplayMode.Wireframe;_prevWireframe=new Map;_prevColorMesh=new Map;_prevColorLines=new Map;_wireColor=new a.Color(65535);handle(){const t=this._api.getMeshes();for(const e of t){const s=Array.isArray(e.material)?e.material:[e.material];for(const i of s)this._enableWireframeOnMaterial(i);e.traverse(i=>{if(i.isLineSegments){const r=i;if(!this._prevColorLines.has(r.material)){const n=r.material;this._prevColorLines.set(n,n.color.clone())}const o=r.material;o.color.copy(this._wireColor),o.needsUpdate=!0}})}}rollback(){for(const[t,e]of this._prevWireframe)"wireframe"in t&&(t.wireframe=e),t.needsUpdate=!0;this._prevWireframe.clear();for(const[t,e]of this._prevColorMesh){const s=t;s.color?.isColor&&s.color.copy(e)}this._prevColorMesh.clear();for(const[t,e]of this._prevColorLines)t.color.copy(e);this._prevColorLines.clear()}dispose(){this.rollback()}_enableWireframeOnMaterial(t){const e=t;"wireframe"in e&&!this._prevWireframe.has(t)&&(this._prevWireframe.set(t,!!e.wireframe),e.wireframe=!0,t.needsUpdate=!0),e.color?.isColor&&(this._prevColorMesh.has(t)||this._prevColorMesh.set(t,e.color.clone()),e.color.copy(this._wireColor))}};X=Mt([h.injectable(),yt(0,h.inject("RendererApi"))],X);var St=Object.getOwnPropertyDescriptor,wt=(t,e,s,i)=>{for(var r=i>1?void 0:i?St(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},ve=(t,e)=>(s,i)=>e(s,i,t);let G=class{constructor(t,e){this._api=t,this._store=e}mode=l.SelectMode.Mesh;_hoveredMesh=null;_selectedMesh=null;_hoverColor=R;_selectColor=V;_origLineColors=new WeakMap;handle(t,e){if(this._api.setRaycastMode(this.mode),e===y.Hover){if(!t){this._hoveredMesh&&this._hoveredMesh!==this._selectedMesh&&this._restoreEdgesColor(this._hoveredMesh),this._hoveredMesh=null;return}const s=t.intersection.object;this._hoveredMesh!==s&&(this._hoveredMesh&&this._hoveredMesh!==this._selectedMesh&&this._restoreEdgesColor(this._hoveredMesh),s!==this._selectedMesh&&this._paintEdges(s,this._hoverColor),this._hoveredMesh=s)}if(e===y.Click){if(!t){this._selectedMesh&&(this._restoreEdgesColor(this._selectedMesh),this._selectedMesh=null,this._store.setSelectedObject(null));return}const s=t.intersection.object;this._selectedMesh&&this._selectedMesh!==s&&this._restoreEdgesColor(this._selectedMesh),this._paintEdges(s,this._selectColor),this._selectedMesh=s,this._store.setSelectedObject(s)}}rollback(){this._hoveredMesh&&this._restoreEdgesColor(this._hoveredMesh),this._selectedMesh&&this._restoreEdgesColor(this._selectedMesh),this._hoveredMesh=this._selectedMesh=null}dispose(){this.rollback()}_paintEdges(t,e){t.children.forEach(s=>{const i=s;if(i.isLineSegments&&i.material){const r=i.material;this._origLineColors.has(i)||this._origLineColors.set(i,r.color.clone()),r.color.setHex(e),r.needsUpdate=!0}})}_restoreEdgesColor(t){t.children.forEach(e=>{const s=e;if(s.isLineSegments&&s.material){const i=this._origLineColors.get(s);if(i){const r=s.material;r.color.copy(i),r.needsUpdate=!0}}})}};G=wt([h.injectable(),ve(0,h.inject("RendererApi")),ve(1,h.inject("IEditorStore"))],G);var Pt=Object.getOwnPropertyDescriptor,Ot=(t,e,s,i)=>{for(var r=i>1?void 0:i?Pt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},Lt=(t,e)=>(s,i)=>e(s,i,t);let K=class{constructor(t){this._api=t}mode=l.SelectMode.Face;_hovered=null;_selected=null;_hoverColor=R;_selectColor=V;_defaultColor=2236962;handle(t,e){this._api.setRaycastMode(this.mode),e===y.Hover&&console.log(t),e===y.Click&&console.log(t)}rollback(){throw new Error("Method not implemented.")}dispose(){throw new Error("Method not implemented.")}};K=Ot([h.injectable(),Lt(0,h.inject("RendererApi"))],K);var Tt=Object.getOwnPropertyDescriptor,Dt=(t,e,s,i)=>{for(var r=i>1?void 0:i?Tt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},Me=(t,e)=>(s,i)=>e(s,i,t);let q=class{constructor(t,e){this._api=t,this._store=e,this._api.enableCameraLayer(L),this._hoverVertex=this._makeOverlayVertex(this._hoverColor),this._selectVertex=this._makeOverlayVertex(this._selectColor),this._api.addObject(this._hoverVertex,L),this._api.addObject(this._selectVertex,L)}mode=l.SelectMode.Vertex;_hovered=null;_selected=null;_hoverVertex;_selectVertex;_hoverColor=R;_selectColor=V;handle(t,e){if(this._api.setRaycastMode(this.mode),e===y.Hover){if(!t){this._hoverVertex.visible=!1,this._hovered=null;return}const s=t.intersection.object;if(!s?.isPoints)return;const i=s,r=t.intersection.index??-1;if(r<0)return;this._selected&&this._same({points:i,index:r},this._selected)?this._hoverVertex.visible=!1:(this._writeWorldVertex(this._hoverVertex,i,r),this._hoverVertex.visible=!0);return}if(e===y.Click){if(!t){this._selectVertex.visible=!1,this._selected=null,this._store.setSelectedObject(null);return}const s=t.intersection.object;if(!s?.isPoints)return;const i=s,r=t.intersection.index??-1;if(r<0)return;this._writeWorldVertex(this._selectVertex,i,r),this._centerVertexOnPoint(this._selectVertex,i,r),this._selectVertex.visible=!0,this._prepareVertexMetadata(i,r),this._store.setSelectedObject(this._selectVertex),this._selected={points:i,index:r},this._hovered&&this._same(this._hovered,this._selected)&&(this._hoverVertex.visible=!1);return}}rollback(){this._hoverVertex.visible=!1,this._selectVertex.visible=!1,this._hovered=this._selected=null}dispose(){this.rollback(),this._api.removeObject(this._hoverVertex),this._api.removeObject(this._selectVertex),this._hoverVertex.geometry.dispose(),this._hoverVertex.material.dispose(),this._selectVertex.geometry.dispose(),this._selectVertex.material.dispose()}_makeOverlayVertex(t,e=Ie){const s=new a.BufferGeometry;s.setAttribute("position",new a.Float32BufferAttribute([0,0,0],3));const i=new a.PointsMaterial({color:t,size:e,sizeAttenuation:!1,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1}),r=new a.Points(s,i);return r.renderOrder=1e3,r.raycast=()=>{},r.layers.set(L),r.visible=!1,r}_writeWorldVertex(t,e,s){const i=e.geometry.getAttribute("position"),r=new a.Vector3(i.getX(s),i.getY(s),i.getZ(s)).applyMatrix4(e.matrixWorld),o=t.geometry.getAttribute("position");o.setXYZ(0,r.x,r.y,r.z),o.needsUpdate=!0}_same(t,e){return!!t&&!!e&&t.points===e.points&&t.index===e.index}_prepareVertexMetadata(t,e){const s=ce(t);if(!s)return;const i=t.geometry.getAttribute("position"),r=new a.Vector3(i.getX(e),i.getY(e),i.getZ(e)).applyMatrix4(t.matrixWorld),o=new a.Matrix4().copy(s.matrixWorld).invert(),n=r.clone().applyMatrix4(o),p=s.geometry.getAttribute("position"),g=1e-6,b=g*g,D=new a.Vector3,M=[];for(let w=0;w<p.count;w++)D.fromBufferAttribute(p,w),D.distanceToSquared(n)<b&&M.push(w);const O=s.children.find(w=>w?.isLineSegments);let S=[];if(O){const w=new a.Matrix4().copy(O.matrixWorld).invert(),H=r.clone().applyMatrix4(w),A=O.geometry.getAttribute("position"),U=new a.Vector3;for(let j=0;j<A.count;j++)U.fromBufferAttribute(A,j),U.distanceToSquared(H)<b&&S.push(j)}this._selectVertex.userData.vertexInfo={points:t,index:e,mesh:s,vertexIndices:M,lines:O??null,edgeVertexIndices:S}}_centerVertexOnPoint(t,e,s){const i=e.geometry.getAttribute("position"),r=new a.Vector3(i.getX(s),i.getY(s),i.getZ(s)).applyMatrix4(e.matrixWorld);t.position.copy(r);const o=t.geometry;let n=o.getAttribute("position");(!n||n.count<1)&&(o.setAttribute("position",new a.BufferAttribute(new Float32Array(3),3)),n=o.getAttribute("position")),n.setXYZ(0,0,0,0),n.needsUpdate=!0,t.quaternion.identity(),t.scale.set(1,1,1),t.updateMatrixWorld(!0)}};q=Dt([h.injectable(),Me(0,h.inject("RendererApi")),Me(1,h.inject("IEditorStore"))],q);class Q{constructor(e,s){this.api=e,this.store=s,this._unsubscribeTransform=this.api.onTransformChange(()=>{this.store.getSelectedObject()&&this.store.notifySelectedTransformChange?.()})}_unsubscribeTransform;handle(){const e=this.store.getSelectedObject();this.api.setMode(this.mode),e?this.api.attach(e):this.api.detach()}rollback(){this.api.detach()}dispose(){this.rollback(),this._unsubscribeTransform&&this._unsubscribeTransform()}}var Ct=Object.getOwnPropertyDescriptor,Et=(t,e,s,i)=>{for(var r=i>1?void 0:i?Ct(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},ye=(t,e)=>(s,i)=>e(s,i,t);let J=class extends Q{mode=l.ToolType.Translate;constructor(t,e){super(t,e)}};J=Et([h.injectable(),ye(0,h.inject("RendererApi")),ye(1,h.inject("IEditorStore"))],J);var jt=Object.getOwnPropertyDescriptor,At=(t,e,s,i)=>{for(var r=i>1?void 0:i?jt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},Se=(t,e)=>(s,i)=>e(s,i,t);let ee=class extends Q{mode=l.ToolType.Scale;constructor(t,e){super(t,e)}};ee=At([h.injectable(),Se(0,h.inject("RendererApi")),Se(1,h.inject("IEditorStore"))],ee);var xt=Object.getOwnPropertyDescriptor,It=(t,e,s,i)=>{for(var r=i>1?void 0:i?xt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},we=(t,e)=>(s,i)=>e(s,i,t);let te=class extends Q{mode=l.ToolType.Rotate;constructor(t,e){super(t,e)}};te=It([h.injectable(),we(0,h.inject("RendererApi")),we(1,h.inject("IEditorStore"))],te);var Rt=Object.getOwnPropertyDescriptor,Vt=(t,e,s,i)=>{for(var r=i>1?void 0:i?Rt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},Pe=(t,e)=>(s,i)=>e(s,i,t);let se=class{constructor(t,e){this._api=t,this._store=e,this._api.enableCameraLayer(L),this._hoverLine=this._makeOverlayLine(this._hoverColor),this._selectLine=this._makeOverlayLine(this._selectColor),this._api.addObject(this._hoverLine,L),this._api.addObject(this._selectLine,L)}mode=l.SelectMode.Edge;_hoverLine;_selectLine;_hovered=null;_selected=null;_hoverColor=R;_selectColor=V;handle(t,e){if(this._api.setRaycastMode(this.mode),e===y.Hover){if(!t){this._hoverLine.visible=!1,this._hovered=null;return}const s=t.intersection.object;if(!s?.isLineSegments)return;const i=s,r=Math.floor((t.intersection.index??-1)/2);if(r<0)return;this._selected&&this._same({lines:i,seg:r},this._selected)?this._hoverLine.visible=!1:(this._writeWorldSegment(this._hoverLine,i,r),this._hoverLine.visible=!0),this._hovered={lines:i,seg:r};return}if(e===y.Click){if(!t){this._selectLine.visible=!1,this._selected=null,this._store.setSelectedObject(null);return}const s=t.intersection.object;if(!s?.isLineSegments)return;const i=s,r=Math.floor((t.intersection.index??-1)/2);if(r<0)return;this._writeWorldSegment(this._selectLine,i,r),this._centerAndOrientLineOnSegment(this._selectLine,i,r),this._selectLine.visible=!0,this._prepareEdgeMetadata(i,r),this._store.setSelectedObject(this._selectLine),this._selected={lines:i,seg:r},this._hovered&&this._same(this._hovered,this._selected)&&(this._hoverLine.visible=!1)}}rollback(){this._hoverLine.visible=!1,this._selectLine.visible=!1,this._hovered=this._selected=null}dispose(){this.rollback(),this._api.removeObject(this._hoverLine),this._api.removeObject(this._selectLine),this._hoverLine.geometry.dispose(),this._hoverLine.material.dispose(),this._selectLine.geometry.dispose(),this._selectLine.material.dispose()}_makeOverlayLine(t){const e=new a.BufferGeometry;e.setAttribute("position",new a.Float32BufferAttribute(6,3));const s=new a.LineBasicMaterial({color:t,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1}),i=new a.Line(e,s);return i.renderOrder=1e3,i.raycast=()=>{},i.layers.set(L),i.visible=!1,i}_writeWorldSegment(t,e,s){const i=e.geometry.getAttribute("position"),r=s*2,o=r+1,n=new a.Vector3(i.getX(r),i.getY(r),i.getZ(r)).applyMatrix4(e.matrixWorld),u=new a.Vector3(i.getX(o),i.getY(o),i.getZ(o)).applyMatrix4(e.matrixWorld),p=t.geometry.getAttribute("position");p.setXYZ(0,n.x,n.y,n.z),p.setXYZ(1,u.x,u.y,u.z),p.needsUpdate=!0}_same(t,e){return!!t&&!!e&&t.lines===e.lines&&t.seg===e.seg}_centerAndOrientLineOnSegment(t,e,s){const i=e.geometry.getAttribute("position"),r=s*2,o=r+1,n=new a.Vector3(i.getX(r),i.getY(r),i.getZ(r)).applyMatrix4(e.matrixWorld),u=new a.Vector3(i.getX(o),i.getY(o),i.getZ(o)).applyMatrix4(e.matrixWorld),p=new a.Vector3().subVectors(u,n),g=p.length();if(!isFinite(g)||g===0)return;const b=new a.Vector3().addVectors(n,u).multiplyScalar(.5);t.position.copy(b);const D=t.geometry;let M=D.getAttribute("position");(!M||M.count<2)&&(D.setAttribute("position",new a.BufferAttribute(new Float32Array(6),3)),M=D.getAttribute("position")),M.setXYZ(0,-g/2,0,0),M.setXYZ(1,g/2,0,0),M.needsUpdate=!0,p.normalize();const O=new a.Quaternion().setFromUnitVectors(new a.Vector3(1,0,0),p);t.quaternion.copy(O),t.updateMatrixWorld(!0)}_prepareEdgeMetadata(t,e){const s=ce(t);if(!s)return;const i=t.geometry.getAttribute("position"),r=e*2,o=r+1,n=new a.Vector3(i.getX(r),i.getY(r),i.getZ(r)).applyMatrix4(t.matrixWorld),u=new a.Vector3(i.getX(o),i.getY(o),i.getZ(o)).applyMatrix4(t.matrixWorld),p=new a.Matrix4().copy(s.matrixWorld).invert(),g=n.clone().applyMatrix4(p),b=u.clone().applyMatrix4(p),M=s.geometry.getAttribute("position"),O=new a.Vector3,S=1e-6,w=[],H=[];for(let P=0;P<M.count;P++)O.fromBufferAttribute(M,P),O.distanceToSquared(g)<S*S?w.push(P):O.distanceToSquared(b)<S*S&&H.push(P);const A=new a.Matrix4().copy(t.matrixWorld).invert(),U=n.clone().applyMatrix4(A),j=u.clone().applyMatrix4(A),Te=t.geometry.getAttribute("position"),ae=new a.Vector3,De=[],Ce=[];for(let P=0;P<Te.count;P++)ae.fromBufferAttribute(Te,P),ae.distanceToSquared(U)<S*S?De.push(P):ae.distanceToSquared(j)<S*S&&Ce.push(P);this._selectLine.userData.edgeInfo={lines:t,seg:e,mesh:s,aIndices:w,bIndices:H,aEdgeIndices:De,bEdgeIndices:Ce}}};se=Vt([h.injectable(),Pe(0,h.inject("RendererApi")),Pe(1,h.inject("IEditorStore"))],se);var kt=Object.getOwnPropertyDescriptor,Ht=(t,e,s,i)=>{for(var r=i>1?void 0:i?kt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},Ut=(t,e)=>(s,i)=>e(s,i,t);let ie=class{constructor(t){this._api=t}mode=l.SceneMode.AddFigure;_lastAddedMesh=null;handle(t){const e=xe[t](),s=e.getAttribute("position");s&&s.setUsage&&s.setUsage(a.DynamicDrawUsage);const i=new a.Mesh(e,he);i.layers.enable(le);const r=_e(i.geometry);i.add(r);const o=de(i.geometry);i.add(o),this._api.addMesh(i),this._lastAddedMesh=i}rollback(){this._lastAddedMesh!==null&&(this._api.removeMesh(this._lastAddedMesh),this._lastAddedMesh=null)}dispose(){this._lastAddedMesh=null}};ie=Ht([h.injectable(),Ut(0,h.inject("RendererApi"))],ie);var Nt=Object.getOwnPropertyDescriptor,zt=(t,e,s,i)=>{for(var r=i>1?void 0:i?Nt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},Oe=(t,e)=>(s,i)=>e(s,i,t);let re=class{constructor(t,e){this._api=t,this._store=e}mode=l.SceneMode.DeleteFigure;_lastDeletedMesh=null;handle(){const t=this._store.getSelectedObject();Ye(t)&&(this._api.removeMesh(t),this._store.setSelectedObject(null),this._lastDeletedMesh=t)}rollback(){this._lastDeletedMesh&&(this._api.addMesh(this._lastDeletedMesh),this._lastDeletedMesh=null)}dispose(){this._lastDeletedMesh=null}};re=zt([h.injectable(),Oe(0,h.inject("RendererApi")),Oe(1,h.inject("IEditorStore"))],re);var Ft=Object.getOwnPropertyDescriptor,Yt=(t,e,s,i)=>{for(var r=i>1?void 0:i?Ft(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},Wt=(t,e)=>(s,i)=>e(s,i,t);let oe=class{constructor(t){this._renderer=t}addMesh(t){this._renderer.addMesh(t)}addMeshes(t){for(const e of t)this._renderer.addMesh(e)}removeMesh(t){this._renderer.removeMesh(t)}removeMeshes(t){for(const e of t)this._renderer.removeMesh(e)}getMeshes(){return this._renderer.getMeshes()}setMode(t){this._renderer.setTransformControlsMode(t)}attach(t){this._renderer.attachTransformControls(t)}detach(){this._renderer.detachTransformControls()}setRaycastMode(t){this._renderer.setRaycastMode(t)}addObject(t,e){this._renderer.addObject(t,e)}removeObject(t){this._renderer.removeObject(t)}enableCameraLayer(t){this._renderer.enableCameraLayer(t)}onTransformChange(t){return this._renderer.onTransformChange(t)}};oe=Yt([h.injectable(),Wt(0,h.inject("EditorRenderer"))],oe);var Bt=Object.getOwnPropertyDescriptor,Zt=(t,e,s,i)=>{for(var r=i>1?void 0:i?Bt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},C=(t,e)=>(s,i)=>e(s,i,t);d.EditorHub=class{constructor(e,s,i,r,o,n){this._displayManager=e,this._selectManager=s,this._toolManager=i,this._sceneManager=r,this._renderer=o,this._store=n,this.setSelectMode(l.SelectMode.Mesh),this.setToolMode(l.ToolType.Translate)}setDisplayMode(e){this._displayManager.manage(e)}setSceneMode(e){this._sceneManager.manage(e)}setSelectMode(e){this._selectManager.manage(e)}setToolMode(e){this._toolManager.manage(e)}resizeRenderer(){this._renderer.resize()}updateRenderer(){this._renderer.loop()}addFigure(e,s){this._sceneManager.manage(e,s)}getSelectionStats(){return this._store.getSelectionStats()}onSelectionStatsChange(e){const s=this._store.onSelectedObjectChange(()=>{e()}),i=this._store.onSelectedTransformChange(()=>{e()});return()=>{s(),i()}}dispose(){this._displayManager.dispose(),this._selectManager.dispose(),this._renderer.dispose()}},d.EditorHub=Zt([h.injectable(),C(0,h.inject("IDisplayManager")),C(1,h.inject("ISelectManager")),C(2,h.inject("IToolManager")),C(3,h.inject("ISceneManager")),C(4,h.inject("EditorRenderer")),C(5,h.inject("IEditorStore"))],d.EditorHub);var $t=Object.getOwnPropertyDescriptor,Xt=(t,e,s,i)=>{for(var r=i>1?void 0:i?$t(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r};let ne=class{_selectMode=l.SelectMode.Mesh;_toolType=l.ToolType.Translate;_displayMode=l.DisplayMode.Plane;_selectedObject=null;_selectedListeners=new Set;_transformListeners=new Set;constructor(){je.makeAutoObservable(this,{},{autoBind:!0})}getSelectMode(){return this._selectMode}getToolType(){return this._toolType}getDisplayMode(){return this._displayMode}setSelectMode(t){this._selectMode=t}setToolType(t){this._toolType=t}setDisplayMode(t){this._displayMode=t}getSelectedObject(){return this._selectedObject}getSelectionStats(){const t=this._selectedObject;return t?We(t):null}setSelectedObject(t){if(this._selectedObject!==t){this._selectedObject=t;for(const e of this._selectedListeners)e(this._selectedObject)}}onSelectedObjectChange(t){return this._selectedListeners.add(t),()=>this._selectedListeners.delete(t)}onSelectedTransformChange(t){return this._transformListeners.add(t),()=>this._transformListeners.delete(t)}notifySelectedTransformChange(){for(const t of this._transformListeners)t()}};ne=Xt([h.injectable()],ne);let Le=!1;const m=h.container.createChildContainer();function Gt(t){return Le||(m.registerInstance("Canvas",t),m.registerSingleton("EventBus",d.EventBus),m.registerSingleton("EditorRenderer",d.EditorRenderer),m.registerSingleton("RendererApi",oe),m.registerSingleton("IDisplayHandler",X),m.registerSingleton("ISelectHandler",G),m.registerSingleton("ISelectHandler",K),m.registerSingleton("ISelectHandler",se),m.registerSingleton("ISelectHandler",q),m.registerSingleton("IToolHandler",J),m.registerSingleton("IToolHandler",ee),m.registerSingleton("IToolHandler",te),m.registerSingleton("ISceneHandler",ie),m.registerSingleton("ISceneHandler",re),m.registerSingleton("IDisplayManager",Y),m.registerSingleton("ISelectManager",B),m.registerSingleton("IToolManager",Z),m.registerSingleton("ISceneManager",$),m.registerSingleton("EditorHub",d.EditorHub),m.registerSingleton("IEditorStore",ne),Le=!0),m}let E=null;const Kt=t=>(E||(E=Gt(t)),E.resolve("EditorHub")),qt=()=>{if(!E)throw new Error("EditorHub is not initialized. Call createAppHub(canvas) first.");return E.resolve("EditorHub")};d.EventTopics=T,d.ObjLoader=ht,d.PreviewRenderer=at,d.Renderer=N,d.createAppHub=Kt,d.getAppHub=qt,Object.defineProperty(d,Symbol.toStringTag,{value:"Module"})}));
1
+ (function(m,R){typeof exports=="object"&&typeof module<"u"?R(exports,require("reflect-metadata"),require("three"),require("tsyringe"),require("@planara/types"),require("@planara/three"),require("events"),require("mobx")):typeof define=="function"&&define.amd?define(["exports","reflect-metadata","three","tsyringe","@planara/types","@planara/three","events","mobx"],R):(m=typeof globalThis<"u"?globalThis:m||self,R(m.PlanaraCore={},m.Reflect,m.THREE,m.tsyringe,m.PlanaraTypes,m.PlanaraThree,m.events,m.mobx))})(this,(function(m,R,Ne,a,d,F,Ue,Xe){"use strict";function qe(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const s=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,s.get?s:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const c=qe(Ne);var Ye=Object.getOwnPropertyDescriptor,Ze=(e,t,r,s)=>{for(var i=s>1?void 0:s?Ye(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Ke=(e,t)=>(r,s)=>t(r,s,e);m.Renderer=class{scene;camera;renderer;canvas;constructor(t){this.canvas=t,this.scene=new c.Scene,this.scene.background=new c.Color(1710618),this.camera=new c.PerspectiveCamera(45,this.canvas.clientWidth/this.canvas.clientHeight,.1,1e3),this.camera.position.set(1,1,7),this.renderer=new c.WebGLRenderer({canvas:this.canvas,antialias:!0}),this.renderer.setSize(this.canvas.clientWidth,this.canvas.clientHeight);const r=new c.AmbientLight(16777215,.5);this.scene.add(r);const s=new c.DirectionalLight(16777215,1);s.position.set(5,10,7),this.scene.add(s)}resize(){this.camera.aspect=this.canvas.clientWidth/this.canvas.clientHeight,this.camera.updateProjectionMatrix(),this.renderer.setSize(this.canvas.clientWidth,this.canvas.clientHeight)}render(){this.renderer.render(this.scene,this.camera)}update(){}loop(){this.update(),this.render(),requestAnimationFrame(()=>this.loop())}getCamera(){return this.camera}getRenderer(){return this.renderer}getCanvas(){return this.canvas}getDomElement(){return this.renderer.domElement}getScene(){return this.scene}dispose(){this.scene=null,this.camera=null,this.renderer?.dispose(),this.canvas=null}},m.Renderer=Ze([a.injectable(),Ke(0,a.inject("Canvas"))],m.Renderer);class Qe{_positions=[];_normals=[];_uvs=[];_tmpPositions=[];_tmpNormals=[];_tmpUVs=[];load(t){const r=t.split(`
2
+ `);for(const i of r){if(!i.trim()||i.startsWith("#"))continue;const n=i.trim().split(/\s+/);switch(n[0]){case"v":this._tmpPositions.push(n.slice(1).map(Number));break;case"vn":this._tmpNormals.push(n.slice(1).map(Number));break;case"vt":this._tmpUVs.push(n.slice(1).map(Number));break;case"f":this.processFaceLine(n);break}}const s={type:d.FigureType.Custom,position:this._positions,...this._normals.length>0&&{normal:this._normals},...this._uvs.length>0&&{uv:this._uvs}};return new d.Figure(s)}processFaceLine(t){for(let r=1;r<t.length;r++){const s=t[r];if(!s)continue;const[i,n,o]=s.split("/"),l=i?parseInt(i,10):void 0,_=n?parseInt(n,10):void 0,u=o?parseInt(o,10):void 0;if(l!==void 0){const p=this._tmpPositions[l-1];p&&this._positions.push(...p)}if(_!==void 0){const p=this._tmpUVs[_-1];p&&this._uvs.push(...p)}if(u!==void 0){const p=this._tmpNormals[u-1];p&&this._normals.push(...p)}}}}var Je=Object.getOwnPropertyDescriptor,et=(e,t,r,s)=>{for(var i=s>1?void 0:s?Je(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},W=(e,t)=>(r,s)=>t(r,s,e);let q=class{constructor(e,t,r,s){this._updatable=e,this._renderable=t,this._runtime=r,this._renderer=s}_animationId=null;start(){const e=[...this._runtime,...this._updatable,...this._renderable];new Set(e).forEach(t=>t.init()),this._loop()}_loop(){this._updatable.forEach(e=>e.update()),this._renderer.render(),this._renderable.forEach(e=>e.render()),this._animationId=requestAnimationFrame(()=>this._loop())}stop(){this._animationId&&(cancelAnimationFrame(this._animationId),this._animationId=null)}dispose(){this._animationId=null}};q=et([a.injectable(),W(0,a.injectAll("IUpdatableModule")),W(1,a.injectAll("IRenderableModule")),W(2,a.injectAll("IRuntimeModule")),W(3,a.inject("IRenderable"))],q);var tt=Object.getOwnPropertyDescriptor,st=(e,t,r,s)=>{for(var i=s>1?void 0:s?tt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},rt=(e,t)=>(r,s)=>t(r,s,e);let Y=class{constructor(e){this._sceneModule=e}addMesh(e){this._sceneModule.addMesh(e)}addMeshes(e){this._sceneModule.addMeshes(e)}removeMesh(e){this._sceneModule.removeMesh(e)}removeMeshes(e){this._sceneModule.removeMeshes(e)}getMeshes(){return this._sceneModule.getMeshes()}};Y=st([a.injectable(),rt(0,a.inject("SceneModule"))],Y);var it=Object.getOwnPropertyDescriptor,nt=(e,t,r,s)=>{for(var i=s>1?void 0:s?it(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},ot=(e,t)=>(r,s)=>t(r,s,e);let Z=class{constructor(e){this._raycastModule=e}setRaycastMode(e){this._raycastModule.setRaycastMode(e)}};Z=nt([a.injectable(),ot(0,a.inject("RaycastModule"))],Z);var at=Object.getOwnPropertyDescriptor,ct=(e,t,r,s)=>{for(var i=s>1?void 0:s?at(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},lt=(e,t)=>(r,s)=>t(r,s,e);let K=class{constructor(e){this._controlsModule=e}attachTransform(e){this._controlsModule.attachTransform(e)}detachTransform(){this._controlsModule.detachTransform()}setTransformMode(e){this._controlsModule.setTransformMode(e)}onTransformChange(e){return this._controlsModule.onTransformChange(e)}};K=ct([a.injectable(),lt(0,a.inject("ControlsModule"))],K);var ht=Object.getOwnPropertyDescriptor,dt=(e,t,r,s)=>{for(var i=s>1?void 0:s?ht(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},_t=(e,t)=>(r,s)=>t(r,s,e);let Q=class{constructor(e){this._cameraAccessApi=e}getCamera(){return this._cameraAccessApi.getCamera()}enableCameraLayer(e){this._cameraAccessApi.getCamera().layers.enable(e)}disableCameraLayer(e){this._cameraAccessApi.getCamera().layers.disable(e)}};Q=dt([a.injectable(),_t(0,a.inject("IRendererCameraAccess"))],Q);var ut=Object.getOwnPropertyDescriptor,pt=(e,t,r,s)=>{for(var i=s>1?void 0:s?ut(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},mt=(e,t)=>(r,s)=>t(r,s,e);let J=class{constructor(e){this._domAccessApi=e}getCanvas(){return this._domAccessApi.getCanvas()}getDomElement(){return this._domAccessApi.getDomElement()}};J=pt([a.injectable(),mt(0,a.inject("IRendererDomAccess"))],J);var vt=Object.getOwnPropertyDescriptor,ft=(e,t,r,s)=>{for(var i=s>1?void 0:s?vt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},gt=(e,t)=>(r,s)=>t(r,s,e);let ee=class{constructor(e){this._sceneAccessApi=e}getScene(){return this._sceneAccessApi.getScene()}addToScene(e){this._sceneAccessApi.getScene().add(e)}removeFromScene(e){this._sceneAccessApi.getScene().remove(e)}addObject(e,t){const r=this._sceneAccessApi.getScene();r&&(typeof t=="number"&&e.layers.set(t),r.add(e))}};ee=ft([a.injectable(),gt(0,a.inject("IRendererSceneAccess"))],ee);var Mt=Object.getOwnPropertyDescriptor,bt=(e,t,r,s)=>{for(var i=s>1?void 0:s?Mt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},St=(e,t)=>(r,s)=>t(r,s,e);let te=class{constructor(e){this._controlsModule=e}isOrbitInteracting(){return this._controlsModule.isOrbitInteracting()}isTransformDragging(){return this._controlsModule.isTransformDragging()}};te=bt([a.injectable(),St(0,a.inject("ControlsModule"))],te);var At=Object.getOwnPropertyDescriptor,wt=(e,t,r,s)=>{for(var i=s>1?void 0:s?At(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},se=(e,t)=>(r,s)=>t(r,s,e);let re=class{constructor(e,t,r){this._cameraApi=e,this._domApi=t,this._sceneApi=r}_orbit=null;_transform=null;_transformHelper=null;_transformListeners=new Set;_isEventListenersAdded=!1;init(){this._orbit=new F.OrbitWithState(this._cameraApi.getCamera(),this._domApi.getDomElement()),this._orbit.enableDamping=!0,this._orbit.dampingFactor=.05,this._transform=new F.ModelingTransformControls(this._cameraApi.getCamera(),this._domApi.getDomElement()),this._transformHelper=this._transform.getHelper(),this._sceneApi.addToScene(this._transformHelper),this._initMouseListeners()}attachTransform(e){this._transform?.attach(e)}detachTransform(){this._transform?.detach()}update(){this._orbit?.update()}setTransformMode(e){this._transform?.setMode(e)}onTransformChange(e){return this._transformListeners.add(e),()=>this._transformListeners.delete(e)}isOrbitInteracting(){return!!this._orbit?.isInteracting}isTransformDragging(){return!!this._transform?.dragging}dispose(){if(this._isEventListenersAdded){const e=this._domApi.getCanvas();if(!this._transform||!this._orbit)return;e.removeEventListener("pointerdown",t=>this._transform?.pointerDown(t)),e.removeEventListener("pointermove",t=>this._transform?.pointerMove(t)),e.removeEventListener("pointerup",t=>this._transform?.pointerUp(t)),e.removeEventListener("pointerleave",()=>this._transform?.pointerHover(null)),this._transform.removeEventListener("dragging-changed",()=>{this._orbit.enabled=!this._transform?.dragging}),this._transformListeners.clear(),this._isEventListenersAdded=!1}this._orbit?.dispose(),this._orbit=null,this._transform?.dispose(),this._transform=null,this._transformHelper?.parent&&this._transformHelper.parent.remove(this._transformHelper)}_initMouseListeners(){const e=this._domApi.getCanvas();!this._transform||!this._orbit||(e.addEventListener("pointerdown",t=>this._transform?.pointerDown(t)),e.addEventListener("pointermove",t=>this._transform?.pointerMove(t)),e.addEventListener("pointerup",t=>this._transform?.pointerUp(t)),e.addEventListener("pointerleave",()=>this._transform?.pointerHover(null)),this._transform.addEventListener("dragging-changed",()=>{this._orbit.enabled=!this._transform?.dragging}),this._transform.addEventListener("objectChange",()=>{for(const t of this._transformListeners)t()}),this._isEventListenersAdded=!0)}};re=wt([a.injectable(),se(0,a.inject("ICameraApi")),se(1,a.inject("IDomApi")),se(2,a.inject("ISceneApi"))],re);var yt=Object.getOwnPropertyDescriptor,Ot=(e,t,r,s)=>{for(var i=s>1?void 0:s?yt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},ie=(e,t)=>(r,s)=>t(r,s,e);let ne=class{constructor(e,t,r){this._cameraApi=e,this._domApi=t,this._rendererApi=r}_cameraGizmo=null;init(){const e=this._cameraApi.getCamera(),t=this._rendererApi.getRenderer();this._cameraGizmo=new F.CameraAxesGizmo(t,e,{size:96,margin:36})}render(){const e=this._domApi.getCanvas();this._cameraGizmo?.render(e.width,e.height)}dispose(){this._cameraGizmo?.dispose(),this._cameraGizmo=null}};ne=Ot([a.injectable(),ie(0,a.inject("ICameraApi")),ie(1,a.inject("IDomApi")),ie(2,a.inject("IRendererAccess"))],ne);var T=(e=>(e.SelectHover="select.hover",e.SelectClick="select.click",e))(T||{});const xt=.03,jt=.05,$=0,Ce=1,Te=2,O=31;var Ct=Object.getOwnPropertyDescriptor,Tt=(e,t,r,s)=>{for(var i=s>1?void 0:s?Ct(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},H=(e,t)=>(r,s)=>t(r,s,e);let oe=class{constructor(e,t,r,s,i){this._domApi=e,this._cameraApi=t,this._meshApi=r,this._controlsState=s,this._bus=i}_raycaster;_mouse;_lastHoverKey=null;_currentRaycastMode=d.SelectMode.Mesh;_isEventListenersAdded=!1;init(){this._raycaster=new c.Raycaster,this._mouse=new c.Vector2,this._applyRaycastParamsByMode(),this._isEventListenersAdded||(this._initMouseListeners(),this._isEventListenersAdded=!0)}setRaycastMode(e){if(this._currentRaycastMode===e)return;const t=this._raycaster;t.params.Line.threshold=0,t.params.Points.threshold=0,this._currentRaycastMode=e,this._lastHoverKey=null,this._applyRaycastParamsByMode()}_applyRaycastParamsByMode(){const e=this._raycaster;switch(e.params.Line.threshold=0,e.params.Points.threshold=0,this._currentRaycastMode){case d.SelectMode.Mesh:case d.SelectMode.Face:e.layers.set($);break;case d.SelectMode.Edge:e.layers.set(Ce),e.params.Line.threshold=xt;break;case d.SelectMode.Vertex:e.layers.set(Te),e.params.Points.threshold=jt;break}}_getHitIntersection(e){const t=this._controlsState.isOrbitInteracting()||this._controlsState.isTransformDragging(),r=this._domApi.getCanvas(),s=this._cameraApi.getCamera(),i=this._meshApi.getMeshes();if(t)return;const n=r.getBoundingClientRect();this._mouse.x=(e.clientX-n.left)/n.width*2-1,this._mouse.y=-((e.clientY-n.top)/n.height)*2+1,this._raycaster.setFromCamera(this._mouse,s);const o=this._raycaster.intersectObjects(i,!0)[0]??null;if(this._currentRaycastMode===d.SelectMode.Mesh||this._currentRaycastMode===d.SelectMode.Face)return o;const l=this._raycaster.layers.mask;this._raycaster.layers.set($);const _=this._raycaster.intersectObjects(i,!0)[0]??null;return this._raycaster.layers.mask=l,this._getVisibleHit(o,_)}_processRaycastEvent(e,t,r){const s=this._getHitIntersection(e),i=this._meshApi.getMeshes();if(s===void 0)return;const n=s?.object??null;if(r){if(!s){i.forEach(l=>l.userData.isHit=!1),this._lastHoverKey=null,this._bus.emit(t,null);return}const o=this._makeHoverKey(s);o!==this._lastHoverKey&&(i.forEach(l=>l.userData.isHit=!1),n&&(n.userData.isHit=!0),this._lastHoverKey=o,this._bus.emit(t,{intersection:s}));return}s&&this._bus.emit(t,{intersection:s})}_getVisibleHit(e,t,r=1e-4){return e?t?e.distance<=t.distance+r?e:null:e:null}_makeHoverKey(e){if(!e)return null;const t=e.object.uuid;switch(this._currentRaycastMode){case d.SelectMode.Face:return`${t}:face:${e.faceIndex??-1}`;case d.SelectMode.Edge:return`${t}:edge:${Math.floor((e.index??-1)/2)}`;case d.SelectMode.Vertex:return`${t}:vertex:${e.index??-1}`;case d.SelectMode.Mesh:default:return`${t}:mesh`}}_handleMouseMove=e=>{this._processRaycastEvent(e,T.SelectHover,!0)};_handleMouseClick=e=>{this._processRaycastEvent(e,T.SelectClick,!1)};_handleDoubleClick=e=>{const t=this._getHitIntersection(e);t!==void 0&&(t||this._bus.emit(T.SelectClick,null))};_handleMouseLeave=()=>{this._lastHoverKey=null,this._bus.emit(T.SelectHover,null)};_initMouseListeners(){const e=this._domApi.getCanvas();e.addEventListener("mousemove",this._handleMouseMove,!1),e.addEventListener("click",this._handleMouseClick,!1),e.addEventListener("dblclick",this._handleDoubleClick,!1),e.addEventListener("mouseleave",this._handleMouseLeave),this._isEventListenersAdded=!0}_removeMouseListeners(){const e=this._domApi.getCanvas();e.removeEventListener("mousemove",this._handleMouseMove),e.removeEventListener("click",this._handleMouseClick),e.removeEventListener("dblclick",this._handleDoubleClick),e.removeEventListener("mouseleave",this._handleMouseLeave)}dispose(){this._removeMouseListeners(),this._isEventListenersAdded=!1,this._lastHoverKey=null}};oe=Tt([a.injectable(),H(0,a.inject("IDomApi")),H(1,a.inject("ICameraApi")),H(2,a.inject("IMeshApi")),H(3,a.inject("IControlsStateApi")),H(4,a.inject("EventBus"))],oe);var It=Object.getOwnPropertyDescriptor,Et=(e,t,r,s)=>{for(var i=s>1?void 0:s?It(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Pt=(e,t)=>(r,s)=>t(r,s,e);let ae=class{constructor(e){this._api=e}_meshes=[];_grid=null;_axes=null;_light=null;init(){this._grid=new c.GridHelper(10,10),this._grid.position.y=-.001,this._api.addToScene(this._grid),this._axes=new F.SymmetricAxesHelper(6),this._api.addToScene(this._axes),this._light=new c.HemisphereLight(16777215,4473924,.6),this._api.addToScene(this._light)}getMeshes(){return this._meshes}addMesh(e){this._meshes.includes(e)||(this._meshes.push(e),this._api.addToScene(e))}removeMesh(e){const t=this._meshes.indexOf(e);t>=0&&this._meshes.splice(t,1),this._api.removeFromScene(e)}addMeshes(e){for(const t of e)this.addMesh(t)}removeMeshes(e){for(const t of e)this.removeMesh(t)}dispose(){for(const e of this._meshes)this._api.removeFromScene(e);this._meshes.length=0,this._grid&&(this._api.removeFromScene(this._grid),this._grid.geometry.dispose(),this._grid.material.dispose(),this._grid=null),this._axes&&(this._api.removeFromScene(this._axes),this._axes=null),this._light&&(this._api.removeFromScene(this._light),this._light=null)}};ae=Et([a.injectable(),Pt(0,a.inject("ISceneApi"))],ae);var x=(e=>(e[e.Display=0]="Display",e[e.Scene=1]="Scene",e[e.Select=2]="Select",e[e.Tool=3]="Tool",e))(x||{}),Lt=Object.getOwnPropertyDescriptor,Dt=(e,t,r,s)=>{for(var i=s>1?void 0:s?Lt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Ie=(e,t)=>(r,s)=>t(r,s,e);let ce=class{constructor(e,t){this._store=t,this._handlers=new Map(e.map(r=>[r.mode,r]))}_currentMode=d.DisplayMode.Plane;_handlers;type=x.Display;manage(e){e!==this._currentMode&&(this._handlers.get(this._currentMode)?.rollback(),e!==d.DisplayMode.Plane&&this._handlers.get(e)?.handle(),this._currentMode=e,this._store.setDisplayMode(this._currentMode))}dispose(){this._handlers&&this._handlers.clear(),this._currentMode=d.DisplayMode.Plane,this._store.setDisplayMode(this._currentMode)}};ce=Dt([a.injectable(),Ie(0,a.injectAll("IDisplayHandler")),Ie(1,a.inject("EditorStore"))],ce);var j=(e=>(e.Hover="hover",e.Click="click",e))(j||{}),Vt=Object.getOwnPropertyDescriptor,$t=(e,t,r,s)=>{for(var i=s>1?void 0:s?Vt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},le=(e,t)=>(r,s)=>t(r,s,e);let he=class{constructor(e,t,r){this._eventBus=e,this._store=r,this._handlers=new Map(t.map(s=>[s.mode,s])),this._eventBus.on(T.SelectHover,this._onHover),this._eventBus.on(T.SelectClick,this._onClick)}_currentMode=d.SelectMode.Mesh;_handlers;type=x.Select;manage(e){e!==this._currentMode&&(this._handlers.get(this._currentMode)?.rollback(),this._currentMode=e,this._store.setSelectMode(this._currentMode))}_onHover=e=>{this._handlers.get(this._currentMode)?.handle(e,j.Hover)};_onClick=e=>{this._handlers.get(this._currentMode)?.handle(e,j.Click)};dispose(){this._handlers&&this._handlers.clear(),this._eventBus.off(T.SelectHover,this._onHover),this._currentMode=d.SelectMode.Mesh,this._store.setSelectMode(this._currentMode)}};he=$t([a.injectable(),le(0,a.inject("EventBus")),le(1,a.injectAll("ISelectHandler")),le(2,a.inject("EditorStore"))],he);const Ht=e=>(t,r,s)=>{const i=s.value;if(!i)throw new Error("usePolicy can only be applied to method");return s.value=function(...n){return e(this).check(...n),i.apply(this,n)},s};var Rt=Object.defineProperty,Ft=Object.getOwnPropertyDescriptor,Ee=(e,t,r,s)=>{for(var i=s>1?void 0:s?Ft(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=(s?o(t,r,i):o(i))||i);return s&&i&&Rt(t,r,i),i},de=(e,t)=>(r,s)=>t(r,s,e);let k=class{constructor(e,t,r){this._store=t,this._policy=r,this._handlers=new Map(e.map(s=>[s.mode,s])),this._unsubSelected=this._store.onSelectedObjectChange(()=>{this._handlers.get(this._currentTool)?.handle()})}_currentTool=d.ToolType.Translate;_handlers;_unsubSelected;type=x.Tool;manage(e){this._currentTool!==e&&(this._handlers.get(this._currentTool)?.rollback(),this._currentTool=e,this._store.setToolType(this._currentTool),this._handlers.get(this._currentTool)?.handle())}dispose(){this._unsubSelected?.(),this._handlers&&this._handlers.clear(),this._currentTool=d.ToolType.Translate,this._store.setToolType(this._currentTool)}};Ee([Ht(e=>e._policy)],k.prototype,"manage",1),k=Ee([a.injectable(),de(0,a.injectAll("IToolHandler")),de(1,a.inject("EditorStore")),de(2,a.inject("ToolPolicy"))],k);var Wt=Object.getOwnPropertyDescriptor,kt=(e,t,r,s)=>{for(var i=s>1?void 0:s?Wt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Gt=(e,t)=>(r,s)=>t(r,s,e);let _e=class{_currentMode=d.SceneMode.AddFigure;_handlers;type=x.Scene;constructor(e){this._handlers=new Map(e.map(t=>[t.mode,t]))}manage(e,t){e===d.SceneMode.AddFigure?this._handlers.get(e)?.handle(t):this._handlers.get(e)?.handle(),this._currentMode=e}dispose(){this._handlers&&this._handlers.clear(),this._currentMode=d.SceneMode.AddFigure}};_e=kt([a.injectable(),Gt(0,a.injectAll("ISceneHandler"))],_e);var Bt=Object.getOwnPropertyDescriptor,zt=(e,t,r,s)=>{for(var i=s>1?void 0:s?Bt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Nt=(e,t)=>(r,s)=>t(r,s,e);let ue=class{constructor(e){this._api=e}mode=d.DisplayMode.Wireframe;_prevWireframe=new Map;_prevColorMesh=new Map;_prevColorLines=new Map;_wireColor=new c.Color(65535);handle(){const e=this._api.getMeshes();for(const t of e){const r=Array.isArray(t.material)?t.material:[t.material];for(const s of r)this._enableWireframeOnMaterial(s);t.traverse(s=>{if(s.isLineSegments){const i=s;if(!this._prevColorLines.has(i.material)){const o=i.material;this._prevColorLines.set(o,o.color.clone())}const n=i.material;n.color.copy(this._wireColor),n.needsUpdate=!0}})}}rollback(){for(const[e,t]of this._prevWireframe)"wireframe"in e&&(e.wireframe=t),e.needsUpdate=!0;this._prevWireframe.clear();for(const[e,t]of this._prevColorMesh){const r=e;r.color?.isColor&&r.color.copy(t)}this._prevColorMesh.clear();for(const[e,t]of this._prevColorLines)e.color.copy(t);this._prevColorLines.clear()}dispose(){this.rollback()}_enableWireframeOnMaterial(e){const t=e;"wireframe"in t&&!this._prevWireframe.has(e)&&(this._prevWireframe.set(e,!!t.wireframe),t.wireframe=!0,e.needsUpdate=!0),t.color?.isColor&&(this._prevColorMesh.has(e)||this._prevColorMesh.set(e,t.color.clone()),t.color.copy(this._wireColor))}};ue=zt([a.injectable(),Nt(0,a.inject("IMeshApi"))],ue);const G=16776960,B=16755200,Ut=2236962,Xt=2236962;var qt=Object.getOwnPropertyDescriptor,Yt=(e,t,r,s)=>{for(var i=s>1?void 0:s?qt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Pe=(e,t)=>(r,s)=>t(r,s,e);let pe=class{constructor(e,t){this._api=e,this._store=t}mode=d.SelectMode.Mesh;_hoveredMesh=null;_selectedMesh=null;_hoverColor=G;_selectColor=B;_origLineColors=new WeakMap;handle(e,t){if(this._api.setRaycastMode(this.mode),t===j.Hover){if(!e){this._hoveredMesh&&this._hoveredMesh!==this._selectedMesh&&this._restoreEdgesColor(this._hoveredMesh),this._hoveredMesh=null;return}const r=e.intersection.object;this._hoveredMesh!==r&&(this._hoveredMesh&&this._hoveredMesh!==this._selectedMesh&&this._restoreEdgesColor(this._hoveredMesh),r!==this._selectedMesh&&this._paintEdges(r,this._hoverColor),this._hoveredMesh=r)}if(t===j.Click){if(!e){this._selectedMesh&&(this._restoreEdgesColor(this._selectedMesh),this._selectedMesh=null,this._store.setSelectedObject(null));return}const r=e.intersection.object;this._selectedMesh&&this._selectedMesh!==r&&this._restoreEdgesColor(this._selectedMesh),this._paintEdges(r,this._selectColor),this._selectedMesh=r,this._store.setSelectedObject(r)}}rollback(){this._hoveredMesh&&this._restoreEdgesColor(this._hoveredMesh),this._selectedMesh&&this._restoreEdgesColor(this._selectedMesh),this._hoveredMesh=this._selectedMesh=null,this._store.setSelectedObject(null)}dispose(){this.rollback()}_paintEdges(e,t){e.children.forEach(r=>{const s=r;if(s.isLineSegments&&s.material){const i=s.material;this._origLineColors.has(s)||this._origLineColors.set(s,i.color.clone()),i.color.setHex(t),i.needsUpdate=!0}})}_restoreEdgesColor(e){e.children.forEach(t=>{const r=t;if(r.isLineSegments&&r.material){const s=this._origLineColors.get(r);if(s){const i=r.material;i.color.copy(s),i.needsUpdate=!0}}})}};pe=Yt([a.injectable(),Pe(0,a.inject("IRaycastApi")),Pe(1,a.inject("EditorStore"))],pe);var Zt=Object.getOwnPropertyDescriptor,Kt=(e,t,r,s)=>{for(var i=s>1?void 0:s?Zt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},z=(e,t)=>(r,s)=>t(r,s,e);let me=class{constructor(e,t,r,s){this._cameraApi=e,this._sceneApi=t,this._raycastApi=r,this._store=s,this._cameraApi.enableCameraLayer(O),this._hoverFace=this._makeOverlayFace(this._hoverColor),this._selectFace=this._makeOverlayFace(this._selectColor),this._sceneApi.addObject(this._hoverFace,O),this._sceneApi.addObject(this._selectFace,O)}mode=d.SelectMode.Face;_hoverFace;_selectFace;_hovered=null;_selected=null;_hoverColor=G;_selectColor=B;_normalEps=1e-4;_planeEps=1e-4;handle(e,t){if(this._raycastApi.setRaycastMode(this.mode),t===j.Hover){if(!e){this._hoverFace.visible=!1,this._hovered=null;return}const r=e.intersection.object;if(!r?.isMesh)return;const s=r,i=e.intersection.faceIndex??-1;if(i<0)return;const n=this._collectFaceGroup(s,i);if(!n)return;this._selected&&this._same(n,this._selected)?this._hoverFace.visible=!1:(this._writeWorldFaceGroup(this._hoverFace,n),this._hoverFace.visible=!0),this._hovered=n;return}if(t===j.Click){if(!e){this._selectFace.visible=!1,this._selected=null,this._store.setSelectedObject(null);return}const r=e.intersection.object;if(!r?.isMesh)return;const s=r,i=e.intersection.faceIndex??-1;if(i<0)return;const n=this._collectFaceGroup(s,i);if(!n)return;this._writeWorldFaceGroup(this._selectFace,n),this._centerFaceProxy(this._selectFace),this._selectFace.visible=!0,this._prepareFaceMetadata(n),this._store.setSelectedObject(this._selectFace),this._selected=n,this._hovered&&this._same(this._hovered,this._selected)&&(this._hoverFace.visible=!1)}}rollback(){this._hoverFace.visible=!1,this._selectFace.visible=!1,this._resetFaceProxyTransform(this._selectFace),this._resetFaceProxyTransform(this._hoverFace),this._hovered=this._selected=null,this._store.setSelectedObject(null)}dispose(){this.rollback(),this._sceneApi.removeFromScene(this._hoverFace),this._sceneApi.removeFromScene(this._selectFace),this._hoverFace.geometry.dispose(),this._hoverFace.material.dispose(),this._selectFace.geometry.dispose(),this._selectFace.material.dispose()}_makeOverlayFace(e){const t=new c.BufferGeometry,r=new c.MeshBasicMaterial({color:e,transparent:!0,opacity:.35,depthTest:!1,depthWrite:!1,side:c.DoubleSide,polygonOffset:!0,polygonOffsetFactor:-1,polygonOffsetUnits:-1}),s=new c.Mesh(t,r);return s.renderOrder=1e3,s.layers.set(O),s.visible=!1,s.raycast=()=>{},s}_collectFaceGroup(e,t){const r=e.geometry,s=r.getAttribute("position");if(!s)return null;const i=r.index;if(!i){const A=t*3,y=t*3+1,C=t*3+2;return{mesh:e,faceIndex:t,triangleIndices:[t],vertexIndices:[A,y,C],proxyVertexMap:[A,y,C]}}const n=Math.floor(i.count/3);if(t<0||t>=n)return null;const o=this._buildTriangleAdjacency(i,s),[l,_,u]=this._getTriangleIndices(i,t),p=this._readVertex(s,l),M=this._readVertex(s,_),f=this._readVertex(s,u),g=new c.Vector3().subVectors(M,p).cross(new c.Vector3().subVectors(f,p)).normalize(),v=new c.Plane().setFromNormalAndCoplanarPoint(g,p),b=new Set,S=[],I=[t];for(;I.length>0;){const A=I.pop();if(b.has(A))continue;b.add(A);const[y,C,L]=this._getTriangleIndices(i,A),w=this._readVertex(s,y),ke=this._readVertex(s,C),Ge=this._readVertex(s,L),$s=new c.Vector3().subVectors(ke,w).cross(new c.Vector3().subVectors(Ge,w)).normalize(),Hs=Math.abs($s.dot(g))>=1-this._normalEps,Rs=Math.abs(v.distanceToPoint(w))<this._planeEps&&Math.abs(v.distanceToPoint(ke))<this._planeEps&&Math.abs(v.distanceToPoint(Ge))<this._planeEps;if(!Hs||!Rs)continue;S.push(A);const Be=o.get(A);if(Be)for(const ze of Be)b.has(ze)||I.push(ze)}S.sort((A,y)=>A-y);const E=new Set,P=[];for(const A of S){const[y,C,L]=this._getTriangleIndices(i,A);E.add(y),E.add(C),E.add(L),P.push(y,C,L)}return{mesh:e,faceIndex:t,triangleIndices:S,vertexIndices:Array.from(E),proxyVertexMap:P}}_writeWorldFaceGroup(e,t){const r=t.mesh.geometry,s=r.getAttribute("position"),i=r.index,n=new Float32Array(t.triangleIndices.length*9);let o=0;for(const _ of t.triangleIndices){let u,p,M;i?[u,p,M]=this._getTriangleIndices(i,_):(u=_*3,p=_*3+1,M=_*3+2);const f=this._readVertex(s,u).applyMatrix4(t.mesh.matrixWorld),g=this._readVertex(s,p).applyMatrix4(t.mesh.matrixWorld),v=this._readVertex(s,M).applyMatrix4(t.mesh.matrixWorld);n[o++]=f.x,n[o++]=f.y,n[o++]=f.z,n[o++]=g.x,n[o++]=g.y,n[o++]=g.z,n[o++]=v.x,n[o++]=v.y,n[o++]=v.z}const l=e.geometry;l.setAttribute("position",new c.BufferAttribute(n,3)),l.setIndex(null),l.computeVertexNormals(),l.computeBoundingBox(),l.computeBoundingSphere()}_same(e,t){return!!e&&!!t&&e.mesh===t.mesh&&e.triangleIndices.length===t.triangleIndices.length&&e.triangleIndices.every((r,s)=>r===t.triangleIndices[s])}_prepareFaceMetadata(e){const{vertexIndexGroups:t,proxyVertexMap:r,lines:s,lineVertexIndexGroups:i}=this._buildFaceVertexGroups(e);this._selectFace.userData.faceInfo={mesh:e.mesh,faceIndex:e.faceIndex,triangleIndices:e.triangleIndices,vertexIndices:e.vertexIndices,vertexIndexGroups:t,proxyVertexMap:r,lines:s,lineVertexIndexGroups:i}}_centerFaceProxy(e){const t=e.geometry,r=t.getAttribute("position");if(!r||r.count===0)return;const s=new c.Vector3;for(let i=0;i<r.count;i++)s.x+=r.getX(i),s.y+=r.getY(i),s.z+=r.getZ(i);s.multiplyScalar(1/r.count);for(let i=0;i<r.count;i++)r.setXYZ(i,r.getX(i)-s.x,r.getY(i)-s.y,r.getZ(i)-s.z);r.needsUpdate=!0,e.position.copy(s),e.quaternion.identity(),e.scale.set(1,1,1),e.updateMatrixWorld(!0),t.computeBoundingBox(),t.computeBoundingSphere()}_pushEdge(e,t,r,s){const i=t<r?`${t}_${r}`:`${r}_${t}`,n=e.get(i);n?n.push(s):e.set(i,[s])}_buildTriangleAdjacency(e,t){const r=Math.floor(e.count/3),s=new Map,i=this._buildWeldMap(e,t);for(let l=0;l<r;l++){const[_,u,p]=this._getTriangleIndices(e,l),M=i.get(_),f=i.get(u),g=i.get(p);this._pushEdge(s,M,f,l),this._pushEdge(s,f,g,l),this._pushEdge(s,g,M,l)}const n=new Map;for(let l=0;l<r;l++)n.set(l,new Set);for(const l of s.values())if(!(l.length<2))for(let _=0;_<l.length;_++)for(let u=0;u<l.length;u++)_!==u&&n.get(l[_])?.add(l[u]);const o=new Map;for(const[l,_]of n)o.set(l,Array.from(_));return o}_getTriangleIndices(e,t){return[e.getX(t*3),e.getX(t*3+1),e.getX(t*3+2)]}_readVertex(e,t){return new c.Vector3(e.getX(t),e.getY(t),e.getZ(t))}_vertexKey(e,t,r=1e-6){const s=Math.round(e.getX(t)/r),i=Math.round(e.getY(t)/r),n=Math.round(e.getZ(t)/r);return`${s}_${i}_${n}`}_buildWeldMap(e,t){const r=new Map,s=new Map;let i=0;for(let n=0;n<e.count;n++){const o=e.getX(n);if(s.has(o))continue;const l=this._vertexKey(t,o);let _=r.get(l);_==null&&(_=i++,r.set(l,_)),s.set(o,_)}return s}_resetFaceProxyTransform(e){e.position.set(0,0,0),e.quaternion.identity(),e.scale.set(1,1,1),e.updateMatrixWorld(!0)}_buildFaceVertexGroups(e){const r=e.mesh.geometry.getAttribute("position"),s=1e-6,i=new c.Vector3,n=e.vertexIndices,o=[],l=new Map;for(const f of n){const g=this._readVertex(r,f),v=[];for(let S=0;S<r.count;S++)i.fromBufferAttribute(r,S),i.distanceToSquared(g)<s*s&&v.push(S);const b=o.length;o.push(v);for(const S of v)l.set(S,b)}const _=[];for(const f of e.proxyVertexMap){const g=l.get(f);_.push(g??-1)}const u=this._findChildLines(e.mesh),p=u?this._buildLineVertexGroups(e,u):void 0,M={vertexIndexGroups:o,proxyVertexMap:_};return u&&(M.lines=u),p&&(M.lineVertexIndexGroups=p),M}_findChildLines(e){for(const t of e.children)if(t.isLineSegments)return t;return null}_buildLineVertexGroups(e,t){const s=t.geometry.getAttribute("position"),n=e.mesh.geometry.getAttribute("position"),o=1e-6,l=new c.Vector3,_=t.matrixWorld,u=e.mesh.matrixWorld,p=[];for(const M of e.vertexIndices){const f=this._readVertex(n,M).applyMatrix4(u),g=[];for(let v=0;v<s.count;v++)l.fromBufferAttribute(s,v).applyMatrix4(_),l.distanceToSquared(f)<o*o&&g.push(v);p.push(g)}return p}};me=Kt([a.injectable(),z(0,a.inject("ICameraApi")),z(1,a.inject("ISceneApi")),z(2,a.inject("IRaycastApi")),z(3,a.inject("EditorStore"))],me);const Qt={[d.FigureType.Plane]:()=>new c.PlaneGeometry(1,1,1,1),[d.FigureType.Cube]:()=>new c.BoxGeometry(1,1,1,1,1,1),[d.FigureType.UVSphere]:()=>new c.SphereGeometry(.5,32,16),[d.FigureType.Icosphere]:()=>new c.IcosahedronGeometry(.5,0),[d.FigureType.Cylinder]:()=>new c.CylinderGeometry(.5,.5,1,32,1,!1),[d.FigureType.Cone]:()=>new c.ConeGeometry(.5,1,32,1,!1),[d.FigureType.Torus]:()=>new c.TorusGeometry(.5,.2,16,64),[d.FigureType.Circle]:()=>new c.CircleGeometry(.5,32),[d.FigureType.Sphere]:()=>new c.SphereGeometry(.5,32,16),[d.FigureType.Custom]:function(){throw new Error("Custom geometry is not generated here.")}},Jt=new c.MeshStandardMaterial({color:12566463,metalness:0,roughness:.6}),es=8,ts=e=>!!e&&e.isMesh,Le=e=>{let t=e;for(;t;){if(t.isMesh)return t;t=t.parent}return null},ss=e=>{const t=new c.BufferGeometry;t.setAttribute("position",e.getAttribute("position")),t.computeBoundingSphere(),t.computeBoundingBox();const r=new c.PointsMaterial({color:Xt,size:6,sizeAttenuation:!1,depthTest:!1,depthWrite:!1,transparent:!0,opacity:.9}),s=new c.Points(t,r);return s.layers.set(Te),s.renderOrder=1e3,s.visible=!1,s},rs=e=>{const t=new c.EdgesGeometry(e),r=new c.LineSegments(t,new c.LineBasicMaterial({color:Ut,linewidth:1}));return r.layers.set(Ce),r},is=e=>{const t={x:e.position.x,y:e.position.y,z:e.position.z},r={x:e.rotation.x,y:e.rotation.y,z:e.rotation.z},s={x:e.scale.x,y:e.scale.y,z:e.scale.z},i=new c.Box3().setFromObject(e),n=new c.Vector3;i.getSize(n);const o={x:n.x,y:n.y,z:n.z};return{position:t,rotation:r,scale:s,size:o}};var ns=Object.getOwnPropertyDescriptor,os=(e,t,r,s)=>{for(var i=s>1?void 0:s?ns(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},N=(e,t)=>(r,s)=>t(r,s,e);let ve=class{constructor(e,t,r,s){this._cameraApi=e,this._sceneApi=t,this._raycastApi=r,this._store=s,this._cameraApi.enableCameraLayer(O),this._hoverVertex=this._makeOverlayVertex(this._hoverColor),this._selectVertex=this._makeOverlayVertex(this._selectColor),this._sceneApi.addObject(this._hoverVertex,O),this._sceneApi.addObject(this._selectVertex,O)}mode=d.SelectMode.Vertex;_hovered=null;_selected=null;_hoverVertex;_selectVertex;_hoverColor=G;_selectColor=B;handle(e,t){if(this._raycastApi.setRaycastMode(this.mode),t===j.Hover){if(!e){this._hoverVertex.visible=!1,this._hovered=null;return}const r=e.intersection.object;if(!r?.isPoints)return;const s=r,i=e.intersection.index??-1;if(i<0)return;this._selected&&this._same({points:s,index:i},this._selected)?this._hoverVertex.visible=!1:(this._writeWorldVertex(this._hoverVertex,s,i),this._hoverVertex.visible=!0);return}if(t===j.Click){if(!e){this._selectVertex.visible=!1,this._selected=null,this._store.setSelectedObject(null);return}const r=e.intersection.object;if(!r?.isPoints)return;const s=r,i=e.intersection.index??-1;if(i<0)return;this._writeWorldVertex(this._selectVertex,s,i),this._centerVertexOnPoint(this._selectVertex,s,i),this._selectVertex.visible=!0,this._prepareVertexMetadata(s,i),this._store.setSelectedObject(this._selectVertex),this._selected={points:s,index:i},this._hovered&&this._same(this._hovered,this._selected)&&(this._hoverVertex.visible=!1);return}}rollback(){this._hoverVertex.visible=!1,this._selectVertex.visible=!1,this._hovered=this._selected=null,this._store.setSelectedObject(null)}dispose(){this.rollback(),this._sceneApi.removeFromScene(this._hoverVertex),this._sceneApi.removeFromScene(this._selectVertex),this._hoverVertex.geometry.dispose(),this._hoverVertex.material.dispose(),this._selectVertex.geometry.dispose(),this._selectVertex.material.dispose()}_makeOverlayVertex(e,t=es){const r=new c.BufferGeometry;r.setAttribute("position",new c.Float32BufferAttribute([0,0,0],3));const s=new c.PointsMaterial({color:e,size:t,sizeAttenuation:!1,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1}),i=new c.Points(r,s);return i.renderOrder=1e3,i.raycast=()=>{},i.layers.set(O),i.visible=!1,i}_writeWorldVertex(e,t,r){const s=t.geometry.getAttribute("position"),i=new c.Vector3(s.getX(r),s.getY(r),s.getZ(r)).applyMatrix4(t.matrixWorld),n=e.geometry.getAttribute("position");n.setXYZ(0,i.x,i.y,i.z),n.needsUpdate=!0}_same(e,t){return!!e&&!!t&&e.points===t.points&&e.index===t.index}_prepareVertexMetadata(e,t){const r=Le(e);if(!r)return;const s=e.geometry.getAttribute("position"),i=new c.Vector3(s.getX(t),s.getY(t),s.getZ(t)).applyMatrix4(e.matrixWorld),n=new c.Matrix4().copy(r.matrixWorld).invert(),o=i.clone().applyMatrix4(n),_=r.geometry.getAttribute("position"),u=1e-6,p=u*u,M=new c.Vector3,f=[];for(let b=0;b<_.count;b++)M.fromBufferAttribute(_,b),M.distanceToSquared(o)<p&&f.push(b);const g=r.children.find(b=>b?.isLineSegments);let v=[];if(g){const b=new c.Matrix4().copy(g.matrixWorld).invert(),S=i.clone().applyMatrix4(b),I=g.geometry.getAttribute("position"),E=new c.Vector3;for(let P=0;P<I.count;P++)E.fromBufferAttribute(I,P),E.distanceToSquared(S)<p&&v.push(P)}this._selectVertex.userData.vertexInfo={points:e,index:t,mesh:r,vertexIndices:f,lines:g??null,edgeVertexIndices:v}}_centerVertexOnPoint(e,t,r){const s=t.geometry.getAttribute("position"),i=new c.Vector3(s.getX(r),s.getY(r),s.getZ(r)).applyMatrix4(t.matrixWorld);e.position.copy(i);const n=e.geometry;let o=n.getAttribute("position");(!o||o.count<1)&&(n.setAttribute("position",new c.BufferAttribute(new Float32Array(3),3)),o=n.getAttribute("position")),o.setXYZ(0,0,0,0),o.needsUpdate=!0,e.quaternion.identity(),e.scale.set(1,1,1),e.updateMatrixWorld(!0)}};ve=os([a.injectable(),N(0,a.inject("ICameraApi")),N(1,a.inject("ISceneApi")),N(2,a.inject("IRaycastApi")),N(3,a.inject("EditorStore"))],ve);class fe{constructor(t,r){this.api=t,this.store=r,this._unsubscribeTransform=this.api.onTransformChange(()=>{this.store.getSelectedObject()&&this.store.notifySelectedTransformChange?.()})}_unsubscribeTransform;handle(){const t=this.store.getSelectedObject();this.api.setTransformMode(this.mode),t?this.api.attachTransform(t):this.api.detachTransform()}rollback(){this.api.detachTransform()}dispose(){this.rollback(),this._unsubscribeTransform&&this._unsubscribeTransform()}}var as=Object.getOwnPropertyDescriptor,cs=(e,t,r,s)=>{for(var i=s>1?void 0:s?as(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},De=(e,t)=>(r,s)=>t(r,s,e);let ge=class extends fe{mode=d.ToolType.Translate;constructor(e,t){super(e,t)}};ge=cs([a.injectable(),De(0,a.inject("ITransformApi")),De(1,a.inject("EditorStore"))],ge);var ls=Object.getOwnPropertyDescriptor,hs=(e,t,r,s)=>{for(var i=s>1?void 0:s?ls(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Ve=(e,t)=>(r,s)=>t(r,s,e);let Me=class extends fe{mode=d.ToolType.Scale;constructor(e,t){super(e,t)}};Me=hs([a.injectable(),Ve(0,a.inject("ITransformApi")),Ve(1,a.inject("EditorStore"))],Me);var ds=Object.getOwnPropertyDescriptor,_s=(e,t,r,s)=>{for(var i=s>1?void 0:s?ds(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},$e=(e,t)=>(r,s)=>t(r,s,e);let be=class extends fe{mode=d.ToolType.Rotate;constructor(e,t){super(e,t)}};be=_s([a.injectable(),$e(0,a.inject("ITransformApi")),$e(1,a.inject("EditorStore"))],be);var us=Object.getOwnPropertyDescriptor,ps=(e,t,r,s)=>{for(var i=s>1?void 0:s?us(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},U=(e,t)=>(r,s)=>t(r,s,e);let Se=class{constructor(e,t,r,s){this._sceneApi=e,this._cameraApi=t,this._raycastApi=r,this._store=s,this._cameraApi.enableCameraLayer(O),this._hoverLine=this._makeOverlayLine(this._hoverColor),this._selectLine=this._makeOverlayLine(this._selectColor),this._sceneApi.addObject(this._hoverLine,O),this._sceneApi.addObject(this._selectLine,O)}mode=d.SelectMode.Edge;_hoverLine;_selectLine;_hovered=null;_selected=null;_hoverColor=G;_selectColor=B;handle(e,t){if(this._raycastApi.setRaycastMode(this.mode),t===j.Hover){if(!e){this._hoverLine.visible=!1,this._hovered=null;return}const r=e.intersection.object;if(!r?.isLineSegments)return;const s=r,i=Math.floor((e.intersection.index??-1)/2);if(i<0)return;this._selected&&this._same({lines:s,seg:i},this._selected)?this._hoverLine.visible=!1:(this._writeWorldSegment(this._hoverLine,s,i),this._hoverLine.visible=!0),this._hovered={lines:s,seg:i};return}if(t===j.Click){if(!e){this._selectLine.visible=!1,this._selected=null,this._store.setSelectedObject(null);return}const r=e.intersection.object;if(!r?.isLineSegments)return;const s=r,i=Math.floor((e.intersection.index??-1)/2);if(i<0)return;this._writeWorldSegment(this._selectLine,s,i),this._centerAndOrientLineOnSegment(this._selectLine,s,i),this._selectLine.visible=!0,this._prepareEdgeMetadata(s,i),this._store.setSelectedObject(this._selectLine),this._selected={lines:s,seg:i},this._hovered&&this._same(this._hovered,this._selected)&&(this._hoverLine.visible=!1)}}rollback(){this._hoverLine.visible=!1,this._selectLine.visible=!1,this._hovered=this._selected=null,this._store.setSelectedObject(null)}dispose(){this.rollback(),this._sceneApi.removeFromScene(this._hoverLine),this._sceneApi.removeFromScene(this._selectLine),this._hoverLine.geometry.dispose(),this._hoverLine.material.dispose(),this._selectLine.geometry.dispose(),this._selectLine.material.dispose()}_makeOverlayLine(e){const t=new c.BufferGeometry;t.setAttribute("position",new c.Float32BufferAttribute(6,3));const r=new c.LineBasicMaterial({color:e,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1}),s=new c.Line(t,r);return s.renderOrder=1e3,s.raycast=()=>{},s.layers.set(O),s.visible=!1,s}_writeWorldSegment(e,t,r){const s=t.geometry.getAttribute("position"),i=r*2,n=i+1,o=new c.Vector3(s.getX(i),s.getY(i),s.getZ(i)).applyMatrix4(t.matrixWorld),l=new c.Vector3(s.getX(n),s.getY(n),s.getZ(n)).applyMatrix4(t.matrixWorld),_=e.geometry.getAttribute("position");_.setXYZ(0,o.x,o.y,o.z),_.setXYZ(1,l.x,l.y,l.z),_.needsUpdate=!0}_same(e,t){return!!e&&!!t&&e.lines===t.lines&&e.seg===t.seg}_centerAndOrientLineOnSegment(e,t,r){const s=t.geometry.getAttribute("position"),i=r*2,n=i+1,o=new c.Vector3(s.getX(i),s.getY(i),s.getZ(i)).applyMatrix4(t.matrixWorld),l=new c.Vector3(s.getX(n),s.getY(n),s.getZ(n)).applyMatrix4(t.matrixWorld),_=new c.Vector3().subVectors(l,o),u=_.length();if(!isFinite(u)||u===0)return;const p=new c.Vector3().addVectors(o,l).multiplyScalar(.5);e.position.copy(p);const M=e.geometry;let f=M.getAttribute("position");(!f||f.count<2)&&(M.setAttribute("position",new c.BufferAttribute(new Float32Array(6),3)),f=M.getAttribute("position")),f.setXYZ(0,-u/2,0,0),f.setXYZ(1,u/2,0,0),f.needsUpdate=!0,_.normalize();const g=new c.Quaternion().setFromUnitVectors(new c.Vector3(1,0,0),_);e.quaternion.copy(g),e.updateMatrixWorld(!0)}_prepareEdgeMetadata(e,t){const r=Le(e);if(!r)return;const s=e.geometry.getAttribute("position"),i=t*2,n=i+1,o=new c.Vector3(s.getX(i),s.getY(i),s.getZ(i)).applyMatrix4(e.matrixWorld),l=new c.Vector3(s.getX(n),s.getY(n),s.getZ(n)).applyMatrix4(e.matrixWorld),_=new c.Matrix4().copy(r.matrixWorld).invert(),u=o.clone().applyMatrix4(_),p=l.clone().applyMatrix4(_),f=r.geometry.getAttribute("position"),g=new c.Vector3,v=1e-6,b=[],S=[];for(let w=0;w<f.count;w++)g.fromBufferAttribute(f,w),g.distanceToSquared(u)<v*v?b.push(w):g.distanceToSquared(p)<v*v&&S.push(w);const I=new c.Matrix4().copy(e.matrixWorld).invert(),E=o.clone().applyMatrix4(I),P=l.clone().applyMatrix4(I),A=e.geometry.getAttribute("position"),y=new c.Vector3,C=[],L=[];for(let w=0;w<A.count;w++)y.fromBufferAttribute(A,w),y.distanceToSquared(E)<v*v?C.push(w):y.distanceToSquared(P)<v*v&&L.push(w);this._selectLine.userData.edgeInfo={lines:e,seg:t,mesh:r,aIndices:b,bIndices:S,aEdgeIndices:C,bEdgeIndices:L}}};Se=ps([a.injectable(),U(0,a.inject("ISceneApi")),U(1,a.inject("ICameraApi")),U(2,a.inject("IRaycastApi")),U(3,a.inject("EditorStore"))],Se);var ms=Object.getOwnPropertyDescriptor,vs=(e,t,r,s)=>{for(var i=s>1?void 0:s?ms(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},fs=(e,t)=>(r,s)=>t(r,s,e);let Ae=class{constructor(e){this._api=e}mode=d.SceneMode.AddFigure;_lastAddedMesh=null;handle(e){const t=Qt[e](),r=t.getAttribute("position");r&&r.setUsage&&r.setUsage(c.DynamicDrawUsage);const s=new c.Mesh(t,Jt);s.layers.enable($);const i=t.index?t.toNonIndexed():t,n=rs(i);n.layers.enable($),s.add(n);const o=ss(i);o.layers.enable($),s.add(o),this._api.addMesh(s),this._lastAddedMesh=s}rollback(){this._lastAddedMesh!==null&&(this._api.removeMesh(this._lastAddedMesh),this._lastAddedMesh=null)}dispose(){this._lastAddedMesh=null}};Ae=vs([a.injectable(),fs(0,a.inject("IMeshApi"))],Ae);var gs=Object.getOwnPropertyDescriptor,Ms=(e,t,r,s)=>{for(var i=s>1?void 0:s?gs(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},He=(e,t)=>(r,s)=>t(r,s,e);let we=class{constructor(e,t){this._api=e,this._store=t}mode=d.SceneMode.DeleteFigure;_lastDeletedMesh=null;handle(){const e=this._store.getSelectedObject();ts(e)&&(this._api.removeMesh(e),this._store.setSelectedObject(null),this._lastDeletedMesh=e)}rollback(){this._lastDeletedMesh&&(this._api.addMesh(this._lastDeletedMesh),this._lastDeletedMesh=null)}dispose(){this._lastDeletedMesh=null}};we=Ms([a.injectable(),He(0,a.inject("IMeshApi")),He(1,a.inject("EditorStore"))],we);var bs=Object.getOwnPropertyDescriptor,Ss=(e,t,r,s)=>{for(var i=s>1?void 0:s?bs(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},X=(e,t)=>(r,s)=>t(r,s,e);m.EditorHub=class{constructor(t,r,s,i){this._renderer=t,this._mediator=r,this._store=s,this._controller=i,this.setSelectMode(d.SelectMode.Mesh),this.setToolMode(d.ToolType.Translate)}setDisplayMode(t){return this._mediator.send({type:x.Display,payload:[t]})}setSceneMode(t){return this._mediator.send({type:x.Scene,payload:[t]})}setSelectMode(t){return this._mediator.send({type:x.Select,payload:[t]})}setToolMode(t){return this._mediator.send({type:x.Tool,payload:[t]})}addFigure(t,r){return this._mediator.send({type:x.Scene,payload:[t,r]})}resizeRenderer(){this._renderer.resize()}start(){this._controller.start()}stop(){this._controller.stop()}getSelectionStats(){return this._store.getSelectionStats()}onSelectionStatsChange(t){const r=this._store.onSelectedObjectChange(()=>{t()}),s=this._store.onSelectedTransformChange(()=>{t()});return()=>{r(),s()}}dispose(){this._mediator.dispose()}},m.EditorHub=Ss([a.injectable(),X(0,a.inject("Renderer")),X(1,a.inject("IMediator")),X(2,a.inject("EditorStore")),X(3,a.inject("IController"))],m.EditorHub);var As=Object.getOwnPropertyDescriptor,ws=(e,t,r,s)=>{for(var i=s>1?void 0:s?As(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i};m.EventBus=class{_emitter;constructor(){this._emitter=new Ue.EventEmitter}emit(t,r){this._emitter.emit(t,r)}on(t,r){this._emitter.on(t,r)}off(t,r){this._emitter.off(t,r)}},m.EventBus=ws([a.injectable()],m.EventBus);var ys=Object.getOwnPropertyDescriptor,Os=(e,t,r,s)=>{for(var i=s>1?void 0:s?ys(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i};let ye=class{_selectMode=d.SelectMode.Mesh;_toolType=d.ToolType.Translate;_displayMode=d.DisplayMode.Plane;_selectedObject=null;_selectedListeners=new Set;_transformListeners=new Set;constructor(){Xe.makeAutoObservable(this,{},{autoBind:!0})}getSelectMode(){return this._selectMode}getToolType(){return this._toolType}getDisplayMode(){return this._displayMode}setSelectMode(e){this._selectMode=e}setToolType(e){this._toolType=e}setDisplayMode(e){this._displayMode=e}getSelectedObject(){return this._selectedObject}getSelectionStats(){const e=this._selectedObject;return e?is(e):null}setSelectedObject(e){if(this._selectedObject!==e){this._selectedObject=e;for(const t of this._selectedListeners)t(this._selectedObject)}}onSelectedObjectChange(e){return this._selectedListeners.add(e),()=>this._selectedListeners.delete(e)}onSelectedTransformChange(e){return this._transformListeners.add(e),()=>this._transformListeners.delete(e)}notifySelectedTransformChange(){for(const e of this._transformListeners)e()}};ye=Os([a.injectable()],ye);var D=(e=>(e.ToolNotAllowed="TOOL_NOT_ALLOWED",e.Success="SUCCESS",e.NoChange="NO_CHANGE",e.Error="ERROR",e))(D||{});class Re extends Error{constructor(t,r,s,i){super(r),this.type=t,this.code=s,this.meta=i,this.name=this._name}_name="PolicyException"}var xs=Object.getOwnPropertyDescriptor,js=(e,t,r,s)=>{for(var i=s>1?void 0:s?xs(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Cs=(e,t)=>(r,s)=>t(r,s,e);let Oe=class{constructor(e){this._store=e}check(e){const t=this._store.getSelectMode();if(!d.DEFAULT_TOOL_RULES[t].includes(e))throw new Re(D.ToolNotAllowed,`Tool ${e} is not allowed`,"TOOL_NOT_ALLOWED")}};Oe=js([a.injectable(),Cs(0,a.inject("EditorStore"))],Oe);var Ts=Object.getOwnPropertyDescriptor,Is=(e,t,r,s)=>{for(var i=s>1?void 0:s?Ts(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i};let xe=class{handle(e){try{return e()}catch(t){return t instanceof Re?{type:t.type,message:t.message,code:t.code,blocked:!0}:t instanceof Error?{type:D.Error,message:t.message,code:"UNHANDLED_EXCEPTION",blocked:!0}:{type:D.Error,message:"Unknown exception",code:"UNKNOWN_EXCEPTION",blocked:!0}}}};xe=Is([a.injectable()],xe);var Es=Object.getOwnPropertyDescriptor,Ps=(e,t,r,s)=>{for(var i=s>1?void 0:s?Es(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Fe=(e,t)=>(r,s)=>t(r,s,e);let je=class{constructor(e,t){this._middlewares=t,this._managers=new Map(e.map(r=>[r.type,r]))}_managers;send(e){const t=this._managers.get(e.type);if(!t)return{type:D.Error,message:`Manager for feature "${String(e.type)}" not found`,code:"MANAGER_NOT_FOUND",blocked:!0};const r=()=>(t.manage(...e.payload),null);return this._middlewares.reduceRight((i,n)=>()=>n.handle(i),r)()}dispose(){this._managers&&this._managers.clear()}};je=Ps([a.injectable(),Fe(0,a.injectAll("IManager")),Fe(1,a.injectAll("IMiddleware"))],je);let We=!1;const h=a.container.createChildContainer();function Ls(e){return We||(h.registerInstance("Canvas",e),h.registerSingleton("EventBus",m.EventBus),h.registerSingleton("IController",q),h.registerSingleton("Renderer",m.Renderer),h.register("IRenderable",{useToken:"Renderer"}),h.register("IRendererAccess",{useToken:"Renderer"}),h.register("IRendererCameraAccess",{useToken:"Renderer"}),h.register("IRendererDomAccess",{useToken:"Renderer"}),h.register("IRendererSceneAccess",{useToken:"Renderer"}),h.registerSingleton("ToolPolicy",Oe),h.registerSingleton("IMeshApi",Y),h.registerSingleton("IControlsStateApi",te),h.registerSingleton("IRaycastApi",Z),h.registerSingleton("ITransformApi",K),h.registerSingleton("ICameraApi",Q),h.registerSingleton("IDomApi",J),h.registerSingleton("ISceneApi",ee),h.registerSingleton("ControlsModule",re),h.registerSingleton("GizmoModule",ne),h.registerSingleton("RaycastModule",oe),h.registerSingleton("SceneModule",ae),h.register("IUpdatableModule",{useToken:"ControlsModule"}),h.register("IRenderableModule",{useToken:"GizmoModule"}),h.register("IRuntimeModule",{useToken:"RaycastModule"}),h.register("IRuntimeModule",{useToken:"SceneModule"}),h.registerSingleton("IDisplayHandler",ue),h.registerSingleton("ISelectHandler",pe),h.registerSingleton("ISelectHandler",me),h.registerSingleton("ISelectHandler",Se),h.registerSingleton("ISelectHandler",ve),h.registerSingleton("IToolHandler",ge),h.registerSingleton("IToolHandler",Me),h.registerSingleton("IToolHandler",be),h.registerSingleton("ISceneHandler",Ae),h.registerSingleton("ISceneHandler",we),h.registerSingleton("DisplayManager",ce),h.register("IDisplayManager",{useToken:"DisplayManager"}),h.register("IManager",{useToken:"DisplayManager"}),h.registerSingleton("SelectManager",he),h.register("ISelectManager",{useToken:"SelectManager"}),h.register("IManager",{useToken:"SelectManager"}),h.registerSingleton("ToolManager",k),h.register("IToolManager",{useToken:"ToolManager"}),h.register("IManager",{useToken:"ToolManager"}),h.registerSingleton("SceneManager",_e),h.register("ISceneManager",{useToken:"SceneManager"}),h.register("IManager",{useToken:"SceneManager"}),h.registerSingleton("IMiddleware",xe),h.registerSingleton("IMediator",je),h.registerSingleton("EditorHub",m.EditorHub),h.registerSingleton("EditorStore",ye),We=!0),h}let V=null;const Ds=e=>(V||(V=Ls(e)),V.resolve("EditorHub")),Vs=()=>{if(!V)throw new Error("EditorHub is not initialized. Call createAppHub(canvas) first.");return V.resolve("EditorHub")};m.EventTopics=T,m.FeatureType=x,m.ObjLoader=Qe,m.ResponseType=D,m.createAppHub=Ds,m.getAppHub=Vs,Object.defineProperty(m,Symbol.toStringTag,{value:"Module"})}));
@@ -0,0 +1,64 @@
1
+ import * as THREE from 'three';
2
+ /**
3
+ * Низкоуровневый API доступа к камере renderer.
4
+ * Используется internal runtime-модулями редактора.
5
+ *
6
+ * @internal
7
+ * @interface
8
+ */
9
+ export interface ICameraApi {
10
+ /**
11
+ * Возвращает экземпляр камеры.
12
+ *
13
+ * @returns Камера Three.js - {@link THREE.Camera}
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const camera = cameraApi.getCamera();
18
+ * console.log(camera.position);
19
+ * ```
20
+ *
21
+ * @internal
22
+ * @method
23
+ */
24
+ getCamera(): THREE.Camera;
25
+ /**
26
+ * Включает указанный слой для камеры.
27
+ *
28
+ * @param layer - номер слоя
29
+ *
30
+ * @remarks
31
+ * Используется для отображения служебных объектов
32
+ * без влияния на основной рендеринг.
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * // Включить слой для отображения оверлея
37
+ * cameraApi.enableCameraLayer(OVERLAY_LAYER);
38
+ * ```
39
+ *
40
+ * @see {@link disableCameraLayer} - выключение слоя
41
+ *
42
+ * @internal
43
+ * @method
44
+ */
45
+ enableCameraLayer(layer: number): void;
46
+ /**
47
+ * Выключает указанный слой для камеры.
48
+ *
49
+ * @param layer - номер слоя
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * // Выключить слой оверлея
54
+ * cameraApi.disableCameraLayer(OVERLAY_LAYER);
55
+ * ```
56
+ *
57
+ * @see {@link enableCameraLayer} - включение слоя
58
+ *
59
+ * @internal
60
+ * @method
61
+ */
62
+ disableCameraLayer(layer: number): void;
63
+ }
64
+ //# sourceMappingURL=camera-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camera-api.d.ts","sourceRoot":"","sources":["../../../src/interfaces/api/camera-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B;;;;;;GAMG;AACH,MAAM,WAAW,UAAU;IACzB;;;;;;;;;;;;;OAaG;IACH,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC;IAE1B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAEvC;;;;;;;;;;;;;;;OAeG;IACH,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * API для получения состояния элементов управления сценой.
3
+ *
4
+ * @remarks
5
+ * Предоставляет информацию о текущем состоянии контролов:
6
+ * - взаимодействует ли пользователь с `OrbitControls` (вращение/панорамирование камеры)
7
+ * - взаимодействует ли пользователь с `TransformControls` (перемещение/вращение/масштабирование объекта)
8
+ *
9
+ * Используется модулями (например, {@link RaycastModule}) для определения,
10
+ * нужно ли обрабатывать события ввода, когда пользователь активно взаимодействует с контролами.
11
+ *
12
+ * @see {@link ControlsModule} - реализация этого интерфейса
13
+ *
14
+ * @internal
15
+ * @interface
16
+ */
17
+ export interface IControlsStateApi {
18
+ /**
19
+ * Проверяет, взаимодействует ли пользователь с `OrbitControls` в текущий момент.
20
+ *
21
+ * @returns `true`, если пользователь вращает или панорамирует камеру, иначе `false`
22
+ *
23
+ * @remarks
24
+ * OrbitControls отвечает за управление камерой:
25
+ * - левая кнопка мыши + движение — вращение
26
+ * - правая кнопка мыши + движение — панорамирование
27
+ * - колёсико мыши — масштабирование
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * if (controlsStateApi.isOrbitInteracting()) {
32
+ * // Не мешаем пользователю крутить камеру
33
+ * return;
34
+ * }
35
+ * ```
36
+ *
37
+ * @internal
38
+ * @method
39
+ */
40
+ isOrbitInteracting(): boolean;
41
+ /**
42
+ * Проверяет, взаимодействует ли пользователь с `TransformControls` в текущий момент.
43
+ *
44
+ * @returns `true`, если пользователь перемещает/вращает/масштабирует объект через гизмо, иначе `false`
45
+ *
46
+ * @remarks
47
+ * `TransformControls` — это гизмо (стрелки, дуги, квадраты), которое появляется
48
+ * над выделенным объектом.
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * if (controlsStateApi.isTransformDragging()) {
53
+ * // Пользователь двигает объект — не обрабатываем hover/click
54
+ * return;
55
+ * }
56
+ * ```
57
+ *
58
+ * @internal
59
+ * @method
60
+ */
61
+ isTransformDragging(): boolean;
62
+ }
63
+ //# sourceMappingURL=controls-state-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controls-state-api.d.ts","sourceRoot":"","sources":["../../../src/interfaces/api/controls-state-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,kBAAkB,IAAI,OAAO,CAAC;IAE9B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,mBAAmB,IAAI,OAAO,CAAC;CAChC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Высокоуровневый API для доступа к DOM-элементам рендерера.
3
+ *
4
+ * @remarks
5
+ * Предоставляет доступ к canvas и DOM-элементу рендерера.
6
+ * Используется модулями и хендлерами, которым нужно взаимодействовать
7
+ * с DOM (например, для подписки на события мыши или настройки canvas).
8
+ *
9
+ * @see {@link DomApi} - реализация этого интерфейса
10
+ * @see {@link IRendererDomAccess} - низкоуровневый доступ к DOM (internal)
11
+ *
12
+ * @internal
13
+ * @interface
14
+ */
15
+ export interface IDomApi {
16
+ /**
17
+ * Возвращает canvas-элемент редактора.
18
+ *
19
+ * @returns HTMLCanvasElement - canvas элемент
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const canvas = domApi.getCanvas();
24
+ * ```
25
+ *
26
+ * @internal
27
+ * @method
28
+ */
29
+ getCanvas(): HTMLCanvasElement;
30
+ /**
31
+ * Возвращает DOM-элемент рендерера.
32
+ *
33
+ * @remarks
34
+ * Обычно это тот же canvas, но может быть другим элементом
35
+ * (например, div-обёрткой). Используется для подписки на события ввода.
36
+ *
37
+ * @returns HTMLElement - DOM-элемент для подписки на события
38
+ *
39
+ * @example
40
+ * ```typescript
41
+ * const domElement = domApi.getDomElement();
42
+ * ```
43
+ *
44
+ * @internal
45
+ * @method
46
+ */
47
+ getDomElement(): HTMLElement;
48
+ }
49
+ //# sourceMappingURL=dom-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom-api.d.ts","sourceRoot":"","sources":["../../../src/interfaces/api/dom-api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,OAAO;IACtB;;;;;;;;;;;;OAYG;IACH,SAAS,IAAI,iBAAiB,CAAC;IAE/B;;;;;;;;;;;;;;;;OAgBG;IACH,aAAa,IAAI,WAAW,CAAC;CAC9B"}
@@ -1,38 +1,119 @@
1
1
  import * as THREE from 'three';
2
2
  /**
3
- * Интерфейс для управления фигурами внутри рендерера.
4
- * Предоставляет базовый CRUD-набор операций для добавления, удаления и получения фигур из сцены.
3
+ * API для управления мешами (фигурами) в сцене.
4
+ *
5
+ * @remarks
6
+ * Предоставляет базовые CRUD-операции для работы с мешами:
7
+ * - добавление одного или нескольких мешей
8
+ * - удаление одного или нескольких мешей
9
+ * - получение списка всех мешей
10
+ *
11
+ * Используется модулями и менеджерами, которым нужно управлять
12
+ * 3D-объектами на сцене (например, `SceneModule`).
13
+ *
14
+ * @see {@link SceneModule} - реализация этого интерфейса
15
+ * @see {@link Renderer} - рендерер, предоставляющий доступ к сцене
16
+ *
5
17
  * @internal
18
+ * @interface
6
19
  */
7
20
  export interface IMeshApi {
8
21
  /**
9
- * Добавляет фигуру в сцену.
22
+ * Добавляет один меш на сцену.
10
23
  *
11
- * @param mesh - Фигура, которую необходимо добавить.
24
+ * @param mesh - меш для добавления
25
+ *
26
+ * @remarks
27
+ * Меш становится видимым на сцене после вызова этого метода.
28
+ * Если меш уже добавлен, он не будет продублирован.
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * const geometry = new THREE.BoxGeometry(1, 1, 1);
33
+ * const material = new THREE.MeshStandardMaterial({ color: 0xff0000 });
34
+ * const mesh = new THREE.Mesh(geometry, material);
35
+ * meshApi.addMesh(mesh);
36
+ * ```
37
+ *
38
+ * @internal
39
+ * @method
12
40
  */
13
41
  addMesh(mesh: THREE.Mesh): void;
14
42
  /**
15
- * Добавляет несколько фигур в сцену за один вызов.
43
+ * Добавляет несколько мешей на сцену за один вызов.
44
+ *
45
+ * @param meshes - массив мешей для добавления
16
46
  *
17
- * @param meshes - Массив фигур для добавления.
47
+ * @remarks
48
+ * Полезно для массового добавления объектов, например,
49
+ * при загрузке сцены из файла.
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * const meshes = [mesh1, mesh2, mesh3];
54
+ * meshApi.addMeshes(meshes);
55
+ * ```
56
+ *
57
+ * @internal
58
+ * @method
18
59
  */
19
60
  addMeshes(meshes: THREE.Mesh[]): void;
20
61
  /**
21
- * Удаляет фигуру из сцены.
62
+ * Удаляет один меш со сцены.
63
+ *
64
+ * @param mesh - меш для удаления
65
+ *
66
+ * @remarks
67
+ * Меш перестаёт отображаться, но его геометрия и материал
68
+ * остаются в памяти. Для полного освобождения памяти нужно
69
+ * вызвать `dispose()` у геометрии и материала.
22
70
  *
23
- * @param mesh - Фигура, которую необходимо удалить.
71
+ * @example
72
+ * ```typescript
73
+ * meshApi.removeMesh(mesh);
74
+ * mesh.geometry.dispose();
75
+ * mesh.material.dispose();
76
+ * ```
77
+ *
78
+ * @internal
79
+ * @method
24
80
  */
25
81
  removeMesh(mesh: THREE.Mesh): void;
26
82
  /**
27
- * Удаляет несколько фигур из сцены за один вызов.
83
+ * Удаляет несколько мешей со сцены за один вызов.
84
+ *
85
+ * @param meshes - массив мешей для удаления
86
+ *
87
+ * @remarks
88
+ * Полезно для массового удаления объектов, например,
89
+ * при очистке сцены.
90
+ *
91
+ * @example
92
+ * ```typescript
93
+ * const meshes = meshApi.getMeshes();
94
+ * meshApi.removeMeshes(meshes);
95
+ * ```
28
96
  *
29
- * @param meshes - Массив фигур для удаления.
97
+ * @internal
98
+ * @method
30
99
  */
31
100
  removeMeshes(meshes: THREE.Mesh[]): void;
32
101
  /**
33
- * Возвращает список всех фигур, находящихся в сцене.
102
+ * Возвращает список всех мешей, находящихся на сцене.
103
+ *
104
+ * @returns массив мешей
105
+ *
106
+ * @remarks
107
+ * Возвращает только меши, добавленные через `addMesh` или `addMeshes`.
108
+ * Вспомогательные объекты (сетка, оси, свет) не включаются в список.
109
+ *
110
+ * @example
111
+ * ```typescript
112
+ * const allMeshes = meshApi.getMeshes();
113
+ * ```
34
114
  *
35
- * @returns Массив текущих фигур.
115
+ * @internal
116
+ * @method
36
117
  */
37
118
  getMeshes(): THREE.Mesh[];
38
119
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mesh-api.d.ts","sourceRoot":"","sources":["../../../src/interfaces/api/mesh-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACvB;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAEhC;;;;OAIG;IACH,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IAEtC;;;;OAIG;IACH,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAEnC;;;;OAIG;IACH,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IAEzC;;;;OAIG;IACH,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;CAC3B"}
1
+ {"version":3,"file":"mesh-api.d.ts","sourceRoot":"","sources":["../../../src/interfaces/api/mesh-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,QAAQ;IACvB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAEhC;;;;;;;;;;;;;;;;;OAiBG;IACH,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IAEtC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAEnC;;;;;;;;;;;;;;;;;OAiBG;IACH,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IAEzC;;;;;;;;;;;;;;;;OAgBG;IACH,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;CAC3B"}
@@ -6,9 +6,11 @@ import { SelectMode } from '@planara/types';
6
6
  * определяет, какие объекты участвуют в пиккинге и какие пороги
7
7
  * используются:
8
8
  * Настройка режима может меняться на лету, перед любым вызовом `raycaster.intersectObjects`.
9
+ *
9
10
  * @internal
11
+ * @interface
10
12
  */
11
- export interface IRaycastAPI {
13
+ export interface IRaycastApi {
12
14
  /**
13
15
  * Устанавливает режим работы Raycaster и связанные с ним таргеты/пороговые параметры.
14
16
  *
@@ -17,6 +19,9 @@ export interface IRaycastAPI {
17
19
  * - `Edge`
18
20
  * - `Vertex`
19
21
  * @param mode Текущий режим выбора (`Mesh | Face | Edge | Vertex`).
22
+ *
23
+ * @internal
24
+ * @method
20
25
  */
21
26
  setRaycastMode(mode: SelectMode): void;
22
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"raycast-api.d.ts","sourceRoot":"","sources":["../../../src/interfaces/api/raycast-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;;;OAQG;IACH,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;CACxC"}
1
+ {"version":3,"file":"raycast-api.d.ts","sourceRoot":"","sources":["../../../src/interfaces/api/raycast-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;;;;;;;;;GAUG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;CACxC"}