@planara/core 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/dist/api/modules/controls-state-api.d.ts +1 -1
  2. package/dist/api/modules/controls-state-api.d.ts.map +1 -1
  3. package/dist/api/modules/index.d.ts +5 -0
  4. package/dist/api/modules/index.d.ts.map +1 -0
  5. package/dist/api/modules/mesh-api.d.ts +1 -1
  6. package/dist/api/modules/mesh-api.d.ts.map +1 -1
  7. package/dist/api/modules/raycast-api.d.ts +1 -1
  8. package/dist/api/modules/raycast-api.d.ts.map +1 -1
  9. package/dist/api/modules/transform-api.d.ts +2 -2
  10. package/dist/api/modules/transform-api.d.ts.map +1 -1
  11. package/dist/api/renderer/camera-api.d.ts +2 -2
  12. package/dist/api/renderer/camera-api.d.ts.map +1 -1
  13. package/dist/api/renderer/dom-api.d.ts +2 -2
  14. package/dist/api/renderer/dom-api.d.ts.map +1 -1
  15. package/dist/api/renderer/index.d.ts +4 -0
  16. package/dist/api/renderer/index.d.ts.map +1 -0
  17. package/dist/api/renderer/scene-api.d.ts +2 -2
  18. package/dist/api/renderer/scene-api.d.ts.map +1 -1
  19. package/dist/constants/figure-geometries.d.ts.map +1 -1
  20. package/dist/constants/index.d.ts +6 -0
  21. package/dist/constants/index.d.ts.map +1 -0
  22. package/dist/controllers/index.d.ts +2 -0
  23. package/dist/controllers/index.d.ts.map +1 -0
  24. package/dist/controllers/renderer-controller.d.ts +7 -9
  25. package/dist/controllers/renderer-controller.d.ts.map +1 -1
  26. package/dist/core/index.d.ts +2 -0
  27. package/dist/core/index.d.ts.map +1 -0
  28. package/dist/core/renderer.d.ts +10 -15
  29. package/dist/core/renderer.d.ts.map +1 -1
  30. package/dist/decorators/index.d.ts +3 -0
  31. package/dist/decorators/index.d.ts.map +1 -0
  32. package/dist/decorators/use-policy.d.ts.map +1 -1
  33. package/dist/decorators/use-validator.d.ts +5 -0
  34. package/dist/decorators/use-validator.d.ts.map +1 -0
  35. package/dist/errors/index.d.ts +3 -0
  36. package/dist/errors/index.d.ts.map +1 -0
  37. package/dist/errors/policy-error.d.ts +1 -1
  38. package/dist/errors/policy-error.d.ts.map +1 -1
  39. package/dist/errors/validation-error.d.ts +9 -0
  40. package/dist/errors/validation-error.d.ts.map +1 -0
  41. package/dist/events/editor-events.d.ts +1 -1
  42. package/dist/events/editor-events.d.ts.map +1 -1
  43. package/dist/events/event-bus.d.ts +1 -1
  44. package/dist/events/event-bus.d.ts.map +1 -1
  45. package/dist/events/index.d.ts +4 -0
  46. package/dist/events/index.d.ts.map +1 -0
  47. package/dist/handlers/display/index.d.ts +2 -0
  48. package/dist/handlers/display/index.d.ts.map +1 -0
  49. package/dist/handlers/display/wireframe-handler.d.ts +2 -2
  50. package/dist/handlers/display/wireframe-handler.d.ts.map +1 -1
  51. package/dist/handlers/scene/add-figure-scene-handler.d.ts +2 -2
  52. package/dist/handlers/scene/add-figure-scene-handler.d.ts.map +1 -1
  53. package/dist/handlers/scene/delete-figure-scene-handler.d.ts +3 -3
  54. package/dist/handlers/scene/delete-figure-scene-handler.d.ts.map +1 -1
  55. package/dist/handlers/scene/export-scene-handler.d.ts +23 -0
  56. package/dist/handlers/scene/export-scene-handler.d.ts.map +1 -0
  57. package/dist/handlers/scene/index.d.ts +6 -0
  58. package/dist/handlers/scene/index.d.ts.map +1 -0
  59. package/dist/handlers/scene/load-figure-scene-handler.d.ts +23 -0
  60. package/dist/handlers/scene/load-figure-scene-handler.d.ts.map +1 -0
  61. package/dist/handlers/scene/load-scene-handler.d.ts +23 -0
  62. package/dist/handlers/scene/load-scene-handler.d.ts.map +1 -0
  63. package/dist/handlers/select/edge-select-handler.d.ts +5 -8
  64. package/dist/handlers/select/edge-select-handler.d.ts.map +1 -1
  65. package/dist/handlers/select/face-select-handler.d.ts +5 -8
  66. package/dist/handlers/select/face-select-handler.d.ts.map +1 -1
  67. package/dist/handlers/select/index.d.ts +5 -0
  68. package/dist/handlers/select/index.d.ts.map +1 -0
  69. package/dist/handlers/select/mesh-select-handler.d.ts +5 -6
  70. package/dist/handlers/select/mesh-select-handler.d.ts.map +1 -1
  71. package/dist/handlers/select/vertex-select-handler.d.ts +5 -8
  72. package/dist/handlers/select/vertex-select-handler.d.ts.map +1 -1
  73. package/dist/handlers/tool/base-tool-handler.d.ts +3 -3
  74. package/dist/handlers/tool/base-tool-handler.d.ts.map +1 -1
  75. package/dist/handlers/tool/index.d.ts +4 -0
  76. package/dist/handlers/tool/index.d.ts.map +1 -0
  77. package/dist/handlers/tool/rotate-tool-handler.d.ts +2 -2
  78. package/dist/handlers/tool/rotate-tool-handler.d.ts.map +1 -1
  79. package/dist/handlers/tool/scale-tool-handler.d.ts +2 -2
  80. package/dist/handlers/tool/scale-tool-handler.d.ts.map +1 -1
  81. package/dist/handlers/tool/translate-tool-handler.d.ts +2 -2
  82. package/dist/handlers/tool/translate-tool-handler.d.ts.map +1 -1
  83. package/dist/hub/editor-hub.d.ts +11 -8
  84. package/dist/hub/editor-hub.d.ts.map +1 -1
  85. package/dist/hub/index.d.ts +26 -0
  86. package/dist/hub/index.d.ts.map +1 -0
  87. package/dist/hub/viewer-hub.d.ts +30 -0
  88. package/dist/hub/viewer-hub.d.ts.map +1 -0
  89. package/dist/index.cjs.js +20 -2
  90. package/dist/index.d.ts +4 -4
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.es.js +2063 -1147
  93. package/dist/index.full.d.ts +67 -57
  94. package/dist/index.public.d.ts +67 -57
  95. package/dist/index.umd.js +20 -2
  96. package/dist/interfaces/api/index.d.ts +9 -0
  97. package/dist/interfaces/api/index.d.ts.map +1 -0
  98. package/dist/interfaces/api/renderer/index.d.ts +6 -0
  99. package/dist/interfaces/api/renderer/index.d.ts.map +1 -0
  100. package/dist/interfaces/api/transform-api.d.ts +1 -1
  101. package/dist/interfaces/api/transform-api.d.ts.map +1 -1
  102. package/dist/interfaces/command/index.d.ts +1 -1
  103. package/dist/interfaces/command/index.d.ts.map +1 -1
  104. package/dist/interfaces/controller/{controller.d.ts → index.d.ts} +1 -1
  105. package/dist/interfaces/controller/index.d.ts.map +1 -0
  106. package/dist/interfaces/handler/index.d.ts +6 -0
  107. package/dist/interfaces/handler/index.d.ts.map +1 -0
  108. package/dist/interfaces/manager/display-manager.d.ts.map +1 -1
  109. package/dist/interfaces/manager/index.d.ts +6 -0
  110. package/dist/interfaces/manager/index.d.ts.map +1 -0
  111. package/dist/interfaces/manager/manager.d.ts +1 -1
  112. package/dist/interfaces/manager/manager.d.ts.map +1 -1
  113. package/dist/interfaces/manager/select-manager.d.ts.map +1 -1
  114. package/dist/interfaces/manager/tool-manager.d.ts.map +1 -1
  115. package/dist/interfaces/mediator/index.d.ts +1 -1
  116. package/dist/interfaces/mediator/index.d.ts.map +1 -1
  117. package/dist/interfaces/middleware/index.d.ts +1 -1
  118. package/dist/interfaces/middleware/index.d.ts.map +1 -1
  119. package/dist/interfaces/module/index.d.ts +4 -0
  120. package/dist/interfaces/module/index.d.ts.map +1 -0
  121. package/dist/interfaces/module/renderable-module.d.ts +1 -1
  122. package/dist/interfaces/module/renderable-module.d.ts.map +1 -1
  123. package/dist/interfaces/store/export-store.d.ts +8 -0
  124. package/dist/interfaces/store/export-store.d.ts.map +1 -0
  125. package/dist/interfaces/store/index.d.ts +6 -0
  126. package/dist/interfaces/store/index.d.ts.map +1 -0
  127. package/dist/interfaces/store/select-store.d.ts +1 -1
  128. package/dist/interfaces/store/select-store.d.ts.map +1 -1
  129. package/dist/interfaces/store/tool-store.d.ts +1 -1
  130. package/dist/interfaces/store/tool-store.d.ts.map +1 -1
  131. package/dist/interfaces/validator/index.d.ts +21 -0
  132. package/dist/interfaces/validator/index.d.ts.map +1 -0
  133. package/dist/ioc/container.d.ts +3 -1
  134. package/dist/ioc/container.d.ts.map +1 -1
  135. package/dist/managers/display/display-manager.d.ts +4 -4
  136. package/dist/managers/display/display-manager.d.ts.map +1 -1
  137. package/dist/managers/display/index.d.ts +2 -0
  138. package/dist/managers/display/index.d.ts.map +1 -0
  139. package/dist/managers/index.d.ts +5 -0
  140. package/dist/managers/index.d.ts.map +1 -0
  141. package/dist/managers/scene/index.d.ts +2 -0
  142. package/dist/managers/scene/index.d.ts.map +1 -0
  143. package/dist/managers/scene/scene-manager.d.ts +5 -5
  144. package/dist/managers/scene/scene-manager.d.ts.map +1 -1
  145. package/dist/managers/select/index.d.ts +2 -0
  146. package/dist/managers/select/index.d.ts.map +1 -0
  147. package/dist/managers/select/select-manager.d.ts +5 -5
  148. package/dist/managers/select/select-manager.d.ts.map +1 -1
  149. package/dist/managers/tool/index.d.ts +2 -0
  150. package/dist/managers/tool/index.d.ts.map +1 -0
  151. package/dist/managers/tool/tool-manager.d.ts +4 -4
  152. package/dist/managers/tool/tool-manager.d.ts.map +1 -1
  153. package/dist/mediator/index.d.ts +2 -2
  154. package/dist/mediator/index.d.ts.map +1 -1
  155. package/dist/middlewares/exception-middleware.d.ts +7 -2
  156. package/dist/middlewares/exception-middleware.d.ts.map +1 -1
  157. package/dist/middlewares/index.d.ts +2 -0
  158. package/dist/middlewares/index.d.ts.map +1 -0
  159. package/dist/modules/controls-module.d.ts +11 -9
  160. package/dist/modules/controls-module.d.ts.map +1 -1
  161. package/dist/modules/gizmo-module.d.ts +2 -4
  162. package/dist/modules/gizmo-module.d.ts.map +1 -1
  163. package/dist/modules/index.d.ts +6 -0
  164. package/dist/modules/index.d.ts.map +1 -0
  165. package/dist/modules/raycast-module.d.ts +4 -8
  166. package/dist/modules/raycast-module.d.ts.map +1 -1
  167. package/dist/modules/scene-module.d.ts +2 -3
  168. package/dist/modules/scene-module.d.ts.map +1 -1
  169. package/dist/modules/scene-preview-module.d.ts +26 -0
  170. package/dist/modules/scene-preview-module.d.ts.map +1 -0
  171. package/dist/policy/index.d.ts +2 -0
  172. package/dist/policy/index.d.ts.map +1 -0
  173. package/dist/policy/tool-policy.d.ts +1 -1
  174. package/dist/policy/tool-policy.d.ts.map +1 -1
  175. package/dist/store/editor-store.d.ts +33 -0
  176. package/dist/store/editor-store.d.ts.map +1 -0
  177. package/dist/store/export-store.d.ts +12 -0
  178. package/dist/store/export-store.d.ts.map +1 -0
  179. package/dist/store/index.d.ts +2 -35
  180. package/dist/store/index.d.ts.map +1 -1
  181. package/dist/types/camera/index.d.ts +2 -0
  182. package/dist/types/camera/index.d.ts.map +1 -0
  183. package/dist/types/event/index.d.ts +2 -0
  184. package/dist/types/event/index.d.ts.map +1 -0
  185. package/dist/types/feature/index.d.ts +2 -0
  186. package/dist/types/feature/index.d.ts.map +1 -0
  187. package/dist/types/listener/index.d.ts +3 -0
  188. package/dist/types/listener/index.d.ts.map +1 -0
  189. package/dist/types/select/index.d.ts +2 -0
  190. package/dist/types/select/index.d.ts.map +1 -0
  191. package/dist/utils/default-renderer-config.d.ts +9 -0
  192. package/dist/utils/default-renderer-config.d.ts.map +1 -0
  193. package/dist/utils/helpers.d.ts +14 -1
  194. package/dist/utils/helpers.d.ts.map +1 -1
  195. package/dist/utils/index.d.ts +3 -0
  196. package/dist/utils/index.d.ts.map +1 -0
  197. package/dist/validators/index.d.ts +2 -0
  198. package/dist/validators/index.d.ts.map +1 -0
  199. package/dist/validators/obj-validator.d.ts +12 -0
  200. package/dist/validators/obj-validator.d.ts.map +1 -0
  201. package/package.json +2 -2
  202. package/dist/hub/app-hub.d.ts +0 -13
  203. package/dist/hub/app-hub.d.ts.map +0 -1
  204. package/dist/interfaces/controller/controller.d.ts.map +0 -1
  205. package/dist/interfaces/response/index.d.ts +0 -22
  206. package/dist/interfaces/response/index.d.ts.map +0 -1
  207. package/dist/types/response/response-type.d.ts +0 -19
  208. package/dist/types/response/response-type.d.ts.map +0 -1
@@ -0,0 +1,5 @@
1
+ export * from './edge-select-handler';
2
+ export * from './face-select-handler';
3
+ export * from './mesh-select-handler';
4
+ export * from './vertex-select-handler';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/handlers/select/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC"}
@@ -1,10 +1,9 @@
1
- import { ISelectHandler } from '../../interfaces/handler/select-handler';
2
- import { ISelectStore } from '../../interfaces/store/select-store';
3
- import { IRaycastApi } from '../../interfaces/api/raycast-api';
1
+ import { ISelectHandler } from '../../interfaces/handler';
2
+ import { ISelectStore } from '../../interfaces/store';
3
+ import { IRaycastApi } from '../../interfaces/api';
4
4
  import { SelectMode } from '@planara/types';
5
- import { EditorEvents } from '../../events/editor-events';
6
- import { EventTopics } from '../../events/event-topics';
7
- import { SelectEventType } from '../../types/event/select-event-type';
5
+ import { SelectEventType } from '../../types/event';
6
+ import { EditorEvents, EventTopics } from '../../events';
8
7
  /**
9
8
  * Хендлер для выборки моделей.
10
9
  * Управляет сценой через payload события рендерера.
@@ -1 +1 @@
1
- {"version":3,"file":"mesh-select-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/select/mesh-select-handler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAEpE,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;AAItE;;;;;;;;GAQG;AACH,qBACa,iBAAkB,YAAW,cAAc;IAkB7B,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,MAAM;IAlBvC,+DAA+D;IAC/D,SAAgB,IAAI,EAAE,UAAU,CAAmB;IAEnD,kDAAkD;IAClD,OAAO,CAAC,YAAY,CAA2B;IAC/C,8CAA8C;IAC9C,OAAO,CAAC,aAAa,CAA2B;IAGhD,iDAAiD;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,uCAAuC;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,iDAAiD;IACjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkD;gBAGjD,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,YAAY;IAG9C,MAAM,CACX,OAAO,EAAE,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,EACtF,IAAI,EAAE,eAAe,GACpB,IAAI;IAuDA,QAAQ,IAAI,IAAI;IAUvB,mFAAmF;IAC5E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAItC;;OAEG;IACH,OAAO,CAAC,WAAW;IAenB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;CAa3B"}
1
+ {"version":3,"file":"mesh-select-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/select/mesh-select-handler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,KAAK,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAI1D;;;;;;;;GAQG;AACH,qBACa,iBAAkB,YAAW,cAAc;IAkB7B,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,MAAM;IAlBvC,+DAA+D;IAC/D,SAAgB,IAAI,EAAE,UAAU,CAAmB;IAEnD,kDAAkD;IAClD,OAAO,CAAC,YAAY,CAA2B;IAC/C,8CAA8C;IAC9C,OAAO,CAAC,aAAa,CAA2B;IAGhD,iDAAiD;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,uCAAuC;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,iDAAiD;IACjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkD;gBAGjD,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,YAAY;IAG9C,MAAM,CACX,OAAO,EAAE,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,EACtF,IAAI,EAAE,eAAe,GACpB,IAAI;IAuDA,QAAQ,IAAI,IAAI;IAUvB,mFAAmF;IAC5E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAItC;;OAEG;IACH,OAAO,CAAC,WAAW;IAenB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;CAa3B"}
@@ -1,12 +1,9 @@
1
- import { ISelectHandler } from '../../interfaces/handler/select-handler';
2
- import { ISelectStore } from '../../interfaces/store/select-store';
3
- import { ICameraApi } from '../../interfaces/api/camera-api';
4
- import { ISceneApi } from '../../interfaces/api/scene-api';
5
- import { IRaycastApi } from '../../interfaces/api/raycast-api';
1
+ import { ISelectHandler } from '../../interfaces/handler';
2
+ import { ISelectStore } from '../../interfaces/store';
3
+ import { ICameraApi, ISceneApi, IRaycastApi } from '../../interfaces/api';
6
4
  import { SelectMode } from '@planara/types';
7
- import { EditorEvents } from '../../events/editor-events';
8
- import { EventTopics } from '../../events/event-topics';
9
- import { SelectEventType } from '../../types/event/select-event-type';
5
+ import { SelectEventType } from '../../types/event';
6
+ import { EditorEvents, EventTopics } from '../../events';
10
7
  /**
11
8
  * Хендлер для выборки вершин.
12
9
  * Управляет сценой через payload события рендерера.
@@ -1 +1 @@
1
- {"version":3,"file":"vertex-select-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/select/vertex-select-handler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAEpE,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;AAQtE;;;;;;;;GAQG;AACH,qBACa,mBAAoB,YAAW,cAAc;IAmBhC,OAAO,CAAC,UAAU;IACnB,OAAO,CAAC,SAAS;IACf,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,MAAM;IArBvC,+DAA+D;IAC/D,SAAgB,IAAI,EAAE,UAAU,CAAqB;IAErD,OAAO,CAAC,QAAQ,CAAwD;IACxE,OAAO,CAAC,SAAS,CAAwD;IAEzE,kCAAkC;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,iCAAiC;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAG7C,sCAAsC;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;gBAGb,UAAU,EAAE,UAAU,EACvB,SAAS,EAAE,SAAS,EAClB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,YAAY;IAc9C,MAAM,CACX,OAAO,EAAE,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,EACtF,IAAI,EAAE,eAAe,GACpB,IAAI;IAqEA,QAAQ,IAAI,IAAI;IAUhB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAetC,OAAO,CAAC,kBAAkB;IA2B1B,iFAAiF;IACjF,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,KAAK;IAOb,mFAAmF;IACnF,OAAO,CAAC,sBAAsB;IAuE9B,iDAAiD;IACjD,OAAO,CAAC,oBAAoB;CA2B7B"}
1
+ {"version":3,"file":"vertex-select-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/select/vertex-select-handler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE3E,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,KAAK,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAM1D;;;;;;;;GAQG;AACH,qBACa,mBAAoB,YAAW,cAAc;IAmBhC,OAAO,CAAC,UAAU;IACnB,OAAO,CAAC,SAAS;IACf,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,MAAM;IArBvC,+DAA+D;IAC/D,SAAgB,IAAI,EAAE,UAAU,CAAqB;IAErD,OAAO,CAAC,QAAQ,CAAwD;IACxE,OAAO,CAAC,SAAS,CAAwD;IAEzE,kCAAkC;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,iCAAiC;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAG7C,sCAAsC;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;gBAGb,UAAU,EAAE,UAAU,EACvB,SAAS,EAAE,SAAS,EAClB,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,YAAY;IAc9C,MAAM,CACX,OAAO,EAAE,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,EACtF,IAAI,EAAE,eAAe,GACpB,IAAI;IAqEA,QAAQ,IAAI,IAAI;IAUhB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAetC,OAAO,CAAC,kBAAkB;IA2B1B,iFAAiF;IACjF,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,KAAK;IAOb,mFAAmF;IACnF,OAAO,CAAC,sBAAsB;IAuE9B,iDAAiD;IACjD,OAAO,CAAC,oBAAoB;CA2B7B"}
@@ -1,7 +1,7 @@
1
1
  import { ToolType } from '@planara/types';
2
- import { ITransformApi } from '../../interfaces/api/transform-api';
3
- import { IToolHandler } from '../../interfaces/handler/tool-handler';
4
- import { ITransformStore } from '../../interfaces/store/transform-store';
2
+ import { ITransformApi } from '../../interfaces/api';
3
+ import { IToolHandler } from '../../interfaces/handler';
4
+ import { ITransformStore } from '../../interfaces/store';
5
5
  /**
6
6
  * Базовый класс для инструментов
7
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"base-tool-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/tool/base-tool-handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAE9E;;;;;;GAMG;AACH,8BAAsB,eAAgB,YAAW,YAAY;IAMzD,SAAS,CAAC,GAAG,EAAE,aAAa;IAC5B,SAAS,CAAC,KAAK,EAAE,eAAe;IANlC,kBAAyB,IAAI,EAAE,QAAQ,CAAC;IAExC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAa;IAEnD,SAAS,aACG,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,eAAe;IAUlC;;OAEG;IACI,MAAM,IAAI,IAAI;IAarB;;;;OAIG;IACI,QAAQ,IAAI,IAAI;IAIvB,sCAAsC;IAC/B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;CAOvC"}
1
+ {"version":3,"file":"base-tool-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/tool/base-tool-handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D;;;;;;GAMG;AACH,8BAAsB,eAAgB,YAAW,YAAY;IAMzD,SAAS,CAAC,GAAG,EAAE,aAAa;IAC5B,SAAS,CAAC,KAAK,EAAE,eAAe;IANlC,kBAAyB,IAAI,EAAE,QAAQ,CAAC;IAExC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAa;IAEnD,SAAS,aACG,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,eAAe;IAUlC;;OAEG;IACI,MAAM,IAAI,IAAI;IAarB;;;;OAIG;IACI,QAAQ,IAAI,IAAI;IAIvB,sCAAsC;IAC/B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;CAOvC"}
@@ -0,0 +1,4 @@
1
+ export * from './rotate-tool-handler';
2
+ export * from './scale-tool-handler';
3
+ export * from './translate-tool-handler';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/handlers/tool/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { BaseToolHandler } from './base-tool-handler';
2
- import { ITransformApi } from '../../interfaces/api/transform-api';
3
- import { ITransformStore } from '../../interfaces/store/transform-store';
2
+ import { ITransformApi } from '../../interfaces/api';
3
+ import { ITransformStore } from '../../interfaces/store';
4
4
  import { ToolType } from '@planara/types';
5
5
  /**
6
6
  * Хендлер инструмента «вращение».
@@ -1 +1 @@
1
- {"version":3,"file":"rotate-tool-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/tool/rotate-tool-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAE9E,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI1C;;;;;;;;;;GAUG;AACH,qBACa,iBAAkB,SAAQ,eAAe;IACpD,oEAAoE;IACpE,SAAgB,IAAI,EAAE,QAAQ,CAAmB;gBAGtB,GAAG,EAAE,aAAa,EACpB,KAAK,EAAE,eAAe;CAIhD"}
1
+ {"version":3,"file":"rotate-tool-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/tool/rotate-tool-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI1C;;;;;;;;;;GAUG;AACH,qBACa,iBAAkB,SAAQ,eAAe;IACpD,oEAAoE;IACpE,SAAgB,IAAI,EAAE,QAAQ,CAAmB;gBAGtB,GAAG,EAAE,aAAa,EACpB,KAAK,EAAE,eAAe;CAIhD"}
@@ -1,6 +1,6 @@
1
1
  import { BaseToolHandler } from './base-tool-handler';
2
- import { ITransformApi } from '../../interfaces/api/transform-api';
3
- import { ITransformStore } from '../../interfaces/store/transform-store';
2
+ import { ITransformApi } from '../../interfaces/api';
3
+ import { ITransformStore } from '../../interfaces/store';
4
4
  import { ToolType } from '@planara/types';
5
5
  /**
6
6
  * Хендлер инструмента «масштабирование».
@@ -1 +1 @@
1
- {"version":3,"file":"scale-tool-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/tool/scale-tool-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAE9E,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI1C;;;;;;;;;;GAUG;AACH,qBACa,gBAAiB,SAAQ,eAAe;IACnD,oEAAoE;IACpE,SAAgB,IAAI,EAAE,QAAQ,CAAkB;gBAGrB,GAAG,EAAE,aAAa,EACpB,KAAK,EAAE,eAAe;CAIhD"}
1
+ {"version":3,"file":"scale-tool-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/tool/scale-tool-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI1C;;;;;;;;;;GAUG;AACH,qBACa,gBAAiB,SAAQ,eAAe;IACnD,oEAAoE;IACpE,SAAgB,IAAI,EAAE,QAAQ,CAAkB;gBAGrB,GAAG,EAAE,aAAa,EACpB,KAAK,EAAE,eAAe;CAIhD"}
@@ -1,6 +1,6 @@
1
1
  import { BaseToolHandler } from './base-tool-handler';
2
- import { ITransformApi } from '../../interfaces/api/transform-api';
3
- import { ITransformStore } from '../../interfaces/store/transform-store';
2
+ import { ITransformApi } from '../../interfaces/api';
3
+ import { ITransformStore } from '../../interfaces/store';
4
4
  import { ToolType } from '@planara/types';
5
5
  /**
6
6
  * Хендлер инструмента «перемещение».
@@ -1 +1 @@
1
- {"version":3,"file":"translate-tool-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/tool/translate-tool-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AAE9E,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI1C;;;;;;;;;;GAUG;AACH,qBACa,oBAAqB,SAAQ,eAAe;IACvD,oEAAoE;IACpE,SAAgB,IAAI,EAAE,QAAQ,CAAsB;gBAGzB,GAAG,EAAE,aAAa,EACpB,KAAK,EAAE,eAAe;CAIhD"}
1
+ {"version":3,"file":"translate-tool-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/tool/translate-tool-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAI1C;;;;;;;;;;GAUG;AACH,qBACa,oBAAqB,SAAQ,eAAe;IACvD,oEAAoE;IACpE,SAAgB,IAAI,EAAE,QAAQ,CAAsB;gBAGzB,GAAG,EAAE,aAAa,EACpB,KAAK,EAAE,eAAe;CAIhD"}
@@ -1,9 +1,8 @@
1
- import { Renderer } from '../core/renderer';
1
+ import { Renderer } from '../core';
2
2
  import { Disposable } from 'tsyringe';
3
- import { DisplayMode, FigureTransform, FigureType, SceneMode, SelectMode, ToolType } from '@planara/types';
4
- import { IResponse } from '../interfaces/response';
5
- import { IController } from '../interfaces/controller/controller';
6
- import { ITransformStore } from '../interfaces/store/transform-store';
3
+ import { DisplayMode, FigureTransform, FigureType, SelectMode, ToolType, IResponse, ExportSceneResult } from '@planara/types';
4
+ import { IController } from '../interfaces/controller';
5
+ import { IExportStore, ITransformStore } from '../interfaces/store';
7
6
  import { IMediator } from '../interfaces/mediator';
8
7
  /**
9
8
  * Хаб для управления редактированием
@@ -13,13 +12,17 @@ export declare class EditorHub implements Disposable {
13
12
  private _renderer;
14
13
  private _mediator;
15
14
  private _store;
15
+ private _exportStore;
16
16
  private _controller;
17
- constructor(_renderer: Renderer, _mediator: IMediator, _store: ITransformStore, _controller: IController);
17
+ constructor(_renderer: Renderer, _mediator: IMediator, _store: ITransformStore, _exportStore: IExportStore, _controller: IController);
18
18
  setDisplayMode(mode: DisplayMode): IResponse | null;
19
- setSceneMode(mode: SceneMode): IResponse | null;
20
19
  setSelectMode(mode: SelectMode): IResponse | null;
21
20
  setToolMode(mode: ToolType): IResponse | null;
22
- addFigure(mode: SceneMode, figure: FigureType): IResponse | null;
21
+ addFigure(figure: FigureType): IResponse | null;
22
+ deleteFigure(): IResponse | null;
23
+ loadFigure(content: string): IResponse | null;
24
+ loadScene(content: string): IResponse | null;
25
+ exportScene(): ExportSceneResult;
23
26
  resizeRenderer(): void;
24
27
  /**
25
28
  * Запускает редактор.
@@ -1 +1 @@
1
- {"version":3,"file":"editor-hub.d.ts","sourceRoot":"","sources":["../../src/hub/editor-hub.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAAE,KAAK,UAAU,EAAsB,MAAM,UAAU,CAAC;AAE/D,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,SAAS,EACT,UAAU,EACV,QAAQ,EACT,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD;;;GAGG;AACH,qBACa,SAAU,YAAW,UAAU;IAEpB,OAAO,CAAC,SAAS;IAChB,OAAO,CAAC,SAAS;IACf,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,WAAW;gBAHd,SAAS,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,EAClB,MAAM,EAAE,eAAe,EACvB,WAAW,EAAE,WAAW;IAMlD,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI;IAOnD,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI;IAO/C,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI;IAOjD,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI;IAO7C,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI;IAOhE,cAAc;IAIrB;;;OAGG;IACI,KAAK,IAAI,IAAI;IAIpB;;OAEG;IACI,IAAI,IAAI,IAAI;IAIZ,iBAAiB,IAAI,eAAe,GAAG,IAAI;IAI3C,sBAAsB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAexD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;CAGvC"}
1
+ {"version":3,"file":"editor-hub.d.ts","sourceRoot":"","sources":["../../src/hub/editor-hub.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,EAAE,KAAK,UAAU,EAAsB,MAAM,UAAU,CAAC;AAE/D,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,UAAU,EAEf,UAAU,EACV,QAAQ,EACR,KAAK,SAAS,EACd,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;GAGG;AACH,qBACa,SAAU,YAAW,UAAU;IAEpB,OAAO,CAAC,SAAS;IAChB,OAAO,CAAC,SAAS;IACf,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,WAAW;gBAJd,SAAS,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,EAClB,MAAM,EAAE,eAAe,EACvB,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,WAAW;IAMlD,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI;IAOnD,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI;IAOjD,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,IAAI;IAO7C,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI;IAO/C,YAAY,IAAI,SAAS,GAAG,IAAI;IAOhC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAO7C,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAO5C,WAAW,IAAI,iBAAiB;IAchC,cAAc;IAIrB;;;OAGG;IACI,KAAK,IAAI,IAAI;IAIpB;;OAEG;IACI,IAAI,IAAI,IAAI;IAIZ,iBAAiB,IAAI,eAAe,GAAG,IAAI;IAI3C,sBAAsB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;IAexD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;CAGvC"}
@@ -0,0 +1,26 @@
1
+ import { EditorHub } from './editor-hub';
2
+ import { ViewerHub } from './viewer-hub';
3
+ import { RendererConfigInput } from '@planara/types';
4
+ /**
5
+ * Инициализирует редактор и возвращает хаб.
6
+ * Вызывать один раз при старте (когда есть canvas).
7
+ * @public
8
+ */
9
+ export declare const createEditorHub: (canvas: HTMLCanvasElement, rendererConfig?: RendererConfigInput) => EditorHub;
10
+ /**
11
+ * Возвращает уже созданный хаб, если редактор инициализирован.
12
+ * @public
13
+ */
14
+ export declare const getEditorHub: () => EditorHub;
15
+ /**
16
+ * Инициализирует вьювер и возвращает хаб.
17
+ * Вызывать один раз при старте (когда есть canvas).
18
+ * @public
19
+ */
20
+ export declare const createViewerHub: (canvas: HTMLCanvasElement, rendererConfig?: RendererConfigInput) => ViewerHub;
21
+ /**
22
+ * Возвращает уже созданный хаб, если редактор инициализирован.
23
+ * @public
24
+ */
25
+ export declare const getViewerHub: () => ViewerHub;
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hub/index.ts"],"names":[],"mappings":"AACA,OAAO,kBAAkB,CAAC;AAI1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAK1D;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAC1B,QAAQ,iBAAiB,EACzB,iBAAiB,mBAAmB,KACnC,SAOF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY,QAAO,SAM/B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAC1B,QAAQ,iBAAiB,EACzB,iBAAiB,mBAAmB,KACnC,SAOF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY,QAAO,SAM/B,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { Renderer } from '../core';
2
+ import { Disposable } from 'tsyringe';
3
+ import { FigureType, IResponse } from '@planara/types';
4
+ import { IController } from '../interfaces/controller';
5
+ import { IMediator } from '../interfaces/mediator';
6
+ /**
7
+ * Хаб для управления вьювером
8
+ * @public
9
+ */
10
+ export declare class ViewerHub implements Disposable {
11
+ private _renderer;
12
+ private _mediator;
13
+ private _controller;
14
+ constructor(_renderer: Renderer, _mediator: IMediator, _controller: IController);
15
+ addFigure(figure: FigureType): IResponse | null;
16
+ loadFigure(content: string): IResponse | null;
17
+ loadScene(content: string): IResponse | null;
18
+ resizeRenderer(): void;
19
+ /**
20
+ * Запускает вьювер.
21
+ * Вызывается после создания хаба.
22
+ */
23
+ start(): void;
24
+ /**
25
+ * Останавливает вьювер.
26
+ */
27
+ stop(): void;
28
+ dispose(): Promise<void> | void;
29
+ }
30
+ //# sourceMappingURL=viewer-hub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewer-hub.d.ts","sourceRoot":"","sources":["../../src/hub/viewer-hub.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,EAAE,KAAK,UAAU,EAAsB,MAAM,UAAU,CAAC;AAE/D,OAAO,EAAE,KAAK,UAAU,EAAa,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;;GAGG;AACH,qBACa,SAAU,YAAW,UAAU;IAEpB,OAAO,CAAC,SAAS;IAChB,OAAO,CAAC,SAAS;IACf,OAAO,CAAC,WAAW;gBAFd,SAAS,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,EAClB,WAAW,EAAE,WAAW;IAGlD,SAAS,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI;IAO/C,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAO7C,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAO5C,cAAc;IAIrB;;;OAGG;IACI,KAAK,IAAI,IAAI;IAIpB;;OAEG;IACI,IAAI,IAAI,IAAI;IAIZ,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;CAGvC"}
package/dist/index.cjs.js CHANGED
@@ -1,2 +1,20 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("reflect-metadata");const Ue=require("three"),a=require("tsyringe"),d=require("@planara/types"),G=require("@planara/three"),Xe=require("events"),qe=require("mobx");function Ye(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const s=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,s.get?s:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const c=Ye(Ue);var Ze=Object.getOwnPropertyDescriptor,Ke=(e,t,r,s)=>{for(var i=s>1?void 0:s?Ze(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Qe=(e,t)=>(r,s)=>t(r,s,e);exports.Renderer=class{scene;camera;renderer;canvas;constructor(t){this.canvas=t,this.scene=new c.Scene,this.scene.background=new c.Color(1710618),this.camera=new c.PerspectiveCamera(45,this.canvas.clientWidth/this.canvas.clientHeight,.1,1e3),this.camera.position.set(1,1,7),this.renderer=new c.WebGLRenderer({canvas:this.canvas,antialias:!0}),this.renderer.setSize(this.canvas.clientWidth,this.canvas.clientHeight);const r=new c.AmbientLight(16777215,.5);this.scene.add(r);const s=new c.DirectionalLight(16777215,1);s.position.set(5,10,7),this.scene.add(s)}resize(){this.camera.aspect=this.canvas.clientWidth/this.canvas.clientHeight,this.camera.updateProjectionMatrix(),this.renderer.setSize(this.canvas.clientWidth,this.canvas.clientHeight)}render(){this.renderer.render(this.scene,this.camera)}update(){}loop(){this.update(),this.render(),requestAnimationFrame(()=>this.loop())}getCamera(){return this.camera}getRenderer(){return this.renderer}getCanvas(){return this.canvas}getDomElement(){return this.renderer.domElement}getScene(){return this.scene}dispose(){this.scene=null,this.camera=null,this.renderer?.dispose(),this.canvas=null}};exports.Renderer=Ke([a.injectable(),Qe(0,a.inject("Canvas"))],exports.Renderer);class Je{_positions=[];_normals=[];_uvs=[];_tmpPositions=[];_tmpNormals=[];_tmpUVs=[];load(t){const r=t.split(`
2
- `);for(const i of r){if(!i.trim()||i.startsWith("#"))continue;const n=i.trim().split(/\s+/);switch(n[0]){case"v":this._tmpPositions.push(n.slice(1).map(Number));break;case"vn":this._tmpNormals.push(n.slice(1).map(Number));break;case"vt":this._tmpUVs.push(n.slice(1).map(Number));break;case"f":this.processFaceLine(n);break}}const s={type:d.FigureType.Custom,position:this._positions,...this._normals.length>0&&{normal:this._normals},...this._uvs.length>0&&{uv:this._uvs}};return new d.Figure(s)}processFaceLine(t){for(let r=1;r<t.length;r++){const s=t[r];if(!s)continue;const[i,n,o]=s.split("/"),l=i?parseInt(i,10):void 0,_=n?parseInt(n,10):void 0,u=o?parseInt(o,10):void 0;if(l!==void 0){const p=this._tmpPositions[l-1];p&&this._positions.push(...p)}if(_!==void 0){const p=this._tmpUVs[_-1];p&&this._uvs.push(...p)}if(u!==void 0){const p=this._tmpNormals[u-1];p&&this._normals.push(...p)}}}}var et=Object.getOwnPropertyDescriptor,tt=(e,t,r,s)=>{for(var i=s>1?void 0:s?et(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},H=(e,t)=>(r,s)=>t(r,s,e);let Z=class{constructor(e,t,r,s){this._updatable=e,this._renderable=t,this._runtime=r,this._renderer=s}_animationId=null;start(){const e=[...this._runtime,...this._updatable,...this._renderable];new Set(e).forEach(t=>t.init()),this._loop()}_loop(){this._updatable.forEach(e=>e.update()),this._renderer.render(),this._renderable.forEach(e=>e.render()),this._animationId=requestAnimationFrame(()=>this._loop())}stop(){this._animationId&&(cancelAnimationFrame(this._animationId),this._animationId=null)}dispose(){this._animationId=null}};Z=tt([a.injectable(),H(0,a.injectAll("IUpdatableModule")),H(1,a.injectAll("IRenderableModule")),H(2,a.injectAll("IRuntimeModule")),H(3,a.inject("IRenderable"))],Z);var st=Object.getOwnPropertyDescriptor,rt=(e,t,r,s)=>{for(var i=s>1?void 0:s?st(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},it=(e,t)=>(r,s)=>t(r,s,e);let K=class{constructor(e){this._sceneModule=e}addMesh(e){this._sceneModule.addMesh(e)}addMeshes(e){this._sceneModule.addMeshes(e)}removeMesh(e){this._sceneModule.removeMesh(e)}removeMeshes(e){this._sceneModule.removeMeshes(e)}getMeshes(){return this._sceneModule.getMeshes()}};K=rt([a.injectable(),it(0,a.inject("SceneModule"))],K);var nt=Object.getOwnPropertyDescriptor,ot=(e,t,r,s)=>{for(var i=s>1?void 0:s?nt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},at=(e,t)=>(r,s)=>t(r,s,e);let Q=class{constructor(e){this._raycastModule=e}setRaycastMode(e){this._raycastModule.setRaycastMode(e)}};Q=ot([a.injectable(),at(0,a.inject("RaycastModule"))],Q);var ct=Object.getOwnPropertyDescriptor,lt=(e,t,r,s)=>{for(var i=s>1?void 0:s?ct(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},ht=(e,t)=>(r,s)=>t(r,s,e);let J=class{constructor(e){this._controlsModule=e}attachTransform(e){this._controlsModule.attachTransform(e)}detachTransform(){this._controlsModule.detachTransform()}setTransformMode(e){this._controlsModule.setTransformMode(e)}onTransformChange(e){return this._controlsModule.onTransformChange(e)}};J=lt([a.injectable(),ht(0,a.inject("ControlsModule"))],J);var dt=Object.getOwnPropertyDescriptor,_t=(e,t,r,s)=>{for(var i=s>1?void 0:s?dt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},ut=(e,t)=>(r,s)=>t(r,s,e);let ee=class{constructor(e){this._cameraAccessApi=e}getCamera(){return this._cameraAccessApi.getCamera()}enableCameraLayer(e){this._cameraAccessApi.getCamera().layers.enable(e)}disableCameraLayer(e){this._cameraAccessApi.getCamera().layers.disable(e)}};ee=_t([a.injectable(),ut(0,a.inject("IRendererCameraAccess"))],ee);var pt=Object.getOwnPropertyDescriptor,mt=(e,t,r,s)=>{for(var i=s>1?void 0:s?pt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},gt=(e,t)=>(r,s)=>t(r,s,e);let te=class{constructor(e){this._domAccessApi=e}getCanvas(){return this._domAccessApi.getCanvas()}getDomElement(){return this._domAccessApi.getDomElement()}};te=mt([a.injectable(),gt(0,a.inject("IRendererDomAccess"))],te);var vt=Object.getOwnPropertyDescriptor,ft=(e,t,r,s)=>{for(var i=s>1?void 0:s?vt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Mt=(e,t)=>(r,s)=>t(r,s,e);let se=class{constructor(e){this._sceneAccessApi=e}getScene(){return this._sceneAccessApi.getScene()}addToScene(e){this._sceneAccessApi.getScene().add(e)}removeFromScene(e){this._sceneAccessApi.getScene().remove(e)}addObject(e,t){const r=this._sceneAccessApi.getScene();r&&(typeof t=="number"&&e.layers.set(t),r.add(e))}};se=ft([a.injectable(),Mt(0,a.inject("IRendererSceneAccess"))],se);var yt=Object.getOwnPropertyDescriptor,bt=(e,t,r,s)=>{for(var i=s>1?void 0:s?yt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},St=(e,t)=>(r,s)=>t(r,s,e);let re=class{constructor(e){this._controlsModule=e}isOrbitInteracting(){return this._controlsModule.isOrbitInteracting()}isTransformDragging(){return this._controlsModule.isTransformDragging()}};re=bt([a.injectable(),St(0,a.inject("ControlsModule"))],re);var At=Object.getOwnPropertyDescriptor,wt=(e,t,r,s)=>{for(var i=s>1?void 0:s?At(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},U=(e,t)=>(r,s)=>t(r,s,e);let ie=class{constructor(e,t,r){this._cameraApi=e,this._domApi=t,this._sceneApi=r}_orbit=null;_transform=null;_transformHelper=null;_transformListeners=new Set;_isEventListenersAdded=!1;init(){this._orbit=new G.OrbitWithState(this._cameraApi.getCamera(),this._domApi.getDomElement()),this._orbit.enableDamping=!0,this._orbit.dampingFactor=.05,this._transform=new G.ModelingTransformControls(this._cameraApi.getCamera(),this._domApi.getDomElement()),this._transformHelper=this._transform.getHelper(),this._sceneApi.addToScene(this._transformHelper),this._initMouseListeners()}attachTransform(e){this._transform?.attach(e)}detachTransform(){this._transform?.detach()}update(){this._orbit?.update()}setTransformMode(e){this._transform?.setMode(e)}onTransformChange(e){return this._transformListeners.add(e),()=>this._transformListeners.delete(e)}isOrbitInteracting(){return!!this._orbit?.isInteracting}isTransformDragging(){return!!this._transform?.dragging}dispose(){if(this._isEventListenersAdded){const e=this._domApi.getCanvas();if(!this._transform||!this._orbit)return;e.removeEventListener("pointerdown",t=>this._transform?.pointerDown(t)),e.removeEventListener("pointermove",t=>this._transform?.pointerMove(t)),e.removeEventListener("pointerup",t=>this._transform?.pointerUp(t)),e.removeEventListener("pointerleave",()=>this._transform?.pointerHover(null)),this._transform.removeEventListener("dragging-changed",()=>{this._orbit.enabled=!this._transform?.dragging}),this._transformListeners.clear(),this._isEventListenersAdded=!1}this._orbit?.dispose(),this._orbit=null,this._transform?.dispose(),this._transform=null,this._transformHelper?.parent&&this._transformHelper.parent.remove(this._transformHelper)}_initMouseListeners(){const e=this._domApi.getCanvas();!this._transform||!this._orbit||(e.addEventListener("pointerdown",t=>this._transform?.pointerDown(t)),e.addEventListener("pointermove",t=>this._transform?.pointerMove(t)),e.addEventListener("pointerup",t=>this._transform?.pointerUp(t)),e.addEventListener("pointerleave",()=>this._transform?.pointerHover(null)),this._transform.addEventListener("dragging-changed",()=>{this._orbit.enabled=!this._transform?.dragging}),this._transform.addEventListener("objectChange",()=>{for(const t of this._transformListeners)t()}),this._isEventListenersAdded=!0)}};ie=wt([a.injectable(),U(0,a.inject("ICameraApi")),U(1,a.inject("IDomApi")),U(2,a.inject("ISceneApi"))],ie);var Ot=Object.getOwnPropertyDescriptor,xt=(e,t,r,s)=>{for(var i=s>1?void 0:s?Ot(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},X=(e,t)=>(r,s)=>t(r,s,e);let ne=class{constructor(e,t,r){this._cameraApi=e,this._domApi=t,this._rendererApi=r}_cameraGizmo=null;init(){const e=this._cameraApi.getCamera(),t=this._rendererApi.getRenderer();this._cameraGizmo=new G.CameraAxesGizmo(t,e,{size:96,margin:36})}render(){const e=this._domApi.getCanvas();this._cameraGizmo?.render(e.width,e.height)}dispose(){this._cameraGizmo?.dispose(),this._cameraGizmo=null}};ne=xt([a.injectable(),X(0,a.inject("ICameraApi")),X(1,a.inject("IDomApi")),X(2,a.inject("IRendererAccess"))],ne);var E=(e=>(e.SelectHover="select.hover",e.SelectClick="select.click",e))(E||{});const jt=.03,Ct=.05,$=0,Re=1,Fe=2,w=31;var Tt=Object.getOwnPropertyDescriptor,It=(e,t,r,s)=>{for(var i=s>1?void 0:s?Tt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},V=(e,t)=>(r,s)=>t(r,s,e);let oe=class{constructor(e,t,r,s,i){this._domApi=e,this._cameraApi=t,this._meshApi=r,this._controlsState=s,this._bus=i}_raycaster;_mouse;_lastHoverKey=null;_currentRaycastMode=d.SelectMode.Mesh;_isEventListenersAdded=!1;init(){this._raycaster=new c.Raycaster,this._mouse=new c.Vector2,this._applyRaycastParamsByMode(),this._isEventListenersAdded||(this._initMouseListeners(),this._isEventListenersAdded=!0)}setRaycastMode(e){if(this._currentRaycastMode===e)return;const t=this._raycaster;t.params.Line.threshold=0,t.params.Points.threshold=0,this._currentRaycastMode=e,this._lastHoverKey=null,this._applyRaycastParamsByMode()}_applyRaycastParamsByMode(){const e=this._raycaster;switch(e.params.Line.threshold=0,e.params.Points.threshold=0,this._currentRaycastMode){case d.SelectMode.Mesh:case d.SelectMode.Face:e.layers.set($);break;case d.SelectMode.Edge:e.layers.set(Re),e.params.Line.threshold=jt;break;case d.SelectMode.Vertex:e.layers.set(Fe),e.params.Points.threshold=Ct;break}}_getHitIntersection(e){const t=this._controlsState.isOrbitInteracting()||this._controlsState.isTransformDragging(),r=this._domApi.getCanvas(),s=this._cameraApi.getCamera(),i=this._meshApi.getMeshes();if(t)return;const n=r.getBoundingClientRect();this._mouse.x=(e.clientX-n.left)/n.width*2-1,this._mouse.y=-((e.clientY-n.top)/n.height)*2+1,this._raycaster.setFromCamera(this._mouse,s);const o=this._raycaster.intersectObjects(i,!0)[0]??null;if(this._currentRaycastMode===d.SelectMode.Mesh||this._currentRaycastMode===d.SelectMode.Face)return o;const l=this._raycaster.layers.mask;this._raycaster.layers.set($);const _=this._raycaster.intersectObjects(i,!0)[0]??null;return this._raycaster.layers.mask=l,this._getVisibleHit(o,_)}_processRaycastEvent(e,t,r){const s=this._getHitIntersection(e),i=this._meshApi.getMeshes();if(s===void 0)return;const n=s?.object??null;if(r){if(!s){i.forEach(l=>l.userData.isHit=!1),this._lastHoverKey=null,this._bus.emit(t,null);return}const o=this._makeHoverKey(s);o!==this._lastHoverKey&&(i.forEach(l=>l.userData.isHit=!1),n&&(n.userData.isHit=!0),this._lastHoverKey=o,this._bus.emit(t,{intersection:s}));return}s&&this._bus.emit(t,{intersection:s})}_getVisibleHit(e,t,r=1e-4){return e?t?e.distance<=t.distance+r?e:null:e:null}_makeHoverKey(e){if(!e)return null;const t=e.object.uuid;switch(this._currentRaycastMode){case d.SelectMode.Face:return`${t}:face:${e.faceIndex??-1}`;case d.SelectMode.Edge:return`${t}:edge:${Math.floor((e.index??-1)/2)}`;case d.SelectMode.Vertex:return`${t}:vertex:${e.index??-1}`;case d.SelectMode.Mesh:default:return`${t}:mesh`}}_handleMouseMove=e=>{this._processRaycastEvent(e,E.SelectHover,!0)};_handleMouseClick=e=>{this._processRaycastEvent(e,E.SelectClick,!1)};_handleDoubleClick=e=>{const t=this._getHitIntersection(e);t!==void 0&&(t||this._bus.emit(E.SelectClick,null))};_handleMouseLeave=()=>{this._lastHoverKey=null,this._bus.emit(E.SelectHover,null)};_initMouseListeners(){const e=this._domApi.getCanvas();e.addEventListener("mousemove",this._handleMouseMove,!1),e.addEventListener("click",this._handleMouseClick,!1),e.addEventListener("dblclick",this._handleDoubleClick,!1),e.addEventListener("mouseleave",this._handleMouseLeave),this._isEventListenersAdded=!0}_removeMouseListeners(){const e=this._domApi.getCanvas();e.removeEventListener("mousemove",this._handleMouseMove),e.removeEventListener("click",this._handleMouseClick),e.removeEventListener("dblclick",this._handleDoubleClick),e.removeEventListener("mouseleave",this._handleMouseLeave)}dispose(){this._removeMouseListeners(),this._isEventListenersAdded=!1,this._lastHoverKey=null}};oe=It([a.injectable(),V(0,a.inject("IDomApi")),V(1,a.inject("ICameraApi")),V(2,a.inject("IMeshApi")),V(3,a.inject("IControlsStateApi")),V(4,a.inject("EventBus"))],oe);var Et=Object.getOwnPropertyDescriptor,Pt=(e,t,r,s)=>{for(var i=s>1?void 0:s?Et(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Lt=(e,t)=>(r,s)=>t(r,s,e);let ae=class{constructor(e){this._api=e}_meshes=[];_grid=null;_axes=null;_light=null;init(){this._grid=new c.GridHelper(10,10),this._grid.position.y=-.001,this._api.addToScene(this._grid),this._axes=new G.SymmetricAxesHelper(6),this._api.addToScene(this._axes),this._light=new c.HemisphereLight(16777215,4473924,.6),this._api.addToScene(this._light)}getMeshes(){return this._meshes}addMesh(e){this._meshes.includes(e)||(this._meshes.push(e),this._api.addToScene(e))}removeMesh(e){const t=this._meshes.indexOf(e);t>=0&&this._meshes.splice(t,1),this._api.removeFromScene(e)}addMeshes(e){for(const t of e)this.addMesh(t)}removeMeshes(e){for(const t of e)this.removeMesh(t)}dispose(){for(const e of this._meshes)this._api.removeFromScene(e);this._meshes.length=0,this._grid&&(this._api.removeFromScene(this._grid),this._grid.geometry.dispose(),this._grid.material.dispose(),this._grid=null),this._axes&&(this._api.removeFromScene(this._axes),this._axes=null),this._light&&(this._api.removeFromScene(this._light),this._light=null)}};ae=Pt([a.injectable(),Lt(0,a.inject("ISceneApi"))],ae);var O=(e=>(e[e.Display=0]="Display",e[e.Scene=1]="Scene",e[e.Select=2]="Select",e[e.Tool=3]="Tool",e))(O||{}),Dt=Object.getOwnPropertyDescriptor,Vt=(e,t,r,s)=>{for(var i=s>1?void 0:s?Dt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Ie=(e,t)=>(r,s)=>t(r,s,e);let ce=class{constructor(e,t){this._store=t,this._handlers=new Map(e.map(r=>[r.mode,r]))}_currentMode=d.DisplayMode.Plane;_handlers;type=O.Display;manage(e){e!==this._currentMode&&(this._handlers.get(this._currentMode)?.rollback(),e!==d.DisplayMode.Plane&&this._handlers.get(e)?.handle(),this._currentMode=e,this._store.setDisplayMode(this._currentMode))}dispose(){this._handlers&&this._handlers.clear(),this._currentMode=d.DisplayMode.Plane,this._store.setDisplayMode(this._currentMode)}};ce=Vt([a.injectable(),Ie(0,a.injectAll("IDisplayHandler")),Ie(1,a.inject("EditorStore"))],ce);var x=(e=>(e.Hover="hover",e.Click="click",e))(x||{}),$t=Object.getOwnPropertyDescriptor,Ht=(e,t,r,s)=>{for(var i=s>1?void 0:s?$t(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},q=(e,t)=>(r,s)=>t(r,s,e);let le=class{constructor(e,t,r){this._eventBus=e,this._store=r,this._handlers=new Map(t.map(s=>[s.mode,s])),this._eventBus.on(E.SelectHover,this._onHover),this._eventBus.on(E.SelectClick,this._onClick)}_currentMode=d.SelectMode.Mesh;_handlers;type=O.Select;manage(e){e!==this._currentMode&&(this._handlers.get(this._currentMode)?.rollback(),this._currentMode=e,this._store.setSelectMode(this._currentMode))}_onHover=e=>{this._handlers.get(this._currentMode)?.handle(e,x.Hover)};_onClick=e=>{this._handlers.get(this._currentMode)?.handle(e,x.Click)};dispose(){this._handlers&&this._handlers.clear(),this._eventBus.off(E.SelectHover,this._onHover),this._currentMode=d.SelectMode.Mesh,this._store.setSelectMode(this._currentMode)}};le=Ht([a.injectable(),q(0,a.inject("EventBus")),q(1,a.injectAll("ISelectHandler")),q(2,a.inject("EditorStore"))],le);const Rt=e=>(t,r,s)=>{const i=s.value;if(!i)throw new Error("usePolicy can only be applied to method");return s.value=function(...n){return e(this).check(...n),i.apply(this,n)},s};var Ft=Object.defineProperty,Wt=Object.getOwnPropertyDescriptor,We=(e,t,r,s)=>{for(var i=s>1?void 0:s?Wt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=(s?o(t,r,i):o(i))||i);return s&&i&&Ft(t,r,i),i},Y=(e,t)=>(r,s)=>t(r,s,e);let B=class{constructor(e,t,r){this._store=t,this._policy=r,this._handlers=new Map(e.map(s=>[s.mode,s])),this._unsubSelected=this._store.onSelectedObjectChange(()=>{this._handlers.get(this._currentTool)?.handle()})}_currentTool=d.ToolType.Translate;_handlers;_unsubSelected;type=O.Tool;manage(e){this._currentTool!==e&&(this._handlers.get(this._currentTool)?.rollback(),this._currentTool=e,this._store.setToolType(this._currentTool),this._handlers.get(this._currentTool)?.handle())}dispose(){this._unsubSelected?.(),this._handlers&&this._handlers.clear(),this._currentTool=d.ToolType.Translate,this._store.setToolType(this._currentTool)}};We([Rt(e=>e._policy)],B.prototype,"manage",1);B=We([a.injectable(),Y(0,a.injectAll("IToolHandler")),Y(1,a.inject("EditorStore")),Y(2,a.inject("ToolPolicy"))],B);var kt=Object.getOwnPropertyDescriptor,Gt=(e,t,r,s)=>{for(var i=s>1?void 0:s?kt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Bt=(e,t)=>(r,s)=>t(r,s,e);let he=class{_currentMode=d.SceneMode.AddFigure;_handlers;type=O.Scene;constructor(e){this._handlers=new Map(e.map(t=>[t.mode,t]))}manage(e,t){e===d.SceneMode.AddFigure?this._handlers.get(e)?.handle(t):this._handlers.get(e)?.handle(),this._currentMode=e}dispose(){this._handlers&&this._handlers.clear(),this._currentMode=d.SceneMode.AddFigure}};he=Gt([a.injectable(),Bt(0,a.injectAll("ISceneHandler"))],he);var zt=Object.getOwnPropertyDescriptor,Nt=(e,t,r,s)=>{for(var i=s>1?void 0:s?zt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Ut=(e,t)=>(r,s)=>t(r,s,e);let de=class{constructor(e){this._api=e}mode=d.DisplayMode.Wireframe;_prevWireframe=new Map;_prevColorMesh=new Map;_prevColorLines=new Map;_wireColor=new c.Color(65535);handle(){const e=this._api.getMeshes();for(const t of e){const r=Array.isArray(t.material)?t.material:[t.material];for(const s of r)this._enableWireframeOnMaterial(s);t.traverse(s=>{if(s.isLineSegments){const i=s;if(!this._prevColorLines.has(i.material)){const o=i.material;this._prevColorLines.set(o,o.color.clone())}const n=i.material;n.color.copy(this._wireColor),n.needsUpdate=!0}})}}rollback(){for(const[e,t]of this._prevWireframe)"wireframe"in e&&(e.wireframe=t),e.needsUpdate=!0;this._prevWireframe.clear();for(const[e,t]of this._prevColorMesh){const r=e;r.color?.isColor&&r.color.copy(t)}this._prevColorMesh.clear();for(const[e,t]of this._prevColorLines)e.color.copy(t);this._prevColorLines.clear()}dispose(){this.rollback()}_enableWireframeOnMaterial(e){const t=e;"wireframe"in t&&!this._prevWireframe.has(e)&&(this._prevWireframe.set(e,!!t.wireframe),t.wireframe=!0,e.needsUpdate=!0),t.color?.isColor&&(this._prevColorMesh.has(e)||this._prevColorMesh.set(e,t.color.clone()),t.color.copy(this._wireColor))}};de=Nt([a.injectable(),Ut(0,a.inject("IMeshApi"))],de);const z=16776960,N=16755200,Xt=2236962,qt=2236962;var Yt=Object.getOwnPropertyDescriptor,Zt=(e,t,r,s)=>{for(var i=s>1?void 0:s?Yt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Ee=(e,t)=>(r,s)=>t(r,s,e);let _e=class{constructor(e,t){this._api=e,this._store=t}mode=d.SelectMode.Mesh;_hoveredMesh=null;_selectedMesh=null;_hoverColor=z;_selectColor=N;_origLineColors=new WeakMap;handle(e,t){if(this._api.setRaycastMode(this.mode),t===x.Hover){if(!e){this._hoveredMesh&&this._hoveredMesh!==this._selectedMesh&&this._restoreEdgesColor(this._hoveredMesh),this._hoveredMesh=null;return}const r=e.intersection.object;this._hoveredMesh!==r&&(this._hoveredMesh&&this._hoveredMesh!==this._selectedMesh&&this._restoreEdgesColor(this._hoveredMesh),r!==this._selectedMesh&&this._paintEdges(r,this._hoverColor),this._hoveredMesh=r)}if(t===x.Click){if(!e){this._selectedMesh&&(this._restoreEdgesColor(this._selectedMesh),this._selectedMesh=null,this._store.setSelectedObject(null));return}const r=e.intersection.object;this._selectedMesh&&this._selectedMesh!==r&&this._restoreEdgesColor(this._selectedMesh),this._paintEdges(r,this._selectColor),this._selectedMesh=r,this._store.setSelectedObject(r)}}rollback(){this._hoveredMesh&&this._restoreEdgesColor(this._hoveredMesh),this._selectedMesh&&this._restoreEdgesColor(this._selectedMesh),this._hoveredMesh=this._selectedMesh=null,this._store.setSelectedObject(null)}dispose(){this.rollback()}_paintEdges(e,t){e.children.forEach(r=>{const s=r;if(s.isLineSegments&&s.material){const i=s.material;this._origLineColors.has(s)||this._origLineColors.set(s,i.color.clone()),i.color.setHex(t),i.needsUpdate=!0}})}_restoreEdgesColor(e){e.children.forEach(t=>{const r=t;if(r.isLineSegments&&r.material){const s=this._origLineColors.get(r);if(s){const i=r.material;i.color.copy(s),i.needsUpdate=!0}}})}};_e=Zt([a.injectable(),Ee(0,a.inject("IRaycastApi")),Ee(1,a.inject("EditorStore"))],_e);var Kt=Object.getOwnPropertyDescriptor,Qt=(e,t,r,s)=>{for(var i=s>1?void 0:s?Kt(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},R=(e,t)=>(r,s)=>t(r,s,e);let ue=class{constructor(e,t,r,s){this._cameraApi=e,this._sceneApi=t,this._raycastApi=r,this._store=s,this._cameraApi.enableCameraLayer(w),this._hoverFace=this._makeOverlayFace(this._hoverColor),this._selectFace=this._makeOverlayFace(this._selectColor),this._sceneApi.addObject(this._hoverFace,w),this._sceneApi.addObject(this._selectFace,w)}mode=d.SelectMode.Face;_hoverFace;_selectFace;_hovered=null;_selected=null;_hoverColor=z;_selectColor=N;_normalEps=1e-4;_planeEps=1e-4;handle(e,t){if(this._raycastApi.setRaycastMode(this.mode),t===x.Hover){if(!e){this._hoverFace.visible=!1,this._hovered=null;return}const r=e.intersection.object;if(!r?.isMesh)return;const s=r,i=e.intersection.faceIndex??-1;if(i<0)return;const n=this._collectFaceGroup(s,i);if(!n)return;this._selected&&this._same(n,this._selected)?this._hoverFace.visible=!1:(this._writeWorldFaceGroup(this._hoverFace,n),this._hoverFace.visible=!0),this._hovered=n;return}if(t===x.Click){if(!e){this._selectFace.visible=!1,this._selected=null,this._store.setSelectedObject(null);return}const r=e.intersection.object;if(!r?.isMesh)return;const s=r,i=e.intersection.faceIndex??-1;if(i<0)return;const n=this._collectFaceGroup(s,i);if(!n)return;this._writeWorldFaceGroup(this._selectFace,n),this._centerFaceProxy(this._selectFace),this._selectFace.visible=!0,this._prepareFaceMetadata(n),this._store.setSelectedObject(this._selectFace),this._selected=n,this._hovered&&this._same(this._hovered,this._selected)&&(this._hoverFace.visible=!1)}}rollback(){this._hoverFace.visible=!1,this._selectFace.visible=!1,this._resetFaceProxyTransform(this._selectFace),this._resetFaceProxyTransform(this._hoverFace),this._hovered=this._selected=null,this._store.setSelectedObject(null)}dispose(){this.rollback(),this._sceneApi.removeFromScene(this._hoverFace),this._sceneApi.removeFromScene(this._selectFace),this._hoverFace.geometry.dispose(),this._hoverFace.material.dispose(),this._selectFace.geometry.dispose(),this._selectFace.material.dispose()}_makeOverlayFace(e){const t=new c.BufferGeometry,r=new c.MeshBasicMaterial({color:e,transparent:!0,opacity:.35,depthTest:!1,depthWrite:!1,side:c.DoubleSide,polygonOffset:!0,polygonOffsetFactor:-1,polygonOffsetUnits:-1}),s=new c.Mesh(t,r);return s.renderOrder=1e3,s.layers.set(w),s.visible=!1,s.raycast=()=>{},s}_collectFaceGroup(e,t){const r=e.geometry,s=r.getAttribute("position");if(!s)return null;const i=r.index;if(!i){const b=t*3,A=t*3+1,j=t*3+2;return{mesh:e,faceIndex:t,triangleIndices:[t],vertexIndices:[b,A,j],proxyVertexMap:[b,A,j]}}const n=Math.floor(i.count/3);if(t<0||t>=n)return null;const o=this._buildTriangleAdjacency(i,s),[l,_,u]=this._getTriangleIndices(i,t),p=this._readVertex(s,l),f=this._readVertex(s,_),g=this._readVertex(s,u),v=new c.Vector3().subVectors(f,p).cross(new c.Vector3().subVectors(g,p)).normalize(),m=new c.Plane().setFromNormalAndCoplanarPoint(v,p),M=new Set,y=[],C=[t];for(;C.length>0;){const b=C.pop();if(M.has(b))continue;M.add(b);const[A,j,P]=this._getTriangleIndices(i,b),S=this._readVertex(s,A),xe=this._readVertex(s,j),je=this._readVertex(s,P),Be=new c.Vector3().subVectors(xe,S).cross(new c.Vector3().subVectors(je,S)).normalize(),ze=Math.abs(Be.dot(v))>=1-this._normalEps,Ne=Math.abs(m.distanceToPoint(S))<this._planeEps&&Math.abs(m.distanceToPoint(xe))<this._planeEps&&Math.abs(m.distanceToPoint(je))<this._planeEps;if(!ze||!Ne)continue;y.push(b);const Ce=o.get(b);if(Ce)for(const Te of Ce)M.has(Te)||C.push(Te)}y.sort((b,A)=>b-A);const T=new Set,I=[];for(const b of y){const[A,j,P]=this._getTriangleIndices(i,b);T.add(A),T.add(j),T.add(P),I.push(A,j,P)}return{mesh:e,faceIndex:t,triangleIndices:y,vertexIndices:Array.from(T),proxyVertexMap:I}}_writeWorldFaceGroup(e,t){const r=t.mesh.geometry,s=r.getAttribute("position"),i=r.index,n=new Float32Array(t.triangleIndices.length*9);let o=0;for(const _ of t.triangleIndices){let u,p,f;i?[u,p,f]=this._getTriangleIndices(i,_):(u=_*3,p=_*3+1,f=_*3+2);const g=this._readVertex(s,u).applyMatrix4(t.mesh.matrixWorld),v=this._readVertex(s,p).applyMatrix4(t.mesh.matrixWorld),m=this._readVertex(s,f).applyMatrix4(t.mesh.matrixWorld);n[o++]=g.x,n[o++]=g.y,n[o++]=g.z,n[o++]=v.x,n[o++]=v.y,n[o++]=v.z,n[o++]=m.x,n[o++]=m.y,n[o++]=m.z}const l=e.geometry;l.setAttribute("position",new c.BufferAttribute(n,3)),l.setIndex(null),l.computeVertexNormals(),l.computeBoundingBox(),l.computeBoundingSphere()}_same(e,t){return!!e&&!!t&&e.mesh===t.mesh&&e.triangleIndices.length===t.triangleIndices.length&&e.triangleIndices.every((r,s)=>r===t.triangleIndices[s])}_prepareFaceMetadata(e){const{vertexIndexGroups:t,proxyVertexMap:r,lines:s,lineVertexIndexGroups:i}=this._buildFaceVertexGroups(e);this._selectFace.userData.faceInfo={mesh:e.mesh,faceIndex:e.faceIndex,triangleIndices:e.triangleIndices,vertexIndices:e.vertexIndices,vertexIndexGroups:t,proxyVertexMap:r,lines:s,lineVertexIndexGroups:i}}_centerFaceProxy(e){const t=e.geometry,r=t.getAttribute("position");if(!r||r.count===0)return;const s=new c.Vector3;for(let i=0;i<r.count;i++)s.x+=r.getX(i),s.y+=r.getY(i),s.z+=r.getZ(i);s.multiplyScalar(1/r.count);for(let i=0;i<r.count;i++)r.setXYZ(i,r.getX(i)-s.x,r.getY(i)-s.y,r.getZ(i)-s.z);r.needsUpdate=!0,e.position.copy(s),e.quaternion.identity(),e.scale.set(1,1,1),e.updateMatrixWorld(!0),t.computeBoundingBox(),t.computeBoundingSphere()}_pushEdge(e,t,r,s){const i=t<r?`${t}_${r}`:`${r}_${t}`,n=e.get(i);n?n.push(s):e.set(i,[s])}_buildTriangleAdjacency(e,t){const r=Math.floor(e.count/3),s=new Map,i=this._buildWeldMap(e,t);for(let l=0;l<r;l++){const[_,u,p]=this._getTriangleIndices(e,l),f=i.get(_),g=i.get(u),v=i.get(p);this._pushEdge(s,f,g,l),this._pushEdge(s,g,v,l),this._pushEdge(s,v,f,l)}const n=new Map;for(let l=0;l<r;l++)n.set(l,new Set);for(const l of s.values())if(!(l.length<2))for(let _=0;_<l.length;_++)for(let u=0;u<l.length;u++)_!==u&&n.get(l[_])?.add(l[u]);const o=new Map;for(const[l,_]of n)o.set(l,Array.from(_));return o}_getTriangleIndices(e,t){return[e.getX(t*3),e.getX(t*3+1),e.getX(t*3+2)]}_readVertex(e,t){return new c.Vector3(e.getX(t),e.getY(t),e.getZ(t))}_vertexKey(e,t,r=1e-6){const s=Math.round(e.getX(t)/r),i=Math.round(e.getY(t)/r),n=Math.round(e.getZ(t)/r);return`${s}_${i}_${n}`}_buildWeldMap(e,t){const r=new Map,s=new Map;let i=0;for(let n=0;n<e.count;n++){const o=e.getX(n);if(s.has(o))continue;const l=this._vertexKey(t,o);let _=r.get(l);_==null&&(_=i++,r.set(l,_)),s.set(o,_)}return s}_resetFaceProxyTransform(e){e.position.set(0,0,0),e.quaternion.identity(),e.scale.set(1,1,1),e.updateMatrixWorld(!0)}_buildFaceVertexGroups(e){const r=e.mesh.geometry.getAttribute("position"),s=1e-6,i=new c.Vector3,n=e.vertexIndices,o=[],l=new Map;for(const g of n){const v=this._readVertex(r,g),m=[];for(let y=0;y<r.count;y++)i.fromBufferAttribute(r,y),i.distanceToSquared(v)<s*s&&m.push(y);const M=o.length;o.push(m);for(const y of m)l.set(y,M)}const _=[];for(const g of e.proxyVertexMap){const v=l.get(g);_.push(v??-1)}const u=this._findChildLines(e.mesh),p=u?this._buildLineVertexGroups(e,u):void 0,f={vertexIndexGroups:o,proxyVertexMap:_};return u&&(f.lines=u),p&&(f.lineVertexIndexGroups=p),f}_findChildLines(e){for(const t of e.children)if(t.isLineSegments)return t;return null}_buildLineVertexGroups(e,t){const s=t.geometry.getAttribute("position"),n=e.mesh.geometry.getAttribute("position"),o=1e-6,l=new c.Vector3,_=t.matrixWorld,u=e.mesh.matrixWorld,p=[];for(const f of e.vertexIndices){const g=this._readVertex(n,f).applyMatrix4(u),v=[];for(let m=0;m<s.count;m++)l.fromBufferAttribute(s,m).applyMatrix4(_),l.distanceToSquared(g)<o*o&&v.push(m);p.push(v)}return p}};ue=Qt([a.injectable(),R(0,a.inject("ICameraApi")),R(1,a.inject("ISceneApi")),R(2,a.inject("IRaycastApi")),R(3,a.inject("EditorStore"))],ue);const Jt={[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.")}},es=new c.MeshStandardMaterial({color:12566463,metalness:0,roughness:.6}),ts=8,ss=e=>!!e&&e.isMesh,ke=e=>{let t=e;for(;t;){if(t.isMesh)return t;t=t.parent}return null},rs=e=>{const t=new c.BufferGeometry;t.setAttribute("position",e.getAttribute("position")),t.computeBoundingSphere(),t.computeBoundingBox();const r=new c.PointsMaterial({color:qt,size:6,sizeAttenuation:!1,depthTest:!1,depthWrite:!1,transparent:!0,opacity:.9}),s=new c.Points(t,r);return s.layers.set(Fe),s.renderOrder=1e3,s.visible=!1,s},is=e=>{const t=new c.EdgesGeometry(e),r=new c.LineSegments(t,new c.LineBasicMaterial({color:Xt,linewidth:1}));return r.layers.set(Re),r},ns=e=>{const t={x:e.position.x,y:e.position.y,z:e.position.z},r={x:e.rotation.x,y:e.rotation.y,z:e.rotation.z},s={x:e.scale.x,y:e.scale.y,z:e.scale.z},i=new c.Box3().setFromObject(e),n=new c.Vector3;i.getSize(n);const o={x:n.x,y:n.y,z:n.z};return{position:t,rotation:r,scale:s,size:o}};var os=Object.getOwnPropertyDescriptor,as=(e,t,r,s)=>{for(var i=s>1?void 0:s?os(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},F=(e,t)=>(r,s)=>t(r,s,e);let pe=class{constructor(e,t,r,s){this._cameraApi=e,this._sceneApi=t,this._raycastApi=r,this._store=s,this._cameraApi.enableCameraLayer(w),this._hoverVertex=this._makeOverlayVertex(this._hoverColor),this._selectVertex=this._makeOverlayVertex(this._selectColor),this._sceneApi.addObject(this._hoverVertex,w),this._sceneApi.addObject(this._selectVertex,w)}mode=d.SelectMode.Vertex;_hovered=null;_selected=null;_hoverVertex;_selectVertex;_hoverColor=z;_selectColor=N;handle(e,t){if(this._raycastApi.setRaycastMode(this.mode),t===x.Hover){if(!e){this._hoverVertex.visible=!1,this._hovered=null;return}const r=e.intersection.object;if(!r?.isPoints)return;const s=r,i=e.intersection.index??-1;if(i<0)return;this._selected&&this._same({points:s,index:i},this._selected)?this._hoverVertex.visible=!1:(this._writeWorldVertex(this._hoverVertex,s,i),this._hoverVertex.visible=!0);return}if(t===x.Click){if(!e){this._selectVertex.visible=!1,this._selected=null,this._store.setSelectedObject(null);return}const r=e.intersection.object;if(!r?.isPoints)return;const s=r,i=e.intersection.index??-1;if(i<0)return;this._writeWorldVertex(this._selectVertex,s,i),this._centerVertexOnPoint(this._selectVertex,s,i),this._selectVertex.visible=!0,this._prepareVertexMetadata(s,i),this._store.setSelectedObject(this._selectVertex),this._selected={points:s,index:i},this._hovered&&this._same(this._hovered,this._selected)&&(this._hoverVertex.visible=!1);return}}rollback(){this._hoverVertex.visible=!1,this._selectVertex.visible=!1,this._hovered=this._selected=null,this._store.setSelectedObject(null)}dispose(){this.rollback(),this._sceneApi.removeFromScene(this._hoverVertex),this._sceneApi.removeFromScene(this._selectVertex),this._hoverVertex.geometry.dispose(),this._hoverVertex.material.dispose(),this._selectVertex.geometry.dispose(),this._selectVertex.material.dispose()}_makeOverlayVertex(e,t=ts){const r=new c.BufferGeometry;r.setAttribute("position",new c.Float32BufferAttribute([0,0,0],3));const s=new c.PointsMaterial({color:e,size:t,sizeAttenuation:!1,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1}),i=new c.Points(r,s);return i.renderOrder=1e3,i.raycast=()=>{},i.layers.set(w),i.visible=!1,i}_writeWorldVertex(e,t,r){const s=t.geometry.getAttribute("position"),i=new c.Vector3(s.getX(r),s.getY(r),s.getZ(r)).applyMatrix4(t.matrixWorld),n=e.geometry.getAttribute("position");n.setXYZ(0,i.x,i.y,i.z),n.needsUpdate=!0}_same(e,t){return!!e&&!!t&&e.points===t.points&&e.index===t.index}_prepareVertexMetadata(e,t){const r=ke(e);if(!r)return;const s=e.geometry.getAttribute("position"),i=new c.Vector3(s.getX(t),s.getY(t),s.getZ(t)).applyMatrix4(e.matrixWorld),n=new c.Matrix4().copy(r.matrixWorld).invert(),o=i.clone().applyMatrix4(n),_=r.geometry.getAttribute("position"),u=1e-6,p=u*u,f=new c.Vector3,g=[];for(let M=0;M<_.count;M++)f.fromBufferAttribute(_,M),f.distanceToSquared(o)<p&&g.push(M);const v=r.children.find(M=>M?.isLineSegments);let m=[];if(v){const M=new c.Matrix4().copy(v.matrixWorld).invert(),y=i.clone().applyMatrix4(M),C=v.geometry.getAttribute("position"),T=new c.Vector3;for(let I=0;I<C.count;I++)T.fromBufferAttribute(C,I),T.distanceToSquared(y)<p&&m.push(I)}this._selectVertex.userData.vertexInfo={points:e,index:t,mesh:r,vertexIndices:g,lines:v??null,edgeVertexIndices:m}}_centerVertexOnPoint(e,t,r){const s=t.geometry.getAttribute("position"),i=new c.Vector3(s.getX(r),s.getY(r),s.getZ(r)).applyMatrix4(t.matrixWorld);e.position.copy(i);const n=e.geometry;let o=n.getAttribute("position");(!o||o.count<1)&&(n.setAttribute("position",new c.BufferAttribute(new Float32Array(3),3)),o=n.getAttribute("position")),o.setXYZ(0,0,0,0),o.needsUpdate=!0,e.quaternion.identity(),e.scale.set(1,1,1),e.updateMatrixWorld(!0)}};pe=as([a.injectable(),F(0,a.inject("ICameraApi")),F(1,a.inject("ISceneApi")),F(2,a.inject("IRaycastApi")),F(3,a.inject("EditorStore"))],pe);class Oe{constructor(t,r){this.api=t,this.store=r,this._unsubscribeTransform=this.api.onTransformChange(()=>{this.store.getSelectedObject()&&this.store.notifySelectedTransformChange?.()})}_unsubscribeTransform;handle(){const t=this.store.getSelectedObject();this.api.setTransformMode(this.mode),t?this.api.attachTransform(t):this.api.detachTransform()}rollback(){this.api.detachTransform()}dispose(){this.rollback(),this._unsubscribeTransform&&this._unsubscribeTransform()}}var cs=Object.getOwnPropertyDescriptor,ls=(e,t,r,s)=>{for(var i=s>1?void 0:s?cs(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Pe=(e,t)=>(r,s)=>t(r,s,e);let me=class extends Oe{mode=d.ToolType.Translate;constructor(e,t){super(e,t)}};me=ls([a.injectable(),Pe(0,a.inject("ITransformApi")),Pe(1,a.inject("EditorStore"))],me);var hs=Object.getOwnPropertyDescriptor,ds=(e,t,r,s)=>{for(var i=s>1?void 0:s?hs(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Le=(e,t)=>(r,s)=>t(r,s,e);let ge=class extends Oe{mode=d.ToolType.Scale;constructor(e,t){super(e,t)}};ge=ds([a.injectable(),Le(0,a.inject("ITransformApi")),Le(1,a.inject("EditorStore"))],ge);var _s=Object.getOwnPropertyDescriptor,us=(e,t,r,s)=>{for(var i=s>1?void 0:s?_s(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},De=(e,t)=>(r,s)=>t(r,s,e);let ve=class extends Oe{mode=d.ToolType.Rotate;constructor(e,t){super(e,t)}};ve=us([a.injectable(),De(0,a.inject("ITransformApi")),De(1,a.inject("EditorStore"))],ve);var ps=Object.getOwnPropertyDescriptor,ms=(e,t,r,s)=>{for(var i=s>1?void 0:s?ps(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},W=(e,t)=>(r,s)=>t(r,s,e);let fe=class{constructor(e,t,r,s){this._sceneApi=e,this._cameraApi=t,this._raycastApi=r,this._store=s,this._cameraApi.enableCameraLayer(w),this._hoverLine=this._makeOverlayLine(this._hoverColor),this._selectLine=this._makeOverlayLine(this._selectColor),this._sceneApi.addObject(this._hoverLine,w),this._sceneApi.addObject(this._selectLine,w)}mode=d.SelectMode.Edge;_hoverLine;_selectLine;_hovered=null;_selected=null;_hoverColor=z;_selectColor=N;handle(e,t){if(this._raycastApi.setRaycastMode(this.mode),t===x.Hover){if(!e){this._hoverLine.visible=!1,this._hovered=null;return}const r=e.intersection.object;if(!r?.isLineSegments)return;const s=r,i=Math.floor((e.intersection.index??-1)/2);if(i<0)return;this._selected&&this._same({lines:s,seg:i},this._selected)?this._hoverLine.visible=!1:(this._writeWorldSegment(this._hoverLine,s,i),this._hoverLine.visible=!0),this._hovered={lines:s,seg:i};return}if(t===x.Click){if(!e){this._selectLine.visible=!1,this._selected=null,this._store.setSelectedObject(null);return}const r=e.intersection.object;if(!r?.isLineSegments)return;const s=r,i=Math.floor((e.intersection.index??-1)/2);if(i<0)return;this._writeWorldSegment(this._selectLine,s,i),this._centerAndOrientLineOnSegment(this._selectLine,s,i),this._selectLine.visible=!0,this._prepareEdgeMetadata(s,i),this._store.setSelectedObject(this._selectLine),this._selected={lines:s,seg:i},this._hovered&&this._same(this._hovered,this._selected)&&(this._hoverLine.visible=!1)}}rollback(){this._hoverLine.visible=!1,this._selectLine.visible=!1,this._hovered=this._selected=null,this._store.setSelectedObject(null)}dispose(){this.rollback(),this._sceneApi.removeFromScene(this._hoverLine),this._sceneApi.removeFromScene(this._selectLine),this._hoverLine.geometry.dispose(),this._hoverLine.material.dispose(),this._selectLine.geometry.dispose(),this._selectLine.material.dispose()}_makeOverlayLine(e){const t=new c.BufferGeometry;t.setAttribute("position",new c.Float32BufferAttribute(6,3));const r=new c.LineBasicMaterial({color:e,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1}),s=new c.Line(t,r);return s.renderOrder=1e3,s.raycast=()=>{},s.layers.set(w),s.visible=!1,s}_writeWorldSegment(e,t,r){const s=t.geometry.getAttribute("position"),i=r*2,n=i+1,o=new c.Vector3(s.getX(i),s.getY(i),s.getZ(i)).applyMatrix4(t.matrixWorld),l=new c.Vector3(s.getX(n),s.getY(n),s.getZ(n)).applyMatrix4(t.matrixWorld),_=e.geometry.getAttribute("position");_.setXYZ(0,o.x,o.y,o.z),_.setXYZ(1,l.x,l.y,l.z),_.needsUpdate=!0}_same(e,t){return!!e&&!!t&&e.lines===t.lines&&e.seg===t.seg}_centerAndOrientLineOnSegment(e,t,r){const s=t.geometry.getAttribute("position"),i=r*2,n=i+1,o=new c.Vector3(s.getX(i),s.getY(i),s.getZ(i)).applyMatrix4(t.matrixWorld),l=new c.Vector3(s.getX(n),s.getY(n),s.getZ(n)).applyMatrix4(t.matrixWorld),_=new c.Vector3().subVectors(l,o),u=_.length();if(!isFinite(u)||u===0)return;const p=new c.Vector3().addVectors(o,l).multiplyScalar(.5);e.position.copy(p);const f=e.geometry;let g=f.getAttribute("position");(!g||g.count<2)&&(f.setAttribute("position",new c.BufferAttribute(new Float32Array(6),3)),g=f.getAttribute("position")),g.setXYZ(0,-u/2,0,0),g.setXYZ(1,u/2,0,0),g.needsUpdate=!0,_.normalize();const v=new c.Quaternion().setFromUnitVectors(new c.Vector3(1,0,0),_);e.quaternion.copy(v),e.updateMatrixWorld(!0)}_prepareEdgeMetadata(e,t){const r=ke(e);if(!r)return;const s=e.geometry.getAttribute("position"),i=t*2,n=i+1,o=new c.Vector3(s.getX(i),s.getY(i),s.getZ(i)).applyMatrix4(e.matrixWorld),l=new c.Vector3(s.getX(n),s.getY(n),s.getZ(n)).applyMatrix4(e.matrixWorld),_=new c.Matrix4().copy(r.matrixWorld).invert(),u=o.clone().applyMatrix4(_),p=l.clone().applyMatrix4(_),g=r.geometry.getAttribute("position"),v=new c.Vector3,m=1e-6,M=[],y=[];for(let S=0;S<g.count;S++)v.fromBufferAttribute(g,S),v.distanceToSquared(u)<m*m?M.push(S):v.distanceToSquared(p)<m*m&&y.push(S);const C=new c.Matrix4().copy(e.matrixWorld).invert(),T=o.clone().applyMatrix4(C),I=l.clone().applyMatrix4(C),b=e.geometry.getAttribute("position"),A=new c.Vector3,j=[],P=[];for(let S=0;S<b.count;S++)A.fromBufferAttribute(b,S),A.distanceToSquared(T)<m*m?j.push(S):A.distanceToSquared(I)<m*m&&P.push(S);this._selectLine.userData.edgeInfo={lines:e,seg:t,mesh:r,aIndices:M,bIndices:y,aEdgeIndices:j,bEdgeIndices:P}}};fe=ms([a.injectable(),W(0,a.inject("ISceneApi")),W(1,a.inject("ICameraApi")),W(2,a.inject("IRaycastApi")),W(3,a.inject("EditorStore"))],fe);var gs=Object.getOwnPropertyDescriptor,vs=(e,t,r,s)=>{for(var i=s>1?void 0:s?gs(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},fs=(e,t)=>(r,s)=>t(r,s,e);let Me=class{constructor(e){this._api=e}mode=d.SceneMode.AddFigure;_lastAddedMesh=null;handle(e){const t=Jt[e](),r=t.getAttribute("position");r&&r.setUsage&&r.setUsage(c.DynamicDrawUsage);const s=new c.Mesh(t,es);s.layers.enable($);const i=t.index?t.toNonIndexed():t,n=is(i);n.layers.enable($),s.add(n);const o=rs(i);o.layers.enable($),s.add(o),this._api.addMesh(s),this._lastAddedMesh=s}rollback(){this._lastAddedMesh!==null&&(this._api.removeMesh(this._lastAddedMesh),this._lastAddedMesh=null)}dispose(){this._lastAddedMesh=null}};Me=vs([a.injectable(),fs(0,a.inject("IMeshApi"))],Me);var Ms=Object.getOwnPropertyDescriptor,ys=(e,t,r,s)=>{for(var i=s>1?void 0:s?Ms(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Ve=(e,t)=>(r,s)=>t(r,s,e);let ye=class{constructor(e,t){this._api=e,this._store=t}mode=d.SceneMode.DeleteFigure;_lastDeletedMesh=null;handle(){const e=this._store.getSelectedObject();ss(e)&&(this._api.removeMesh(e),this._store.setSelectedObject(null),this._lastDeletedMesh=e)}rollback(){this._lastDeletedMesh&&(this._api.addMesh(this._lastDeletedMesh),this._lastDeletedMesh=null)}dispose(){this._lastDeletedMesh=null}};ye=ys([a.injectable(),Ve(0,a.inject("IMeshApi")),Ve(1,a.inject("EditorStore"))],ye);var bs=Object.getOwnPropertyDescriptor,Ss=(e,t,r,s)=>{for(var i=s>1?void 0:s?bs(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},k=(e,t)=>(r,s)=>t(r,s,e);exports.EditorHub=class{constructor(t,r,s,i){this._renderer=t,this._mediator=r,this._store=s,this._controller=i,this.setSelectMode(d.SelectMode.Mesh),this.setToolMode(d.ToolType.Translate)}setDisplayMode(t){return this._mediator.send({type:O.Display,payload:[t]})}setSceneMode(t){return this._mediator.send({type:O.Scene,payload:[t]})}setSelectMode(t){return this._mediator.send({type:O.Select,payload:[t]})}setToolMode(t){return this._mediator.send({type:O.Tool,payload:[t]})}addFigure(t,r){return this._mediator.send({type:O.Scene,payload:[t,r]})}resizeRenderer(){this._renderer.resize()}start(){this._controller.start()}stop(){this._controller.stop()}getSelectionStats(){return this._store.getSelectionStats()}onSelectionStatsChange(t){const r=this._store.onSelectedObjectChange(()=>{t()}),s=this._store.onSelectedTransformChange(()=>{t()});return()=>{r(),s()}}dispose(){this._mediator.dispose()}};exports.EditorHub=Ss([a.injectable(),k(0,a.inject("Renderer")),k(1,a.inject("IMediator")),k(2,a.inject("EditorStore")),k(3,a.inject("IController"))],exports.EditorHub);var As=Object.getOwnPropertyDescriptor,ws=(e,t,r,s)=>{for(var i=s>1?void 0:s?As(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i};exports.EventBus=class{_emitter;constructor(){this._emitter=new Xe.EventEmitter}emit(t,r){this._emitter.emit(t,r)}on(t,r){this._emitter.on(t,r)}off(t,r){this._emitter.off(t,r)}};exports.EventBus=ws([a.injectable()],exports.EventBus);var Os=Object.getOwnPropertyDescriptor,xs=(e,t,r,s)=>{for(var i=s>1?void 0:s?Os(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i};let be=class{_selectMode=d.SelectMode.Mesh;_toolType=d.ToolType.Translate;_displayMode=d.DisplayMode.Plane;_selectedObject=null;_selectedListeners=new Set;_transformListeners=new Set;constructor(){qe.makeAutoObservable(this,{},{autoBind:!0})}getSelectMode(){return this._selectMode}getToolType(){return this._toolType}getDisplayMode(){return this._displayMode}setSelectMode(e){this._selectMode=e}setToolType(e){this._toolType=e}setDisplayMode(e){this._displayMode=e}getSelectedObject(){return this._selectedObject}getSelectionStats(){const e=this._selectedObject;return e?ns(e):null}setSelectedObject(e){if(this._selectedObject!==e){this._selectedObject=e;for(const t of this._selectedListeners)t(this._selectedObject)}}onSelectedObjectChange(e){return this._selectedListeners.add(e),()=>this._selectedListeners.delete(e)}onSelectedTransformChange(e){return this._transformListeners.add(e),()=>this._transformListeners.delete(e)}notifySelectedTransformChange(){for(const e of this._transformListeners)e()}};be=xs([a.injectable()],be);var D=(e=>(e.ToolNotAllowed="TOOL_NOT_ALLOWED",e.Success="SUCCESS",e.NoChange="NO_CHANGE",e.Error="ERROR",e))(D||{});class Ge extends Error{constructor(t,r,s,i){super(r),this.type=t,this.code=s,this.meta=i,this.name=this._name}_name="PolicyException"}var js=Object.getOwnPropertyDescriptor,Cs=(e,t,r,s)=>{for(var i=s>1?void 0:s?js(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Ts=(e,t)=>(r,s)=>t(r,s,e);let Se=class{constructor(e){this._store=e}check(e){const t=this._store.getSelectMode();if(!d.DEFAULT_TOOL_RULES[t].includes(e))throw new Ge(D.ToolNotAllowed,`Tool ${e} is not allowed`,"TOOL_NOT_ALLOWED")}};Se=Cs([a.injectable(),Ts(0,a.inject("EditorStore"))],Se);var Is=Object.getOwnPropertyDescriptor,Es=(e,t,r,s)=>{for(var i=s>1?void 0:s?Is(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i};let Ae=class{handle(e){try{return e()}catch(t){return t instanceof Ge?{type:t.type,message:t.message,code:t.code,blocked:!0}:t instanceof Error?{type:D.Error,message:t.message,code:"UNHANDLED_EXCEPTION",blocked:!0}:{type:D.Error,message:"Unknown exception",code:"UNKNOWN_EXCEPTION",blocked:!0}}}};Ae=Es([a.injectable()],Ae);var Ps=Object.getOwnPropertyDescriptor,Ls=(e,t,r,s)=>{for(var i=s>1?void 0:s?Ps(t,r):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},$e=(e,t)=>(r,s)=>t(r,s,e);let we=class{constructor(e,t){this._middlewares=t,this._managers=new Map(e.map(r=>[r.type,r]))}_managers;send(e){const t=this._managers.get(e.type);if(!t)return{type:D.Error,message:`Manager for feature "${String(e.type)}" not found`,code:"MANAGER_NOT_FOUND",blocked:!0};const r=()=>(t.manage(...e.payload),null);return this._middlewares.reduceRight((i,n)=>()=>n.handle(i),r)()}dispose(){this._managers&&this._managers.clear()}};we=Ls([a.injectable(),$e(0,a.injectAll("IManager")),$e(1,a.injectAll("IMiddleware"))],we);let He=!1;const h=a.container.createChildContainer();function Ds(e){return He||(h.registerInstance("Canvas",e),h.registerSingleton("EventBus",exports.EventBus),h.registerSingleton("IController",Z),h.registerSingleton("Renderer",exports.Renderer),h.register("IRenderable",{useToken:"Renderer"}),h.register("IRendererAccess",{useToken:"Renderer"}),h.register("IRendererCameraAccess",{useToken:"Renderer"}),h.register("IRendererDomAccess",{useToken:"Renderer"}),h.register("IRendererSceneAccess",{useToken:"Renderer"}),h.registerSingleton("ToolPolicy",Se),h.registerSingleton("IMeshApi",K),h.registerSingleton("IControlsStateApi",re),h.registerSingleton("IRaycastApi",Q),h.registerSingleton("ITransformApi",J),h.registerSingleton("ICameraApi",ee),h.registerSingleton("IDomApi",te),h.registerSingleton("ISceneApi",se),h.registerSingleton("ControlsModule",ie),h.registerSingleton("GizmoModule",ne),h.registerSingleton("RaycastModule",oe),h.registerSingleton("SceneModule",ae),h.register("IUpdatableModule",{useToken:"ControlsModule"}),h.register("IRenderableModule",{useToken:"GizmoModule"}),h.register("IRuntimeModule",{useToken:"RaycastModule"}),h.register("IRuntimeModule",{useToken:"SceneModule"}),h.registerSingleton("IDisplayHandler",de),h.registerSingleton("ISelectHandler",_e),h.registerSingleton("ISelectHandler",ue),h.registerSingleton("ISelectHandler",fe),h.registerSingleton("ISelectHandler",pe),h.registerSingleton("IToolHandler",me),h.registerSingleton("IToolHandler",ge),h.registerSingleton("IToolHandler",ve),h.registerSingleton("ISceneHandler",Me),h.registerSingleton("ISceneHandler",ye),h.registerSingleton("DisplayManager",ce),h.register("IDisplayManager",{useToken:"DisplayManager"}),h.register("IManager",{useToken:"DisplayManager"}),h.registerSingleton("SelectManager",le),h.register("ISelectManager",{useToken:"SelectManager"}),h.register("IManager",{useToken:"SelectManager"}),h.registerSingleton("ToolManager",B),h.register("IToolManager",{useToken:"ToolManager"}),h.register("IManager",{useToken:"ToolManager"}),h.registerSingleton("SceneManager",he),h.register("ISceneManager",{useToken:"SceneManager"}),h.register("IManager",{useToken:"SceneManager"}),h.registerSingleton("IMiddleware",Ae),h.registerSingleton("IMediator",we),h.registerSingleton("EditorHub",exports.EditorHub),h.registerSingleton("EditorStore",be),He=!0),h}let L=null;const Vs=e=>(L||(L=Ds(e)),L.resolve("EditorHub")),$s=()=>{if(!L)throw new Error("EditorHub is not initialized. Call createAppHub(canvas) first.");return L.resolve("EditorHub")};exports.EventTopics=E;exports.FeatureType=O;exports.ObjLoader=Je;exports.ResponseType=D;exports.createAppHub=Vs;exports.getAppHub=$s;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("reflect-metadata");const y=require("three"),a=require("tsyringe"),d=require("@planara/types"),J=require("@planara/three"),At=require("events"),ye=require("mobx");function jt(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const s in e)if(s!=="default"){const r=Object.getOwnPropertyDescriptor(e,s);Object.defineProperty(t,s,r.get?r:{enumerable:!0,get:()=>e[s]})}}return t.default=e,Object.freeze(t)}const c=jt(y),Ot=/^[og]\s*(.+)?/,Ct=/^mtllib /,It=/^usemtl /,Pt=/^usemap /,Ue=/\s+/,Ne=new y.Vector3,pe=new y.Vector3,Xe=new y.Vector3,qe=new y.Vector3,L=new y.Vector3,N=new y.Color;function Tt(){const e={objects:[],object:{},vertices:[],normals:[],colors:[],uvs:[],materials:{},materialLibraries:[],startObject:function(t,s){if(this.object&&this.object.fromDeclaration===!1){this.object.name=t,this.object.fromDeclaration=s!==!1;return}const r=this.object&&typeof this.object.currentMaterial=="function"?this.object.currentMaterial():void 0;if(this.object&&typeof this.object._finalize=="function"&&this.object._finalize(!0),this.object={name:t||"",fromDeclaration:s!==!1,geometry:{vertices:[],normals:[],colors:[],uvs:[],hasUVIndices:!1},materials:[],smooth:!0,startMaterial:function(i,n){const o=this._finalize(!1);o&&(o.inherited||o.groupCount<=0)&&this.materials.splice(o.index,1);const h={index:this.materials.length,name:i||"",mtllib:Array.isArray(n)&&n.length>0?n[n.length-1]:"",smooth:o!==void 0?o.smooth:this.smooth,groupStart:o!==void 0?o.groupEnd:0,groupEnd:-1,groupCount:-1,inherited:!1,clone:function(p){const _={index:typeof p=="number"?p:this.index,name:this.name,mtllib:this.mtllib,smooth:this.smooth,groupStart:0,groupEnd:-1,groupCount:-1,inherited:!1};return _.clone=this.clone.bind(_),_}};return this.materials.push(h),h},currentMaterial:function(){if(this.materials.length>0)return this.materials[this.materials.length-1]},_finalize:function(i){const n=this.currentMaterial();if(n&&n.groupEnd===-1&&(n.groupEnd=this.geometry.vertices.length/3,n.groupCount=n.groupEnd-n.groupStart,n.inherited=!1),i&&this.materials.length>1)for(let o=this.materials.length-1;o>=0;o--)this.materials[o].groupCount<=0&&this.materials.splice(o,1);return i&&this.materials.length===0&&this.materials.push({name:"",smooth:this.smooth}),n}},r&&r.name&&typeof r.clone=="function"){const i=r.clone(0);i.inherited=!0,this.object.materials.push(i)}this.objects.push(this.object)},finalize:function(){this.object&&typeof this.object._finalize=="function"&&this.object._finalize(!0)},parseVertexIndex:function(t,s){const r=parseInt(t,10);return(r>=0?r-1:r+s/3)*3},parseNormalIndex:function(t,s){const r=parseInt(t,10);return(r>=0?r-1:r+s/3)*3},parseUVIndex:function(t,s){const r=parseInt(t,10);return(r>=0?r-1:r+s/2)*2},addVertex:function(t,s,r){const i=this.vertices,n=this.object.geometry.vertices;n.push(i[t+0],i[t+1],i[t+2]),n.push(i[s+0],i[s+1],i[s+2]),n.push(i[r+0],i[r+1],i[r+2])},addVertexPoint:function(t){const s=this.vertices;this.object.geometry.vertices.push(s[t+0],s[t+1],s[t+2])},addVertexLine:function(t){const s=this.vertices;this.object.geometry.vertices.push(s[t+0],s[t+1],s[t+2])},addNormal:function(t,s,r){const i=this.normals,n=this.object.geometry.normals;n.push(i[t+0],i[t+1],i[t+2]),n.push(i[s+0],i[s+1],i[s+2]),n.push(i[r+0],i[r+1],i[r+2])},addFaceNormal:function(t,s,r){const i=this.vertices,n=this.object.geometry.normals;Ne.fromArray(i,t),pe.fromArray(i,s),Xe.fromArray(i,r),L.subVectors(Xe,pe),qe.subVectors(Ne,pe),L.cross(qe),L.normalize(),n.push(L.x,L.y,L.z),n.push(L.x,L.y,L.z),n.push(L.x,L.y,L.z)},addColor:function(t,s,r){const i=this.colors,n=this.object.geometry.colors;i[t]!==void 0&&n.push(i[t+0],i[t+1],i[t+2]),i[s]!==void 0&&n.push(i[s+0],i[s+1],i[s+2]),i[r]!==void 0&&n.push(i[r+0],i[r+1],i[r+2])},addUV:function(t,s,r){const i=this.uvs,n=this.object.geometry.uvs;n.push(i[t+0],i[t+1]),n.push(i[s+0],i[s+1]),n.push(i[r+0],i[r+1])},addDefaultUV:function(){const t=this.object.geometry.uvs;t.push(0,0),t.push(0,0),t.push(0,0)},addUVLine:function(t){const s=this.uvs;this.object.geometry.uvs.push(s[t+0],s[t+1])},addFace:function(t,s,r,i,n,o,h,p,_){const g=this.vertices.length;let m=this.parseVertexIndex(t,g),f=this.parseVertexIndex(s,g),v=this.parseVertexIndex(r,g);if(this.addVertex(m,f,v),this.addColor(m,f,v),h!==void 0&&h!==""){const u=this.normals.length;m=this.parseNormalIndex(h,u),f=this.parseNormalIndex(p,u),v=this.parseNormalIndex(_,u),this.addNormal(m,f,v)}else this.addFaceNormal(m,f,v);if(i!==void 0&&i!==""){const u=this.uvs.length;m=this.parseUVIndex(i,u),f=this.parseUVIndex(n,u),v=this.parseUVIndex(o,u),this.addUV(m,f,v),this.object.geometry.hasUVIndices=!0}else this.addDefaultUV()},addPointGeometry:function(t){this.object.geometry.type="Points";const s=this.vertices.length;for(let r=0,i=t.length;r<i;r++){const n=this.parseVertexIndex(t[r],s);this.addVertexPoint(n),this.addColor(n)}},addLineGeometry:function(t,s){this.object.geometry.type="Line";const r=this.vertices.length,i=this.uvs.length;for(let n=0,o=t.length;n<o;n++)this.addVertexLine(this.parseVertexIndex(t[n],r));for(let n=0,o=s.length;n<o;n++)this.addUVLine(this.parseUVIndex(s[n],i))}};return e.startObject("",!1),e}class Et extends y.Loader{constructor(t){super(t),this.materials=null}load(t,s,r,i){const n=this,o=new y.FileLoader(this.manager);o.setPath(this.path),o.setRequestHeader(this.requestHeader),o.setWithCredentials(this.withCredentials),o.load(t,function(h){try{s(n.parse(h))}catch(p){i?i(p):console.error(p),n.manager.itemError(t)}},r,i)}setMaterials(t){return this.materials=t,this}parse(t){const s=new Tt;t.indexOf(`\r
2
+ `)!==-1&&(t=t.replace(/\r\n/g,`
3
+ `)),t.indexOf(`\\
4
+ `)!==-1&&(t=t.replace(/\\\n/g,""));const r=t.split(`
5
+ `);let i=[];for(let h=0,p=r.length;h<p;h++){const _=r[h].trimStart();if(_.length===0)continue;const g=_.charAt(0);if(g!=="#")if(g==="v"){const m=_.split(Ue);switch(m[0]){case"v":s.vertices.push(parseFloat(m[1]),parseFloat(m[2]),parseFloat(m[3])),m.length>=7?(N.setRGB(parseFloat(m[4]),parseFloat(m[5]),parseFloat(m[6]),y.SRGBColorSpace),s.colors.push(N.r,N.g,N.b)):s.colors.push(void 0,void 0,void 0);break;case"vn":s.normals.push(parseFloat(m[1]),parseFloat(m[2]),parseFloat(m[3]));break;case"vt":s.uvs.push(parseFloat(m[1]),parseFloat(m[2]));break}}else if(g==="f"){const f=_.slice(1).trim().split(Ue),v=[];for(let b=0,M=f.length;b<M;b++){const j=f[b];if(j.length>0){const A=j.split("/");v.push(A)}}const u=v[0];for(let b=1,M=v.length-1;b<M;b++){const j=v[b],A=v[b+1];s.addFace(u[0],j[0],A[0],u[1],j[1],A[1],u[2],j[2],A[2])}}else if(g==="l"){const m=_.substring(1).trim().split(" ");let f=[];const v=[];if(_.indexOf("/")===-1)f=m;else for(let u=0,b=m.length;u<b;u++){const M=m[u].split("/");M[0]!==""&&f.push(M[0]),M[1]!==""&&v.push(M[1])}s.addLineGeometry(f,v)}else if(g==="p"){const f=_.slice(1).trim().split(" ");s.addPointGeometry(f)}else if((i=Ot.exec(_))!==null){const m=(" "+i[0].slice(1).trim()).slice(1);s.startObject(m)}else if(It.test(_))s.object.startMaterial(_.substring(7).trim(),s.materialLibraries);else if(Ct.test(_))s.materialLibraries.push(_.substring(7).trim());else if(Pt.test(_))console.warn('THREE.OBJLoader: Rendering identifier "usemap" not supported. Textures must be defined in MTL files.');else if(g==="s"){if(i=_.split(" "),i.length>1){const f=i[1].trim().toLowerCase();s.object.smooth=f!=="0"&&f!=="off"}else s.object.smooth=!0;const m=s.object.currentMaterial();m&&(m.smooth=s.object.smooth)}else{if(_==="\0")continue;console.warn('THREE.OBJLoader: Unexpected line: "'+_+'"')}}s.finalize();const n=new y.Group;if(n.materialLibraries=[].concat(s.materialLibraries),!(s.objects.length===1&&s.objects[0].geometry.vertices.length===0)===!0)for(let h=0,p=s.objects.length;h<p;h++){const _=s.objects[h],g=_.geometry,m=_.materials,f=g.type==="Line",v=g.type==="Points";let u=!1;if(g.vertices.length===0)continue;const b=new y.BufferGeometry;b.setAttribute("position",new y.Float32BufferAttribute(g.vertices,3)),g.normals.length>0&&b.setAttribute("normal",new y.Float32BufferAttribute(g.normals,3)),g.colors.length>0&&(u=!0,b.setAttribute("color",new y.Float32BufferAttribute(g.colors,3))),g.hasUVIndices===!0&&b.setAttribute("uv",new y.Float32BufferAttribute(g.uvs,2));const M=[];for(let A=0,w=m.length;A<w;A++){const S=m[A],C=S.name+"_"+S.smooth+"_"+u;let x=s.materials[C];if(this.materials!==null){if(x=this.materials.create(S.name),f&&x&&!(x instanceof y.LineBasicMaterial)){const I=new y.LineBasicMaterial;y.Material.prototype.copy.call(I,x),I.color.copy(x.color),x=I}else if(v&&x&&!(x instanceof y.PointsMaterial)){const I=new y.PointsMaterial({size:10,sizeAttenuation:!1});y.Material.prototype.copy.call(I,x),I.color.copy(x.color),I.map=x.map,x=I}}x===void 0&&(f?x=new y.LineBasicMaterial:v?x=new y.PointsMaterial({size:1,sizeAttenuation:!1}):x=new y.MeshPhongMaterial,x.name=S.name,x.flatShading=!S.smooth,x.vertexColors=u,s.materials[C]=x),M.push(x)}let j;if(M.length>1){for(let A=0,w=m.length;A<w;A++){const S=m[A];b.addGroup(S.groupStart,S.groupCount,A)}f?j=new y.LineSegments(b,M):v?j=new y.Points(b,M):j=new y.Mesh(b,M)}else f?j=new y.LineSegments(b,M[0]):v?j=new y.Points(b,M[0]):j=new y.Mesh(b,M[0]);j.name=_.name,n.add(j)}else if(s.vertices.length>0){const h=new y.PointsMaterial({size:1,sizeAttenuation:!1}),p=new y.BufferGeometry;p.setAttribute("position",new y.Float32BufferAttribute(s.vertices,3)),s.colors.length>0&&s.colors[0]!==void 0&&(p.setAttribute("color",new y.Float32BufferAttribute(s.colors,3)),h.vertexColors=!0);const _=new y.Points(p,h);n.add(_)}return n}}const ue=16776960,_e=16755200,Lt=2236962,Vt=2236962,Dt={[d.FigureType.Plane]:()=>new c.PlaneGeometry(1,1,1,1),[d.FigureType.Cube]:()=>new c.BoxGeometry(1,1,1,1,1,1),[d.FigureType.Sphere]:()=>new c.SphereGeometry(.5,32,16),[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.Pyramid]:()=>new c.ConeGeometry(.5,1,4,1,!1),[d.FigureType.Tetrahedron]:()=>new c.TetrahedronGeometry(.5,0),[d.FigureType.Octahedron]:()=>new c.OctahedronGeometry(.5,0),[d.FigureType.Dodecahedron]:()=>new c.DodecahedronGeometry(.5,0),[d.FigureType.Torus]:()=>new c.TorusGeometry(.5,.2,16,64),[d.FigureType.TorusKnot]:()=>new c.TorusKnotGeometry(.4,.12,96,16),[d.FigureType.Circle]:()=>new c.CircleGeometry(.5,32),[d.FigureType.Ring]:()=>new c.RingGeometry(.25,.5,32),[d.FigureType.Capsule]:()=>new c.CapsuleGeometry(.3,.8,8,16),[d.FigureType.Custom]:function(){throw new Error("Custom geometry is not generated here.")}},ot=new c.MeshStandardMaterial({color:12566463,metalness:0,roughness:.6}),Ft=8,$=0,at=1,lt=2,V=31,Rt=.03,Ht=.05,ke=e=>!!e&&e.isMesh,ct=e=>{let t=e;for(;t;){if(t.isMesh)return t;t=t.parent}return null},ht=e=>{const t=new c.BufferGeometry;t.setAttribute("position",e.getAttribute("position")),t.computeBoundingSphere(),t.computeBoundingBox();const s=new c.PointsMaterial({color:Vt,size:6,sizeAttenuation:!1,depthTest:!1,depthWrite:!1,transparent:!0,opacity:.9}),r=new c.Points(t,s);return r.layers.set(lt),r.renderOrder=1e3,r.visible=!1,r},dt=e=>{const t=new c.EdgesGeometry(e),s=new c.LineSegments(t,new c.LineBasicMaterial({color:Lt,linewidth:1}));return s.layers.set(at),s},$t=e=>{const t={x:e.position.x,y:e.position.y,z:e.position.z},s={x:e.rotation.x,y:e.rotation.y,z:e.rotation.z},r={x:e.scale.x,y:e.scale.y,z:e.scale.z},i=new c.Box3().setFromObject(e),n=new c.Vector3;i.getSize(n);const o={x:n.x,y:n.y,z:n.z};return{position:t,rotation:s,scale:r,size:o}},ut=(e,t)=>t?{background:{...e.background,...t.background},camera:{...e.camera,...t.camera,position:{...e.camera.position,...t.camera?.position}},renderer:{...e.renderer,...t.renderer},lights:{ambient:{...e.lights.ambient,...t.lights?.ambient},directional:{...e.lights.directional,...t.lights?.directional,position:{...e.lights.directional.position,...t.lights?.directional?.position}}}}:e,k=e=>(e.userData.isProxy=!0,e.userData.isExportable=!1,e),B=e=>(e.userData.isExportable=!1,e),_t=e=>e.userData.isProxy===!0,Bt=e=>{let t=e;for(;t;){if(t.userData.isExportable===!1)return!0;t=t.parent}return!1},kt=e=>!ke(e)||!e.visible||_t(e)||Bt(e)?!1:e.userData.isExportable!==!1,zt=e=>{const t=new c.Group;return t.name="Planara_OBJ_Export",e.updateMatrixWorld(!0),e.traverse(s=>{if(!kt(s))return;const r=s.clone(!1);r.geometry=s.geometry.clone(),Array.isArray(s.material)?r.material=s.material.map(i=>i.clone()):r.material=s.material.clone(),r.matrix.copy(s.matrixWorld),r.matrixAutoUpdate=!1,t.add(r)}),t},pt=e=>{const s=new Et().parse(e);s.updateMatrixWorld(!0);const r=[];return s.traverse(i=>{if(!ke(i))return;const n=i.geometry.clone();n.applyMatrix4(i.matrixWorld),n.computeBoundingBox();const o=n.boundingBox;if(!o)return;const h=new c.Vector3;o.getCenter(h),n.translate(-h.x,-h.y,-h.z),n.computeBoundingBox(),n.computeBoundingSphere(),n.computeVertexNormals();const p=n.getAttribute("position");p&&p.setUsage&&p.setUsage(c.DynamicDrawUsage);const _=new c.Mesh(n,ot.clone());_.position.copy(h),_.layers.enable($);const g=n.index?n.toNonIndexed():n,m=B(dt(g));m.layers.enable($),_.add(m);const f=B(ht(g));f.layers.enable($),_.add(f),r.push(_)}),r},mt={background:{color:1710618,transparent:!1},camera:{fov:45,near:.1,far:1e3,position:{x:1,y:1,z:7}},renderer:{antialias:!0,alpha:!1},lights:{ambient:{enabled:!0,color:16777215,intensity:.5},directional:{enabled:!0,color:16777215,intensity:1,position:{x:5,y:10,z:7}}}};var Gt=Object.getOwnPropertyDescriptor,Wt=(e,t,s,r)=>{for(var i=r>1?void 0:r?Gt(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Ye=(e,t)=>(s,r)=>t(s,r,e);exports.Renderer=class{constructor(t,s){if(this._config=s,this.canvas=t,this.scene=new c.Scene,this._config.background.transparent?this.scene.background=null:this.scene.background=new c.Color(this._config.background.color),this.camera=new c.PerspectiveCamera(this._config.camera.fov,this.canvas.clientWidth/this.canvas.clientHeight,this._config.camera.near,this._config.camera.far),this.camera.position.set(this._config.camera.position.x,this._config.camera.position.y,this._config.camera.position.z),this.renderer=new c.WebGLRenderer({canvas:this.canvas,antialias:this._config.renderer.antialias,alpha:this._config.background.transparent||this._config.renderer.alpha}),this.renderer.setSize(this.canvas.clientWidth,this.canvas.clientHeight),this._config.background.transparent?this.renderer.setClearAlpha(0):this.renderer.setClearColor(this._config.background.color,1),this._config.lights.ambient.enabled){const r=new c.AmbientLight(this._config.lights.ambient.color,this._config.lights.ambient.intensity);this.scene.add(B(r))}if(this._config.lights.directional.enabled){const r=new c.DirectionalLight(this._config.lights.directional.color,this._config.lights.directional.intensity);r.position.set(this._config.lights.directional.position.x,this._config.lights.directional.position.y,this._config.lights.directional.position.z),this.scene.add(B(r))}}scene;camera;renderer;canvas;resize(){this.camera.aspect=this.canvas.clientWidth/this.canvas.clientHeight,this.camera.updateProjectionMatrix(),this.renderer.setSize(this.canvas.clientWidth,this.canvas.clientHeight)}render(){this.renderer.render(this.scene,this.camera)}update(){}loop(){this.update(),this.render(),requestAnimationFrame(()=>this.loop())}getCamera(){return this.camera}getRenderer(){return this.renderer}getCanvas(){return this.canvas}getDomElement(){return this.renderer.domElement}getScene(){return this.scene}dispose(){this.scene=null,this.camera=null,this.renderer?.dispose(),this.canvas=null}};exports.Renderer=Wt([a.injectable(),Ye(0,a.inject("Canvas")),Ye(1,a.inject("RendererConfig"))],exports.Renderer);class Ut{_positions=[];_normals=[];_uvs=[];_tmpPositions=[];_tmpNormals=[];_tmpUVs=[];load(t){const s=t.split(`
6
+ `);for(const i of s){if(!i.trim()||i.startsWith("#"))continue;const n=i.trim().split(/\s+/);switch(n[0]){case"v":this._tmpPositions.push(n.slice(1).map(Number));break;case"vn":this._tmpNormals.push(n.slice(1).map(Number));break;case"vt":this._tmpUVs.push(n.slice(1).map(Number));break;case"f":this.processFaceLine(n);break}}const r={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(r)}processFaceLine(t){for(let s=1;s<t.length;s++){const r=t[s];if(!r)continue;const[i,n,o]=r.split("/"),h=i?parseInt(i,10):void 0,p=n?parseInt(n,10):void 0,_=o?parseInt(o,10):void 0;if(h!==void 0){const g=this._tmpPositions[h-1];g&&this._positions.push(...g)}if(p!==void 0){const g=this._tmpUVs[p-1];g&&this._uvs.push(...g)}if(_!==void 0){const g=this._tmpNormals[_-1];g&&this._normals.push(...g)}}}}var Nt=Object.getOwnPropertyDescriptor,Xt=(e,t,s,r)=>{for(var i=r>1?void 0:r?Nt(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},X=(e,t)=>(s,r)=>t(s,r,e);let Q=class{constructor(e,t,s,r){this._updatable=e,this._renderable=t,this._runtime=s,this._renderer=r}_animationId=null;start(){const e=[...this._runtime,...this._updatable,...this._renderable];new Set(e).forEach(t=>t.init()),this._loop()}_loop(){this._updatable.forEach(e=>e.update()),this._renderer.render(),this._renderable.forEach(e=>e.render()),this._animationId=requestAnimationFrame(()=>this._loop())}stop(){this._animationId&&(cancelAnimationFrame(this._animationId),this._animationId=null)}dispose(){this._animationId=null}};Q=Xt([a.injectable(),X(0,a.injectAll("IUpdatableModule",{isOptional:!0})),X(1,a.injectAll("IRenderableModule",{isOptional:!0})),X(2,a.injectAll("IRuntimeModule",{isOptional:!0})),X(3,a.inject("IRenderable"))],Q);var qt=Object.getOwnPropertyDescriptor,Yt=(e,t,s,r)=>{for(var i=r>1?void 0:r?qt(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Zt=(e,t)=>(s,r)=>t(s,r,e);let Me=class{constructor(e){this._controlsModule=e}isOrbitInteracting(){return this._controlsModule.isOrbitInteracting()}isTransformDragging(){return this._controlsModule.isTransformDragging()}};Me=Yt([a.injectable(),Zt(0,a.inject("ControlsModule"))],Me);var Kt=Object.getOwnPropertyDescriptor,Jt=(e,t,s,r)=>{for(var i=r>1?void 0:r?Kt(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Qt=(e,t)=>(s,r)=>t(s,r,e);let ee=class{constructor(e){this._sceneModule=e}addMesh(e){this._sceneModule.addMesh(e)}addMeshes(e){this._sceneModule.addMeshes(e)}removeMesh(e){this._sceneModule.removeMesh(e)}removeMeshes(e){this._sceneModule.removeMeshes(e)}getMeshes(){return this._sceneModule.getMeshes()}};ee=Jt([a.injectable(),Qt(0,a.inject("SceneModule"))],ee);var er=Object.getOwnPropertyDescriptor,tr=(e,t,s,r)=>{for(var i=r>1?void 0:r?er(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},rr=(e,t)=>(s,r)=>t(s,r,e);let Se=class{constructor(e){this._raycastModule=e}setRaycastMode(e){this._raycastModule.setRaycastMode(e)}};Se=tr([a.injectable(),rr(0,a.inject("RaycastModule"))],Se);var sr=Object.getOwnPropertyDescriptor,ir=(e,t,s,r)=>{for(var i=r>1?void 0:r?sr(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},nr=(e,t)=>(s,r)=>t(s,r,e);let xe=class{constructor(e){this._controlsModule=e}attachTransform(e){this._controlsModule.attachTransform(e)}detachTransform(){this._controlsModule.detachTransform()}setTransformMode(e){this._controlsModule.setTransformMode(e)}onTransformChange(e){return this._controlsModule.onTransformChange(e)}};xe=ir([a.injectable(),nr(0,a.inject("ControlsModule"))],xe);var or=Object.getOwnPropertyDescriptor,ar=(e,t,s,r)=>{for(var i=r>1?void 0:r?or(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},lr=(e,t)=>(s,r)=>t(s,r,e);let te=class{constructor(e){this._cameraAccessApi=e}getCamera(){return this._cameraAccessApi.getCamera()}enableCameraLayer(e){this._cameraAccessApi.getCamera().layers.enable(e)}disableCameraLayer(e){this._cameraAccessApi.getCamera().layers.disable(e)}};te=ar([a.injectable(),lr(0,a.inject("IRendererCameraAccess"))],te);var cr=Object.getOwnPropertyDescriptor,hr=(e,t,s,r)=>{for(var i=r>1?void 0:r?cr(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},dr=(e,t)=>(s,r)=>t(s,r,e);let re=class{constructor(e){this._domAccessApi=e}getCanvas(){return this._domAccessApi.getCanvas()}getDomElement(){return this._domAccessApi.getDomElement()}};re=hr([a.injectable(),dr(0,a.inject("IRendererDomAccess"))],re);var ur=Object.getOwnPropertyDescriptor,_r=(e,t,s,r)=>{for(var i=r>1?void 0:r?ur(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},pr=(e,t)=>(s,r)=>t(s,r,e);let se=class{constructor(e){this._sceneAccessApi=e}getScene(){return this._sceneAccessApi.getScene()}addToScene(e){this._sceneAccessApi.getScene().add(e)}removeFromScene(e){this._sceneAccessApi.getScene().remove(e)}addObject(e,t){const s=this._sceneAccessApi.getScene();s&&(typeof t=="number"&&e.layers.set(t),s.add(e))}};se=_r([a.injectable(),pr(0,a.inject("IRendererSceneAccess"))],se);var mr=Object.getOwnPropertyDescriptor,gr=(e,t,s,r)=>{for(var i=r>1?void 0:r?mr(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},me=(e,t)=>(s,r)=>t(s,r,e);let ie=class{constructor(e,t,s){this._cameraApi=e,this._domApi=t,this._sceneApi=s}_orbit=null;_transform=null;_transformHelper=null;_transformListeners=new Set;_isEventListenersAdded=!1;init(){this._orbit=new J.OrbitWithState(this._cameraApi.getCamera(),this._domApi.getDomElement()),this._orbit.enableDamping=!0,this._orbit.dampingFactor=.05,this._transform=new J.ModelingTransformControls(this._cameraApi.getCamera(),this._domApi.getDomElement()),this._transformHelper=this._transform.getHelper(),this._sceneApi.addToScene(B(this._transformHelper)),this._initMouseListeners()}attachTransform(e){this._transform?.attach(e)}detachTransform(){this._transform?.detach()}update(){this._orbit?.update()}setTransformMode(e){this._transform?.setMode(e)}onTransformChange(e){return this._transformListeners.add(e),()=>this._transformListeners.delete(e)}isOrbitInteracting(){return!!this._orbit?.isInteracting}isTransformDragging(){return!!this._transform?.dragging}_handlePointerDown=e=>{this._transform?.pointerDown(e)};_handlePointerMove=e=>{this._transform?.pointerMove(e)};_handlePointerUp=e=>{this._transform?.pointerUp(e)};_handlePointerLeave=()=>{this._transform?.pointerHover(null)};_handleDraggingChanged=()=>{this._orbit&&(this._orbit.enabled=!this._transform?.dragging)};_handleObjectChange=()=>{for(const e of this._transformListeners)e()};_initMouseListeners(){const e=this._domApi.getCanvas();!this._transform||!this._orbit||(e.addEventListener("pointerdown",this._handlePointerDown),e.addEventListener("pointermove",this._handlePointerMove),e.addEventListener("pointerup",this._handlePointerUp),e.addEventListener("pointerleave",this._handlePointerLeave),this._transform.addEventListener("dragging-changed",this._handleDraggingChanged),this._transform.addEventListener("objectChange",this._handleObjectChange),this._isEventListenersAdded=!0)}dispose(){if(this._isEventListenersAdded){const e=this._domApi.getCanvas();if(!this._transform||!this._orbit)return;e.removeEventListener("pointerdown",this._handlePointerDown),e.removeEventListener("pointermove",this._handlePointerMove),e.removeEventListener("pointerup",this._handlePointerUp),e.removeEventListener("pointerleave",this._handlePointerLeave),this._transform.removeEventListener("dragging-changed",this._handleDraggingChanged),this._transform.removeEventListener("objectChange",this._handleObjectChange),this._transformListeners.clear(),this._isEventListenersAdded=!1}this._orbit?.dispose(),this._orbit=null,this._transform?.dispose(),this._transform=null,this._transformHelper?.parent&&this._transformHelper.parent.remove(this._transformHelper)}};ie=gr([a.injectable(),me(0,a.inject("ICameraApi")),me(1,a.inject("IDomApi")),me(2,a.inject("ISceneApi"))],ie);var fr=Object.getOwnPropertyDescriptor,vr=(e,t,s,r)=>{for(var i=r>1?void 0:r?fr(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},ge=(e,t)=>(s,r)=>t(s,r,e);let we=class{constructor(e,t,s){this._cameraApi=e,this._domApi=t,this._rendererApi=s}_cameraGizmo=null;init(){const e=this._cameraApi.getCamera(),t=this._rendererApi.getRenderer();this._cameraGizmo=new J.CameraAxesGizmo(t,e,{size:96,margin:36})}render(){const e=this._domApi.getCanvas();this._cameraGizmo?.render(e.width,e.height)}dispose(){this._cameraGizmo?.dispose(),this._cameraGizmo=null}};we=vr([a.injectable(),ge(0,a.inject("ICameraApi")),ge(1,a.inject("IDomApi")),ge(2,a.inject("IRendererAccess"))],we);var br=Object.getOwnPropertyDescriptor,yr=(e,t,s,r)=>{for(var i=r>1?void 0:r?br(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i};exports.EventBus=class{_emitter;constructor(){this._emitter=new At.EventEmitter}emit(t,s){this._emitter.emit(t,s)}on(t,s){this._emitter.on(t,s)}off(t,s){this._emitter.off(t,s)}};exports.EventBus=yr([a.injectable()],exports.EventBus);var H=(e=>(e.SelectHover="select.hover",e.SelectClick="select.click",e))(H||{}),Mr=Object.getOwnPropertyDescriptor,Sr=(e,t,s,r)=>{for(var i=r>1?void 0:r?Mr(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},z=(e,t)=>(s,r)=>t(s,r,e);let Ae=class{constructor(e,t,s,r,i){this._domApi=e,this._cameraApi=t,this._meshApi=s,this._controlsState=r,this._bus=i}_raycaster;_mouse;_lastHoverKey=null;_currentRaycastMode=d.SelectMode.Mesh;_isEventListenersAdded=!1;init(){this._raycaster=new c.Raycaster,this._mouse=new c.Vector2,this._applyRaycastParamsByMode(),this._isEventListenersAdded||(this._initMouseListeners(),this._isEventListenersAdded=!0)}setRaycastMode(e){if(this._currentRaycastMode===e)return;const t=this._raycaster;t.params.Line.threshold=0,t.params.Points.threshold=0,this._currentRaycastMode=e,this._lastHoverKey=null,this._applyRaycastParamsByMode()}_applyRaycastParamsByMode(){const e=this._raycaster;switch(e.params.Line.threshold=0,e.params.Points.threshold=0,this._currentRaycastMode){case d.SelectMode.Mesh:case d.SelectMode.Face:e.layers.set($);break;case d.SelectMode.Edge:e.layers.set(at),e.params.Line.threshold=Rt;break;case d.SelectMode.Vertex:e.layers.set(lt),e.params.Points.threshold=Ht;break}}_getHitIntersection(e){const t=this._controlsState.isOrbitInteracting()||this._controlsState.isTransformDragging(),s=this._domApi.getCanvas(),r=this._cameraApi.getCamera(),i=this._meshApi.getMeshes();if(t)return;const n=s.getBoundingClientRect();this._mouse.x=(e.clientX-n.left)/n.width*2-1,this._mouse.y=-((e.clientY-n.top)/n.height)*2+1,this._raycaster.setFromCamera(this._mouse,r);const o=this._raycaster.intersectObjects(i,!0)[0]??null;if(this._currentRaycastMode===d.SelectMode.Mesh||this._currentRaycastMode===d.SelectMode.Face)return o;const h=this._raycaster.layers.mask;this._raycaster.layers.set($);const p=this._raycaster.intersectObjects(i,!0)[0]??null;return this._raycaster.layers.mask=h,this._getVisibleHit(o,p)}_processRaycastEvent(e,t,s){const r=this._getHitIntersection(e),i=this._meshApi.getMeshes();if(r===void 0)return;const n=r?.object??null;if(s){if(!r){i.forEach(h=>h.userData.isHit=!1),this._lastHoverKey=null,this._bus.emit(t,null);return}const o=this._makeHoverKey(r);o!==this._lastHoverKey&&(i.forEach(h=>h.userData.isHit=!1),n&&(n.userData.isHit=!0),this._lastHoverKey=o,this._bus.emit(t,{intersection:r}));return}r&&this._bus.emit(t,{intersection:r})}_getVisibleHit(e,t,s=1e-4){return e?t?e.distance<=t.distance+s?e:null:e:null}_makeHoverKey(e){if(!e)return null;const t=e.object.uuid;switch(this._currentRaycastMode){case d.SelectMode.Face:return`${t}:face:${e.faceIndex??-1}`;case d.SelectMode.Edge:return`${t}:edge:${Math.floor((e.index??-1)/2)}`;case d.SelectMode.Vertex:return`${t}:vertex:${e.index??-1}`;case d.SelectMode.Mesh:default:return`${t}:mesh`}}_handleMouseMove=e=>{this._processRaycastEvent(e,H.SelectHover,!0)};_handleMouseClick=e=>{this._processRaycastEvent(e,H.SelectClick,!1)};_handleDoubleClick=e=>{const t=this._getHitIntersection(e);t!==void 0&&(t||this._bus.emit(H.SelectClick,null))};_handleMouseLeave=()=>{this._lastHoverKey=null,this._bus.emit(H.SelectHover,null)};_initMouseListeners(){const e=this._domApi.getCanvas();e.addEventListener("mousemove",this._handleMouseMove,!1),e.addEventListener("click",this._handleMouseClick,!1),e.addEventListener("dblclick",this._handleDoubleClick,!1),e.addEventListener("mouseleave",this._handleMouseLeave),this._isEventListenersAdded=!0}_removeMouseListeners(){const e=this._domApi.getCanvas();e.removeEventListener("mousemove",this._handleMouseMove),e.removeEventListener("click",this._handleMouseClick),e.removeEventListener("dblclick",this._handleDoubleClick),e.removeEventListener("mouseleave",this._handleMouseLeave)}dispose(){this._removeMouseListeners(),this._isEventListenersAdded=!1,this._lastHoverKey=null}};Ae=Sr([a.injectable(),z(0,a.inject("IDomApi")),z(1,a.inject("ICameraApi")),z(2,a.inject("IMeshApi")),z(3,a.inject("IControlsStateApi")),z(4,a.inject("EventBus"))],Ae);var xr=Object.getOwnPropertyDescriptor,wr=(e,t,s,r)=>{for(var i=r>1?void 0:r?xr(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Ar=(e,t)=>(s,r)=>t(s,r,e);let je=class{constructor(e){this._api=e}_meshes=[];_grid=null;_axes=null;_light=null;init(){this._grid=new c.GridHelper(10,10),this._grid.position.y=-.001,this._api.addToScene(this._grid),this._axes=new J.SymmetricAxesHelper(6),this._api.addToScene(this._axes),this._light=new c.HemisphereLight(16777215,4473924,.6),this._api.addToScene(this._light)}getMeshes(){return this._meshes}addMesh(e){this._meshes.includes(e)||(this._meshes.push(e),this._api.addToScene(e))}removeMesh(e){const t=this._meshes.indexOf(e);t>=0&&this._meshes.splice(t,1),this._api.removeFromScene(e)}addMeshes(e){for(const t of e)this.addMesh(t)}removeMeshes(e){for(const t of e)this.removeMesh(t)}dispose(){for(const e of this._meshes)this._api.removeFromScene(e);this._meshes.length=0,this._grid&&(this._api.removeFromScene(this._grid),this._grid.geometry.dispose(),this._grid.material.dispose(),this._grid=null),this._axes&&(this._api.removeFromScene(this._axes),this._axes=null),this._light&&(this._api.removeFromScene(this._light),this._light=null)}};je=wr([a.injectable(),Ar(0,a.inject("ISceneApi"))],je);var jr=Object.getOwnPropertyDescriptor,Or=(e,t,s,r)=>{for(var i=r>1?void 0:r?jr(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Cr=(e,t)=>(s,r)=>t(s,r,e);let Oe=class{constructor(e){this._api=e}_meshes=[];_light=null;init(){this._light=new c.HemisphereLight(16777215,4473924,.6),this._api.addToScene(this._light)}getMeshes(){return this._meshes}addMesh(e){this._meshes.includes(e)||(this._meshes.push(e),this._api.addToScene(e))}removeMesh(e){const t=this._meshes.indexOf(e);t>=0&&this._meshes.splice(t,1),this._api.removeFromScene(e)}addMeshes(e){for(const t of e)this.addMesh(t)}removeMeshes(e){for(const t of e)this.removeMesh(t)}dispose(){for(const e of this._meshes)this._api.removeFromScene(e);this._meshes.length=0,this._light&&(this._api.removeFromScene(this._light),this._light=null)}};Oe=Or([a.injectable(),Cr(0,a.inject("ISceneApi"))],Oe);var P=(e=>(e[e.Display=0]="Display",e[e.Scene=1]="Scene",e[e.Select=2]="Select",e[e.Tool=3]="Tool",e))(P||{}),Ir=Object.getOwnPropertyDescriptor,Pr=(e,t,s,r)=>{for(var i=r>1?void 0:r?Ir(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Ze=(e,t)=>(s,r)=>t(s,r,e);let Ce=class{constructor(e,t){this._store=t,this._handlers=new Map(e.map(s=>[s.mode,s]))}_currentMode=d.DisplayMode.Plane;_handlers;type=P.Display;manage(e){e!==this._currentMode&&(this._handlers.get(this._currentMode)?.rollback(),e!==d.DisplayMode.Plane&&this._handlers.get(e)?.handle(),this._currentMode=e,this._store.setDisplayMode(this._currentMode))}dispose(){this._handlers&&this._handlers.clear(),this._currentMode=d.DisplayMode.Plane,this._store.setDisplayMode(this._currentMode)}};Ce=Pr([a.injectable(),Ze(0,a.injectAll("IDisplayHandler")),Ze(1,a.inject("EditorStore"))],Ce);var Tr=Object.getOwnPropertyDescriptor,Er=(e,t,s,r)=>{for(var i=r>1?void 0:r?Tr(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Lr=(e,t)=>(s,r)=>t(s,r,e);let ne=class{_currentMode=d.SceneMode.AddFigure;_handlers;type=P.Scene;constructor(e){this._handlers=new Map(e.map(t=>[t.mode,t]))}manage(e,t){this._handlers.get(e)?.handle(t),this._currentMode=e}dispose(){this._handlers&&this._handlers.clear(),this._currentMode=d.SceneMode.AddFigure}};ne=Er([a.injectable(),Lr(0,a.injectAll("ISceneHandler"))],ne);var F=(e=>(e.Hover="hover",e.Click="click",e))(F||{}),Vr=Object.getOwnPropertyDescriptor,Dr=(e,t,s,r)=>{for(var i=r>1?void 0:r?Vr(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},fe=(e,t)=>(s,r)=>t(s,r,e);let Ie=class{constructor(e,t,s){this._eventBus=e,this._store=s,this._handlers=new Map(t.map(r=>[r.mode,r])),this._eventBus.on(H.SelectHover,this._onHover),this._eventBus.on(H.SelectClick,this._onClick)}_currentMode=d.SelectMode.Mesh;_handlers;type=P.Select;manage(e){e!==this._currentMode&&(this._handlers.get(this._currentMode)?.rollback(),this._currentMode=e,this._store.setSelectMode(this._currentMode))}_onHover=e=>{this._handlers.get(this._currentMode)?.handle(e,F.Hover)};_onClick=e=>{this._handlers.get(this._currentMode)?.handle(e,F.Click)};dispose(){this._handlers&&this._handlers.clear(),this._eventBus.off(H.SelectHover,this._onHover),this._currentMode=d.SelectMode.Mesh,this._store.setSelectMode(this._currentMode)}};Ie=Dr([a.injectable(),fe(0,a.inject("EventBus")),fe(1,a.injectAll("ISelectHandler")),fe(2,a.inject("EditorStore"))],Ie);const Fr=e=>(t,s,r)=>{const i=r.value;if(!i)throw new Error("usePolicy can only be applied to method");return r.value=function(...n){return e(this).check(...n),i.apply(this,n)},r},gt=e=>(t,s,r)=>{const i=r.value;if(!i)throw new Error("useValidator can only be applied to method");return r.value=function(...n){return e(this).validate(...n),i.apply(this,n)},r};var Rr=Object.defineProperty,Hr=Object.getOwnPropertyDescriptor,ft=(e,t,s,r)=>{for(var i=r>1?void 0:r?Hr(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=(r?o(t,s,i):o(i))||i);return r&&i&&Rr(t,s,i),i},ve=(e,t)=>(s,r)=>t(s,r,e);let oe=class{constructor(e,t,s){this._store=t,this._policy=s,this._handlers=new Map(e.map(r=>[r.mode,r])),this._unsubSelected=this._store.onSelectedObjectChange(()=>{this._handlers.get(this._currentTool)?.handle()})}_currentTool=d.ToolType.Translate;_handlers;_unsubSelected;type=P.Tool;manage(e){this._currentTool!==e&&(this._handlers.get(this._currentTool)?.rollback(),this._currentTool=e,this._store.setToolType(this._currentTool),this._handlers.get(this._currentTool)?.handle())}dispose(){this._unsubSelected?.(),this._handlers&&this._handlers.clear(),this._currentTool=d.ToolType.Translate,this._store.setToolType(this._currentTool)}};ft([Fr(e=>e._policy)],oe.prototype,"manage",1);oe=ft([a.injectable(),ve(0,a.injectAll("IToolHandler")),ve(1,a.inject("EditorStore")),ve(2,a.inject("ToolPolicy"))],oe);var $r=Object.getOwnPropertyDescriptor,Br=(e,t,s,r)=>{for(var i=r>1?void 0:r?$r(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},kr=(e,t)=>(s,r)=>t(s,r,e);let Pe=class{constructor(e){this._api=e}mode=d.DisplayMode.Wireframe;_prevWireframe=new Map;_prevColorMesh=new Map;_prevColorLines=new Map;_wireColor=new c.Color(65535);handle(){const e=this._api.getMeshes();for(const t of e){const s=Array.isArray(t.material)?t.material:[t.material];for(const r of s)this._enableWireframeOnMaterial(r);t.traverse(r=>{if(r.isLineSegments){const i=r;if(!this._prevColorLines.has(i.material)){const o=i.material;this._prevColorLines.set(o,o.color.clone())}const n=i.material;n.color.copy(this._wireColor),n.needsUpdate=!0}})}}rollback(){for(const[e,t]of this._prevWireframe)"wireframe"in e&&(e.wireframe=t),e.needsUpdate=!0;this._prevWireframe.clear();for(const[e,t]of this._prevColorMesh){const s=e;s.color?.isColor&&s.color.copy(t)}this._prevColorMesh.clear();for(const[e,t]of this._prevColorLines)e.color.copy(t);this._prevColorLines.clear()}dispose(){this.rollback()}_enableWireframeOnMaterial(e){const t=e;"wireframe"in t&&!this._prevWireframe.has(e)&&(this._prevWireframe.set(e,!!t.wireframe),t.wireframe=!0,e.needsUpdate=!0),t.color?.isColor&&(this._prevColorMesh.has(e)||this._prevColorMesh.set(e,t.color.clone()),t.color.copy(this._wireColor))}};Pe=Br([a.injectable(),kr(0,a.inject("IMeshApi"))],Pe);var zr=Object.getOwnPropertyDescriptor,Gr=(e,t,s,r)=>{for(var i=r>1?void 0:r?zr(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},q=(e,t)=>(s,r)=>t(s,r,e);let Te=class{constructor(e,t,s,r){this._sceneApi=e,this._cameraApi=t,this._raycastApi=s,this._store=r,this._cameraApi.enableCameraLayer(V),this._hoverLine=k(this._makeOverlayLine(this._hoverColor)),this._selectLine=k(this._makeOverlayLine(this._selectColor)),this._sceneApi.addObject(this._hoverLine,V),this._sceneApi.addObject(this._selectLine,V)}mode=d.SelectMode.Edge;_hoverLine;_selectLine;_hovered=null;_selected=null;_hoverColor=ue;_selectColor=_e;handle(e,t){if(this._raycastApi.setRaycastMode(this.mode),t===F.Hover){if(!e){this._hoverLine.visible=!1,this._hovered=null;return}const s=e.intersection.object;if(!s?.isLineSegments)return;const r=s,i=Math.floor((e.intersection.index??-1)/2);if(i<0)return;this._selected&&this._same({lines:r,seg:i},this._selected)?this._hoverLine.visible=!1:(this._writeWorldSegment(this._hoverLine,r,i),this._hoverLine.visible=!0),this._hovered={lines:r,seg:i};return}if(t===F.Click){if(!e){this._selectLine.visible=!1,this._selected=null,this._store.setSelectedObject(null);return}const s=e.intersection.object;if(!s?.isLineSegments)return;const r=s,i=Math.floor((e.intersection.index??-1)/2);if(i<0)return;this._writeWorldSegment(this._selectLine,r,i),this._centerAndOrientLineOnSegment(this._selectLine,r,i),this._selectLine.visible=!0,this._prepareEdgeMetadata(r,i),this._store.setSelectedObject(this._selectLine),this._selected={lines:r,seg:i},this._hovered&&this._same(this._hovered,this._selected)&&(this._hoverLine.visible=!1)}}rollback(){this._hoverLine.visible=!1,this._selectLine.visible=!1,this._hovered=this._selected=null,this._store.setSelectedObject(null)}dispose(){this.rollback(),this._sceneApi.removeFromScene(this._hoverLine),this._sceneApi.removeFromScene(this._selectLine),this._hoverLine.geometry.dispose(),this._hoverLine.material.dispose(),this._selectLine.geometry.dispose(),this._selectLine.material.dispose()}_makeOverlayLine(e){const t=new c.BufferGeometry;t.setAttribute("position",new c.Float32BufferAttribute(6,3));const s=new c.LineBasicMaterial({color:e,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1}),r=new c.Line(t,s);return r.renderOrder=1e3,r.raycast=()=>{},r.layers.set(V),r.visible=!1,r}_writeWorldSegment(e,t,s){const r=t.geometry.getAttribute("position"),i=s*2,n=i+1,o=new c.Vector3(r.getX(i),r.getY(i),r.getZ(i)).applyMatrix4(t.matrixWorld),h=new c.Vector3(r.getX(n),r.getY(n),r.getZ(n)).applyMatrix4(t.matrixWorld),p=e.geometry.getAttribute("position");p.setXYZ(0,o.x,o.y,o.z),p.setXYZ(1,h.x,h.y,h.z),p.needsUpdate=!0}_same(e,t){return!!e&&!!t&&e.lines===t.lines&&e.seg===t.seg}_centerAndOrientLineOnSegment(e,t,s){const r=t.geometry.getAttribute("position"),i=s*2,n=i+1,o=new c.Vector3(r.getX(i),r.getY(i),r.getZ(i)).applyMatrix4(t.matrixWorld),h=new c.Vector3(r.getX(n),r.getY(n),r.getZ(n)).applyMatrix4(t.matrixWorld),p=new c.Vector3().subVectors(h,o),_=p.length();if(!isFinite(_)||_===0)return;const g=new c.Vector3().addVectors(o,h).multiplyScalar(.5);e.position.copy(g);const m=e.geometry;let f=m.getAttribute("position");(!f||f.count<2)&&(m.setAttribute("position",new c.BufferAttribute(new Float32Array(6),3)),f=m.getAttribute("position")),f.setXYZ(0,-_/2,0,0),f.setXYZ(1,_/2,0,0),f.needsUpdate=!0,p.normalize();const v=new c.Quaternion().setFromUnitVectors(new c.Vector3(1,0,0),p);e.quaternion.copy(v),e.updateMatrixWorld(!0)}_prepareEdgeMetadata(e,t){const s=ct(e);if(!s)return;const r=e.geometry.getAttribute("position"),i=t*2,n=i+1,o=new c.Vector3(r.getX(i),r.getY(i),r.getZ(i)).applyMatrix4(e.matrixWorld),h=new c.Vector3(r.getX(n),r.getY(n),r.getZ(n)).applyMatrix4(e.matrixWorld),p=new c.Matrix4().copy(s.matrixWorld).invert(),_=o.clone().applyMatrix4(p),g=h.clone().applyMatrix4(p),f=s.geometry.getAttribute("position"),v=new c.Vector3,u=1e-6,b=[],M=[];for(let O=0;O<f.count;O++)v.fromBufferAttribute(f,O),v.distanceToSquared(_)<u*u?b.push(O):v.distanceToSquared(g)<u*u&&M.push(O);const j=new c.Matrix4().copy(e.matrixWorld).invert(),A=o.clone().applyMatrix4(j),w=h.clone().applyMatrix4(j),S=e.geometry.getAttribute("position"),C=new c.Vector3,x=[],I=[];for(let O=0;O<S.count;O++)C.fromBufferAttribute(S,O),C.distanceToSquared(A)<u*u?x.push(O):C.distanceToSquared(w)<u*u&&I.push(O);this._selectLine.userData.edgeInfo={lines:e,seg:t,mesh:s,aIndices:b,bIndices:M,aEdgeIndices:x,bEdgeIndices:I}}};Te=Gr([a.injectable(),q(0,a.inject("ISceneApi")),q(1,a.inject("ICameraApi")),q(2,a.inject("IRaycastApi")),q(3,a.inject("EditorStore"))],Te);var Wr=Object.getOwnPropertyDescriptor,Ur=(e,t,s,r)=>{for(var i=r>1?void 0:r?Wr(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Y=(e,t)=>(s,r)=>t(s,r,e);let Ee=class{constructor(e,t,s,r){this._cameraApi=e,this._sceneApi=t,this._raycastApi=s,this._store=r,this._cameraApi.enableCameraLayer(V),this._hoverFace=k(this._makeOverlayFace(this._hoverColor)),this._selectFace=k(this._makeOverlayFace(this._selectColor)),this._sceneApi.addObject(this._hoverFace,V),this._sceneApi.addObject(this._selectFace,V)}mode=d.SelectMode.Face;_hoverFace;_selectFace;_hovered=null;_selected=null;_hoverColor=ue;_selectColor=_e;_normalEps=1e-4;_planeEps=1e-4;handle(e,t){if(this._raycastApi.setRaycastMode(this.mode),t===F.Hover){if(!e){this._hoverFace.visible=!1,this._hovered=null;return}const s=e.intersection.object;if(!s?.isMesh)return;const r=s,i=e.intersection.faceIndex??-1;if(i<0)return;const n=this._collectFaceGroup(r,i);if(!n)return;this._selected&&this._same(n,this._selected)?this._hoverFace.visible=!1:(this._writeWorldFaceGroup(this._hoverFace,n),this._hoverFace.visible=!0),this._hovered=n;return}if(t===F.Click){if(!e){this._selectFace.visible=!1,this._selected=null,this._store.setSelectedObject(null);return}const s=e.intersection.object;if(!s?.isMesh)return;const r=s,i=e.intersection.faceIndex??-1;if(i<0)return;const n=this._collectFaceGroup(r,i);if(!n)return;this._writeWorldFaceGroup(this._selectFace,n),this._centerFaceProxy(this._selectFace),this._selectFace.visible=!0,this._prepareFaceMetadata(n),this._store.setSelectedObject(this._selectFace),this._selected=n,this._hovered&&this._same(this._hovered,this._selected)&&(this._hoverFace.visible=!1)}}rollback(){this._hoverFace.visible=!1,this._selectFace.visible=!1,this._resetFaceProxyTransform(this._selectFace),this._resetFaceProxyTransform(this._hoverFace),this._hovered=this._selected=null,this._store.setSelectedObject(null)}dispose(){this.rollback(),this._sceneApi.removeFromScene(this._hoverFace),this._sceneApi.removeFromScene(this._selectFace),this._hoverFace.geometry.dispose(),this._hoverFace.material.dispose(),this._selectFace.geometry.dispose(),this._selectFace.material.dispose()}_makeOverlayFace(e){const t=new c.BufferGeometry,s=new c.MeshBasicMaterial({color:e,transparent:!0,opacity:.35,depthTest:!1,depthWrite:!1,side:c.DoubleSide,polygonOffset:!0,polygonOffsetFactor:-1,polygonOffsetUnits:-1}),r=new c.Mesh(t,s);return r.renderOrder=1e3,r.layers.set(V),r.visible=!1,r.raycast=()=>{},r}_collectFaceGroup(e,t){const s=e.geometry,r=s.getAttribute("position");if(!r)return null;const i=s.index;if(!i){const S=t*3,C=t*3+1,x=t*3+2;return{mesh:e,faceIndex:t,triangleIndices:[t],vertexIndices:[S,C,x],proxyVertexMap:[S,C,x]}}const n=Math.floor(i.count/3);if(t<0||t>=n)return null;const o=this._buildTriangleAdjacency(i,r),[h,p,_]=this._getTriangleIndices(i,t),g=this._readVertex(r,h),m=this._readVertex(r,p),f=this._readVertex(r,_),v=new c.Vector3().subVectors(m,g).cross(new c.Vector3().subVectors(f,g)).normalize(),u=new c.Plane().setFromNormalAndCoplanarPoint(v,g),b=new Set,M=[],j=[t];for(;j.length>0;){const S=j.pop();if(b.has(S))continue;b.add(S);const[C,x,I]=this._getTriangleIndices(i,S),O=this._readVertex(r,C),T=this._readVertex(r,x),E=this._readVertex(r,I),R=new c.Vector3().subVectors(T,O).cross(new c.Vector3().subVectors(E,O)).normalize(),xt=Math.abs(R.dot(v))>=1-this._normalEps,wt=Math.abs(u.distanceToPoint(O))<this._planeEps&&Math.abs(u.distanceToPoint(T))<this._planeEps&&Math.abs(u.distanceToPoint(E))<this._planeEps;if(!xt||!wt)continue;M.push(S);const Ge=o.get(S);if(Ge)for(const We of Ge)b.has(We)||j.push(We)}M.sort((S,C)=>S-C);const A=new Set,w=[];for(const S of M){const[C,x,I]=this._getTriangleIndices(i,S);A.add(C),A.add(x),A.add(I),w.push(C,x,I)}return{mesh:e,faceIndex:t,triangleIndices:M,vertexIndices:Array.from(A),proxyVertexMap:w}}_writeWorldFaceGroup(e,t){const s=t.mesh.geometry,r=s.getAttribute("position"),i=s.index,n=new Float32Array(t.triangleIndices.length*9);let o=0;for(const p of t.triangleIndices){let _,g,m;i?[_,g,m]=this._getTriangleIndices(i,p):(_=p*3,g=p*3+1,m=p*3+2);const f=this._readVertex(r,_).applyMatrix4(t.mesh.matrixWorld),v=this._readVertex(r,g).applyMatrix4(t.mesh.matrixWorld),u=this._readVertex(r,m).applyMatrix4(t.mesh.matrixWorld);n[o++]=f.x,n[o++]=f.y,n[o++]=f.z,n[o++]=v.x,n[o++]=v.y,n[o++]=v.z,n[o++]=u.x,n[o++]=u.y,n[o++]=u.z}const h=e.geometry;h.setAttribute("position",new c.BufferAttribute(n,3)),h.setIndex(null),h.computeVertexNormals(),h.computeBoundingBox(),h.computeBoundingSphere()}_same(e,t){return!!e&&!!t&&e.mesh===t.mesh&&e.triangleIndices.length===t.triangleIndices.length&&e.triangleIndices.every((s,r)=>s===t.triangleIndices[r])}_prepareFaceMetadata(e){const{vertexIndexGroups:t,proxyVertexMap:s,lines:r,lineVertexIndexGroups:i}=this._buildFaceVertexGroups(e);this._selectFace.userData.faceInfo={mesh:e.mesh,faceIndex:e.faceIndex,triangleIndices:e.triangleIndices,vertexIndices:e.vertexIndices,vertexIndexGroups:t,proxyVertexMap:s,lines:r,lineVertexIndexGroups:i}}_centerFaceProxy(e){const t=e.geometry,s=t.getAttribute("position");if(!s||s.count===0)return;const r=new c.Vector3;for(let i=0;i<s.count;i++)r.x+=s.getX(i),r.y+=s.getY(i),r.z+=s.getZ(i);r.multiplyScalar(1/s.count);for(let i=0;i<s.count;i++)s.setXYZ(i,s.getX(i)-r.x,s.getY(i)-r.y,s.getZ(i)-r.z);s.needsUpdate=!0,e.position.copy(r),e.quaternion.identity(),e.scale.set(1,1,1),e.updateMatrixWorld(!0),t.computeBoundingBox(),t.computeBoundingSphere()}_pushEdge(e,t,s,r){const i=t<s?`${t}_${s}`:`${s}_${t}`,n=e.get(i);n?n.push(r):e.set(i,[r])}_buildTriangleAdjacency(e,t){const s=Math.floor(e.count/3),r=new Map,i=this._buildWeldMap(e,t);for(let h=0;h<s;h++){const[p,_,g]=this._getTriangleIndices(e,h),m=i.get(p),f=i.get(_),v=i.get(g);this._pushEdge(r,m,f,h),this._pushEdge(r,f,v,h),this._pushEdge(r,v,m,h)}const n=new Map;for(let h=0;h<s;h++)n.set(h,new Set);for(const h of r.values())if(!(h.length<2))for(let p=0;p<h.length;p++)for(let _=0;_<h.length;_++)p!==_&&n.get(h[p])?.add(h[_]);const o=new Map;for(const[h,p]of n)o.set(h,Array.from(p));return o}_getTriangleIndices(e,t){return[e.getX(t*3),e.getX(t*3+1),e.getX(t*3+2)]}_readVertex(e,t){return new c.Vector3(e.getX(t),e.getY(t),e.getZ(t))}_vertexKey(e,t,s=1e-6){const r=Math.round(e.getX(t)/s),i=Math.round(e.getY(t)/s),n=Math.round(e.getZ(t)/s);return`${r}_${i}_${n}`}_buildWeldMap(e,t){const s=new Map,r=new Map;let i=0;for(let n=0;n<e.count;n++){const o=e.getX(n);if(r.has(o))continue;const h=this._vertexKey(t,o);let p=s.get(h);p==null&&(p=i++,s.set(h,p)),r.set(o,p)}return r}_resetFaceProxyTransform(e){e.position.set(0,0,0),e.quaternion.identity(),e.scale.set(1,1,1),e.updateMatrixWorld(!0)}_buildFaceVertexGroups(e){const s=e.mesh.geometry.getAttribute("position"),r=1e-6,i=new c.Vector3,n=e.vertexIndices,o=[],h=new Map;for(const f of n){const v=this._readVertex(s,f),u=[];for(let M=0;M<s.count;M++)i.fromBufferAttribute(s,M),i.distanceToSquared(v)<r*r&&u.push(M);const b=o.length;o.push(u);for(const M of u)h.set(M,b)}const p=[];for(const f of e.proxyVertexMap){const v=h.get(f);p.push(v??-1)}const _=this._findChildLines(e.mesh),g=_?this._buildLineVertexGroups(e,_):void 0,m={vertexIndexGroups:o,proxyVertexMap:p};return _&&(m.lines=_),g&&(m.lineVertexIndexGroups=g),m}_findChildLines(e){for(const t of e.children)if(t.isLineSegments)return t;return null}_buildLineVertexGroups(e,t){const r=t.geometry.getAttribute("position"),n=e.mesh.geometry.getAttribute("position"),o=1e-6,h=new c.Vector3,p=t.matrixWorld,_=e.mesh.matrixWorld,g=[];for(const m of e.vertexIndices){const f=this._readVertex(n,m).applyMatrix4(_),v=[];for(let u=0;u<r.count;u++)h.fromBufferAttribute(r,u).applyMatrix4(p),h.distanceToSquared(f)<o*o&&v.push(u);g.push(v)}return g}};Ee=Ur([a.injectable(),Y(0,a.inject("ICameraApi")),Y(1,a.inject("ISceneApi")),Y(2,a.inject("IRaycastApi")),Y(3,a.inject("EditorStore"))],Ee);var Nr=Object.getOwnPropertyDescriptor,Xr=(e,t,s,r)=>{for(var i=r>1?void 0:r?Nr(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Ke=(e,t)=>(s,r)=>t(s,r,e);let Le=class{constructor(e,t){this._api=e,this._store=t}mode=d.SelectMode.Mesh;_hoveredMesh=null;_selectedMesh=null;_hoverColor=ue;_selectColor=_e;_origLineColors=new WeakMap;handle(e,t){if(this._api.setRaycastMode(this.mode),t===F.Hover){if(!e){this._hoveredMesh&&this._hoveredMesh!==this._selectedMesh&&this._restoreEdgesColor(this._hoveredMesh),this._hoveredMesh=null;return}const s=e.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(t===F.Click){if(!e){this._selectedMesh&&(this._restoreEdgesColor(this._selectedMesh),this._selectedMesh=null,this._store.setSelectedObject(null));return}const s=e.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,this._store.setSelectedObject(null)}dispose(){this.rollback()}_paintEdges(e,t){e.children.forEach(s=>{const r=s;if(r.isLineSegments&&r.material){const i=r.material;this._origLineColors.has(r)||this._origLineColors.set(r,i.color.clone()),i.color.setHex(t),i.needsUpdate=!0}})}_restoreEdgesColor(e){e.children.forEach(t=>{const s=t;if(s.isLineSegments&&s.material){const r=this._origLineColors.get(s);if(r){const i=s.material;i.color.copy(r),i.needsUpdate=!0}}})}};Le=Xr([a.injectable(),Ke(0,a.inject("IRaycastApi")),Ke(1,a.inject("EditorStore"))],Le);var qr=Object.getOwnPropertyDescriptor,Yr=(e,t,s,r)=>{for(var i=r>1?void 0:r?qr(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Z=(e,t)=>(s,r)=>t(s,r,e);let Ve=class{constructor(e,t,s,r){this._cameraApi=e,this._sceneApi=t,this._raycastApi=s,this._store=r,this._cameraApi.enableCameraLayer(V),this._hoverVertex=k(this._makeOverlayVertex(this._hoverColor)),this._selectVertex=k(this._makeOverlayVertex(this._selectColor)),this._sceneApi.addObject(this._hoverVertex,V),this._sceneApi.addObject(this._selectVertex,V)}mode=d.SelectMode.Vertex;_hovered=null;_selected=null;_hoverVertex;_selectVertex;_hoverColor=ue;_selectColor=_e;handle(e,t){if(this._raycastApi.setRaycastMode(this.mode),t===F.Hover){if(!e){this._hoverVertex.visible=!1,this._hovered=null;return}const s=e.intersection.object;if(!s?.isPoints)return;const r=s,i=e.intersection.index??-1;if(i<0)return;this._selected&&this._same({points:r,index:i},this._selected)?this._hoverVertex.visible=!1:(this._writeWorldVertex(this._hoverVertex,r,i),this._hoverVertex.visible=!0);return}if(t===F.Click){if(!e){this._selectVertex.visible=!1,this._selected=null,this._store.setSelectedObject(null);return}const s=e.intersection.object;if(!s?.isPoints)return;const r=s,i=e.intersection.index??-1;if(i<0)return;this._writeWorldVertex(this._selectVertex,r,i),this._centerVertexOnPoint(this._selectVertex,r,i),this._selectVertex.visible=!0,this._prepareVertexMetadata(r,i),this._store.setSelectedObject(this._selectVertex),this._selected={points:r,index:i},this._hovered&&this._same(this._hovered,this._selected)&&(this._hoverVertex.visible=!1);return}}rollback(){this._hoverVertex.visible=!1,this._selectVertex.visible=!1,this._hovered=this._selected=null,this._store.setSelectedObject(null)}dispose(){this.rollback(),this._sceneApi.removeFromScene(this._hoverVertex),this._sceneApi.removeFromScene(this._selectVertex),this._hoverVertex.geometry.dispose(),this._hoverVertex.material.dispose(),this._selectVertex.geometry.dispose(),this._selectVertex.material.dispose()}_makeOverlayVertex(e,t=Ft){const s=new c.BufferGeometry;s.setAttribute("position",new c.Float32BufferAttribute([0,0,0],3));const r=new c.PointsMaterial({color:e,size:t,sizeAttenuation:!1,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1}),i=new c.Points(s,r);return i.renderOrder=1e3,i.raycast=()=>{},i.layers.set(V),i.visible=!1,i}_writeWorldVertex(e,t,s){const r=t.geometry.getAttribute("position"),i=new c.Vector3(r.getX(s),r.getY(s),r.getZ(s)).applyMatrix4(t.matrixWorld),n=e.geometry.getAttribute("position");n.setXYZ(0,i.x,i.y,i.z),n.needsUpdate=!0}_same(e,t){return!!e&&!!t&&e.points===t.points&&e.index===t.index}_prepareVertexMetadata(e,t){const s=ct(e);if(!s)return;const r=e.geometry.getAttribute("position"),i=new c.Vector3(r.getX(t),r.getY(t),r.getZ(t)).applyMatrix4(e.matrixWorld),n=new c.Matrix4().copy(s.matrixWorld).invert(),o=i.clone().applyMatrix4(n),p=s.geometry.getAttribute("position"),_=1e-6,g=_*_,m=new c.Vector3,f=[];for(let b=0;b<p.count;b++)m.fromBufferAttribute(p,b),m.distanceToSquared(o)<g&&f.push(b);const v=s.children.find(b=>b?.isLineSegments);let u=[];if(v){const b=new c.Matrix4().copy(v.matrixWorld).invert(),M=i.clone().applyMatrix4(b),j=v.geometry.getAttribute("position"),A=new c.Vector3;for(let w=0;w<j.count;w++)A.fromBufferAttribute(j,w),A.distanceToSquared(M)<g&&u.push(w)}this._selectVertex.userData.vertexInfo={points:e,index:t,mesh:s,vertexIndices:f,lines:v??null,edgeVertexIndices:u}}_centerVertexOnPoint(e,t,s){const r=t.geometry.getAttribute("position"),i=new c.Vector3(r.getX(s),r.getY(s),r.getZ(s)).applyMatrix4(t.matrixWorld);e.position.copy(i);const n=e.geometry;let o=n.getAttribute("position");(!o||o.count<1)&&(n.setAttribute("position",new c.BufferAttribute(new Float32Array(3),3)),o=n.getAttribute("position")),o.setXYZ(0,0,0,0),o.needsUpdate=!0,e.quaternion.identity(),e.scale.set(1,1,1),e.updateMatrixWorld(!0)}};Ve=Yr([a.injectable(),Z(0,a.inject("ICameraApi")),Z(1,a.inject("ISceneApi")),Z(2,a.inject("IRaycastApi")),Z(3,a.inject("EditorStore"))],Ve);class ze{constructor(t,s){this.api=t,this.store=s,this._unsubscribeTransform=this.api.onTransformChange(()=>{this.store.getSelectedObject()&&this.store.notifySelectedTransformChange?.()})}_unsubscribeTransform;handle(){const t=this.store.getSelectedObject();this.api.setTransformMode(this.mode),t?this.api.attachTransform(t):this.api.detachTransform()}rollback(){this.api.detachTransform()}dispose(){this.rollback(),this._unsubscribeTransform&&this._unsubscribeTransform()}}var Zr=Object.getOwnPropertyDescriptor,Kr=(e,t,s,r)=>{for(var i=r>1?void 0:r?Zr(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Je=(e,t)=>(s,r)=>t(s,r,e);let De=class extends ze{mode=d.ToolType.Rotate;constructor(e,t){super(e,t)}};De=Kr([a.injectable(),Je(0,a.inject("ITransformApi")),Je(1,a.inject("EditorStore"))],De);var Jr=Object.getOwnPropertyDescriptor,Qr=(e,t,s,r)=>{for(var i=r>1?void 0:r?Jr(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},Qe=(e,t)=>(s,r)=>t(s,r,e);let Fe=class extends ze{mode=d.ToolType.Scale;constructor(e,t){super(e,t)}};Fe=Qr([a.injectable(),Qe(0,a.inject("ITransformApi")),Qe(1,a.inject("EditorStore"))],Fe);var es=Object.getOwnPropertyDescriptor,ts=(e,t,s,r)=>{for(var i=r>1?void 0:r?es(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},et=(e,t)=>(s,r)=>t(s,r,e);let Re=class extends ze{mode=d.ToolType.Translate;constructor(e,t){super(e,t)}};Re=ts([a.injectable(),et(0,a.inject("ITransformApi")),et(1,a.inject("EditorStore"))],Re);var rs=Object.getOwnPropertyDescriptor,ss=(e,t,s,r)=>{for(var i=r>1?void 0:r?rs(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},is=(e,t)=>(s,r)=>t(s,r,e);let ae=class{constructor(e){this._api=e}mode=d.SceneMode.AddFigure;_lastAddedMesh=null;handle(e){const t=Dt[e](),s=t.getAttribute("position");s&&s.setUsage&&s.setUsage(c.DynamicDrawUsage);const r=new c.Mesh(t,ot.clone());r.layers.enable($);const i=t.index?t.toNonIndexed():t,n=B(dt(i));n.layers.enable($),r.add(n);const o=B(ht(i));o.layers.enable($),r.add(o),this._api.addMesh(r),this._lastAddedMesh=r}rollback(){this._lastAddedMesh!==null&&(this._api.removeMesh(this._lastAddedMesh),this._lastAddedMesh=null)}dispose(){this._lastAddedMesh=null}};ae=ss([a.injectable(),is(0,a.inject("IMeshApi"))],ae);var ns=Object.getOwnPropertyDescriptor,os=(e,t,s,r)=>{for(var i=r>1?void 0:r?ns(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},tt=(e,t)=>(s,r)=>t(s,r,e);let He=class{constructor(e,t){this._api=e,this._store=t}mode=d.SceneMode.DeleteFigure;_lastDeletedMesh=null;handle(){const e=this._store.getSelectedObject();ke(e)&&!_t(e)&&(this._api.removeMesh(e),this._store.setSelectedObject(null),this._lastDeletedMesh=e)}rollback(){this._lastDeletedMesh&&(this._api.addMesh(this._lastDeletedMesh),this._lastDeletedMesh=null)}dispose(){this._lastDeletedMesh=null}};He=os([a.injectable(),tt(0,a.inject("IMeshApi")),tt(1,a.inject("EditorStore"))],He);class as{parse(t){let s="",r=0,i=0,n=0;const o=new y.Vector3,h=new y.Color,p=new y.Vector3,_=new y.Vector2,g=[];function m(u){let b=0,M=0,j=0;const A=u.geometry,w=new y.Matrix3,S=A.getAttribute("position"),C=A.getAttribute("normal"),x=A.getAttribute("uv"),I=A.getIndex();if(s+="o "+u.name+`
7
+ `,u.material&&u.material.name&&(s+="usemtl "+u.material.name+`
8
+ `),S!==void 0)for(let O=0,T=S.count;O<T;O++,b++)o.fromBufferAttribute(S,O),o.applyMatrix4(u.matrixWorld),s+="v "+o.x+" "+o.y+" "+o.z+`
9
+ `;if(x!==void 0)for(let O=0,T=x.count;O<T;O++,j++)_.fromBufferAttribute(x,O),s+="vt "+_.x+" "+_.y+`
10
+ `;if(C!==void 0){w.getNormalMatrix(u.matrixWorld);for(let O=0,T=C.count;O<T;O++,M++)p.fromBufferAttribute(C,O),p.applyMatrix3(w).normalize(),s+="vn "+p.x+" "+p.y+" "+p.z+`
11
+ `}if(I!==null)for(let O=0,T=I.count;O<T;O+=3){for(let E=0;E<3;E++){const R=I.getX(O+E)+1;g[E]=r+R+(C||x?"/"+(x?i+R:"")+(C?"/"+(n+R):""):"")}s+="f "+g.join(" ")+`
12
+ `}else for(let O=0,T=S.count;O<T;O+=3){for(let E=0;E<3;E++){const R=O+E+1;g[E]=r+R+(C||x?"/"+(x?i+R:"")+(C?"/"+(n+R):""):"")}s+="f "+g.join(" ")+`
13
+ `}r+=b,i+=j,n+=M}function f(u){let b=0;const M=u.geometry,j=u.type,A=M.getAttribute("position");if(s+="o "+u.name+`
14
+ `,A!==void 0)for(let w=0,S=A.count;w<S;w++,b++)o.fromBufferAttribute(A,w),o.applyMatrix4(u.matrixWorld),s+="v "+o.x+" "+o.y+" "+o.z+`
15
+ `;if(j==="Line"){s+="l ";for(let w=1,S=A.count;w<=S;w++)s+=r+w+" ";s+=`
16
+ `}if(j==="LineSegments")for(let w=1,S=w+1,C=A.count;w<C;w+=2,S=w+1)s+="l "+(r+w)+" "+(r+S)+`
17
+ `;r+=b}function v(u){let b=0;const M=u.geometry,j=M.getAttribute("position"),A=M.getAttribute("color");if(s+="o "+u.name+`
18
+ `,j!==void 0){for(let w=0,S=j.count;w<S;w++,b++)o.fromBufferAttribute(j,w),o.applyMatrix4(u.matrixWorld),s+="v "+o.x+" "+o.y+" "+o.z,A!==void 0&&(h.fromBufferAttribute(A,w),y.ColorManagement.workingToColorSpace(h,y.SRGBColorSpace),s+=" "+h.r+" "+h.g+" "+h.b),s+=`
19
+ `;s+="p ";for(let w=1,S=j.count;w<=S;w++)s+=r+w+" ";s+=`
20
+ `}r+=b}return t.traverse(function(u){u.isMesh===!0&&m(u),u.isLine===!0&&f(u),u.isPoints===!0&&v(u)}),s}}var ls=Object.getOwnPropertyDescriptor,cs=(e,t,s,r)=>{for(var i=r>1?void 0:r?ls(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},rt=(e,t)=>(s,r)=>t(s,r,e);let le=class{constructor(e,t){this._api=e,this._exportStore=t}mode=d.SceneMode.Export;handle(){const e=this._api.getScene(),t=zt(e),r=new as().parse(t),i=Date.now();this._exportStore.setResult({format:"obj",filename:`scene-${i}.obj`,mimeType:"text/plain;charset=utf-8",content:r,createdAt:i})}rollback(){}dispose(){this._exportStore.clearResult()}};le=cs([a.injectable(),rt(0,a.inject("ISceneApi")),rt(1,a.inject("ExportStore"))],le);var hs=Object.defineProperty,ds=Object.getOwnPropertyDescriptor,vt=(e,t,s,r)=>{for(var i=r>1?void 0:r?ds(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=(r?o(t,s,i):o(i))||i);return r&&i&&hs(t,s,i),i},st=(e,t)=>(s,r)=>t(s,r,e);let W=class{constructor(e,t){this._api=e,this._validator=t}mode=d.SceneMode.Load;handle(e){const t=[...this._api.getMeshes()];this._api.removeMeshes(t);const s=pt(e);this._api.addMeshes(s)}rollback(){}dispose(){}};vt([gt(e=>e._validator)],W.prototype,"handle",1);W=vt([a.injectable(),st(0,a.inject("IMeshApi")),st(1,a.inject("ObjValidator"))],W);var us=Object.defineProperty,_s=Object.getOwnPropertyDescriptor,bt=(e,t,s,r)=>{for(var i=r>1?void 0:r?_s(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=(r?o(t,s,i):o(i))||i);return r&&i&&us(t,s,i),i},it=(e,t)=>(s,r)=>t(s,r,e);let U=class{constructor(e,t){this._api=e,this._validator=t}mode=d.SceneMode.LoadFigure;handle(e){const t=pt(e);this._api.addMeshes(t)}rollback(){}dispose(){}};bt([gt(e=>e._validator)],U.prototype,"handle",1);U=bt([a.injectable(),it(0,a.inject("IMeshApi")),it(1,a.inject("ObjValidator"))],U);var ps=Object.getOwnPropertyDescriptor,ms=(e,t,s,r)=>{for(var i=r>1?void 0:r?ps(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},G=(e,t)=>(s,r)=>t(s,r,e);exports.EditorHub=class{constructor(t,s,r,i,n){this._renderer=t,this._mediator=s,this._store=r,this._exportStore=i,this._controller=n,this.setSelectMode(d.SelectMode.Mesh),this.setToolMode(d.ToolType.Translate)}setDisplayMode(t){return this._mediator.send({type:P.Display,payload:[t]})}setSelectMode(t){return this._mediator.send({type:P.Select,payload:[t]})}setToolMode(t){return this._mediator.send({type:P.Tool,payload:[t]})}addFigure(t){return this._mediator.send({type:P.Scene,payload:[d.SceneMode.AddFigure,t]})}deleteFigure(){return this._mediator.send({type:P.Scene,payload:[d.SceneMode.DeleteFigure]})}loadFigure(t){return this._mediator.send({type:P.Scene,payload:[d.SceneMode.LoadFigure,t]})}loadScene(t){return this._mediator.send({type:P.Scene,payload:[d.SceneMode.Load,t]})}exportScene(){return this._exportStore.clearResult(),{response:this._mediator.send({type:P.Scene,payload:[d.SceneMode.Export]}),result:this._exportStore.getResult()}}resizeRenderer(){this._renderer.resize()}start(){this._controller.start()}stop(){this._controller.stop()}getSelectionStats(){return this._store.getSelectionStats()}onSelectionStatsChange(t){const s=this._store.onSelectedObjectChange(()=>{t()}),r=this._store.onSelectedTransformChange(()=>{t()});return()=>{s(),r()}}dispose(){this._mediator.dispose()}};exports.EditorHub=ms([a.injectable(),G(0,a.inject("Renderer")),G(1,a.inject("IMediator")),G(2,a.inject("EditorStore")),G(3,a.inject("ExportStore")),G(4,a.inject("IController"))],exports.EditorHub);var gs=Object.getOwnPropertyDescriptor,fs=(e,t,s,r)=>{for(var i=r>1?void 0:r?gs(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i};let $e=class{_selectMode=d.SelectMode.Mesh;_toolType=d.ToolType.Translate;_displayMode=d.DisplayMode.Plane;_selectedObject=null;_selectedListeners=new Set;_transformListeners=new Set;constructor(){ye.makeAutoObservable(this,{},{autoBind:!0})}getSelectMode(){return this._selectMode}getToolType(){return this._toolType}getDisplayMode(){return this._displayMode}setSelectMode(e){this._selectMode=e}setToolType(e){this._toolType=e}setDisplayMode(e){this._displayMode=e}getSelectedObject(){return this._selectedObject}getSelectionStats(){const e=this._selectedObject;return e?$t(e):null}setSelectedObject(e){if(this._selectedObject!==e){this._selectedObject=e;for(const t of this._selectedListeners)t(this._selectedObject)}}onSelectedObjectChange(e){return this._selectedListeners.add(e),()=>this._selectedListeners.delete(e)}onSelectedTransformChange(e){return this._transformListeners.add(e),()=>this._transformListeners.delete(e)}notifySelectedTransformChange(){for(const e of this._transformListeners)e()}};$e=fs([a.injectable()],$e);class yt{_result=null;constructor(){ye.makeAutoObservable(this,{_result:ye.observable.ref},{autoBind:!0})}get result(){return this._result}get hasResult(){return this._result!==null}setResult(t){this._result=t}getResult(){return this._result}clearResult(){this._result=null}}class Mt extends Error{constructor(t,s,r,i){super(s),this.type=t,this.code=r,this.meta=i,this.name=this._name}_name="PolicyException"}class K extends Error{constructor(t,s,r,i){super(s),this.type=t,this.code=r,this.meta=i,this.name=this._name}_name="ValidationException"}var vs=Object.getOwnPropertyDescriptor,bs=(e,t,s,r)=>{for(var i=r>1?void 0:r?vs(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},ys=(e,t)=>(s,r)=>t(s,r,e);let Be=class{constructor(e){this._store=e}check(e){const t=this._store.getSelectMode();if(!d.DEFAULT_TOOL_RULES[t].includes(e))throw new Mt(d.ResponseType.NotAllowed,`Tool ${e} is not allowed`,"TOOL_NOT_ALLOWED")}};Be=bs([a.injectable(),ys(0,a.inject("EditorStore"))],Be);class St{constructor(){}validate(t){const s=t.trim();if(!s)throw new K(d.ResponseType.ValidationError,"File content is empty.","FILE_CONTENT_EMPTY");if(!/^v\s+[-+.\deE]+\s+[-+.\deE]+\s+[-+.\deE]+/m.test(s))throw new K(d.ResponseType.ValidationError,"OBJ content does not contain vertices.","WRONG_FILE_CONTENT");if(!/^f\s+/m.test(s))throw new K(d.ResponseType.ValidationError,"OBJ content does not contain faces.","WRONG_FILE_CONTENT")}}var Ms=Object.getOwnPropertyDescriptor,Ss=(e,t,s,r)=>{for(var i=r>1?void 0:r?Ms(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i};let ce=class{handle(e){try{return e()}catch(t){return t instanceof Mt?{type:t.type,message:t.message,code:t.code,blocked:!0}:t instanceof K?{type:t.type,message:t.message,code:t.code,blocked:!0}:t instanceof Error?{type:d.ResponseType.Error,message:t.message,code:"UNHANDLED_EXCEPTION",blocked:!0}:{type:d.ResponseType.Error,message:"Unknown exception",code:"UNKNOWN_EXCEPTION",blocked:!0}}}};ce=Ss([a.injectable()],ce);var xs=Object.getOwnPropertyDescriptor,ws=(e,t,s,r)=>{for(var i=r>1?void 0:r?xs(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},nt=(e,t)=>(s,r)=>t(s,r,e);let he=class{constructor(e,t){this._middlewares=t,this._managers=new Map(e.map(s=>[s.type,s]))}_managers;send(e){const t=this._managers.get(e.type);if(!t)return{type:d.ResponseType.Error,message:`Manager for feature "${String(e.type)}" not found`,code:"MANAGER_NOT_FOUND",blocked:!0};const s=()=>(t.manage(...e.payload),null);return this._middlewares.reduceRight((i,n)=>()=>n.handle(i),s)()}dispose(){this._managers&&this._managers.clear()}};he=ws([a.injectable(),nt(0,a.injectAll("IManager")),nt(1,a.injectAll("IMiddleware"))],he);var As=Object.getOwnPropertyDescriptor,js=(e,t,s,r)=>{for(var i=r>1?void 0:r?As(t,s):t,n=e.length-1,o;n>=0;n--)(o=e[n])&&(i=o(i)||i);return i},be=(e,t)=>(s,r)=>t(s,r,e);exports.ViewerHub=class{constructor(t,s,r){this._renderer=t,this._mediator=s,this._controller=r}addFigure(t){return this._mediator.send({type:P.Scene,payload:[d.SceneMode.AddFigure,t]})}loadFigure(t){return this._mediator.send({type:P.Scene,payload:[d.SceneMode.LoadFigure,t]})}loadScene(t){return this._mediator.send({type:P.Scene,payload:[d.SceneMode.Load,t]})}resizeRenderer(){this._renderer.resize()}start(){this._controller.start()}stop(){this._controller.stop()}dispose(){this._mediator.dispose()}};exports.ViewerHub=js([a.injectable(),be(0,a.inject("Renderer")),be(1,a.inject("IMediator")),be(2,a.inject("IController"))],exports.ViewerHub);let de=!1;const l=a.container.createChildContainer();function Os(e,t){return de||(l.registerInstance("Canvas",e),l.registerInstance("RendererConfig",ut(mt,t)),l.registerSingleton("EventBus",exports.EventBus),l.registerSingleton("IController",Q),l.registerSingleton("Renderer",exports.Renderer),l.register("IRenderable",{useToken:"Renderer"}),l.register("IRendererAccess",{useToken:"Renderer"}),l.register("IRendererCameraAccess",{useToken:"Renderer"}),l.register("IRendererDomAccess",{useToken:"Renderer"}),l.register("IRendererSceneAccess",{useToken:"Renderer"}),l.registerSingleton("ToolPolicy",Be),l.registerSingleton("ObjValidator",St),l.registerSingleton("IMeshApi",ee),l.registerSingleton("IControlsStateApi",Me),l.registerSingleton("IRaycastApi",Se),l.registerSingleton("ITransformApi",xe),l.registerSingleton("ICameraApi",te),l.registerSingleton("IDomApi",re),l.registerSingleton("ISceneApi",se),l.registerSingleton("ControlsModule",ie),l.registerSingleton("GizmoModule",we),l.registerSingleton("RaycastModule",Ae),l.registerSingleton("SceneModule",je),l.register("IUpdatableModule",{useToken:"ControlsModule"}),l.register("IRenderableModule",{useToken:"GizmoModule"}),l.register("IRuntimeModule",{useToken:"RaycastModule"}),l.register("IRuntimeModule",{useToken:"SceneModule"}),l.registerSingleton("IDisplayHandler",Pe),l.registerSingleton("ISelectHandler",Le),l.registerSingleton("ISelectHandler",Ee),l.registerSingleton("ISelectHandler",Te),l.registerSingleton("ISelectHandler",Ve),l.registerSingleton("IToolHandler",Re),l.registerSingleton("IToolHandler",Fe),l.registerSingleton("IToolHandler",De),l.registerSingleton("ISceneHandler",ae),l.registerSingleton("ISceneHandler",He),l.registerSingleton("ISceneHandler",le),l.registerSingleton("ISceneHandler",U),l.registerSingleton("ISceneHandler",W),l.registerSingleton("DisplayManager",Ce),l.register("IDisplayManager",{useToken:"DisplayManager"}),l.register("IManager",{useToken:"DisplayManager"}),l.registerSingleton("SelectManager",Ie),l.register("ISelectManager",{useToken:"SelectManager"}),l.register("IManager",{useToken:"SelectManager"}),l.registerSingleton("ToolManager",oe),l.register("IToolManager",{useToken:"ToolManager"}),l.register("IManager",{useToken:"ToolManager"}),l.registerSingleton("SceneManager",ne),l.register("ISceneManager",{useToken:"SceneManager"}),l.register("IManager",{useToken:"SceneManager"}),l.registerSingleton("IMiddleware",ce),l.registerSingleton("IMediator",he),l.registerSingleton("EditorHub",exports.EditorHub),l.registerSingleton("EditorStore",$e),l.registerSingleton("ExportStore",yt),de=!0),l}function Cs(e,t){return de||(l.registerInstance("Canvas",e),l.registerInstance("RendererConfig",ut(mt,t)),l.registerSingleton("IController",Q),l.registerSingleton("Renderer",exports.Renderer),l.register("IRenderable",{useToken:"Renderer"}),l.register("IRendererAccess",{useToken:"Renderer"}),l.register("IRendererCameraAccess",{useToken:"Renderer"}),l.register("IRendererDomAccess",{useToken:"Renderer"}),l.register("IRendererSceneAccess",{useToken:"Renderer"}),l.registerSingleton("ObjValidator",St),l.registerSingleton("IMeshApi",ee),l.registerSingleton("ICameraApi",te),l.registerSingleton("IDomApi",re),l.registerSingleton("ISceneApi",se),l.registerSingleton("ControlsModule",ie),l.registerSingleton("SceneModule",Oe),l.register("IUpdatableModule",{useToken:"ControlsModule"}),l.register("IRuntimeModule",{useToken:"SceneModule"}),l.registerSingleton("ISceneHandler",ae),l.registerSingleton("ISceneHandler",le),l.registerSingleton("ISceneHandler",U),l.registerSingleton("ISceneHandler",W),l.registerSingleton("SceneManager",ne),l.register("ISceneManager",{useToken:"SceneManager"}),l.register("IManager",{useToken:"SceneManager"}),l.registerSingleton("IMiddleware",ce),l.registerSingleton("IMediator",he),l.registerSingleton("ViewerHub",exports.ViewerHub),l.registerSingleton("ExportStore",yt),de=!0),l}let D=null;const Is=(e,t)=>(D||(D=Os(e,t)),D.resolve("EditorHub")),Ps=()=>{if(!D)throw new Error("EditorHub is not initialized. Call createEditorHub(canvas) first.");return D.resolve("EditorHub")},Ts=(e,t)=>(D||(D=Cs(e,t)),D.resolve("ViewerHub")),Es=()=>{if(!D)throw new Error("ViewerHub is not initialized. Call createViewerHub(canvas) first.");return D.resolve("ViewerHub")};exports.EventTopics=H;exports.FeatureType=P;exports.ObjLoader=Ut;exports.createEditorHub=Is;exports.createViewerHub=Ts;exports.getEditorHub=Ps;exports.getViewerHub=Es;