@planara/core 2.3.2 → 2.5.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.
@@ -27,6 +27,8 @@ export declare class EditorRenderer extends Renderer {
27
27
  * необходима для отправки только уникальных событий в event bus
28
28
  */
29
29
  private _lastHovered;
30
+ /** Gizmo для управления отображением perspective camera */
31
+ private _cameraGizmo;
30
32
  constructor(_canvas: HTMLCanvasElement, _bus: EventBus);
31
33
  /**
32
34
  * Обновление состояния рендерера.
@@ -57,6 +59,7 @@ export declare class EditorRenderer extends Renderer {
57
59
  */
58
60
  setRaycastMode(mode: SelectMode): void;
59
61
  dispose(): void;
62
+ protected render(): void;
60
63
  /** Инициализация обработчиков событий на hover/click */
61
64
  private _initMouseListeners;
62
65
  /** Обработчик события для hover */
@@ -1 +1 @@
1
- {"version":3,"file":"editor-renderer.d.ts","sourceRoot":"","sources":["../../src/core/editor-renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAOtC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG/C,OAAO,EAAE,KAAK,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAGnE;;;;;GAKG;AACH,qBACa,cAAe,SAAQ,QAAQ;IAwBtB,OAAO,CAAC,OAAO;IACb,OAAO,CAAC,IAAI;IAxBlC,8CAA8C;IAC9C,OAAO,CAAC,MAAM,CAAkB;IAEhC,8CAA8C;IAC9C,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IAEnD,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmB;IAE9C,kBAAkB;IAClB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IAExC,iEAAiE;IACjE,OAAO,CAAC,sBAAsB,CAAS;IAEvC;;;OAGG;IACH,OAAO,CAAC,YAAY,CAA+B;gBAGvB,OAAO,EAAE,iBAAiB,EACxB,IAAI,EAAE,QAAQ;IAuC5C;;OAEG;IACH,SAAS,CAAC,MAAM;IAIhB,iCAAiC;IACjB,SAAS,CAAC,MAAM,EAAE,MAAM;IAkBxC;;;;OAIG;IACI,wBAAwB,CAAC,IAAI,EAAE,QAAQ;IAI9C;;;;OAIG;IACI,uBAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ;IAIrD;;;OAGG;IACI,uBAAuB;IAI9B;;;OAGG;IACI,cAAc,CAAC,IAAI,EAAE,UAAU;IAsBtB,OAAO;IA6BvB,wDAAwD;IACxD,OAAO,CAAC,mBAAmB;IAiB3B,mCAAmC;IACnC,OAAO,CAAC,gBAAgB,CAEtB;IAEF,kCAAkC;IAClC,OAAO,CAAC,iBAAiB,CAEvB;IAEF,iGAAiG;IACjG,OAAO,CAAC,oBAAoB;CAqC7B"}
1
+ {"version":3,"file":"editor-renderer.d.ts","sourceRoot":"","sources":["../../src/core/editor-renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAWtC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG/C,OAAO,EAAE,KAAK,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAGnE;;;;;GAKG;AACH,qBACa,cAAe,SAAQ,QAAQ;IA2BtB,OAAO,CAAC,OAAO;IACb,OAAO,CAAC,IAAI;IA3BlC,8CAA8C;IAC9C,OAAO,CAAC,MAAM,CAAkB;IAEhC,8CAA8C;IAC9C,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IAEnD,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmB;IAE9C,kBAAkB;IAClB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IAExC,iEAAiE;IACjE,OAAO,CAAC,sBAAsB,CAAS;IAEvC;;;OAGG;IACH,OAAO,CAAC,YAAY,CAA+B;IAEnD,2DAA2D;IAC3D,OAAO,CAAC,YAAY,CAAmB;gBAGX,OAAO,EAAE,iBAAiB,EACxB,IAAI,EAAE,QAAQ;IA6C5C;;OAEG;IACH,SAAS,CAAC,MAAM;IAIhB,iCAAiC;IACjB,SAAS,CAAC,MAAM,EAAE,MAAM;IAkBxC;;;;OAIG;IACI,wBAAwB,CAAC,IAAI,EAAE,QAAQ;IAI9C;;;;OAIG;IACI,uBAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ;IAIrD;;;OAGG;IACI,uBAAuB;IAI9B;;;OAGG;IACI,cAAc,CAAC,IAAI,EAAE,UAAU;IAsBtB,OAAO;cA6BJ,MAAM;IAMzB,wDAAwD;IACxD,OAAO,CAAC,mBAAmB;IAiB3B,mCAAmC;IACnC,OAAO,CAAC,gBAAgB,CAEtB;IAEF,kCAAkC;IAClC,OAAO,CAAC,iBAAiB,CAEvB;IAEF,iGAAiG;IACjG,OAAO,CAAC,oBAAoB;CAqC7B"}
@@ -36,11 +36,19 @@ export declare class EdgeSelectHandler implements ISelectHandler {
36
36
  rollback(): void;
37
37
  /** Освобождает ресурсы хендлера, удаляет слушатели и очищает внутренние данные. */
38
38
  dispose(): Promise<void> | void;
39
+ /** Инициализация буферных линий для режима (hover и click).
40
+ * На весь режим будет использовано 2 глобальных линии на сцене,
41
+ * использоваться они будут только для обозначения геометрии ребер конкретной фигуры.
42
+ */
39
43
  private _makeOverlayLine;
40
44
  /** Локальные точки сегмента переводим в target (который висит на сцене) */
41
45
  private _writeWorldSegment;
42
46
  private _same;
43
47
  /** Центрует `THREE.Line` на сегменте и ориентирует её вдоль ребра */
44
48
  private _centerAndOrientLineOnSegment;
49
+ /** Поиск родителя ребер (сама фигура) */
50
+ private _findParentMesh;
51
+ /** Запись метаданных выбранного ребра для использования инструментов */
52
+ private _prepareEdgeMetadata;
45
53
  }
46
54
  //# sourceMappingURL=edge-select-handler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"edge-select-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/select/edge-select-handler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAExE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAKtE;;;;;;GAMG;AACH,qBACa,iBAAkB,YAAW,cAAc;IAqB7B,OAAO,CAAC,IAAI;IACX,OAAO,CAAC,MAAM;IArBxC,+DAA+D;IAC/D,SAAgB,IAAI,EAAE,UAAU,CAAmB;IAEnD,gCAAgC;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,+BAA+B;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IAEzC,iEAAiE;IACjE,OAAO,CAAC,QAAQ,CAA2D;IAC3E,gEAAgE;IAChE,OAAO,CAAC,SAAS,CAA2D;IAG5E,sCAAsC;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;gBAGZ,IAAI,EAAE,UAAU,EACf,MAAM,EAAE,YAAY;IActD,yCAAyC;IAClC,MAAM,CACX,OAAO,EAAE,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,EACtF,IAAI,EAAE,eAAe,GACpB,IAAI;IA0DP,oCAAoC;IAC7B,QAAQ,IAAI,IAAI;IASvB,mFAAmF;IAC5E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IActC,OAAO,CAAC,gBAAgB;IAyBxB,2EAA2E;IAC3E,OAAO,CAAC,kBAAkB;IAkB1B,OAAO,CAAC,KAAK;IAOb,qEAAqE;IACrE,OAAO,CAAC,6BAA6B;CAqCtC"}
1
+ {"version":3,"file":"edge-select-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/select/edge-select-handler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAExE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAKtE;;;;;;GAMG;AACH,qBACa,iBAAkB,YAAW,cAAc;IAqB7B,OAAO,CAAC,IAAI;IACX,OAAO,CAAC,MAAM;IArBxC,+DAA+D;IAC/D,SAAgB,IAAI,EAAE,UAAU,CAAmB;IAEnD,gCAAgC;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,+BAA+B;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IAEzC,iEAAiE;IACjE,OAAO,CAAC,QAAQ,CAA2D;IAC3E,gEAAgE;IAChE,OAAO,CAAC,SAAS,CAA2D;IAG5E,sCAAsC;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;gBAGZ,IAAI,EAAE,UAAU,EACf,MAAM,EAAE,YAAY;IActD,yCAAyC;IAClC,MAAM,CACX,OAAO,EAAE,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,EACtF,IAAI,EAAE,eAAe,GACpB,IAAI;IAoEP,oCAAoC;IAC7B,QAAQ,IAAI,IAAI;IASvB,mFAAmF;IAC5E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IActC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAyBxB,2EAA2E;IAC3E,OAAO,CAAC,kBAAkB;IAkB1B,OAAO,CAAC,KAAK;IAOb,qEAAqE;IACrE,OAAO,CAAC,6BAA6B;IAsCrC,yCAAyC;IACzC,OAAO,CAAC,eAAe;IASvB,wEAAwE;IACxE,OAAO,CAAC,oBAAoB;CA2E7B"}
package/dist/index.cjs.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("reflect-metadata");const n=require("three"),d=require("@planara/types"),Ae=require("@planara/three"),l=require("tsyringe"),at=require("events"),ht=require("mobx");function lt(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 c=lt(n),ct={[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.")}},qe=new c.MeshStandardMaterial({color:12566463,metalness:0,roughness:.6});class Pe{scene;camera;renderer;canvas;meshes=[];constructor(e){this.canvas=e,this.scene=new c.Scene,this.scene.background=new c.Color(1710618),this.camera=new c.PerspectiveCamera(45,e.clientWidth/e.clientHeight,.1,1e3),this.camera.position.set(1,1,7),this.renderer=new c.WebGLRenderer({canvas:e,antialias:!0}),this.renderer.setSize(e.clientWidth,e.clientHeight);const s=new c.AmbientLight(16777215,.5);this.scene.add(s);const i=new c.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 c.BufferGeometry;s.setAttribute("position",new c.Float32BufferAttribute(e.position,3)),e.normal&&s.setAttribute("normal",new c.Float32BufferAttribute(e.normal,3)),e.uv&&s.setAttribute("uv",new c.Float32BufferAttribute(e.uv,2));const i=new c.Mesh(s,qe);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}}const Y=new n.Raycaster,M=new n.Vector3,R=new n.Vector3,m=new n.Quaternion,je={X:new n.Vector3(1,0,0),Y:new n.Vector3(0,1,0),Z:new n.Vector3(0,0,1)},re={type:"change"},Ce={type:"mouseDown",mode:null},Ie={type:"mouseUp",mode:null},Re={type:"objectChange"};class dt extends n.Controls{constructor(e,s=null){super(void 0,s);const i=new yt(this);this._root=i;const o=new gt;this._gizmo=o,i.add(o);const a=new bt;this._plane=a,i.add(a);const r=this;function h(E,H){let G=H;Object.defineProperty(r,E,{get:function(){return G!==void 0?G:H},set:function(k){G!==k&&(G=k,a[E]=k,o[E]=k,r.dispatchEvent({type:E+"-changed",value:k}),r.dispatchEvent(re))}}),r[E]=H,a[E]=H,o[E]=H}h("camera",e),h("object",void 0),h("enabled",!0),h("axis",null),h("mode","translate"),h("translationSnap",null),h("rotationSnap",null),h("scaleSnap",null),h("space","world"),h("size",1),h("dragging",!1),h("showX",!0),h("showY",!0),h("showZ",!0),h("minX",-1/0),h("maxX",1/0),h("minY",-1/0),h("maxY",1/0),h("minZ",-1/0),h("maxZ",1/0);const p=new n.Vector3,y=new n.Vector3,b=new n.Quaternion,D=new n.Quaternion,S=new n.Vector3,z=new n.Quaternion,B=new n.Vector3,L=new n.Vector3,A=new n.Vector3,x=0,j=new n.Vector3;h("worldPosition",p),h("worldPositionStart",y),h("worldQuaternion",b),h("worldQuaternionStart",D),h("cameraPosition",S),h("cameraQuaternion",z),h("pointStart",B),h("pointEnd",L),h("rotationAxis",A),h("rotationAngle",x),h("eye",j),this._offset=new n.Vector3,this._startNorm=new n.Vector3,this._endNorm=new n.Vector3,this._cameraScale=new n.Vector3,this._parentPosition=new n.Vector3,this._parentQuaternion=new n.Quaternion,this._parentQuaternionInv=new n.Quaternion,this._parentScale=new n.Vector3,this._worldScaleStart=new n.Vector3,this._worldQuaternionInv=new n.Quaternion,this._worldScale=new n.Vector3,this._positionStart=new n.Vector3,this._quaternionStart=new n.Quaternion,this._scaleStart=new n.Vector3,this._getPointer=pt.bind(this),this._onPointerDown=ut.bind(this),this._onPointerHover=_t.bind(this),this._onPointerMove=mt.bind(this),this._onPointerUp=ft.bind(this),s!==null&&this.connect(s)}connect(e){super.connect(e),this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointermove",this._onPointerHover),this.domElement.addEventListener("pointerup",this._onPointerUp),this.domElement.style.touchAction="none"}disconnect(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.removeEventListener("pointermove",this._onPointerHover),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.domElement.style.touchAction="auto"}getHelper(){return this._root}pointerHover(e){if(this.object===void 0||this.dragging===!0)return;e!==null&&Y.setFromCamera(e,this.camera);const s=ae(this._gizmo.picker[this.mode],Y);s?this.axis=s.object.name:this.axis=null}pointerDown(e){if(!(this.object===void 0||this.dragging===!0||e!=null&&e.button!==0)&&this.axis!==null){e!==null&&Y.setFromCamera(e,this.camera);const s=ae(this._plane,Y,!0);s&&(this.object.updateMatrixWorld(),this.object.parent.updateMatrixWorld(),this._positionStart.copy(this.object.position),this._quaternionStart.copy(this.object.quaternion),this._scaleStart.copy(this.object.scale),this.object.matrixWorld.decompose(this.worldPositionStart,this.worldQuaternionStart,this._worldScaleStart),this.pointStart.copy(s.point).sub(this.worldPositionStart)),this.dragging=!0,Ce.mode=this.mode,this.dispatchEvent(Ce)}}pointerMove(e){const s=this.axis,i=this.mode,o=this.object;let a=this.space;if(i==="scale"?a="local":(s==="E"||s==="XYZE"||s==="XYZ")&&(a="world"),o===void 0||s===null||this.dragging===!1||e!==null&&e.button!==-1)return;e!==null&&Y.setFromCamera(e,this.camera);const r=ae(this._plane,Y,!0);if(r){if(this.pointEnd.copy(r.point).sub(this.worldPositionStart),i==="translate")this._offset.copy(this.pointEnd).sub(this.pointStart),a==="local"&&s!=="XYZ"&&this._offset.applyQuaternion(this._worldQuaternionInv),s.indexOf("X")===-1&&(this._offset.x=0),s.indexOf("Y")===-1&&(this._offset.y=0),s.indexOf("Z")===-1&&(this._offset.z=0),a==="local"&&s!=="XYZ"?this._offset.applyQuaternion(this._quaternionStart).divide(this._parentScale):this._offset.applyQuaternion(this._parentQuaternionInv).divide(this._parentScale),o.position.copy(this._offset).add(this._positionStart),this.translationSnap&&(a==="local"&&(o.position.applyQuaternion(m.copy(this._quaternionStart).invert()),s.search("X")!==-1&&(o.position.x=Math.round(o.position.x/this.translationSnap)*this.translationSnap),s.search("Y")!==-1&&(o.position.y=Math.round(o.position.y/this.translationSnap)*this.translationSnap),s.search("Z")!==-1&&(o.position.z=Math.round(o.position.z/this.translationSnap)*this.translationSnap),o.position.applyQuaternion(this._quaternionStart)),a==="world"&&(o.parent&&o.position.add(M.setFromMatrixPosition(o.parent.matrixWorld)),s.search("X")!==-1&&(o.position.x=Math.round(o.position.x/this.translationSnap)*this.translationSnap),s.search("Y")!==-1&&(o.position.y=Math.round(o.position.y/this.translationSnap)*this.translationSnap),s.search("Z")!==-1&&(o.position.z=Math.round(o.position.z/this.translationSnap)*this.translationSnap),o.parent&&o.position.sub(M.setFromMatrixPosition(o.parent.matrixWorld)))),o.position.x=Math.max(this.minX,Math.min(this.maxX,o.position.x)),o.position.y=Math.max(this.minY,Math.min(this.maxY,o.position.y)),o.position.z=Math.max(this.minZ,Math.min(this.maxZ,o.position.z));else if(i==="scale"){if(s.search("XYZ")!==-1){let h=this.pointEnd.length()/this.pointStart.length();this.pointEnd.dot(this.pointStart)<0&&(h*=-1),R.set(h,h,h)}else M.copy(this.pointStart),R.copy(this.pointEnd),M.applyQuaternion(this._worldQuaternionInv),R.applyQuaternion(this._worldQuaternionInv),R.divide(M),s.search("X")===-1&&(R.x=1),s.search("Y")===-1&&(R.y=1),s.search("Z")===-1&&(R.z=1);o.scale.copy(this._scaleStart).multiply(R),this.scaleSnap&&(s.search("X")!==-1&&(o.scale.x=Math.round(o.scale.x/this.scaleSnap)*this.scaleSnap||this.scaleSnap),s.search("Y")!==-1&&(o.scale.y=Math.round(o.scale.y/this.scaleSnap)*this.scaleSnap||this.scaleSnap),s.search("Z")!==-1&&(o.scale.z=Math.round(o.scale.z/this.scaleSnap)*this.scaleSnap||this.scaleSnap))}else if(i==="rotate"){this._offset.copy(this.pointEnd).sub(this.pointStart);const h=20/this.worldPosition.distanceTo(M.setFromMatrixPosition(this.camera.matrixWorld));let p=!1;s==="XYZE"?(this.rotationAxis.copy(this._offset).cross(this.eye).normalize(),this.rotationAngle=this._offset.dot(M.copy(this.rotationAxis).cross(this.eye))*h):(s==="X"||s==="Y"||s==="Z")&&(this.rotationAxis.copy(je[s]),M.copy(je[s]),a==="local"&&M.applyQuaternion(this.worldQuaternion),M.cross(this.eye),M.length()===0?p=!0:this.rotationAngle=this._offset.dot(M.normalize())*h),(s==="E"||p)&&(this.rotationAxis.copy(this.eye),this.rotationAngle=this.pointEnd.angleTo(this.pointStart),this._startNorm.copy(this.pointStart).normalize(),this._endNorm.copy(this.pointEnd).normalize(),this.rotationAngle*=this._endNorm.cross(this._startNorm).dot(this.eye)<0?1:-1),this.rotationSnap&&(this.rotationAngle=Math.round(this.rotationAngle/this.rotationSnap)*this.rotationSnap),a==="local"&&s!=="E"&&s!=="XYZE"?(o.quaternion.copy(this._quaternionStart),o.quaternion.multiply(m.setFromAxisAngle(this.rotationAxis,this.rotationAngle)).normalize()):(this.rotationAxis.applyQuaternion(this._parentQuaternionInv),o.quaternion.copy(m.setFromAxisAngle(this.rotationAxis,this.rotationAngle)),o.quaternion.multiply(this._quaternionStart).normalize())}this.dispatchEvent(re),this.dispatchEvent(Re)}}pointerUp(e){e!==null&&e.button!==0||(this.dragging&&this.axis!==null&&(Ie.mode=this.mode,this.dispatchEvent(Ie)),this.dragging=!1,this.axis=null)}dispose(){this.disconnect(),this._root.dispose()}attach(e){return this.object=e,this._root.visible=!0,this}detach(){return this.object=void 0,this.axis=null,this._root.visible=!1,this}reset(){this.enabled&&this.dragging&&(this.object.position.copy(this._positionStart),this.object.quaternion.copy(this._quaternionStart),this.object.scale.copy(this._scaleStart),this.dispatchEvent(re),this.dispatchEvent(Re),this.pointStart.copy(this.pointEnd))}getRaycaster(){return Y}getMode(){return this.mode}setMode(e){this.mode=e}setTranslationSnap(e){this.translationSnap=e}setRotationSnap(e){this.rotationSnap=e}setScaleSnap(e){this.scaleSnap=e}setSize(e){this.size=e}setSpace(e){this.space=e}setColors(e,s,i,o){const a=this._gizmo.materialLib;a.xAxis.color.set(e),a.yAxis.color.set(s),a.zAxis.color.set(i),a.active.color.set(o),a.xAxisTransparent.color.set(e),a.yAxisTransparent.color.set(s),a.zAxisTransparent.color.set(i),a.activeTransparent.color.set(o),a.xAxis._color&&a.xAxis._color.set(e),a.yAxis._color&&a.yAxis._color.set(s),a.zAxis._color&&a.zAxis._color.set(i),a.active._color&&a.active._color.set(o),a.xAxisTransparent._color&&a.xAxisTransparent._color.set(e),a.yAxisTransparent._color&&a.yAxisTransparent._color.set(s),a.zAxisTransparent._color&&a.zAxisTransparent._color.set(i),a.activeTransparent._color&&a.activeTransparent._color.set(o)}}function pt(t){if(this.domElement.ownerDocument.pointerLockElement)return{x:0,y:0,button:t.button};{const e=this.domElement.getBoundingClientRect();return{x:(t.clientX-e.left)/e.width*2-1,y:-(t.clientY-e.top)/e.height*2+1,button:t.button}}}function _t(t){if(this.enabled)switch(t.pointerType){case"mouse":case"pen":this.pointerHover(this._getPointer(t));break}}function ut(t){this.enabled&&(document.pointerLockElement||this.domElement.setPointerCapture(t.pointerId),this.domElement.addEventListener("pointermove",this._onPointerMove),this.pointerHover(this._getPointer(t)),this.pointerDown(this._getPointer(t)))}function mt(t){this.enabled&&this.pointerMove(this._getPointer(t))}function ft(t){this.enabled&&(this.domElement.releasePointerCapture(t.pointerId),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.pointerUp(this._getPointer(t)))}function ae(t,e,s){const i=e.intersectObject(t,!0);for(let o=0;o<i.length;o++)if(i[o].object.visible||s)return i[o];return!1}const ee=new n.Euler,u=new n.Vector3(0,1,0),He=new n.Vector3(0,0,0),ke=new n.Matrix4,te=new n.Quaternion,ne=new n.Quaternion,O=new n.Vector3,Ye=new n.Matrix4,N=new n.Vector3(1,0,0),Z=new n.Vector3(0,1,0),W=new n.Vector3(0,0,1),se=new n.Vector3,F=new n.Vector3,Q=new n.Vector3;class yt extends n.Object3D{constructor(e){super(),this.isTransformControlsRoot=!0,this.controls=e,this.visible=!1}updateMatrixWorld(e){const s=this.controls;s.object!==void 0&&(s.object.updateMatrixWorld(),s.object.parent===null?console.error("TransformControls: The attached 3D object must be a part of the scene graph."):s.object.parent.matrixWorld.decompose(s._parentPosition,s._parentQuaternion,s._parentScale),s.object.matrixWorld.decompose(s.worldPosition,s.worldQuaternion,s._worldScale),s._parentQuaternionInv.copy(s._parentQuaternion).invert(),s._worldQuaternionInv.copy(s.worldQuaternion).invert()),s.camera.updateMatrixWorld(),s.camera.matrixWorld.decompose(s.cameraPosition,s.cameraQuaternion,s._cameraScale),s.camera.isOrthographicCamera?s.camera.getWorldDirection(s.eye).negate():s.eye.copy(s.cameraPosition).sub(s.worldPosition).normalize(),super.updateMatrixWorld(e)}dispose(){this.traverse(function(e){e.geometry&&e.geometry.dispose(),e.material&&e.material.dispose()})}}class gt extends n.Object3D{constructor(){super(),this.isTransformControlsGizmo=!0,this.type="TransformControlsGizmo";const e=new n.MeshBasicMaterial({depthTest:!1,depthWrite:!1,fog:!1,toneMapped:!1,transparent:!0}),s=new n.LineBasicMaterial({depthTest:!1,depthWrite:!1,fog:!1,toneMapped:!1,transparent:!0}),i=e.clone();i.opacity=.15;const o=s.clone();o.opacity=.5;const a=e.clone();a.color.setHex(16711680);const r=e.clone();r.color.setHex(65280);const h=e.clone();h.color.setHex(255);const p=e.clone();p.color.setHex(16711680),p.opacity=.5;const y=e.clone();y.color.setHex(65280),y.opacity=.5;const b=e.clone();b.color.setHex(255),b.opacity=.5;const D=e.clone();D.opacity=.25;const S=e.clone();S.color.setHex(16776960),S.opacity=.25;const z=e.clone();z.color.setHex(16776960);const B=e.clone();B.color.setHex(7895160),this.materialLib={xAxis:a,yAxis:r,zAxis:h,active:z,xAxisTransparent:p,yAxisTransparent:y,zAxisTransparent:b,activeTransparent:S};const L=new n.CylinderGeometry(0,.04,.1,12);L.translate(0,.05,0);const A=new n.BoxGeometry(.08,.08,.08);A.translate(0,.04,0);const x=new n.BufferGeometry;x.setAttribute("position",new n.Float32BufferAttribute([0,0,0,1,0,0],3));const j=new n.CylinderGeometry(.0075,.0075,.5,3);j.translate(0,.25,0);function E(P,$){const T=new n.TorusGeometry(P,.0075,3,64,$*Math.PI*2);return T.rotateY(Math.PI/2),T.rotateX(Math.PI/2),T}function H(){const P=new n.BufferGeometry;return P.setAttribute("position",new n.Float32BufferAttribute([0,0,0,1,1,1],3)),P}const G={X:[[new n.Mesh(L,a),[.5,0,0],[0,0,-Math.PI/2]],[new n.Mesh(L,a),[-.5,0,0],[0,0,Math.PI/2]],[new n.Mesh(j,a),[0,0,0],[0,0,-Math.PI/2]]],Y:[[new n.Mesh(L,r),[0,.5,0]],[new n.Mesh(L,r),[0,-.5,0],[Math.PI,0,0]],[new n.Mesh(j,r)]],Z:[[new n.Mesh(L,h),[0,0,.5],[Math.PI/2,0,0]],[new n.Mesh(L,h),[0,0,-.5],[-Math.PI/2,0,0]],[new n.Mesh(j,h),null,[Math.PI/2,0,0]]],XYZ:[[new n.Mesh(new n.OctahedronGeometry(.1,0),D),[0,0,0]]],XY:[[new n.Mesh(new n.BoxGeometry(.15,.15,.01),b),[.15,.15,0]]],YZ:[[new n.Mesh(new n.BoxGeometry(.15,.15,.01),p),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new n.Mesh(new n.BoxGeometry(.15,.15,.01),y),[.15,0,.15],[-Math.PI/2,0,0]]]},k={X:[[new n.Mesh(new n.CylinderGeometry(.2,0,.6,4),i),[.3,0,0],[0,0,-Math.PI/2]],[new n.Mesh(new n.CylinderGeometry(.2,0,.6,4),i),[-.3,0,0],[0,0,Math.PI/2]]],Y:[[new n.Mesh(new n.CylinderGeometry(.2,0,.6,4),i),[0,.3,0]],[new n.Mesh(new n.CylinderGeometry(.2,0,.6,4),i),[0,-.3,0],[0,0,Math.PI]]],Z:[[new n.Mesh(new n.CylinderGeometry(.2,0,.6,4),i),[0,0,.3],[Math.PI/2,0,0]],[new n.Mesh(new n.CylinderGeometry(.2,0,.6,4),i),[0,0,-.3],[-Math.PI/2,0,0]]],XYZ:[[new n.Mesh(new n.OctahedronGeometry(.2,0),i)]],XY:[[new n.Mesh(new n.BoxGeometry(.2,.2,.01),i),[.15,.15,0]]],YZ:[[new n.Mesh(new n.BoxGeometry(.2,.2,.01),i),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new n.Mesh(new n.BoxGeometry(.2,.2,.01),i),[.15,0,.15],[-Math.PI/2,0,0]]]},Je={START:[[new n.Mesh(new n.OctahedronGeometry(.01,2),o),null,null,null,"helper"]],END:[[new n.Mesh(new n.OctahedronGeometry(.01,2),o),null,null,null,"helper"]],DELTA:[[new n.Line(H(),o),null,null,null,"helper"]],X:[[new n.Line(x,o),[-1e3,0,0],null,[1e6,1,1],"helper"]],Y:[[new n.Line(x,o),[0,-1e3,0],[0,0,Math.PI/2],[1e6,1,1],"helper"]],Z:[[new n.Line(x,o),[0,0,-1e3],[0,-Math.PI/2,0],[1e6,1,1],"helper"]]},et={XYZE:[[new n.Mesh(E(.5,1),B),null,[0,Math.PI/2,0]]],X:[[new n.Mesh(E(.5,.5),a)]],Y:[[new n.Mesh(E(.5,.5),r),null,[0,0,-Math.PI/2]]],Z:[[new n.Mesh(E(.5,.5),h),null,[0,Math.PI/2,0]]],E:[[new n.Mesh(E(.75,1),S),null,[0,Math.PI/2,0]]]},tt={AXIS:[[new n.Line(x,o),[-1e3,0,0],null,[1e6,1,1],"helper"]]},st={XYZE:[[new n.Mesh(new n.SphereGeometry(.25,10,8),i)]],X:[[new n.Mesh(new n.TorusGeometry(.5,.1,4,24),i),[0,0,0],[0,-Math.PI/2,-Math.PI/2]]],Y:[[new n.Mesh(new n.TorusGeometry(.5,.1,4,24),i),[0,0,0],[Math.PI/2,0,0]]],Z:[[new n.Mesh(new n.TorusGeometry(.5,.1,4,24),i),[0,0,0],[0,0,-Math.PI/2]]],E:[[new n.Mesh(new n.TorusGeometry(.75,.1,2,24),i)]]},it={X:[[new n.Mesh(A,a),[.5,0,0],[0,0,-Math.PI/2]],[new n.Mesh(j,a),[0,0,0],[0,0,-Math.PI/2]],[new n.Mesh(A,a),[-.5,0,0],[0,0,Math.PI/2]]],Y:[[new n.Mesh(A,r),[0,.5,0]],[new n.Mesh(j,r)],[new n.Mesh(A,r),[0,-.5,0],[0,0,Math.PI]]],Z:[[new n.Mesh(A,h),[0,0,.5],[Math.PI/2,0,0]],[new n.Mesh(j,h),[0,0,0],[Math.PI/2,0,0]],[new n.Mesh(A,h),[0,0,-.5],[-Math.PI/2,0,0]]],XY:[[new n.Mesh(new n.BoxGeometry(.15,.15,.01),b),[.15,.15,0]]],YZ:[[new n.Mesh(new n.BoxGeometry(.15,.15,.01),p),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new n.Mesh(new n.BoxGeometry(.15,.15,.01),y),[.15,0,.15],[-Math.PI/2,0,0]]],XYZ:[[new n.Mesh(new n.BoxGeometry(.1,.1,.1),D)]]},ot={X:[[new n.Mesh(new n.CylinderGeometry(.2,0,.6,4),i),[.3,0,0],[0,0,-Math.PI/2]],[new n.Mesh(new n.CylinderGeometry(.2,0,.6,4),i),[-.3,0,0],[0,0,Math.PI/2]]],Y:[[new n.Mesh(new n.CylinderGeometry(.2,0,.6,4),i),[0,.3,0]],[new n.Mesh(new n.CylinderGeometry(.2,0,.6,4),i),[0,-.3,0],[0,0,Math.PI]]],Z:[[new n.Mesh(new n.CylinderGeometry(.2,0,.6,4),i),[0,0,.3],[Math.PI/2,0,0]],[new n.Mesh(new n.CylinderGeometry(.2,0,.6,4),i),[0,0,-.3],[-Math.PI/2,0,0]]],XY:[[new n.Mesh(new n.BoxGeometry(.2,.2,.01),i),[.15,.15,0]]],YZ:[[new n.Mesh(new n.BoxGeometry(.2,.2,.01),i),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new n.Mesh(new n.BoxGeometry(.2,.2,.01),i),[.15,0,.15],[-Math.PI/2,0,0]]],XYZ:[[new n.Mesh(new n.BoxGeometry(.2,.2,.2),i),[0,0,0]]]},nt={X:[[new n.Line(x,o),[-1e3,0,0],null,[1e6,1,1],"helper"]],Y:[[new n.Line(x,o),[0,-1e3,0],[0,0,Math.PI/2],[1e6,1,1],"helper"]],Z:[[new n.Line(x,o),[0,0,-1e3],[0,-Math.PI/2,0],[1e6,1,1],"helper"]]};function C(P){const $=new n.Object3D;for(const T in P)for(let V=P[T].length;V--;){const w=P[T][V][0].clone(),q=P[T][V][1],K=P[T][V][2],J=P[T][V][3],rt=P[T][V][4];w.name=T,w.tag=rt,q&&w.position.set(q[0],q[1],q[2]),K&&w.rotation.set(K[0],K[1],K[2]),J&&w.scale.set(J[0],J[1],J[2]),w.updateMatrix();const Le=w.geometry.clone();Le.applyMatrix4(w.matrix),w.geometry=Le,w.renderOrder=1/0,w.position.set(0,0,0),w.rotation.set(0,0,0),w.scale.set(1,1,1),$.add(w)}return $}this.gizmo={},this.picker={},this.helper={},this.add(this.gizmo.translate=C(G)),this.add(this.gizmo.rotate=C(et)),this.add(this.gizmo.scale=C(it)),this.add(this.picker.translate=C(k)),this.add(this.picker.rotate=C(st)),this.add(this.picker.scale=C(ot)),this.add(this.helper.translate=C(Je)),this.add(this.helper.rotate=C(tt)),this.add(this.helper.scale=C(nt)),this.picker.translate.visible=!1,this.picker.rotate.visible=!1,this.picker.scale.visible=!1}updateMatrixWorld(e){const i=(this.mode==="scale"?"local":this.space)==="local"?this.worldQuaternion:ne;this.gizmo.translate.visible=this.mode==="translate",this.gizmo.rotate.visible=this.mode==="rotate",this.gizmo.scale.visible=this.mode==="scale",this.helper.translate.visible=this.mode==="translate",this.helper.rotate.visible=this.mode==="rotate",this.helper.scale.visible=this.mode==="scale";let o=[];o=o.concat(this.picker[this.mode].children),o=o.concat(this.gizmo[this.mode].children),o=o.concat(this.helper[this.mode].children);for(let a=0;a<o.length;a++){const r=o[a];r.visible=!0,r.rotation.set(0,0,0),r.position.copy(this.worldPosition);let h;if(this.camera.isOrthographicCamera?h=(this.camera.top-this.camera.bottom)/this.camera.zoom:h=this.worldPosition.distanceTo(this.cameraPosition)*Math.min(1.9*Math.tan(Math.PI*this.camera.fov/360)/this.camera.zoom,7),r.scale.set(1,1,1).multiplyScalar(h*this.size/4),r.tag==="helper"){r.visible=!1,r.name==="AXIS"?(r.visible=!!this.axis,this.axis==="X"&&(m.setFromEuler(ee.set(0,0,0)),r.quaternion.copy(i).multiply(m),Math.abs(u.copy(N).applyQuaternion(i).dot(this.eye))>.9&&(r.visible=!1)),this.axis==="Y"&&(m.setFromEuler(ee.set(0,0,Math.PI/2)),r.quaternion.copy(i).multiply(m),Math.abs(u.copy(Z).applyQuaternion(i).dot(this.eye))>.9&&(r.visible=!1)),this.axis==="Z"&&(m.setFromEuler(ee.set(0,Math.PI/2,0)),r.quaternion.copy(i).multiply(m),Math.abs(u.copy(W).applyQuaternion(i).dot(this.eye))>.9&&(r.visible=!1)),this.axis==="XYZE"&&(m.setFromEuler(ee.set(0,Math.PI/2,0)),u.copy(this.rotationAxis),r.quaternion.setFromRotationMatrix(ke.lookAt(He,u,Z)),r.quaternion.multiply(m),r.visible=this.dragging),this.axis==="E"&&(r.visible=!1)):r.name==="START"?(r.position.copy(this.worldPositionStart),r.visible=this.dragging):r.name==="END"?(r.position.copy(this.worldPosition),r.visible=this.dragging):r.name==="DELTA"?(r.position.copy(this.worldPositionStart),r.quaternion.copy(this.worldQuaternionStart),M.set(1e-10,1e-10,1e-10).add(this.worldPositionStart).sub(this.worldPosition).multiplyScalar(-1),M.applyQuaternion(this.worldQuaternionStart.clone().invert()),r.scale.copy(M),r.visible=this.dragging):(r.quaternion.copy(i),this.dragging?r.position.copy(this.worldPositionStart):r.position.copy(this.worldPosition),this.axis&&(r.visible=this.axis.search(r.name)!==-1));continue}r.quaternion.copy(i),this.mode==="translate"||this.mode==="scale"?(r.name==="X"&&Math.abs(u.copy(N).applyQuaternion(i).dot(this.eye))>.99&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name==="Y"&&Math.abs(u.copy(Z).applyQuaternion(i).dot(this.eye))>.99&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name==="Z"&&Math.abs(u.copy(W).applyQuaternion(i).dot(this.eye))>.99&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name==="XY"&&Math.abs(u.copy(W).applyQuaternion(i).dot(this.eye))<.2&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name==="YZ"&&Math.abs(u.copy(N).applyQuaternion(i).dot(this.eye))<.2&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name==="XZ"&&Math.abs(u.copy(Z).applyQuaternion(i).dot(this.eye))<.2&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1)):this.mode==="rotate"&&(te.copy(i),u.copy(this.eye).applyQuaternion(m.copy(i).invert()),r.name.search("E")!==-1&&r.quaternion.setFromRotationMatrix(ke.lookAt(this.eye,He,Z)),r.name==="X"&&(m.setFromAxisAngle(N,Math.atan2(-u.y,u.z)),m.multiplyQuaternions(te,m),r.quaternion.copy(m)),r.name==="Y"&&(m.setFromAxisAngle(Z,Math.atan2(u.x,u.z)),m.multiplyQuaternions(te,m),r.quaternion.copy(m)),r.name==="Z"&&(m.setFromAxisAngle(W,Math.atan2(u.y,u.x)),m.multiplyQuaternions(te,m),r.quaternion.copy(m))),r.visible=r.visible&&(r.name.indexOf("X")===-1||this.showX),r.visible=r.visible&&(r.name.indexOf("Y")===-1||this.showY),r.visible=r.visible&&(r.name.indexOf("Z")===-1||this.showZ),r.visible=r.visible&&(r.name.indexOf("E")===-1||this.showX&&this.showY&&this.showZ),r.material._color=r.material._color||r.material.color.clone(),r.material._opacity=r.material._opacity||r.material.opacity,r.material.color.copy(r.material._color),r.material.opacity=r.material._opacity,this.enabled&&this.axis&&(r.name===this.axis?(r.material.color.copy(this.materialLib.active.color),r.material.opacity=1):this.axis.split("").some(function(p){return r.name===p})&&(r.material.color.copy(this.materialLib.active.color),r.material.opacity=1))}super.updateMatrixWorld(e)}}class bt extends n.Mesh{constructor(){super(new n.PlaneGeometry(1e5,1e5,2,2),new n.MeshBasicMaterial({visible:!1,wireframe:!0,side:n.DoubleSide,transparent:!0,opacity:.1,toneMapped:!1})),this.isTransformControlsPlane=!0,this.type="TransformControlsPlane"}updateMatrixWorld(e){let s=this.space;switch(this.position.copy(this.worldPosition),this.mode==="scale"&&(s="local"),se.copy(N).applyQuaternion(s==="local"?this.worldQuaternion:ne),F.copy(Z).applyQuaternion(s==="local"?this.worldQuaternion:ne),Q.copy(W).applyQuaternion(s==="local"?this.worldQuaternion:ne),u.copy(F),this.mode){case"translate":case"scale":switch(this.axis){case"X":u.copy(this.eye).cross(se),O.copy(se).cross(u);break;case"Y":u.copy(this.eye).cross(F),O.copy(F).cross(u);break;case"Z":u.copy(this.eye).cross(Q),O.copy(Q).cross(u);break;case"XY":O.copy(Q);break;case"YZ":O.copy(se);break;case"XZ":u.copy(Q),O.copy(F);break;case"XYZ":case"E":O.set(0,0,0);break}break;case"rotate":default:O.set(0,0,0)}O.length()===0?this.quaternion.copy(this.cameraQuaternion):(Ye.lookAt(M.set(0,0,0),O,u),this.quaternion.setFromRotationMatrix(Ye)),super.updateMatrixWorld(e)}}var Mt=Object.getOwnPropertyDescriptor,wt=(t,e,s,i)=>{for(var o=i>1?void 0:i?Mt(e,s):e,a=t.length-1,r;a>=0;a--)(r=t[a])&&(o=r(o)||o);return o};exports.EventBus=class{_emitter;constructor(){this._emitter=new at.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)}};exports.EventBus=wt([l.injectable()],exports.EventBus);var X=(t=>(t.SelectHover="select.hover",t.SelectClick="select.click",t.ToolSelect="tool.select",t))(X||{});const vt=.03,St=10;var Et=Object.getOwnPropertyDescriptor,Pt=(t,e,s,i)=>{for(var o=i>1?void 0:i?Et(e,s):e,a=t.length-1,r;a>=0;a--)(r=t[a])&&(o=r(o)||o);return o},Ze=(t,e)=>(s,i)=>e(s,i,t);exports.EditorRenderer=class extends Pe{constructor(e,s){super(e),this._canvas=e,this._bus=s;const i=new c.GridHelper(10,10);i.position.y=-.001,this.scene.add(i);const o=new Ae.SymmetricAxesHelper(6);this.scene.add(o),this._orbit=new Ae.OrbitWithState(this.camera,this.renderer.domElement),this._orbit.enableDamping=!0,this._orbit.dampingFactor=.05,this._raycaster=new c.Raycaster,this._mouse=new c.Vector2,this.scene.add(new c.HemisphereLight(16777215,4473924,.6)),this.camera.layers.enable(0),this.camera.layers.enable(1),this._transform=new dt(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;update(){this._orbit.update()}addFigure(e){const s=super.addFigure(e);s.layers.enable(0);const i=new c.EdgesGeometry(s.geometry),o=new c.LineSegments(i,new c.LineBasicMaterial({color:8947848,linewidth:1}));return o.layers.set(1),s.add(o),s}setTransformControlsMode(e){this._transform.setMode(e)}attachTransformControls(e){this._transform.attach(e)}detachTransformControls(){this._transform.detach()}setRaycastMode(e){const s=this._raycaster;switch(s.params.Line.threshold=0,s.params.Points.threshold=0,e){case d.SelectMode.Mesh:case d.SelectMode.Face:s.layers.set(0);break;case d.SelectMode.Edge:s.layers.set(1),s.params.Line.threshold=vt;break;case d.SelectMode.Vertex:s.layers.set(2),s.params.Points.threshold=St;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._isEventListenersAdded=!1),this._orbit?.dispose(),this._transform?.dispose(),this._transformHelper?.parent&&this._transformHelper.parent.remove(this._transformHelper),this._lastHovered=null,super.dispose()}_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._isEventListenersAdded=!0}_handleMouseMove=e=>{this._processRaycastEvent(e,X.SelectHover,!0)};_handleMouseClick=e=>{this._processRaycastEvent(e,X.SelectClick,!1)};_processRaycastEvent(e,s,i){if(this._orbit.isInteracting||this._transform.dragging)return;const o=this._canvas.getBoundingClientRect();this._mouse.x=(e.clientX-o.left)/o.width*2-1,this._mouse.y=-((e.clientY-o.top)/o.height)*2+1,this._raycaster.setFromCamera(this._mouse,this.camera);const r=this._raycaster.intersectObjects(this.meshes,!0)[0]??null,h=r?.object??null;i?h!==this._lastHovered&&(this.meshes.forEach(p=>p.userData.isHit=!1),h&&(h.userData.isHit=!0),this._lastHovered=h,this._bus.emit(s,r?{intersection:r}:null)):this._bus.emit(s,r?{intersection:r}:null)}};exports.EditorRenderer=Pt([l.injectable(),Ze(0,l.inject("Canvas")),Ze(1,l.inject("EventBus"))],exports.EditorRenderer);const Xe={type:"change"},Te={type:"start"},Ke={type:"end"},ie=new n.Ray,ze=new n.Plane,Tt=Math.cos(70*n.MathUtils.DEG2RAD),g=new n.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},he=1e-6;class xt extends n.Controls{constructor(e,s=null){super(e,s),this.state=_.NONE,this.target=new n.Vector3,this.cursor=new n.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:n.MOUSE.ROTATE,MIDDLE:n.MOUSE.DOLLY,RIGHT:n.MOUSE.PAN},this.touches={ONE:n.TOUCH.ROTATE,TWO:n.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 n.Vector3,this._lastQuaternion=new n.Quaternion,this._lastTargetPosition=new n.Vector3,this._quat=new n.Quaternion().setFromUnitVectors(e.up,new n.Vector3(0,1,0)),this._quatInverse=this._quat.clone().invert(),this._spherical=new n.Spherical,this._sphericalDelta=new n.Spherical,this._scale=1,this._panOffset=new n.Vector3,this._rotateStart=new n.Vector2,this._rotateEnd=new n.Vector2,this._rotateDelta=new n.Vector2,this._panStart=new n.Vector2,this._panEnd=new n.Vector2,this._panDelta=new n.Vector2,this._dollyStart=new n.Vector2,this._dollyEnd=new n.Vector2,this._dollyDelta=new n.Vector2,this._dollyDirection=new n.Vector3,this._mouse=new n.Vector2,this._performCursorZoom=!1,this._pointers=[],this._pointerPositions={},this._controlActive=!1,this._onPointerMove=Dt.bind(this),this._onPointerDown=Ot.bind(this),this._onPointerUp=Lt.bind(this),this._onContextMenu=kt.bind(this),this._onMouseWheel=Ct.bind(this),this._onKeyDown=It.bind(this),this._onTouchStart=Rt.bind(this),this._onTouchMove=Ht.bind(this),this._onMouseDown=At.bind(this),this._onMouseMove=jt.bind(this),this._interceptControlDown=Yt.bind(this),this._interceptControlUp=Zt.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(Xe),this.update(),this.state=_.NONE}update(e=null){const s=this.object.position;g.copy(s).sub(this.target),g.applyQuaternion(this._quat),this._spherical.setFromVector3(g),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,o=this.maxAzimuthAngle;isFinite(i)&&isFinite(o)&&(i<-Math.PI?i+=v:i>Math.PI&&(i-=v),o<-Math.PI?o+=v:o>Math.PI&&(o-=v),i<=o?this._spherical.theta=Math.max(i,Math.min(o,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(i+o)/2?Math.max(i,this._spherical.theta):Math.min(o,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 a=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{const r=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),a=r!=this._spherical.radius}if(g.setFromSpherical(this._spherical),g.applyQuaternion(this._quatInverse),s.copy(this.target).add(g),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 r=null;if(this.object.isPerspectiveCamera){const h=g.length();r=this._clampDistance(h*this._scale);const p=h-r;this.object.position.addScaledVector(this._dollyDirection,p),this.object.updateMatrixWorld(),a=!!p}else if(this.object.isOrthographicCamera){const h=new n.Vector3(this._mouse.x,this._mouse.y,0);h.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(),a=p!==this.object.zoom;const y=new n.Vector3(this._mouse.x,this._mouse.y,0);y.unproject(this.object),this.object.position.sub(y).add(h),this.object.updateMatrixWorld(),r=g.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),this.zoomToCursor=!1;r!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(r).add(this.object.position):(ie.origin.copy(this.object.position),ie.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(ie.direction))<Tt?this.object.lookAt(this.target):(ze.setFromNormalAndCoplanarPoint(this.object.up,this.target),ie.intersectPlane(ze,this.target))))}else if(this.object.isOrthographicCamera){const r=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),r!==this.object.zoom&&(this.object.updateProjectionMatrix(),a=!0)}return this._scale=1,this._performCursorZoom=!1,a||this._lastPosition.distanceToSquared(this.object.position)>he||8*(1-this._lastQuaternion.dot(this.object.quaternion))>he||this._lastTargetPosition.distanceToSquared(this.target)>he?(this.dispatchEvent(Xe),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){g.setFromMatrixColumn(s,0),g.multiplyScalar(-e),this._panOffset.add(g)}_panUp(e,s){this.screenSpacePanning===!0?g.setFromMatrixColumn(s,1):(g.setFromMatrixColumn(s,0),g.crossVectors(this.object.up,g)),g.multiplyScalar(e),this._panOffset.add(g)}_pan(e,s){const i=this.domElement;if(this.object.isPerspectiveCamera){const o=this.object.position;g.copy(o).sub(this.target);let a=g.length();a*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*e*a/i.clientHeight,this.object.matrix),this._panUp(2*s*a/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(),o=e-i.left,a=s-i.top,r=i.width,h=i.height;this._mouse.x=o/r*2-1,this._mouse.y=-(a/h)*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),o=.5*(e.pageY+s.y);this._rotateStart.set(i,o)}}_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),o=.5*(e.pageY+s.y);this._panStart.set(i,o)}}_handleTouchStartDolly(e){const s=this._getSecondPointerPosition(e),i=e.pageX-s.x,o=e.pageY-s.y,a=Math.sqrt(i*i+o*o);this._dollyStart.set(0,a)}_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),o=.5*(e.pageX+i.x),a=.5*(e.pageY+i.y);this._rotateEnd.set(o,a)}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),o=.5*(e.pageY+s.y);this._panEnd.set(i,o)}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,o=e.pageY-s.y,a=Math.sqrt(i*i+o*o);this._dollyEnd.set(0,a),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 r=(e.pageX+s.x)*.5,h=(e.pageY+s.y)*.5;this._updateZoomParameters(r,h)}_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 n.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 Ot(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 Dt(t){this.enabled!==!1&&(t.pointerType==="touch"?this._onTouchMove(t):this._onMouseMove(t))}function Lt(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(Ke),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 At(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 n.MOUSE.DOLLY:if(this.enableZoom===!1)return;this._handleMouseDownDolly(t),this.state=_.DOLLY;break;case n.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 n.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(Te)}function jt(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 Ct(t){this.enabled===!1||this.enableZoom===!1||this.state!==_.NONE||(t.preventDefault(),this.dispatchEvent(Te),this._handleMouseWheel(this._customWheelEvent(t)),this.dispatchEvent(Ke))}function It(t){this.enabled!==!1&&this._handleKeyDown(t)}function Rt(t){switch(this._trackPointer(t),this._pointers.length){case 1:switch(this.touches.ONE){case n.TOUCH.ROTATE:if(this.enableRotate===!1)return;this._handleTouchStartRotate(t),this.state=_.TOUCH_ROTATE;break;case n.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 n.TOUCH.DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchStartDollyPan(t),this.state=_.TOUCH_DOLLY_PAN;break;case n.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(Te)}function Ht(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 kt(t){this.enabled!==!1&&t.preventDefault()}function Yt(t){t.key==="Control"&&(this._controlActive=!0,this.domElement.getRootNode().addEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}function Zt(t){t.key==="Control"&&(this._controlActive=!1,this.domElement.getRootNode().removeEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}class Xt extends Pe{_orbit;constructor(e){super(e),this.camera.position.set(1,1,7),this.camera.lookAt(0,0,0),this._orbit=new xt(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 zt{_positions=[];_normals=[];_uvs=[];_tmpPositions=[];_tmpNormals=[];_tmpUVs=[];load(e){const s=e.split(`
2
- `);for(const o of s){if(!o.trim()||o.startsWith("#"))continue;const a=o.trim().split(/\s+/);switch(a[0]){case"v":this._tmpPositions.push(a.slice(1).map(Number));break;case"vn":this._tmpNormals.push(a.slice(1).map(Number));break;case"vt":this._tmpUVs.push(a.slice(1).map(Number));break;case"f":this.processFaceLine(a);break}}const i={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(i)}processFaceLine(e){for(let s=1;s<e.length;s++){const i=e[s];if(!i)continue;const[o,a,r]=i.split("/"),h=o?parseInt(o,10):void 0,p=a?parseInt(a,10):void 0,y=r?parseInt(r,10):void 0;if(h!==void 0){const b=this._tmpPositions[h-1];b&&this._positions.push(...b)}if(p!==void 0){const b=this._tmpUVs[p-1];b&&this._uvs.push(...b)}if(y!==void 0){const b=this._tmpNormals[y-1];b&&this._normals.push(...b)}}}}var Gt=Object.getOwnPropertyDescriptor,Vt=(t,e,s,i)=>{for(var o=i>1?void 0:i?Gt(e,s):e,a=t.length-1,r;a>=0;a--)(r=t[a])&&(o=r(o)||o);return o},Ge=(t,e)=>(s,i)=>e(s,i,t);let ce=class{constructor(t,e){this._store=e,this._handlers=new Map(t.map(s=>[s.mode,s]))}_currentMode=d.DisplayMode.Plane;_handlers;manage(t){t!==this._currentMode&&(this._handlers.get(this._currentMode)?.rollback(),t!==d.DisplayMode.Plane&&this._handlers.get(t)?.handle(),this._currentMode=t,this._store.setDisplayMode(this._currentMode))}dispose(){this._handlers&&this._handlers.clear(),this._currentMode=d.DisplayMode.Plane,this._store.setDisplayMode(this._currentMode)}};ce=Vt([l.injectable(),Ge(0,l.injectAll("IDisplayHandler")),Ge(1,l.inject("IEditorStore"))],ce);var I=(t=>(t.Hover="hover",t.Click="click",t))(I||{}),Ft=Object.getOwnPropertyDescriptor,Qt=(t,e,s,i)=>{for(var o=i>1?void 0:i?Ft(e,s):e,a=t.length-1,r;a>=0;a--)(r=t[a])&&(o=r(o)||o);return o},le=(t,e)=>(s,i)=>e(s,i,t);let de=class{constructor(t,e,s){this._eventBus=t,this._store=s,this._handlers=new Map(e.map(i=>[i.mode,i])),this._eventBus.on(X.SelectHover,this._onHover),this._eventBus.on(X.SelectClick,this._onClick)}_currentMode=d.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,I.Hover)};_onClick=t=>{this._handlers.get(this._currentMode)?.handle(t,I.Click)};dispose(){this._handlers&&this._handlers.clear(),this._eventBus.off(X.SelectHover,this._onHover),this._currentMode=d.SelectMode.Mesh,this._store.setSelectMode(this._currentMode)}};de=Qt([l.injectable(),le(0,l.inject("EventBus")),le(1,l.injectAll("ISelectHandler")),le(2,l.inject("IEditorStore"))],de);var Ut=Object.getOwnPropertyDescriptor,Nt=(t,e,s,i)=>{for(var o=i>1?void 0:i?Ut(e,s):e,a=t.length-1,r;a>=0;a--)(r=t[a])&&(o=r(o)||o);return o},Ve=(t,e)=>(s,i)=>e(s,i,t);let pe=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()})}_currentTool=d.ToolType.Translate;_handlers;_unsubSelected;manage(t){this._currentTool!==t&&(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=d.ToolType.Translate,this._store.setToolType(this._currentTool)}};pe=Nt([l.injectable(),Ve(0,l.injectAll("IToolHandler")),Ve(1,l.inject("IEditorStore"))],pe);var Wt=Object.getOwnPropertyDescriptor,Bt=(t,e,s,i)=>{for(var o=i>1?void 0:i?Wt(e,s):e,a=t.length-1,r;a>=0;a--)(r=t[a])&&(o=r(o)||o);return o},$t=(t,e)=>(s,i)=>e(s,i,t);let _e=class{_currentMode=d.SceneMode.AddFigure;_handlers;constructor(t){this._handlers=new Map(t.map(e=>[e.mode,e]))}manage(t,e){console.log("manage",t),t===d.SceneMode.AddFigure?this._handlers.get(t)?.handle(e):this._handlers.get(t)?.handle(),this._currentMode=t}dispose(){this._handlers&&this._handlers.clear(),this._currentMode=d.SceneMode.AddFigure}};_e=Bt([l.injectable(),$t(0,l.injectAll("ISceneHandler"))],_e);var qt=Object.getOwnPropertyDescriptor,Kt=(t,e,s,i)=>{for(var o=i>1?void 0:i?qt(e,s):e,a=t.length-1,r;a>=0;a--)(r=t[a])&&(o=r(o)||o);return o},Jt=(t,e)=>(s,i)=>e(s,i,t);let ue=class{constructor(t){this._api=t}mode=d.DisplayMode.Wireframe;_prevWireframe=new Map;_prevColorMesh=new Map;_prevColorLines=new Map;_wireColor=new c.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 o=i;if(!this._prevColorLines.has(o.material)){const r=o.material;this._prevColorLines.set(r,r.color.clone())}const a=o.material;a.color.copy(this._wireColor),a.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))}};ue=Kt([l.injectable(),Jt(0,l.inject("RendererApi"))],ue);const xe=16776960,Oe=16755200,es=2236962;var ts=Object.getOwnPropertyDescriptor,ss=(t,e,s,i)=>{for(var o=i>1?void 0:i?ts(e,s):e,a=t.length-1,r;a>=0;a--)(r=t[a])&&(o=r(o)||o);return o},Fe=(t,e)=>(s,i)=>e(s,i,t);let me=class{constructor(t,e){this._api=t,this._store=e}mode=d.SelectMode.Mesh;_hoveredMesh=null;_selectedMesh=null;_hoverColor=xe;_selectColor=Oe;_origLineColors=new WeakMap;handle(t,e){if(this._api.setRaycastMode(this.mode),e===I.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===I.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 o=i.material;this._origLineColors.has(i)||this._origLineColors.set(i,o.color.clone()),o.color.setHex(e),o.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 o=s.material;o.color.copy(i),o.needsUpdate=!0}}})}};me=ss([l.injectable(),Fe(0,l.inject("RendererApi")),Fe(1,l.inject("IEditorStore"))],me);var is=Object.getOwnPropertyDescriptor,os=(t,e,s,i)=>{for(var o=i>1?void 0:i?is(e,s):e,a=t.length-1,r;a>=0;a--)(r=t[a])&&(o=r(o)||o);return o},ns=(t,e)=>(s,i)=>e(s,i,t);let fe=class{constructor(t){this._api=t}mode=d.SelectMode.Face;_hovered=null;_selected=null;_hoverColor=xe;_selectColor=Oe;_defaultColor=2236962;handle(t,e){this._api.setRaycastMode(this.mode),e===I.Hover&&console.log(t),e===I.Click&&console.log(t)}rollback(){throw new Error("Method not implemented.")}dispose(){throw new Error("Method not implemented.")}};fe=os([l.injectable(),ns(0,l.inject("RendererApi"))],fe);class De{constructor(e,s){this.api=e,this.store=s}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()}}var rs=Object.getOwnPropertyDescriptor,as=(t,e,s,i)=>{for(var o=i>1?void 0:i?rs(e,s):e,a=t.length-1,r;a>=0;a--)(r=t[a])&&(o=r(o)||o);return o},Qe=(t,e)=>(s,i)=>e(s,i,t);let ye=class extends De{mode=d.ToolType.Translate;constructor(t,e){super(t,e)}};ye=as([l.injectable(),Qe(0,l.inject("RendererApi")),Qe(1,l.inject("IEditorStore"))],ye);var hs=Object.getOwnPropertyDescriptor,ls=(t,e,s,i)=>{for(var o=i>1?void 0:i?hs(e,s):e,a=t.length-1,r;a>=0;a--)(r=t[a])&&(o=r(o)||o);return o},Ue=(t,e)=>(s,i)=>e(s,i,t);let ge=class extends De{mode=d.ToolType.Scale;constructor(t,e){super(t,e)}};ge=ls([l.injectable(),Ue(0,l.inject("RendererApi")),Ue(1,l.inject("IEditorStore"))],ge);var cs=Object.getOwnPropertyDescriptor,ds=(t,e,s,i)=>{for(var o=i>1?void 0:i?cs(e,s):e,a=t.length-1,r;a>=0;a--)(r=t[a])&&(o=r(o)||o);return o},Ne=(t,e)=>(s,i)=>e(s,i,t);let be=class extends De{mode=d.ToolType.Rotate;constructor(t,e){super(t,e)}};be=ds([l.injectable(),Ne(0,l.inject("RendererApi")),Ne(1,l.inject("IEditorStore"))],be);const oe=31;var ps=Object.getOwnPropertyDescriptor,_s=(t,e,s,i)=>{for(var o=i>1?void 0:i?ps(e,s):e,a=t.length-1,r;a>=0;a--)(r=t[a])&&(o=r(o)||o);return o},We=(t,e)=>(s,i)=>e(s,i,t);let Me=class{constructor(t,e){this._api=t,this._store=e,this._api.enableCameraLayer(oe),this._hoverLine=this._makeOverlayLine(this._hoverColor),this._selectLine=this._makeOverlayLine(this._selectColor),this._api.addObject(this._hoverLine,oe),this._api.addObject(this._selectLine,oe)}mode=d.SelectMode.Edge;_hoverLine;_selectLine;_hovered=null;_selected=null;_hoverColor=xe;_selectColor=Oe;handle(t,e){if(this._api.setRaycastMode(this.mode),e===I.Hover){if(!t){this._hoverLine.visible=!1,this._hovered=null;return}const s=t.intersection.object;if(!s?.isLineSegments)return;const i=s,o=Math.floor((t.intersection.index??-1)/2);if(o<0)return;this._selected&&this._same({lines:i,seg:o},this._selected)?this._hoverLine.visible=!1:(this._writeWorldSegment(this._hoverLine,i,o),this._hoverLine.visible=!0),this._hovered={lines:i,seg:o};return}if(e===I.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,o=Math.floor((t.intersection.index??-1)/2);if(o<0)return;this._writeWorldSegment(this._selectLine,i,o),this._centerAndOrientLineOnSegment(this._selectLine,i,o),this._selectLine.visible=!0,this._store.setSelectedObject(this._selectLine),this._selected={lines:i,seg:o},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 c.BufferGeometry;e.setAttribute("position",new c.Float32BufferAttribute(6,3));const s=new c.LineBasicMaterial({color:t,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1}),i=new c.Line(e,s);return i.renderOrder=1e3,i.raycast=()=>{},i.layers.set(oe),i.visible=!1,i}_writeWorldSegment(t,e,s){const i=e.geometry.getAttribute("position"),o=s*2,a=o+1,r=new c.Vector3(i.getX(o),i.getY(o),i.getZ(o)).applyMatrix4(e.matrixWorld),h=new c.Vector3(i.getX(a),i.getY(a),i.getZ(a)).applyMatrix4(e.matrixWorld),p=t.geometry.getAttribute("position");p.setXYZ(0,r.x,r.y,r.z),p.setXYZ(1,h.x,h.y,h.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"),o=s*2,a=o+1,r=new c.Vector3(i.getX(o),i.getY(o),i.getZ(o)).applyMatrix4(e.matrixWorld),h=new c.Vector3(i.getX(a),i.getY(a),i.getZ(a)).applyMatrix4(e.matrixWorld),p=new c.Vector3().subVectors(h,r),y=p.length();if(!isFinite(y)||y===0)return;const b=new c.Vector3().addVectors(r,h).multiplyScalar(.5);t.position.copy(b);const D=t.geometry;let S=D.getAttribute("position");(!S||S.count<2)&&(D.setAttribute("position",new c.BufferAttribute(new Float32Array(6),3)),S=D.getAttribute("position")),S.setXYZ(0,-y/2,0,0),S.setXYZ(1,y/2,0,0),S.needsUpdate=!0,p.normalize();const z=new c.Quaternion().setFromUnitVectors(new c.Vector3(1,0,0),p);t.quaternion.copy(z),t.updateMatrixWorld(!0)}};Me=_s([l.injectable(),We(0,l.inject("RendererApi")),We(1,l.inject("IEditorStore"))],Me);var us=Object.getOwnPropertyDescriptor,ms=(t,e,s,i)=>{for(var o=i>1?void 0:i?us(e,s):e,a=t.length-1,r;a>=0;a--)(r=t[a])&&(o=r(o)||o);return o},fs=(t,e)=>(s,i)=>e(s,i,t);let we=class{constructor(t){this._api=t}mode=d.SceneMode.AddFigure;_lastAddedMesh=null;handle(t){const e=ct[t](),s=e.getAttribute("position");s&&s.setUsage&&s.setUsage(c.DynamicDrawUsage);const i=new c.Mesh(e,qe);i.layers.enable(0);const o=new c.EdgesGeometry(i.geometry),a=new c.LineSegments(o,new c.LineBasicMaterial({color:es,linewidth:1}));a.layers.set(1),i.add(a),this._api.addMesh(i),this._lastAddedMesh=i}rollback(){this._lastAddedMesh!==null&&(this._api.removeMesh(this._lastAddedMesh),this._lastAddedMesh=null)}dispose(){this._lastAddedMesh=null}};we=ms([l.injectable(),fs(0,l.inject("RendererApi"))],we);const ys=t=>!!t&&t.isMesh;var gs=Object.getOwnPropertyDescriptor,bs=(t,e,s,i)=>{for(var o=i>1?void 0:i?gs(e,s):e,a=t.length-1,r;a>=0;a--)(r=t[a])&&(o=r(o)||o);return o},Be=(t,e)=>(s,i)=>e(s,i,t);let ve=class{constructor(t,e){this._api=t,this._store=e}mode=d.SceneMode.DeleteFigure;_lastDeletedMesh=null;handle(){const t=this._store.getSelectedObject();ys(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}};ve=bs([l.injectable(),Be(0,l.inject("RendererApi")),Be(1,l.inject("IEditorStore"))],ve);var Ms=Object.getOwnPropertyDescriptor,ws=(t,e,s,i)=>{for(var o=i>1?void 0:i?Ms(e,s):e,a=t.length-1,r;a>=0;a--)(r=t[a])&&(o=r(o)||o);return o},vs=(t,e)=>(s,i)=>e(s,i,t);let Se=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)}};Se=ws([l.injectable(),vs(0,l.inject("EditorRenderer"))],Se);var Ss=Object.getOwnPropertyDescriptor,Es=(t,e,s,i)=>{for(var o=i>1?void 0:i?Ss(e,s):e,a=t.length-1,r;a>=0;a--)(r=t[a])&&(o=r(o)||o);return o},U=(t,e)=>(s,i)=>e(s,i,t);exports.EditorHub=class{constructor(e,s,i,o,a){this._displayManager=e,this._selectManager=s,this._toolManager=i,this._sceneManager=o,this._renderer=a,this.setSelectMode(d.SelectMode.Mesh),this.setToolMode(d.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)}dispose(){this._displayManager.dispose(),this._selectManager.dispose(),this._renderer.dispose()}};exports.EditorHub=Es([l.injectable(),U(0,l.inject("IDisplayManager")),U(1,l.inject("ISelectManager")),U(2,l.inject("IToolManager")),U(3,l.inject("ISceneManager")),U(4,l.inject("EditorRenderer"))],exports.EditorHub);var Ps=Object.getOwnPropertyDescriptor,Ts=(t,e,s,i)=>{for(var o=i>1?void 0:i?Ps(e,s):e,a=t.length-1,r;a>=0;a--)(r=t[a])&&(o=r(o)||o);return o};let Ee=class{_selectMode=d.SelectMode.Mesh;_toolType=d.ToolType.Translate;_displayMode=d.DisplayMode.Plane;_selectedObject=null;_selectedListeners=new Set;constructor(){ht.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}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)}};Ee=Ts([l.injectable()],Ee);let $e=!1;const f=l.container.createChildContainer();function xs(t){return $e||(f.registerInstance("Canvas",t),f.registerSingleton("EventBus",exports.EventBus),f.registerSingleton("EditorRenderer",exports.EditorRenderer),f.registerSingleton("RendererApi",Se),f.registerSingleton("IDisplayHandler",ue),f.registerSingleton("ISelectHandler",me),f.registerSingleton("ISelectHandler",fe),f.registerSingleton("ISelectHandler",Me),f.registerSingleton("IToolHandler",ye),f.registerSingleton("IToolHandler",ge),f.registerSingleton("IToolHandler",be),f.registerSingleton("ISceneHandler",we),f.registerSingleton("ISceneHandler",ve),f.registerSingleton("IDisplayManager",ce),f.registerSingleton("ISelectManager",de),f.registerSingleton("IToolManager",pe),f.registerSingleton("ISceneManager",_e),f.registerSingleton("EditorHub",exports.EditorHub),f.registerSingleton("IEditorStore",Ee),$e=!0),f}function Os(t){return xs(t).resolve("EditorHub")}exports.EventTopics=X;exports.ObjLoader=zt;exports.PreviewRenderer=Xt;exports.Renderer=Pe;exports.createAppHub=Os;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("reflect-metadata");const l=require("three"),c=require("@planara/types"),T=require("@planara/three"),h=require("tsyringe"),Me=require("events"),Ee=require("mobx");function Se(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=Se(l),we={[c.FigureType.Plane]:()=>new a.PlaneGeometry(1,1,1,1),[c.FigureType.Cube]:()=>new a.BoxGeometry(1,1,1,1,1,1),[c.FigureType.UVSphere]:()=>new a.SphereGeometry(.5,32,16),[c.FigureType.Icosphere]:()=>new a.IcosahedronGeometry(.5,0),[c.FigureType.Cylinder]:()=>new a.CylinderGeometry(.5,.5,1,32,1,!1),[c.FigureType.Cone]:()=>new a.ConeGeometry(.5,1,32,1,!1),[c.FigureType.Torus]:()=>new a.TorusGeometry(.5,.2,16,64),[c.FigureType.Circle]:()=>new a.CircleGeometry(.5,32),[c.FigureType.Sphere]:()=>new a.SphereGeometry(.5,32,16),[c.FigureType.Custom]:function(){throw new Error("Custom geometry is not generated here.")}},ge=new a.MeshStandardMaterial({color:12566463,metalness:0,roughness:.6});class X{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,ge);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 Pe=Object.getOwnPropertyDescriptor,Oe=(t,e,s,i)=>{for(var r=i>1?void 0:i?Pe(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r};exports.EventBus=class{_emitter;constructor(){this._emitter=new Me.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)}};exports.EventBus=Oe([h.injectable()],exports.EventBus);var S=(t=>(t.SelectHover="select.hover",t.SelectClick="select.click",t.ToolSelect="tool.select",t))(S||{});const Te=.03,De=10;var Le=Object.getOwnPropertyDescriptor,je=(t,e,s,i)=>{for(var r=i>1?void 0:i?Le(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);exports.EditorRenderer=class extends X{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 T.SymmetricAxesHelper(6);this.scene.add(r),this._orbit=new T.OrbitWithState(this.camera,this.renderer.domElement),this._orbit.enableDamping=!0,this._orbit.dampingFactor=.05,this._cameraGizmo=new T.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 T.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;update(){this._orbit.update()}addFigure(e){const s=super.addFigure(e);s.layers.enable(0);const i=new a.EdgesGeometry(s.geometry),r=new a.LineSegments(i,new a.LineBasicMaterial({color:8947848,linewidth:1}));return r.layers.set(1),s.add(r),s}setTransformControlsMode(e){this._transform.setMode(e)}attachTransformControls(e){this._transform.attach(e)}detachTransformControls(){this._transform.detach()}setRaycastMode(e){const s=this._raycaster;switch(s.params.Line.threshold=0,s.params.Points.threshold=0,e){case c.SelectMode.Mesh:case c.SelectMode.Face:s.layers.set(0);break;case c.SelectMode.Edge:s.layers.set(1),s.params.Line.threshold=Te;break;case c.SelectMode.Vertex:s.layers.set(2),s.params.Points.threshold=De;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._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._isEventListenersAdded=!0}_handleMouseMove=e=>{this._processRaycastEvent(e,S.SelectHover,!0)};_handleMouseClick=e=>{this._processRaycastEvent(e,S.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,_=n?.object??null;i?_!==this._lastHovered&&(this.meshes.forEach(u=>u.userData.isHit=!1),_&&(_.userData.isHit=!0),this._lastHovered=_,this._bus.emit(s,n?{intersection:n}:null)):this._bus.emit(s,n?{intersection:n}:null)}};exports.EditorRenderer=je([h.injectable(),oe(0,h.inject("Canvas")),oe(1,h.inject("EventBus"))],exports.EditorRenderer);const ne={type:"change"},K={type:"start"},be={type:"end"},D=new l.Ray,ae=new l.Plane,Ce=Math.cos(70*l.MathUtils.DEG2RAD),m=new l.Vector3,f=2*Math.PI,d={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6},C=1e-6;class Ae extends l.Controls{constructor(e,s=null){super(e,s),this.state=d.NONE,this.target=new l.Vector3,this.cursor=new l.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:l.MOUSE.ROTATE,MIDDLE:l.MOUSE.DOLLY,RIGHT:l.MOUSE.PAN},this.touches={ONE:l.TOUCH.ROTATE,TWO:l.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 l.Vector3,this._lastQuaternion=new l.Quaternion,this._lastTargetPosition=new l.Vector3,this._quat=new l.Quaternion().setFromUnitVectors(e.up,new l.Vector3(0,1,0)),this._quatInverse=this._quat.clone().invert(),this._spherical=new l.Spherical,this._sphericalDelta=new l.Spherical,this._scale=1,this._panOffset=new l.Vector3,this._rotateStart=new l.Vector2,this._rotateEnd=new l.Vector2,this._rotateDelta=new l.Vector2,this._panStart=new l.Vector2,this._panEnd=new l.Vector2,this._panDelta=new l.Vector2,this._dollyStart=new l.Vector2,this._dollyEnd=new l.Vector2,this._dollyDelta=new l.Vector2,this._dollyDirection=new l.Vector3,this._mouse=new l.Vector2,this._performCursorZoom=!1,this._pointers=[],this._pointerPositions={},this._controlActive=!1,this._onPointerMove=xe.bind(this),this._onPointerDown=Re.bind(this),this._onPointerUp=He.bind(this),this._onContextMenu=Ve.bind(this),this._onMouseWheel=Ue.bind(this),this._onKeyDown=Ne.bind(this),this._onTouchStart=Fe.bind(this),this._onTouchMove=Ye.bind(this),this._onMouseDown=Ie.bind(this),this._onMouseMove=ke.bind(this),this._interceptControlDown=ze.bind(this),this._interceptControlUp=$e.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(ne),this.update(),this.state=d.NONE}update(e=null){const s=this.object.position;m.copy(s).sub(this.target),m.applyQuaternion(this._quat),this._spherical.setFromVector3(m),this.autoRotate&&this.state===d.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+=f:i>Math.PI&&(i-=f),r<-Math.PI?r+=f:r>Math.PI&&(r-=f),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(m.setFromSpherical(this._spherical),m.applyQuaternion(this._quatInverse),s.copy(this.target).add(m),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 _=m.length();n=this._clampDistance(_*this._scale);const u=_-n;this.object.position.addScaledVector(this._dollyDirection,u),this.object.updateMatrixWorld(),o=!!u}else if(this.object.isOrthographicCamera){const _=new l.Vector3(this._mouse.x,this._mouse.y,0);_.unproject(this.object);const u=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),o=u!==this.object.zoom;const g=new l.Vector3(this._mouse.x,this._mouse.y,0);g.unproject(this.object),this.object.position.sub(g).add(_),this.object.updateMatrixWorld(),n=m.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):(D.origin.copy(this.object.position),D.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(D.direction))<Ce?this.object.lookAt(this.target):(ae.setFromNormalAndCoplanarPoint(this.object.up,this.target),D.intersectPlane(ae,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)>C||8*(1-this._lastQuaternion.dot(this.object.quaternion))>C||this._lastTargetPosition.distanceToSquared(this.target)>C?(this.dispatchEvent(ne),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(e){return e!==null?f/60*this.autoRotateSpeed*e:f/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){m.setFromMatrixColumn(s,0),m.multiplyScalar(-e),this._panOffset.add(m)}_panUp(e,s){this.screenSpacePanning===!0?m.setFromMatrixColumn(s,1):(m.setFromMatrixColumn(s,0),m.crossVectors(this.object.up,m)),m.multiplyScalar(e),this._panOffset.add(m)}_pan(e,s){const i=this.domElement;if(this.object.isPerspectiveCamera){const r=this.object.position;m.copy(r).sub(this.target);let o=m.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,_=i.height;this._mouse.x=r/n*2-1,this._mouse.y=-(o/_)*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(f*this._rotateDelta.x/s.clientHeight),this._rotateUp(f*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(f*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(-f*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(f*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(-f*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(f*this._rotateDelta.x/s.clientHeight),this._rotateUp(f*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,_=(e.pageY+s.y)*.5;this._updateZoomParameters(n,_)}_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 l.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 Re(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 xe(t){this.enabled!==!1&&(t.pointerType==="touch"?this._onTouchMove(t):this._onMouseMove(t))}function He(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(be),this.state=d.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 Ie(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 l.MOUSE.DOLLY:if(this.enableZoom===!1)return;this._handleMouseDownDolly(t),this.state=d.DOLLY;break;case l.MOUSE.ROTATE:if(t.ctrlKey||t.metaKey||t.shiftKey){if(this.enablePan===!1)return;this._handleMouseDownPan(t),this.state=d.PAN}else{if(this.enableRotate===!1)return;this._handleMouseDownRotate(t),this.state=d.ROTATE}break;case l.MOUSE.PAN:if(t.ctrlKey||t.metaKey||t.shiftKey){if(this.enableRotate===!1)return;this._handleMouseDownRotate(t),this.state=d.ROTATE}else{if(this.enablePan===!1)return;this._handleMouseDownPan(t),this.state=d.PAN}break;default:this.state=d.NONE}this.state!==d.NONE&&this.dispatchEvent(K)}function ke(t){switch(this.state){case d.ROTATE:if(this.enableRotate===!1)return;this._handleMouseMoveRotate(t);break;case d.DOLLY:if(this.enableZoom===!1)return;this._handleMouseMoveDolly(t);break;case d.PAN:if(this.enablePan===!1)return;this._handleMouseMovePan(t);break}}function Ue(t){this.enabled===!1||this.enableZoom===!1||this.state!==d.NONE||(t.preventDefault(),this.dispatchEvent(K),this._handleMouseWheel(this._customWheelEvent(t)),this.dispatchEvent(be))}function Ne(t){this.enabled!==!1&&this._handleKeyDown(t)}function Fe(t){switch(this._trackPointer(t),this._pointers.length){case 1:switch(this.touches.ONE){case l.TOUCH.ROTATE:if(this.enableRotate===!1)return;this._handleTouchStartRotate(t),this.state=d.TOUCH_ROTATE;break;case l.TOUCH.PAN:if(this.enablePan===!1)return;this._handleTouchStartPan(t),this.state=d.TOUCH_PAN;break;default:this.state=d.NONE}break;case 2:switch(this.touches.TWO){case l.TOUCH.DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchStartDollyPan(t),this.state=d.TOUCH_DOLLY_PAN;break;case l.TOUCH.DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchStartDollyRotate(t),this.state=d.TOUCH_DOLLY_ROTATE;break;default:this.state=d.NONE}break;default:this.state=d.NONE}this.state!==d.NONE&&this.dispatchEvent(K)}function Ye(t){switch(this._trackPointer(t),this.state){case d.TOUCH_ROTATE:if(this.enableRotate===!1)return;this._handleTouchMoveRotate(t),this.update();break;case d.TOUCH_PAN:if(this.enablePan===!1)return;this._handleTouchMovePan(t),this.update();break;case d.TOUCH_DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchMoveDollyPan(t),this.update();break;case d.TOUCH_DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchMoveDollyRotate(t),this.update();break;default:this.state=d.NONE}}function Ve(t){this.enabled!==!1&&t.preventDefault()}function ze(t){t.key==="Control"&&(this._controlActive=!0,this.domElement.getRootNode().addEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}function $e(t){t.key==="Control"&&(this._controlActive=!1,this.domElement.getRootNode().removeEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}class We extends X{_orbit;constructor(e){super(e),this.camera.position.set(1,1,7),this.camera.lookAt(0,0,0),this._orbit=new Ae(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 Ze{_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:c.FigureType.Custom,position:this._positions,...this._normals.length>0&&{normal:this._normals},...this._uvs.length>0&&{uv:this._uvs}};return new c.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("/"),_=r?parseInt(r,10):void 0,u=o?parseInt(o,10):void 0,g=n?parseInt(n,10):void 0;if(_!==void 0){const b=this._tmpPositions[_-1];b&&this._positions.push(...b)}if(u!==void 0){const b=this._tmpUVs[u-1];b&&this._uvs.push(...b)}if(g!==void 0){const b=this._tmpNormals[g-1];b&&this._normals.push(...b)}}}}var Be=Object.getOwnPropertyDescriptor,Xe=(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},he=(t,e)=>(s,i)=>e(s,i,t);let R=class{constructor(t,e){this._store=e,this._handlers=new Map(t.map(s=>[s.mode,s]))}_currentMode=c.DisplayMode.Plane;_handlers;manage(t){t!==this._currentMode&&(this._handlers.get(this._currentMode)?.rollback(),t!==c.DisplayMode.Plane&&this._handlers.get(t)?.handle(),this._currentMode=t,this._store.setDisplayMode(this._currentMode))}dispose(){this._handlers&&this._handlers.clear(),this._currentMode=c.DisplayMode.Plane,this._store.setDisplayMode(this._currentMode)}};R=Xe([h.injectable(),he(0,h.injectAll("IDisplayHandler")),he(1,h.inject("IEditorStore"))],R);var M=(t=>(t.Hover="hover",t.Click="click",t))(M||{}),Ke=Object.getOwnPropertyDescriptor,Ge=(t,e,s,i)=>{for(var r=i>1?void 0:i?Ke(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},A=(t,e)=>(s,i)=>e(s,i,t);let x=class{constructor(t,e,s){this._eventBus=t,this._store=s,this._handlers=new Map(e.map(i=>[i.mode,i])),this._eventBus.on(S.SelectHover,this._onHover),this._eventBus.on(S.SelectClick,this._onClick)}_currentMode=c.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,M.Hover)};_onClick=t=>{this._handlers.get(this._currentMode)?.handle(t,M.Click)};dispose(){this._handlers&&this._handlers.clear(),this._eventBus.off(S.SelectHover,this._onHover),this._currentMode=c.SelectMode.Mesh,this._store.setSelectMode(this._currentMode)}};x=Ge([h.injectable(),A(0,h.inject("EventBus")),A(1,h.injectAll("ISelectHandler")),A(2,h.inject("IEditorStore"))],x);var qe=Object.getOwnPropertyDescriptor,Qe=(t,e,s,i)=>{for(var r=i>1?void 0:i?qe(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},le=(t,e)=>(s,i)=>e(s,i,t);let H=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()})}_currentTool=c.ToolType.Translate;_handlers;_unsubSelected;manage(t){this._currentTool!==t&&(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=c.ToolType.Translate,this._store.setToolType(this._currentTool)}};H=Qe([h.injectable(),le(0,h.injectAll("IToolHandler")),le(1,h.inject("IEditorStore"))],H);var Je=Object.getOwnPropertyDescriptor,et=(t,e,s,i)=>{for(var r=i>1?void 0:i?Je(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},tt=(t,e)=>(s,i)=>e(s,i,t);let I=class{_currentMode=c.SceneMode.AddFigure;_handlers;constructor(t){this._handlers=new Map(t.map(e=>[e.mode,e]))}manage(t,e){console.log("manage",t),t===c.SceneMode.AddFigure?this._handlers.get(t)?.handle(e):this._handlers.get(t)?.handle(),this._currentMode=t}dispose(){this._handlers&&this._handlers.clear(),this._currentMode=c.SceneMode.AddFigure}};I=et([h.injectable(),tt(0,h.injectAll("ISceneHandler"))],I);var st=Object.getOwnPropertyDescriptor,it=(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},rt=(t,e)=>(s,i)=>e(s,i,t);let k=class{constructor(t){this._api=t}mode=c.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))}};k=it([h.injectable(),rt(0,h.inject("RendererApi"))],k);const G=16776960,q=16755200,ot=2236962;var nt=Object.getOwnPropertyDescriptor,at=(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},ce=(t,e)=>(s,i)=>e(s,i,t);let U=class{constructor(t,e){this._api=t,this._store=e}mode=c.SelectMode.Mesh;_hoveredMesh=null;_selectedMesh=null;_hoverColor=G;_selectColor=q;_origLineColors=new WeakMap;handle(t,e){if(this._api.setRaycastMode(this.mode),e===M.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===M.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}}})}};U=at([h.injectable(),ce(0,h.inject("RendererApi")),ce(1,h.inject("IEditorStore"))],U);var ht=Object.getOwnPropertyDescriptor,lt=(t,e,s,i)=>{for(var r=i>1?void 0:i?ht(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},ct=(t,e)=>(s,i)=>e(s,i,t);let N=class{constructor(t){this._api=t}mode=c.SelectMode.Face;_hovered=null;_selected=null;_hoverColor=G;_selectColor=q;_defaultColor=2236962;handle(t,e){this._api.setRaycastMode(this.mode),e===M.Hover&&console.log(t),e===M.Click&&console.log(t)}rollback(){throw new Error("Method not implemented.")}dispose(){throw new Error("Method not implemented.")}};N=lt([h.injectable(),ct(0,h.inject("RendererApi"))],N);class Q{constructor(e,s){this.api=e,this.store=s}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()}}var 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},de=(t,e)=>(s,i)=>e(s,i,t);let F=class extends Q{mode=c.ToolType.Translate;constructor(t,e){super(t,e)}};F=_t([h.injectable(),de(0,h.inject("RendererApi")),de(1,h.inject("IEditorStore"))],F);var pt=Object.getOwnPropertyDescriptor,ut=(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},_e=(t,e)=>(s,i)=>e(s,i,t);let Y=class extends Q{mode=c.ToolType.Scale;constructor(t,e){super(t,e)}};Y=ut([h.injectable(),_e(0,h.inject("RendererApi")),_e(1,h.inject("IEditorStore"))],Y);var mt=Object.getOwnPropertyDescriptor,ft=(t,e,s,i)=>{for(var r=i>1?void 0:i?mt(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 V=class extends Q{mode=c.ToolType.Rotate;constructor(t,e){super(t,e)}};V=ft([h.injectable(),pe(0,h.inject("RendererApi")),pe(1,h.inject("IEditorStore"))],V);const L=31;var gt=Object.getOwnPropertyDescriptor,bt=(t,e,s,i)=>{for(var r=i>1?void 0:i?gt(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);let z=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=c.SelectMode.Edge;_hoverLine;_selectLine;_hovered=null;_selected=null;_hoverColor=G;_selectColor=q;handle(t,e){if(this._api.setRaycastMode(this.mode),e===M.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===M.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),_=new a.Vector3(i.getX(o),i.getY(o),i.getZ(o)).applyMatrix4(e.matrixWorld),u=t.geometry.getAttribute("position");u.setXYZ(0,n.x,n.y,n.z),u.setXYZ(1,_.x,_.y,_.z),u.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),_=new a.Vector3(i.getX(o),i.getY(o),i.getZ(o)).applyMatrix4(e.matrixWorld),u=new a.Vector3().subVectors(_,n),g=u.length();if(!isFinite(g)||g===0)return;const b=new a.Vector3().addVectors(n,_).multiplyScalar(.5);t.position.copy(b);const O=t.geometry;let y=O.getAttribute("position");(!y||y.count<2)&&(O.setAttribute("position",new a.BufferAttribute(new Float32Array(6),3)),y=O.getAttribute("position")),y.setXYZ(0,-g/2,0,0),y.setXYZ(1,g/2,0,0),y.needsUpdate=!0,u.normalize();const w=new a.Quaternion().setFromUnitVectors(new a.Vector3(1,0,0),u);t.quaternion.copy(w),t.updateMatrixWorld(!0)}_findParentMesh(t){let e=t;for(;e;){if(e.isMesh)return e;e=e.parent}return null}_prepareEdgeMetadata(t,e){const s=this._findParentMesh(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),_=new a.Vector3(i.getX(o),i.getY(o),i.getZ(o)).applyMatrix4(t.matrixWorld),u=new a.Matrix4().copy(s.matrixWorld).invert(),g=n.clone().applyMatrix4(u),b=_.clone().applyMatrix4(u),y=s.geometry.getAttribute("position"),w=new a.Vector3,E=1e-6,J=[],ee=[];for(let v=0;v<y.count;v++)w.fromBufferAttribute(y,v),w.distanceToSquared(g)<E*E?J.push(v):w.distanceToSquared(b)<E*E&&ee.push(v);const te=new a.Matrix4().copy(t.matrixWorld).invert(),ve=n.clone().applyMatrix4(te),ye=_.clone().applyMatrix4(te),se=t.geometry.getAttribute("position"),j=new a.Vector3,ie=[],re=[];for(let v=0;v<se.count;v++)j.fromBufferAttribute(se,v),j.distanceToSquared(ve)<E*E?ie.push(v):j.distanceToSquared(ye)<E*E&&re.push(v);this._selectLine.userData.edgeInfo={lines:t,seg:e,mesh:s,aIndices:J,bIndices:ee,aEdgeIndices:ie,bEdgeIndices:re}}};z=bt([h.injectable(),ue(0,h.inject("RendererApi")),ue(1,h.inject("IEditorStore"))],z);var vt=Object.getOwnPropertyDescriptor,yt=(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},Mt=(t,e)=>(s,i)=>e(s,i,t);let $=class{constructor(t){this._api=t}mode=c.SceneMode.AddFigure;_lastAddedMesh=null;handle(t){const e=we[t](),s=e.getAttribute("position");s&&s.setUsage&&s.setUsage(a.DynamicDrawUsage);const i=new a.Mesh(e,ge);i.layers.enable(0);const r=new a.EdgesGeometry(i.geometry),o=new a.LineSegments(r,new a.LineBasicMaterial({color:ot,linewidth:1}));o.layers.set(1),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}};$=yt([h.injectable(),Mt(0,h.inject("RendererApi"))],$);const Et=t=>!!t&&t.isMesh;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},me=(t,e)=>(s,i)=>e(s,i,t);let W=class{constructor(t,e){this._api=t,this._store=e}mode=c.SceneMode.DeleteFigure;_lastDeletedMesh=null;handle(){const t=this._store.getSelectedObject();Et(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}};W=wt([h.injectable(),me(0,h.inject("RendererApi")),me(1,h.inject("IEditorStore"))],W);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},Tt=(t,e)=>(s,i)=>e(s,i,t);let Z=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)}};Z=Ot([h.injectable(),Tt(0,h.inject("EditorRenderer"))],Z);var Dt=Object.getOwnPropertyDescriptor,Lt=(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},P=(t,e)=>(s,i)=>e(s,i,t);exports.EditorHub=class{constructor(e,s,i,r,o){this._displayManager=e,this._selectManager=s,this._toolManager=i,this._sceneManager=r,this._renderer=o,this.setSelectMode(c.SelectMode.Mesh),this.setToolMode(c.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)}dispose(){this._displayManager.dispose(),this._selectManager.dispose(),this._renderer.dispose()}};exports.EditorHub=Lt([h.injectable(),P(0,h.inject("IDisplayManager")),P(1,h.inject("ISelectManager")),P(2,h.inject("IToolManager")),P(3,h.inject("ISceneManager")),P(4,h.inject("EditorRenderer"))],exports.EditorHub);var jt=Object.getOwnPropertyDescriptor,Ct=(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};let B=class{_selectMode=c.SelectMode.Mesh;_toolType=c.ToolType.Translate;_displayMode=c.DisplayMode.Plane;_selectedObject=null;_selectedListeners=new Set;constructor(){Ee.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}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)}};B=Ct([h.injectable()],B);let fe=!1;const p=h.container.createChildContainer();function At(t){return fe||(p.registerInstance("Canvas",t),p.registerSingleton("EventBus",exports.EventBus),p.registerSingleton("EditorRenderer",exports.EditorRenderer),p.registerSingleton("RendererApi",Z),p.registerSingleton("IDisplayHandler",k),p.registerSingleton("ISelectHandler",U),p.registerSingleton("ISelectHandler",N),p.registerSingleton("ISelectHandler",z),p.registerSingleton("IToolHandler",F),p.registerSingleton("IToolHandler",Y),p.registerSingleton("IToolHandler",V),p.registerSingleton("ISceneHandler",$),p.registerSingleton("ISceneHandler",W),p.registerSingleton("IDisplayManager",R),p.registerSingleton("ISelectManager",x),p.registerSingleton("IToolManager",H),p.registerSingleton("ISceneManager",I),p.registerSingleton("EditorHub",exports.EditorHub),p.registerSingleton("IEditorStore",B),fe=!0),p}function Rt(t){return At(t).resolve("EditorHub")}exports.EventTopics=S;exports.ObjLoader=Ze;exports.PreviewRenderer=We;exports.Renderer=X;exports.createAppHub=Rt;