@planara/core 2.8.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 (283) hide show
  1. package/README.md +5 -0
  2. package/dist/api/modules/controls-state-api.d.ts +23 -0
  3. package/dist/api/modules/controls-state-api.d.ts.map +1 -0
  4. package/dist/api/modules/index.d.ts +5 -0
  5. package/dist/api/modules/index.d.ts.map +1 -0
  6. package/dist/api/modules/mesh-api.d.ts +30 -0
  7. package/dist/api/modules/mesh-api.d.ts.map +1 -0
  8. package/dist/api/modules/raycast-api.d.ts +28 -0
  9. package/dist/api/modules/raycast-api.d.ts.map +1 -0
  10. package/dist/api/modules/transform-api.d.ts +33 -0
  11. package/dist/api/modules/transform-api.d.ts.map +1 -0
  12. package/dist/api/renderer/camera-api.d.ts +26 -0
  13. package/dist/api/renderer/camera-api.d.ts.map +1 -0
  14. package/dist/api/renderer/dom-api.d.ts +24 -0
  15. package/dist/api/renderer/dom-api.d.ts.map +1 -0
  16. package/dist/api/renderer/index.d.ts +4 -0
  17. package/dist/api/renderer/index.d.ts.map +1 -0
  18. package/dist/api/renderer/scene-api.d.ts +26 -0
  19. package/dist/api/renderer/scene-api.d.ts.map +1 -0
  20. package/dist/constants/colors.d.ts +12 -0
  21. package/dist/constants/colors.d.ts.map +1 -1
  22. package/dist/constants/figure-geometries.d.ts +55 -4
  23. package/dist/constants/figure-geometries.d.ts.map +1 -1
  24. package/dist/constants/index.d.ts +6 -0
  25. package/dist/constants/index.d.ts.map +1 -0
  26. package/dist/constants/layers.d.ts +12 -0
  27. package/dist/constants/layers.d.ts.map +1 -1
  28. package/dist/constants/messages.d.ts +18 -0
  29. package/dist/constants/messages.d.ts.map +1 -0
  30. package/dist/constants/threshold.d.ts +42 -2
  31. package/dist/constants/threshold.d.ts.map +1 -1
  32. package/dist/controllers/index.d.ts +2 -0
  33. package/dist/controllers/index.d.ts.map +1 -0
  34. package/dist/controllers/renderer-controller.d.ts +72 -0
  35. package/dist/controllers/renderer-controller.d.ts.map +1 -0
  36. package/dist/core/index.d.ts +2 -0
  37. package/dist/core/index.d.ts.map +1 -0
  38. package/dist/core/renderer.d.ts +105 -78
  39. package/dist/core/renderer.d.ts.map +1 -1
  40. package/dist/decorators/index.d.ts +3 -0
  41. package/dist/decorators/index.d.ts.map +1 -0
  42. package/dist/decorators/use-policy.d.ts +5 -0
  43. package/dist/decorators/use-policy.d.ts.map +1 -0
  44. package/dist/decorators/use-validator.d.ts +5 -0
  45. package/dist/decorators/use-validator.d.ts.map +1 -0
  46. package/dist/errors/index.d.ts +3 -0
  47. package/dist/errors/index.d.ts.map +1 -0
  48. package/dist/errors/policy-error.d.ts +9 -0
  49. package/dist/errors/policy-error.d.ts.map +1 -0
  50. package/dist/errors/validation-error.d.ts +9 -0
  51. package/dist/errors/validation-error.d.ts.map +1 -0
  52. package/dist/events/editor-events.d.ts +3 -7
  53. package/dist/events/editor-events.d.ts.map +1 -1
  54. package/dist/events/event-bus.d.ts +103 -6
  55. package/dist/events/event-bus.d.ts.map +1 -1
  56. package/dist/events/event-topics.d.ts +3 -3
  57. package/dist/events/event-topics.d.ts.map +1 -1
  58. package/dist/events/index.d.ts +4 -0
  59. package/dist/events/index.d.ts.map +1 -0
  60. package/dist/handlers/display/index.d.ts +2 -0
  61. package/dist/handlers/display/index.d.ts.map +1 -0
  62. package/dist/handlers/display/wireframe-handler.d.ts +4 -2
  63. package/dist/handlers/display/wireframe-handler.d.ts.map +1 -1
  64. package/dist/handlers/scene/add-figure-scene-handler.d.ts +4 -2
  65. package/dist/handlers/scene/add-figure-scene-handler.d.ts.map +1 -1
  66. package/dist/handlers/scene/delete-figure-scene-handler.d.ts +4 -4
  67. package/dist/handlers/scene/delete-figure-scene-handler.d.ts.map +1 -1
  68. package/dist/handlers/scene/export-scene-handler.d.ts +23 -0
  69. package/dist/handlers/scene/export-scene-handler.d.ts.map +1 -0
  70. package/dist/handlers/scene/index.d.ts +6 -0
  71. package/dist/handlers/scene/index.d.ts.map +1 -0
  72. package/dist/handlers/scene/load-figure-scene-handler.d.ts +23 -0
  73. package/dist/handlers/scene/load-figure-scene-handler.d.ts.map +1 -0
  74. package/dist/handlers/scene/load-scene-handler.d.ts +23 -0
  75. package/dist/handlers/scene/load-scene-handler.d.ts.map +1 -0
  76. package/dist/handlers/select/edge-select-handler.d.ts +11 -8
  77. package/dist/handlers/select/edge-select-handler.d.ts.map +1 -1
  78. package/dist/handlers/select/face-select-handler.d.ts +11 -8
  79. package/dist/handlers/select/face-select-handler.d.ts.map +1 -1
  80. package/dist/handlers/select/index.d.ts +5 -0
  81. package/dist/handlers/select/index.d.ts.map +1 -0
  82. package/dist/handlers/select/mesh-select-handler.d.ts +8 -7
  83. package/dist/handlers/select/mesh-select-handler.d.ts.map +1 -1
  84. package/dist/handlers/select/vertex-select-handler.d.ts +11 -8
  85. package/dist/handlers/select/vertex-select-handler.d.ts.map +1 -1
  86. package/dist/handlers/tool/base-tool-handler.d.ts +10 -7
  87. package/dist/handlers/tool/base-tool-handler.d.ts.map +1 -1
  88. package/dist/handlers/tool/index.d.ts +4 -0
  89. package/dist/handlers/tool/index.d.ts.map +1 -0
  90. package/dist/handlers/tool/rotate-tool-handler.d.ts +4 -3
  91. package/dist/handlers/tool/rotate-tool-handler.d.ts.map +1 -1
  92. package/dist/handlers/tool/scale-tool-handler.d.ts +4 -3
  93. package/dist/handlers/tool/scale-tool-handler.d.ts.map +1 -1
  94. package/dist/handlers/tool/translate-tool-handler.d.ts +4 -3
  95. package/dist/handlers/tool/translate-tool-handler.d.ts.map +1 -1
  96. package/dist/hub/editor-hub.d.ts +26 -18
  97. package/dist/hub/editor-hub.d.ts.map +1 -1
  98. package/dist/hub/index.d.ts +26 -0
  99. package/dist/hub/index.d.ts.map +1 -0
  100. package/dist/hub/viewer-hub.d.ts +30 -0
  101. package/dist/hub/viewer-hub.d.ts.map +1 -0
  102. package/dist/index.cjs.js +20 -2
  103. package/dist/index.d.ts +16 -9
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.es.js +2615 -1627
  106. package/dist/index.full.d.ts +650 -245
  107. package/dist/index.public.d.ts +665 -160
  108. package/dist/index.umd.js +20 -2
  109. package/dist/interfaces/api/camera-api.d.ts +64 -0
  110. package/dist/interfaces/api/camera-api.d.ts.map +1 -0
  111. package/dist/interfaces/api/controls-state-api.d.ts +63 -0
  112. package/dist/interfaces/api/controls-state-api.d.ts.map +1 -0
  113. package/dist/interfaces/api/dom-api.d.ts +49 -0
  114. package/dist/interfaces/api/dom-api.d.ts.map +1 -0
  115. package/dist/interfaces/api/index.d.ts +9 -0
  116. package/dist/interfaces/api/index.d.ts.map +1 -0
  117. package/dist/interfaces/api/mesh-api.d.ts +93 -12
  118. package/dist/interfaces/api/mesh-api.d.ts.map +1 -1
  119. package/dist/interfaces/api/raycast-api.d.ts +6 -1
  120. package/dist/interfaces/api/raycast-api.d.ts.map +1 -1
  121. package/dist/interfaces/api/renderer/index.d.ts +6 -0
  122. package/dist/interfaces/api/renderer/index.d.ts.map +1 -0
  123. package/dist/interfaces/api/renderer/renderable.d.ts +45 -0
  124. package/dist/interfaces/api/renderer/renderable.d.ts.map +1 -0
  125. package/dist/interfaces/api/renderer/renderer-access.d.ts +34 -0
  126. package/dist/interfaces/api/renderer/renderer-access.d.ts.map +1 -0
  127. package/dist/interfaces/api/renderer/renderer-camera-access.d.ts +37 -0
  128. package/dist/interfaces/api/renderer/renderer-camera-access.d.ts.map +1 -0
  129. package/dist/interfaces/api/renderer/renderer-dom-access.d.ts +51 -0
  130. package/dist/interfaces/api/renderer/renderer-dom-access.d.ts.map +1 -0
  131. package/dist/interfaces/api/renderer/renderer-scene-access.d.ts +45 -0
  132. package/dist/interfaces/api/renderer/renderer-scene-access.d.ts.map +1 -0
  133. package/dist/interfaces/api/renderer-api.d.ts +35 -0
  134. package/dist/interfaces/api/renderer-api.d.ts.map +1 -0
  135. package/dist/interfaces/api/scene-api.d.ts +66 -26
  136. package/dist/interfaces/api/scene-api.d.ts.map +1 -1
  137. package/dist/interfaces/api/transform-api.d.ts +120 -0
  138. package/dist/interfaces/api/transform-api.d.ts.map +1 -0
  139. package/dist/interfaces/command/index.d.ts +9 -0
  140. package/dist/interfaces/command/index.d.ts.map +1 -0
  141. package/dist/interfaces/controller/index.d.ts +38 -0
  142. package/dist/interfaces/controller/index.d.ts.map +1 -0
  143. package/dist/interfaces/handler/display-handler.d.ts +9 -1
  144. package/dist/interfaces/handler/display-handler.d.ts.map +1 -1
  145. package/dist/interfaces/handler/handler.d.ts +2 -0
  146. package/dist/interfaces/handler/handler.d.ts.map +1 -1
  147. package/dist/interfaces/handler/index.d.ts +6 -0
  148. package/dist/interfaces/handler/index.d.ts.map +1 -0
  149. package/dist/interfaces/handler/scene-handler.d.ts +1 -0
  150. package/dist/interfaces/handler/scene-handler.d.ts.map +1 -1
  151. package/dist/interfaces/handler/select-handler.d.ts +1 -0
  152. package/dist/interfaces/handler/select-handler.d.ts.map +1 -1
  153. package/dist/interfaces/handler/tool-handler.d.ts +1 -0
  154. package/dist/interfaces/handler/tool-handler.d.ts.map +1 -1
  155. package/dist/interfaces/manager/display-manager.d.ts +3 -1
  156. package/dist/interfaces/manager/display-manager.d.ts.map +1 -1
  157. package/dist/interfaces/manager/index.d.ts +6 -0
  158. package/dist/interfaces/manager/index.d.ts.map +1 -0
  159. package/dist/interfaces/manager/manager.d.ts +12 -1
  160. package/dist/interfaces/manager/manager.d.ts.map +1 -1
  161. package/dist/interfaces/manager/scene-manager.d.ts +3 -1
  162. package/dist/interfaces/manager/scene-manager.d.ts.map +1 -1
  163. package/dist/interfaces/manager/select-manager.d.ts +3 -1
  164. package/dist/interfaces/manager/select-manager.d.ts.map +1 -1
  165. package/dist/interfaces/manager/tool-manager.d.ts +3 -1
  166. package/dist/interfaces/manager/tool-manager.d.ts.map +1 -1
  167. package/dist/interfaces/mediator/index.d.ts +51 -0
  168. package/dist/interfaces/mediator/index.d.ts.map +1 -0
  169. package/dist/interfaces/middleware/index.d.ts +50 -0
  170. package/dist/interfaces/middleware/index.d.ts.map +1 -0
  171. package/dist/interfaces/module/index.d.ts +4 -0
  172. package/dist/interfaces/module/index.d.ts.map +1 -0
  173. package/dist/interfaces/module/renderable-module.d.ts +27 -0
  174. package/dist/interfaces/module/renderable-module.d.ts.map +1 -0
  175. package/dist/interfaces/module/runtime-module.d.ts +54 -0
  176. package/dist/interfaces/module/runtime-module.d.ts.map +1 -0
  177. package/dist/interfaces/module/updatable-module.d.ts +48 -0
  178. package/dist/interfaces/module/updatable-module.d.ts.map +1 -0
  179. package/dist/interfaces/policy/index.d.ts +21 -0
  180. package/dist/interfaces/policy/index.d.ts.map +1 -0
  181. package/dist/interfaces/store/display-store.d.ts +21 -0
  182. package/dist/interfaces/store/display-store.d.ts.map +1 -0
  183. package/dist/interfaces/store/export-store.d.ts +8 -0
  184. package/dist/interfaces/store/export-store.d.ts.map +1 -0
  185. package/dist/interfaces/store/index.d.ts +6 -0
  186. package/dist/interfaces/store/index.d.ts.map +1 -0
  187. package/dist/interfaces/store/select-store.d.ts +44 -0
  188. package/dist/interfaces/store/select-store.d.ts.map +1 -0
  189. package/dist/interfaces/store/tool-store.d.ts +27 -0
  190. package/dist/interfaces/store/tool-store.d.ts.map +1 -0
  191. package/dist/interfaces/store/transform-store.d.ts +11 -0
  192. package/dist/interfaces/store/transform-store.d.ts.map +1 -0
  193. package/dist/interfaces/validator/index.d.ts +21 -0
  194. package/dist/interfaces/validator/index.d.ts.map +1 -0
  195. package/dist/ioc/container.d.ts +3 -1
  196. package/dist/ioc/container.d.ts.map +1 -1
  197. package/dist/managers/display/display-manager.d.ts +7 -4
  198. package/dist/managers/display/display-manager.d.ts.map +1 -1
  199. package/dist/managers/display/index.d.ts +2 -0
  200. package/dist/managers/display/index.d.ts.map +1 -0
  201. package/dist/managers/index.d.ts +5 -0
  202. package/dist/managers/index.d.ts.map +1 -0
  203. package/dist/managers/scene/index.d.ts +2 -0
  204. package/dist/managers/scene/index.d.ts.map +1 -0
  205. package/dist/managers/scene/scene-manager.d.ts +7 -4
  206. package/dist/managers/scene/scene-manager.d.ts.map +1 -1
  207. package/dist/managers/select/index.d.ts +2 -0
  208. package/dist/managers/select/index.d.ts.map +1 -0
  209. package/dist/managers/select/select-manager.d.ts +8 -5
  210. package/dist/managers/select/select-manager.d.ts.map +1 -1
  211. package/dist/managers/tool/index.d.ts +2 -0
  212. package/dist/managers/tool/index.d.ts.map +1 -0
  213. package/dist/managers/tool/tool-manager.d.ts +9 -6
  214. package/dist/managers/tool/tool-manager.d.ts.map +1 -1
  215. package/dist/mediator/index.d.ts +14 -0
  216. package/dist/mediator/index.d.ts.map +1 -0
  217. package/dist/middlewares/exception-middleware.d.ts +12 -0
  218. package/dist/middlewares/exception-middleware.d.ts.map +1 -0
  219. package/dist/middlewares/index.d.ts +2 -0
  220. package/dist/middlewares/index.d.ts.map +1 -0
  221. package/dist/modules/controls-module.d.ts +60 -0
  222. package/dist/modules/controls-module.d.ts.map +1 -0
  223. package/dist/modules/gizmo-module.d.ts +32 -0
  224. package/dist/modules/gizmo-module.d.ts.map +1 -0
  225. package/dist/modules/index.d.ts +6 -0
  226. package/dist/modules/index.d.ts.map +1 -0
  227. package/dist/modules/raycast-module.d.ts +87 -0
  228. package/dist/modules/raycast-module.d.ts.map +1 -0
  229. package/dist/modules/scene-module.d.ts +31 -0
  230. package/dist/modules/scene-module.d.ts.map +1 -0
  231. package/dist/modules/scene-preview-module.d.ts +26 -0
  232. package/dist/modules/scene-preview-module.d.ts.map +1 -0
  233. package/dist/policy/index.d.ts +2 -0
  234. package/dist/policy/index.d.ts.map +1 -0
  235. package/dist/policy/tool-policy.d.ts +18 -0
  236. package/dist/policy/tool-policy.d.ts.map +1 -0
  237. package/dist/store/editor-store.d.ts +33 -0
  238. package/dist/store/editor-store.d.ts.map +1 -0
  239. package/dist/store/export-store.d.ts +12 -0
  240. package/dist/store/export-store.d.ts.map +1 -0
  241. package/dist/store/index.d.ts +2 -45
  242. package/dist/store/index.d.ts.map +1 -1
  243. package/dist/types/camera/index.d.ts +2 -0
  244. package/dist/types/camera/index.d.ts.map +1 -0
  245. package/dist/types/event/index.d.ts +2 -0
  246. package/dist/types/event/index.d.ts.map +1 -0
  247. package/dist/types/feature/feature-type.d.ts +16 -0
  248. package/dist/types/feature/feature-type.d.ts.map +1 -0
  249. package/dist/types/feature/index.d.ts +2 -0
  250. package/dist/types/feature/index.d.ts.map +1 -0
  251. package/dist/types/listener/index.d.ts +3 -0
  252. package/dist/types/listener/index.d.ts.map +1 -0
  253. package/dist/types/select/index.d.ts +2 -0
  254. package/dist/types/select/index.d.ts.map +1 -0
  255. package/dist/utils/default-renderer-config.d.ts +9 -0
  256. package/dist/utils/default-renderer-config.d.ts.map +1 -0
  257. package/dist/utils/helpers.d.ts +14 -1
  258. package/dist/utils/helpers.d.ts.map +1 -1
  259. package/dist/utils/index.d.ts +3 -0
  260. package/dist/utils/index.d.ts.map +1 -0
  261. package/dist/validators/index.d.ts +2 -0
  262. package/dist/validators/index.d.ts.map +1 -0
  263. package/dist/validators/obj-validator.d.ts +12 -0
  264. package/dist/validators/obj-validator.d.ts.map +1 -0
  265. package/package.json +2 -2
  266. package/dist/core/editor-renderer.d.ts +0 -89
  267. package/dist/core/editor-renderer.d.ts.map +0 -1
  268. package/dist/core/preview-renderer.d.ts +0 -16
  269. package/dist/core/preview-renderer.d.ts.map +0 -1
  270. package/dist/hub/app-hub.d.ts +0 -13
  271. package/dist/hub/app-hub.d.ts.map +0 -1
  272. package/dist/interfaces/api/transform-helpers-api.d.ts +0 -26
  273. package/dist/interfaces/api/transform-helpers-api.d.ts.map +0 -1
  274. package/dist/interfaces/policy/tool-availability-policy.d.ts +0 -12
  275. package/dist/interfaces/policy/tool-availability-policy.d.ts.map +0 -1
  276. package/dist/interfaces/store/editor-store.d.ts +0 -52
  277. package/dist/interfaces/store/editor-store.d.ts.map +0 -1
  278. package/dist/policy/tool-availability-policy.d.ts +0 -13
  279. package/dist/policy/tool-availability-policy.d.ts.map +0 -1
  280. package/dist/types/api/editor-api.d.ts +0 -4
  281. package/dist/types/api/editor-api.d.ts.map +0 -1
  282. package/dist/utils/renderer-api.d.ts +0 -43
  283. package/dist/utils/renderer-api.d.ts.map +0 -1
@@ -1,9 +1,13 @@
1
1
  import { DisplayMode } from '@planara/types';
2
2
  import { Disposable as Disposable_2 } from 'tsyringe';
3
+ import { ExportResult } from '@planara/types';
4
+ import { ExportSceneResult } from '@planara/types';
3
5
  import { Figure } from '@planara/types';
4
6
  import { FigureTransform } from '@planara/types';
5
7
  import { FigureType } from '@planara/types';
6
- import { SceneMode } from '@planara/types';
8
+ import { IResponse } from '@planara/types';
9
+ import { RendererConfig } from '@planara/types';
10
+ import { RendererConfigInput } from '@planara/types';
7
11
  import { SelectMode } from '@planara/types';
8
12
  import * as THREE from 'three';
9
13
  import { ToolType } from '@planara/types';
@@ -23,12 +27,21 @@ export declare type CameraPosition = {
23
27
  * Вызывать один раз при старте (когда есть canvas).
24
28
  * @public
25
29
  */
26
- export declare const createAppHub: (canvas: HTMLCanvasElement) => EditorHub;
30
+ export declare const createEditorHub: (canvas: HTMLCanvasElement, rendererConfig?: RendererConfigInput) => EditorHub;
31
+
32
+ /**
33
+ * Инициализирует вьювер и возвращает хаб.
34
+ * Вызывать один раз при старте (когда есть canvas).
35
+ * @public
36
+ */
37
+ export declare const createViewerHub: (canvas: HTMLCanvasElement, rendererConfig?: RendererConfigInput) => ViewerHub;
27
38
 
28
39
  /**
29
40
  * Типы событий редактора.
30
41
  * Используются в EventEmitter для типизированной публикации и подписки на события.
42
+ *
31
43
  * @public
44
+ * @type
32
45
  */
33
46
  export declare type EditorEvents = {
34
47
  /** Событие наведения на объект (hover). Payload: объект с пересечениями или null */
@@ -39,11 +52,6 @@ export declare type EditorEvents = {
39
52
  [EventTopics.SelectClick]: {
40
53
  intersection: THREE.Intersection;
41
54
  } | null;
42
- /** Событие выбора объекта для редактирования. Payload: выбранный режим выборки */
43
- [EventTopics.ToolSelect]: {
44
- mode: SelectMode;
45
- mesh: THREE.Object3D | null;
46
- };
47
55
  };
48
56
 
49
57
  /**
@@ -51,180 +59,544 @@ export declare type EditorEvents = {
51
59
  * @public
52
60
  */
53
61
  export declare class EditorHub implements Disposable_2 {
54
- private _displayManager;
55
- private _selectManager;
56
- private _toolManager;
57
- private _sceneManager;
58
62
  private _renderer;
63
+ private _mediator;
59
64
  private _store;
60
- constructor(_displayManager: IDisplayManager, _selectManager: ISelectManager, _toolManager: IToolManager, _sceneManager: ISceneManager, _renderer: EditorRenderer, _store: IEditorStore);
61
- setDisplayMode(mode: DisplayMode): void;
62
- setSceneMode(sceneMode: SceneMode): void;
63
- setSelectMode(mode: SelectMode): void;
64
- setToolMode(mode: ToolType): void;
65
+ private _exportStore;
66
+ private _controller;
67
+ constructor(_renderer: Renderer, _mediator: IMediator, _store: ITransformStore, _exportStore: IExportStore, _controller: IController);
68
+ setDisplayMode(mode: DisplayMode): IResponse | null;
69
+ setSelectMode(mode: SelectMode): IResponse | null;
70
+ setToolMode(mode: ToolType): IResponse | null;
71
+ addFigure(figure: FigureType): IResponse | null;
72
+ deleteFigure(): IResponse | null;
73
+ loadFigure(content: string): IResponse | null;
74
+ loadScene(content: string): IResponse | null;
75
+ exportScene(): ExportSceneResult;
65
76
  resizeRenderer(): void;
66
- updateRenderer(): void;
67
- addFigure(mode: SceneMode, figure: FigureType): void;
77
+ /**
78
+ * Запускает редактор.
79
+ * Вызывается после создания хаба.
80
+ */
81
+ start(): void;
82
+ /**
83
+ * Останавливает редактор.
84
+ */
85
+ stop(): void;
68
86
  getSelectionStats(): FigureTransform | null;
69
87
  onSelectionStatsChange(listener: () => void): () => void;
70
88
  dispose(): Promise<void> | void;
71
89
  }
72
90
 
73
91
  /**
74
- * Рендерер для редактора.
75
- * Добавляет сетку, оси координат и поддержку Orbit для управления камерой.
76
- * Наследуется от базового Renderer.
77
- * @public
78
- */
79
- export declare class EditorRenderer extends Renderer {
80
- private _canvas;
81
- private _bus;
82
- /** Orbit-контроллер для управления камерой */
83
- private _orbit;
84
- /** Transform-контроллер для редактирования */
85
- private _transform;
86
- private readonly _transformHelper;
87
- /** Raycast для получения событий наведения/клика по модели*/
88
- private readonly _raycaster;
89
- /** Курсор мыши */
90
- private readonly _mouse;
91
- /** Были ли инициализированы обработчики событий (hover/click) */
92
- private _isEventListenersAdded;
93
- /**
94
- * Ключ последней модели, на которую наводились,
95
- * необходима для отправки только уникальных событий в event bus
96
- */
97
- private _lastHoverKey;
98
- private _currentRaycastMode;
99
- /** Gizmo для управления отображением perspective camera */
100
- private _cameraGizmo;
101
- private _transformListeners;
102
- constructor(_canvas: HTMLCanvasElement, _bus: EventBus);
103
- /**
104
- * Обновление состояния рендерера.
105
- */
106
- protected update(): void;
107
- /** Добавление фигуры на сцену */
108
- addFigure(figure: Figure): THREE.Mesh<THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>, THREE.Material | THREE.Material[], THREE.Object3DEventMap>;
109
- /**
110
- * Смена отображения `TransformControls` в зависимости от типа инструмента.
111
- * @param mode - тип инструмента для отображения `TransformControls`.
112
- * @internal
113
- */
114
- setTransformControlsMode(mode: ToolType): void;
115
- /**
116
- * Добавление `TransformControls` к объекту.
117
- * @param object - объект, к которому добавляются `TransformControls`.
118
- * @internal
119
- */
120
- attachTransformControls(object: THREE.Object3D): void;
121
- /**
122
- * Удаление `TransformControls` с последнего выбранного объекта.
123
- * @internal
124
- */
125
- detachTransformControls(): void;
126
- /**
127
- * Подписывает слушателя на изменения трансформации текущего объекта.
128
- * @internal
129
- */
130
- onTransformChange(cb: TransformListener): () => void;
131
- /**
132
- * Настройка режимов для `Raycaster`.
133
- * @internal
134
- */
135
- setRaycastMode(mode: SelectMode): void;
136
- dispose(): void;
137
- protected render(): void;
138
- /** Инициализация обработчиков событий на hover/click */
139
- private _initMouseListeners;
140
- /** Обработчик события для hover */
141
- private _handleMouseMove;
142
- /** Обработчик события на click */
143
- private _handleMouseClick;
144
- /** Возвращает ближайшее пересечение по текущему положению курсора */
145
- private _getHitIntersection;
146
- private _handleDoubleClick;
147
- /** Вспомогательный метод для получения модели, которую выбрали и отправки события в event bus */
148
- private _processRaycastEvent;
149
- /** Поиск видимой части меша
150
- * необходимо это для того, чтобы отправлять только видимые элементы модели, а не все попадания
151
- */
152
- private _getVisibleHit;
153
- /** Строит ключ hover-пересечения с учетом текущего режима выборки */
154
- private _makeHoverKey;
155
- }
156
-
157
- /**
158
- * Событийная шина редактора с топиками.
159
- * Используется для publish/subscribe без прямых зависимостей.
92
+ * Событийная шина редактора с типизированными топиками.
93
+ *
94
+ * @remarks
95
+ * Реализует паттерн Publish/Subscribe для слабой связи между компонентами.
96
+ *
97
+ * **Особенности:**
98
+ * - Полная типобезопасность через дженерики (`EditorEvents`)
99
+ * - Отсутствие прямых зависимостей между отправителем и получателем
100
+ * - Централизованное управление событиями
101
+ *
102
+ * **Где используется:**
103
+ * - `RaycasterModule` — публикует события выделения (`SelectHover`, `SelectClick`)
104
+ * - `SelectManager` — подписывается на события выделения
105
+ *
106
+ * @see {@link EditorEvents} - типы событий
107
+ * @see {@link EventTopics} - доступные топики
108
+ *
160
109
  * @public
110
+ * @class
161
111
  */
162
112
  export declare class EventBus {
113
+ /**
114
+ * Внутренний эмиттер событий Node.js.
115
+ *
116
+ * @private
117
+ * @member
118
+ */
163
119
  private _emitter;
120
+ /** @constructor */
164
121
  constructor();
165
- /** Публикация события */
122
+ /**
123
+ * Публикует событие в шину.
124
+ *
125
+ * @param event - название события (из `EventTopics`)
126
+ * @param payload - данные события (тип зависит от события)
127
+ *
128
+ * @typeParam K - ключ события из `EditorEvents`
129
+ *
130
+ * @remarks
131
+ * Все подписчики, зарегистрированные на это событие, получат payload.
132
+ *
133
+ * @example
134
+ * ```typescript
135
+ * // Публикация события клика
136
+ * eventBus.emit(EventTopics.SelectClick, { intersection: hit });
137
+ *
138
+ * // Публикация события сброса выделения
139
+ * eventBus.emit(EventTopics.SelectClick, null);
140
+ * ```
141
+ *
142
+ * @public
143
+ * @method
144
+ */
166
145
  emit<K extends keyof EditorEvents>(event: K, payload: EditorEvents[K]): void;
167
- /** Подписка на событие */
146
+ /**
147
+ * Подписывается на событие.
148
+ *
149
+ * @param event - название события (из `EventTopics`)
150
+ * @param listener - функция-обработчик, получающая payload
151
+ *
152
+ * @typeParam K - ключ события из `EditorEvents`
153
+ *
154
+ * @remarks
155
+ * **Важно:** для предотвращения утечек памяти необходимо отписываться от событий
156
+ * в `dispose()` методах компонентов.
157
+ *
158
+ * @example
159
+ * ```typescript
160
+ * // Подписка на событие hover
161
+ * this._eventBus.on(EventTopics.SelectHover, (payload) => {
162
+ * if (payload) {
163
+ * this._handleHover(payload.intersection);
164
+ * } else {
165
+ * this._clearHover();
166
+ * }
167
+ * });
168
+ * ```
169
+ *
170
+ * @public
171
+ * @method
172
+ */
168
173
  on<K extends keyof EditorEvents>(event: K, listener: (payload: EditorEvents[K]) => void): void;
169
- /** Отписка от события */
174
+ /**
175
+ * Отписывается от события.
176
+ *
177
+ * @param event - название события (из `EventTopics`)
178
+ * @param listener - функция-обработчик, которую нужно отписать
179
+ *
180
+ * @typeParam K - ключ события из `EditorEvents`
181
+ *
182
+ * @remarks
183
+ * Для корректной отписки необходимо передать ту же самую функцию,
184
+ * которая использовалась при подписке.
185
+ *
186
+ * @example
187
+ * ```typescript
188
+ * // Сохранение ссылки на обработчик
189
+ * private _handleClick = (payload) => { ... };
190
+ *
191
+ * // Подписка
192
+ * eventBus.on(EventTopics.SelectClick, this._handleClick);
193
+ *
194
+ * // Отписка (в dispose)
195
+ * eventBus.off(EventTopics.SelectClick, this._handleClick);
196
+ * ```
197
+ *
198
+ * @public
199
+ * @method
200
+ */
170
201
  off<K extends keyof EditorEvents>(event: K, listener: (payload: EditorEvents[K]) => void): void;
171
202
  }
172
203
 
173
204
  /**
174
205
  * Топики событий редактора.
175
206
  * Используются для подписки/публикации через EventEmitter.
207
+ *
176
208
  * @public
209
+ * @enum
177
210
  */
178
211
  export declare enum EventTopics {
179
212
  /** Событие наведения на объект (hover). Payload: intersection: Intersection | null */
180
213
  SelectHover = "select.hover",
181
214
  /** Событие клика по объекту. Payload: intersection: Intersection | null */
182
- SelectClick = "select.click",
183
- /** Событие выбора объекта для редактирования. Payload: mode: SelectMode, object: THREE.Object3D | null */
184
- ToolSelect = "tool.select"
215
+ SelectClick = "select.click"
216
+ }
217
+
218
+ /**
219
+ * Тип фичи, совпадает с менеджерами
220
+ *
221
+ * @public
222
+ */
223
+ export declare enum FeatureType {
224
+ /** Отображение */
225
+ Display = 0,
226
+ /** Управление сценой */
227
+ Scene = 1,
228
+ /** Выборка */
229
+ Select = 2,
230
+ /** Инструменты */
231
+ Tool = 3
185
232
  }
186
233
 
187
234
  /**
188
235
  * Возвращает уже созданный хаб, если редактор инициализирован.
189
236
  * @public
190
237
  */
191
- export declare const getAppHub: () => EditorHub;
238
+ export declare const getEditorHub: () => EditorHub;
239
+
240
+ /**
241
+ * Возвращает уже созданный хаб, если редактор инициализирован.
242
+ * @public
243
+ */
244
+ export declare const getViewerHub: () => ViewerHub;
192
245
 
193
246
  /**
194
- * Маркерный интерфейс для менеджера отображения.
195
247
  * @public
196
248
  */
197
- export declare interface IDisplayManager extends IManager {
249
+ export declare interface ICommand {
250
+ type: FeatureType;
251
+ payload: unknown[];
198
252
  }
199
253
 
200
- /** @public */
201
- export declare interface IEditorStore {
202
- /** Возвращает текущий режим выбора. */
203
- getSelectMode(): SelectMode;
204
- /** Возвращает текущий активный инструмент. */
205
- getToolType(): ToolType;
206
- /** Возвращает текущий режим отображения. */
207
- getDisplayMode(): DisplayMode;
254
+ /**
255
+ * Интерфейс для контроллера, управляющего жизненным циклом модулей.
256
+ *
257
+ * @remarks
258
+ * Контроллер отвечает за:
259
+ * - инициализацию модулей (`IRuntimeModule`)
260
+ * - запуск цикла рендеринга
261
+ * - обновление модулей каждый кадр (`IUpdatableModule`)
262
+ * - рендеринг модулей (`IRenderableModule`)
263
+ * - остановку и очистку ресурсов
264
+ *
265
+ * @public
266
+ * @interface
267
+ */
268
+ export declare interface IController extends Disposable_2 {
208
269
  /**
209
- * Устанавливает режим выбора.
210
- * @param mode - Режим выбора (Mesh/Face/Edge/Vertex и т.п.).
270
+ * Запускает контроллер.
271
+ *
272
+ * @remarks
273
+ * Инициализирует все модули и запускает цикл рендеринга.
274
+ *
275
+ * @public
276
+ * @method
211
277
  */
212
- setSelectMode(mode: SelectMode): void;
278
+ start(): void;
213
279
  /**
214
- * Устанавливает активный инструмент.
215
- * @param toolType - Тип инструмента (Translate/Rotate/Scale и т.п.).
280
+ * Останавливает контроллер.
281
+ *
282
+ * @remarks
283
+ * Останавливает цикл рендеринга и освобождает ресурсы.
284
+ *
285
+ * @public
286
+ * @method
216
287
  */
217
- setToolType(toolType: ToolType): void;
288
+ stop(): void;
289
+ }
290
+
291
+ /**
292
+ * Интерфейс store для менеджеров и хендлеров, которые позволяют работать с Display фичей,
293
+ * необходим для корректного взаимодействия между группами фичей.
294
+ *
295
+ * Можно получить:
296
+ * - текущий режим отображения
297
+ *
298
+ * @public
299
+ * @interface
300
+ */
301
+ export declare interface IDisplayStore {
302
+ /** Возвращает текущий режим отображения. */
303
+ getDisplayMode(): DisplayMode;
218
304
  /**
219
305
  * Устанавливает режим отображения.
220
306
  * @param mode - Режим отображения (зависит от твоего домена).
221
307
  */
222
308
  setDisplayMode(mode: DisplayMode): void;
309
+ }
310
+
311
+ /** @public */
312
+ export declare interface IExportStore {
313
+ setResult(result: ExportResult): void;
314
+ getResult(): ExportResult | null;
315
+ clearResult(): void;
316
+ }
317
+
318
+ /**
319
+ * Интерфейс медиатора команд редактора.
320
+ *
321
+ * @remarks
322
+ * Медиатор выступает промежуточным слоем между публичным API хаба
323
+ * и менеджерами конкретных функциональных областей редактора.
324
+ *
325
+ * Основные задачи медиатора:
326
+ * - принять команду от верхнего уровня
327
+ * - определить менеджер, отвечающий за указанную фичу
328
+ * - передать вызов в pipeline middleware
329
+ * - вернуть итоговый ответ выполнения команды
330
+ *
331
+ * В штатном сценарии успешное выполнение команды может не формировать явный ответ и возвращать `null`.
332
+ * Если в процессе обработки возникает исключение, например ошибка политики,
333
+ * оно может быть преобразовано middleware в объект `IResponse`.
334
+ *
335
+ * @public
336
+ * @interface
337
+ */
338
+ export declare interface IMediator extends Disposable_2 {
339
+ /**
340
+ * Отправляет команду на выполнение через middleware pipeline в соответствующий менеджер редактора.
341
+ *
342
+ * @param command - команда, содержащая тип фичи и аргументы вызова
343
+ *
344
+ * @returns результат выполнения команды:
345
+ * - `null`, если команда выполнена успешно и не требует явного ответа
346
+ * - `IResponse`, если в ходе обработки был сформирован ответ, например при ошибке или блокировке действия
347
+ *
348
+ * @example
349
+ * ```typescript
350
+ * const response = mediator.send({
351
+ * type: FeatureType.Tool,
352
+ * payload: [ToolType.Rotate],
353
+ * });
354
+ *
355
+ * if (response?.blocked) {
356
+ * console.warn(response.message);
357
+ * }
358
+ * ```
359
+ *
360
+ * @public
361
+ * @method
362
+ */
363
+ send(command: ICommand): IResponse | null;
364
+ }
365
+
366
+ /**
367
+ * Интерфейс для объектов, которые могут быть отрисованы.
368
+ *
369
+ * @remarks
370
+ * Предназначен для модулей, которым требуется кастомный рендеринг
371
+ * поверх основной сцены (например, `GizmoModule`).
372
+ *
373
+ * **Отличие от `IUpdatableModule`:**
374
+ * - `render()` вызывается **после** основного рендера сцены
375
+ * - `render()` предназначен для отрисовки дополнительных элементов
376
+ * (осей координат, отладочной информации, оверлеев)
377
+ *
378
+ * **Жизненный цикл:**
379
+ * 1. `init()` (из `IRuntimeModule`) — создание ресурсов
380
+ * 2. `render()` — отрисовка (вызывается каждый кадр)
381
+ * 3. `dispose()` (из `IRuntimeModule`) — освобождение ресурсов
382
+ *
383
+ * @public
384
+ * @interface
385
+ */
386
+ export declare interface IRenderable {
387
+ /**
388
+ * Выполняет кастомный рендеринг объекта.
389
+ *
390
+ * @remarks
391
+ * Вызывается каждый кадр **после** основного рендера сцены.
392
+ *
393
+ * **Важно:** метод не должен выполнять тяжёлые операции,
394
+ * чтобы не снижать производительность.
395
+ *
396
+ * @example
397
+ * ```typescript
398
+ * public render(): void {
399
+ * const canvas = this._domApi.getCanvas();
400
+ * this._gizmo?.render(canvas.width, canvas.height);
401
+ * this._drawFPS();
402
+ * }
403
+ * ```
404
+ *
405
+ * @public
406
+ * @method
407
+ */
408
+ render(): void;
409
+ }
410
+
411
+ /**
412
+ * Низкоуровневый доступ к WebGLRenderer.
413
+ *
414
+ * @remarks
415
+ * Этот интерфейс **реализуется самим рендерером** (`Renderer`).
416
+ * Предоставляет прямой доступ к WebGLRenderer Three.js.
417
+ *
418
+ * Используется **только внутренними API-слоями** (например, `RendererApi`),
419
+ * но не модулями напрямую.
420
+ *
421
+ * @see {@link Renderer} - класс, реализующий этот интерфейс
422
+ *
423
+ * @public
424
+ * @interface
425
+ */
426
+ export declare interface IRendererAccess {
427
+ /**
428
+ * Возвращает WebGLRenderer.
429
+ *
430
+ * @returns THREE.WebGLRenderer - рендерер Three.js
431
+ *
432
+ * @example
433
+ * ```typescript
434
+ * // Использование в RendererApi
435
+ * const renderer = this._rendererAccess.getRenderer();
436
+ * ```
437
+ *
438
+ * @public
439
+ * @method
440
+ */
441
+ getRenderer(): THREE.WebGLRenderer;
442
+ }
443
+
444
+ /**
445
+ * Предоставляет низкоуровневый доступ к камере рендерера.
446
+ *
447
+ * Этот интерфейс используется внутренними модулями (например, `CameraApi`) для
448
+ * получения прямого доступа к камере `Three.js`. Он не содержит логики управления
449
+ * камерой — только доступ к объекту.
450
+ *
451
+ * @remarks
452
+ * В отличие от `ICameraApi`, который предоставляет высокоуровневые операции
453
+ * (включение слоёв, настройка параметров), этот интерфейс нужен только для
454
+ * чтения камеры.
455
+ *
456
+ * @see {@link Renderer} - класс, который реализует этот интерфейс
457
+ *
458
+ * @public
459
+ * @interface
460
+ */
461
+ export declare interface IRendererCameraAccess {
462
+ /**
463
+ * Возвращает камеру рендерера.
464
+ *
465
+ * @returns Камера Three.js.
466
+ *
467
+ * @example
468
+ * ```typescript
469
+ * const camera = cameraAccess.getCamera();
470
+ * camera.position.set(5, 5, 5);
471
+ * camera.lookAt(0, 0, 0);
472
+ * ```
473
+ *
474
+ * @public
475
+ * @method
476
+ */
477
+ getCamera(): THREE.Camera;
478
+ }
479
+
480
+ /**
481
+ * Низкоуровневый доступ к DOM-элементам рендерера.
482
+ *
483
+ * @remarks
484
+ * Этот интерфейс предоставляет доступ к canvas и DOM-элементу рендерера.
485
+ * Используется внутренними API-слоями (например, `DomApi`)
486
+ * для получения доступа к DOM без необходимости знать конкретную реализацию рендерера.
487
+ *
488
+ * @see {@link Renderer} - класс, реализующий этот интерфейс
489
+ *
490
+ * @public
491
+ * @interface
492
+ */
493
+ export declare interface IRendererDomAccess {
494
+ /**
495
+ * Возвращает canvas-элемент редактора.
496
+ *
497
+ * @remarks
498
+ * Canvas используется для рендеринга 3D-сцены.
499
+ *
500
+ * @returns HTMLCanvasElement - canvas элемент
501
+ *
502
+ * @example
503
+ * ```typescript
504
+ * const canvas = domAccess.getCanvas();
505
+ * ```
506
+ *
507
+ * @public
508
+ */
509
+ getCanvas(): HTMLCanvasElement;
510
+ /**
511
+ * Возвращает DOM-элемент рендерера.
512
+ *
513
+ * @remarks
514
+ * Обычно это тот же canvas, но в некоторых случаях может быть
515
+ * другим элементом (например, div-обёрткой). Используется для
516
+ * подписки на события ввода (mousemove, click, dblclick и т.д.).
517
+ *
518
+ * @returns HTMLElement - DOM-элемент для подписки на события
519
+ *
520
+ * @example
521
+ * ```typescript
522
+ * const domElement = domAccess.getDomElement();
523
+ * ```
524
+ *
525
+ * @public
526
+ * @method
527
+ */
528
+ getDomElement(): HTMLElement;
529
+ }
530
+
531
+ /**
532
+ * Низкоуровневый доступ к сцене рендерера.
533
+ *
534
+ * @remarks
535
+ * Этот интерфейс предоставляет доступ к сцене Three.js.
536
+ * Используется внутренними API-слоями (например, `SceneApi`)
537
+ * для получения доступа к сцене без необходимости знать конкретную
538
+ * реализацию рендерера.
539
+ *
540
+ * @see {@link Renderer} - класс, реализующий этот интерфейс
541
+ *
542
+ * @public
543
+ * @interface
544
+ */
545
+ export declare interface IRendererSceneAccess {
546
+ /**
547
+ * Возвращает сцену рендерера.
548
+ *
549
+ * @returns THREE.Scene - сцена Three.js
550
+ *
551
+ * @remarks
552
+ * Сцена содержит все объекты, которые рендерятся на экране.
553
+ * Через неё можно добавлять, удалять и модифицировать объекты.
554
+ *
555
+ * @example
556
+ * ```typescript
557
+ * const scene = sceneAccess.getScene();
558
+ *
559
+ * // Добавление объекта
560
+ * scene.add(myMesh);
561
+ *
562
+ * // Поиск объекта по имени
563
+ * const obj = scene.getObjectByName('myObject');
564
+ *
565
+ * // Удаление объекта
566
+ * scene.remove(obj);
567
+ * ```
568
+ *
569
+ * @public
570
+ * @method
571
+ */
572
+ getScene(): THREE.Scene;
573
+ }
574
+
575
+ /**
576
+ * Интерфейс store для менеджеров и хендлеров, которые позволяют работать с Select фичей,
577
+ * необходим для корректного взаимодействия между группами фичей.
578
+ *
579
+ * Можно получить:
580
+ * - режим выборки
581
+ * - выбранный объект
582
+ * - подписаться на изменение объекта
583
+ *
584
+ * @public
585
+ * @interface
586
+ */
587
+ export declare interface ISelectStore {
588
+ /** Возвращает текущий режим выбора. */
589
+ getSelectMode(): SelectMode;
590
+ /**
591
+ * Устанавливает режим выбора.
592
+ * @param mode - Режим выбора (Mesh/Face/Edge/Vertex и т.п.).
593
+ */
594
+ setSelectMode(mode: SelectMode): void;
223
595
  /**
224
596
  * Возвращает текущий выбранный объект сцены.
225
597
  * @remarks
226
598
  * Предполагается, что до вызова этого метода уже был
227
- * вызван {@link IEditorStore.setSelectedObject}. Иначе результат не определён.
599
+ * вызван {@link ISelectStore.setSelectedObject}. Иначе результат не определён.
228
600
  */
229
601
  getSelectedObject(): THREE.Object3D | null;
230
602
  /** Возвращает актуальную статистику по трансформации выбранного объекта. */
@@ -239,43 +611,40 @@ export declare interface IEditorStore {
239
611
  * @param cb - Callback, получающий текущий выбранный объект (`THREE.Object3D | null`).
240
612
  */
241
613
  onSelectedObjectChange(cb: SelectedListener): () => void;
242
- /** Подписывает слушателя на изменения трансформации выбранного объекта. */
243
- onSelectedTransformChange(cb: TransformListener): () => void;
244
- /** Уведомляет всех подписчиков о том, что трансформация выбранного объекта изменилась. */
245
- notifySelectedTransformChange(): void;
246
614
  }
247
615
 
248
616
  /**
249
- * Общий интерфейс для всех менеджеров в хабе.
250
- * Каждый менеджер отвечает за одну фичу.
617
+ * Интерфейс store для менеджеров и хендлеров, которые позволяют работать с Tool фичей,
618
+ * необходим для корректного взаимодействия между группами фичей.
619
+ *
620
+ * Можно получить:
621
+ * - выбранный инструмент
622
+ * - подписаться на изменение трансформации объекта
623
+ *
251
624
  * @public
625
+ * @interface
252
626
  */
253
- export declare interface IManager extends Disposable_2 {
627
+ export declare interface IToolStore {
628
+ /** Возвращает текущий активный инструмент. */
629
+ getToolType(): ToolType;
254
630
  /**
255
- * Выполняет основное действие менеджера.
631
+ * Устанавливает активный инструмент.
632
+ * @param toolType - Тип инструмента (Translate/Rotate/Scale и т.п.).
256
633
  */
257
- manage(...args: unknown[]): void;
258
- }
259
-
260
- /**
261
- * Маркерный интерфейс для менеджера сцены.
262
- * @public
263
- */
264
- export declare interface ISceneManager extends IManager {
265
- }
266
-
267
- /**
268
- * Маркерный интерфейс для менеджера выборки.
269
- * @public
270
- */
271
- export declare interface ISelectManager extends IManager {
634
+ setToolType(toolType: ToolType): void;
635
+ /** Подписывает слушателя на изменения трансформации выбранного объекта. */
636
+ onSelectedTransformChange(cb: TransformListener): () => void;
637
+ /** Уведомляет всех подписчиков о том, что трансформация выбранного объекта изменилась. */
638
+ notifySelectedTransformChange(): void;
272
639
  }
273
640
 
274
641
  /**
275
- * Маркерный интерфейс для менеджера инструментов.
642
+ * Обобщенный интерфейс для хендлеров инструментов (`IToolHandler`).
643
+ *
276
644
  * @public
645
+ * @interface
277
646
  */
278
- export declare interface IToolManager extends IManager {
647
+ export declare interface ITransformStore extends ISelectStore, IToolStore {
279
648
  }
280
649
 
281
650
  /** @public */
@@ -301,134 +670,145 @@ export declare class ObjLoader {
301
670
  }
302
671
 
303
672
  /**
304
- * Рендерер для предпросмотра 3D-модели.
305
- * Настраивает сцену, камеру и орбитальную навигацию по горизонтали.
306
- * @alpha
307
- */
308
- export declare class PreviewRenderer extends Renderer {
309
- /** Orbit-контроллер для управления камерой */
310
- private _orbit;
311
- constructor(canvas: HTMLCanvasElement);
312
- /**
313
- * Обновление состояния рендерера.
314
- */
315
- protected update(): void;
316
- }
317
-
318
- /**
319
- * Абстрактный базовый класс рендерера для работы с WebGL через OGL.
320
- * Отвечает за инициализацию сцены, камеры и цикла рендеринга.
673
+ * Базовый класс рендерера для работы с WebGL через Three.js.
674
+ *
675
+ * @remarks
676
+ * Отвечает за инициализацию сцены, камеры, освещения и цикла рендеринга.
677
+ * Предоставляет низкоуровневый API для доступа к основным компонентам Three.js.
678
+ *
679
+ * **Не содержит логики управления камерой или выделения объектов** —
680
+ * это ответственность модулей (например, `ControlsModule`, `RaycasterModule`).
681
+ *
682
+ * Рендерер реализует интерфейсы нижнего API:
683
+ * - `IRendererAccess` — доступ к WebGLRenderer
684
+ * - `IRendererCameraAccess` — доступ к камере
685
+ * - `IRendererDomAccess` — доступ к DOM-элементам
686
+ * - `IRendererSceneAccess` — доступ к сцене
687
+ *
688
+ * @see {@link IRendererAccess} - доступ к WebGLRenderer
689
+ * @see {@link IRendererCameraAccess} - доступ к камере
690
+ * @see {@link IRendererDomAccess} - доступ к DOM
691
+ * @see {@link IRendererSceneAccess} - доступ к сцене
692
+ *
321
693
  * @public
694
+ * @class
322
695
  */
323
- export declare abstract class Renderer implements Disposable_2 {
324
- /** Корневой объект сцены */
325
- protected scene: THREE.Scene;
326
- /** Камера для сцены */
327
- protected camera: THREE.PerspectiveCamera;
328
- /** Экземпляр рендерера Three.js */
329
- protected renderer: THREE.WebGLRenderer;
330
- /** HTML-элемент canvas, на котором рендерится сцена */
331
- protected canvas: HTMLCanvasElement;
332
- /** Массив моделей на сцене */
333
- protected meshes: THREE.Mesh[];
696
+ export declare class Renderer implements IRendererAccess, IRendererCameraAccess, IRendererDomAccess, IRendererSceneAccess, IRenderable, Disposable_2 {
697
+ private readonly _config;
334
698
  /**
335
- * Конструктор рендерера
336
- * @param canvas - HTMLCanvasElement для рендеринга
337
- */
338
- protected constructor(canvas: HTMLCanvasElement);
339
- /**
340
- * Обновляет размер рендерера и камеры при изменении размеров canvas.
341
- */
342
- resize(): void;
343
- /**
344
- * Выполняет рендеринг сцены с текущей камерой.
699
+ * Корневой объект сцены Three.js.
700
+ *
701
+ * @protected
702
+ * @member
345
703
  */
346
- protected render(): void;
704
+ protected scene: THREE.Scene;
347
705
  /**
348
- * Метод для обновления логики рендерера.
706
+ * Камера для сцены Three.js.
707
+ *
708
+ * @protected
709
+ * @member
349
710
  */
350
- protected update(): void;
711
+ protected camera: THREE.PerspectiveCamera;
351
712
  /**
352
- * Запускает основной цикл рендеринга.
713
+ * Экземпляр Three.js WebGLRenderer.
714
+ *
715
+ * @protected
716
+ * @member
353
717
  */
354
- loop(): void;
718
+ protected renderer: THREE.WebGLRenderer;
355
719
  /**
356
- * Добавление фигуры на сцену.
357
- * @param figure - Данные фигуры: position, normal, uv
720
+ * HTML-элемент canvas, на котором рендерится сцена.
721
+ *
722
+ * @protected
723
+ * @member
358
724
  */
359
- addFigure(figure: Figure): THREE.Mesh;
725
+ protected canvas: HTMLCanvasElement;
360
726
  /**
361
- * Добавляет фигуру в сцену и сохраняет его во внутреннем массиве.
727
+ * Конструктор рендерера.
728
+ *
729
+ * @param _canvas - HTMLCanvasElement для рендеринга
730
+ * @param _config - Конфиг для настройки рендерера
731
+ *
732
+ * @remarks
733
+ * Инициализирует сцену, камеру, WebGLRenderer и базовое освещение
734
+ * на основе переданного `RendererConfig`.
735
+ *
736
+ * По умолчанию используется тёмный фон, перспективная камера
737
+ * и два источника света: AmbientLight и DirectionalLight.
362
738
  *
363
- * @param mesh - Фигура для добавления в сцену.
364
- * @internal
739
+ * @public
740
+ * @constructor
365
741
  */
366
- addMesh(mesh: THREE.Mesh): void;
742
+ constructor(_canvas: HTMLCanvasElement, _config: RendererConfig);
367
743
  /**
368
- * Убирает фигуру со сцены
744
+ * Обновляет размер рендерера и пропорции камеры.
745
+ *
746
+ * @remarks
747
+ * Вызывается при изменении размеров canvas (например, при ресайзе окна браузера).
748
+ *
749
+ * @example
750
+ * ```typescript
751
+ * window.addEventListener('resize', () => renderer.resize());
752
+ * ```
369
753
  *
370
- * @param mesh - Фигура для удаления со сцены.
371
- * @internal
754
+ * @public
755
+ * @method
372
756
  */
373
- removeMesh(mesh: THREE.Mesh): void;
757
+ resize(): void;
374
758
  /**
375
- * Возвращает список всех фигур, находящихся в сцене.
759
+ * Выполняет рендеринг текущего кадра.
760
+ *
761
+ * @remarks
762
+ * Рендерит сцену с текущей камерой.
763
+ * Вызывается автоматически в цикле `loop()`.
376
764
  *
377
- * @returns Массив текущих фигур.
378
- * @internal
765
+ * @public
766
+ * @method
379
767
  */
380
- getMeshes(): THREE.Mesh[];
768
+ render(): void;
381
769
  /**
382
- * Добавляет объект в сцену и (опционально) выставляет ему слой.
383
- *
384
- * @param obj - Объект, который нужно добавить в сцену.
385
- * @param layer - (Опц.) Номер слоя, который следует установить объекту перед добавлением.
770
+ * Обновляет состояние рендерера перед рендерингом.
386
771
  *
387
772
  * @remarks
388
- * Если рендерер уже диспоузнут (scene отсутствует), метод тихо завершится.
389
- * Слой задаётся через `obj.layers.set(layer)`, после чего объект добавляется в `this.scene`.
773
+ * Пустой метод, предназначен для переопределения в наследниках
774
+ * (например, для обновления контролов камеры).
390
775
  *
391
- * @example
392
- * // Добавить оверлей на слой подсветок:
393
- * add(overlayLine, OVERLAY_LAYER);
394
- *
395
- * @internal
776
+ * @protected
777
+ * @method
778
+ * @virtual
396
779
  */
397
- addObject(obj: THREE.Object3D, layer?: number): void;
780
+ protected update(): void;
398
781
  /**
399
- * Удаляет объект из сцены (или из его родителя, если он есть).
400
- *
401
- * @param obj - Объект, который необходимо удалить.
782
+ * Запускает основной цикл рендеринга.
402
783
  *
403
784
  * @remarks
404
- * Если у объекта есть `parent`, он будет удалён из родителя. Иначе — метод попытается
405
- * удалить его напрямую из `this.scene`. В рамках данного API метод не отвечает за
406
- * освобождение GPU-ресурсов; освобождайте геометрию/материалы отдельно при необходимости.
785
+ * Вызывает `update()` и `render()` каждый кадр с помощью `requestAnimationFrame`.
786
+ * **Важно:** вызывать метод только один раз.
407
787
  *
408
788
  * @example
409
- * // Снять оверлей со сцены:
410
- * removeObject(overlayLine);
789
+ * ```typescript
790
+ * renderer.loop();
791
+ * ```
411
792
  *
412
- * @internal
793
+ * @public
794
+ * @method
413
795
  */
414
- removeObject(obj: THREE.Object3D): void;
796
+ loop(): void;
797
+ getCamera(): THREE.Camera;
798
+ getRenderer(): THREE.WebGLRenderer;
799
+ getCanvas(): HTMLCanvasElement;
800
+ getDomElement(): HTMLElement;
801
+ getScene(): THREE.Scene;
415
802
  /**
416
- * Включает указанный слой у активной камеры.
417
- *
418
- * @param layer - Номер слоя, который требуется сделать видимым для камеры.
803
+ * Освобождает ресурсы рендерера.
419
804
  *
420
805
  * @remarks
421
- * Полезно для показа служебных оверлеев (например, подсветки) на отдельном слое.
422
- * Метод не изменяет слои Raycaster — ими должен управлять другой слой API (например, IRaycastAPI).
423
- *
424
- * @example
425
- * // Убедиться, что камера видит слой оверлеев:
426
- * enableCameraLayer(OVERLAY_LAYER);
806
+ * Удаляет ссылки на сцену, камеру и canvas, вызывает `dispose()` у WebGLRenderer.
807
+ * Вызывается при уничтожении редактора IOC-контейнером.
427
808
  *
428
- * @internal
809
+ * @public
810
+ * @method
429
811
  */
430
- enableCameraLayer(layer: number): void;
431
- /** Освобождает ресурсы рендерера, очищает внутренние данные. */
432
812
  dispose(): Promise<void> | void;
433
813
  }
434
814
 
@@ -438,4 +818,29 @@ export declare type SelectedListener = (obj: THREE.Object3D | null) => void;
438
818
  /** @public */
439
819
  export declare type TransformListener = () => void;
440
820
 
821
+ /**
822
+ * Хаб для управления вьювером
823
+ * @public
824
+ */
825
+ export declare class ViewerHub implements Disposable_2 {
826
+ private _renderer;
827
+ private _mediator;
828
+ private _controller;
829
+ constructor(_renderer: Renderer, _mediator: IMediator, _controller: IController);
830
+ addFigure(figure: FigureType): IResponse | null;
831
+ loadFigure(content: string): IResponse | null;
832
+ loadScene(content: string): IResponse | null;
833
+ resizeRenderer(): void;
834
+ /**
835
+ * Запускает вьювер.
836
+ * Вызывается после создания хаба.
837
+ */
838
+ start(): void;
839
+ /**
840
+ * Останавливает вьювер.
841
+ */
842
+ stop(): void;
843
+ dispose(): Promise<void> | void;
844
+ }
845
+
441
846
  export { }