@planara/core 2.8.0 → 3.0.0

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