@planara/core 1.6.0 → 2.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 (63) hide show
  1. package/README.md +10 -2
  2. package/dist/core/editor-renderer.d.ts +30 -32
  3. package/dist/core/editor-renderer.d.ts.map +1 -1
  4. package/dist/core/preview-renderer.d.ts +1 -6
  5. package/dist/core/preview-renderer.d.ts.map +1 -1
  6. package/dist/core/renderer.d.ts +10 -27
  7. package/dist/core/renderer.d.ts.map +1 -1
  8. package/dist/events/editor-events.d.ts +9 -3
  9. package/dist/events/editor-events.d.ts.map +1 -1
  10. package/dist/events/event-bus.d.ts.map +1 -1
  11. package/dist/events/event-topics.d.ts +3 -1
  12. package/dist/events/event-topics.d.ts.map +1 -1
  13. package/dist/extensions/orbit-extension.d.ts +5 -5
  14. package/dist/extensions/orbit-extension.d.ts.map +1 -1
  15. package/dist/extensions/symmetric-axes-helper.d.ts +5 -0
  16. package/dist/extensions/symmetric-axes-helper.d.ts.map +1 -0
  17. package/dist/handlers/display/wireframe-handler.d.ts +6 -14
  18. package/dist/handlers/display/wireframe-handler.d.ts.map +1 -1
  19. package/dist/handlers/select/mesh-select-handler.d.ts +20 -12
  20. package/dist/handlers/select/mesh-select-handler.d.ts.map +1 -1
  21. package/dist/handlers/tool/base-tool-handler.d.ts +25 -0
  22. package/dist/handlers/tool/base-tool-handler.d.ts.map +1 -0
  23. package/dist/handlers/tool/rotate-tool-handler.d.ts +19 -0
  24. package/dist/handlers/tool/rotate-tool-handler.d.ts.map +1 -0
  25. package/dist/handlers/tool/scale-tool-handler.d.ts +19 -0
  26. package/dist/handlers/tool/scale-tool-handler.d.ts.map +1 -0
  27. package/dist/handlers/tool/translate-tool-handler.d.ts +19 -0
  28. package/dist/handlers/tool/translate-tool-handler.d.ts.map +1 -0
  29. package/dist/hub/editor-hub.d.ts +5 -2
  30. package/dist/hub/editor-hub.d.ts.map +1 -1
  31. package/dist/index.cjs.js +3833 -39
  32. package/dist/index.d.ts +1 -1
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.es.js +22571 -1515
  35. package/dist/index.full.d.ts +60 -82
  36. package/dist/index.public.d.ts +49 -61
  37. package/dist/index.umd.js +3833 -39
  38. package/dist/interfaces/api/mesh-api.d.ts +6 -6
  39. package/dist/interfaces/api/mesh-api.d.ts.map +1 -1
  40. package/dist/interfaces/api/transform-helpers-api.d.ts +25 -0
  41. package/dist/interfaces/api/transform-helpers-api.d.ts.map +1 -0
  42. package/dist/interfaces/handler/display-handler.d.ts +1 -0
  43. package/dist/interfaces/handler/display-handler.d.ts.map +1 -1
  44. package/dist/interfaces/handler/select-handler.d.ts +1 -0
  45. package/dist/interfaces/handler/select-handler.d.ts.map +1 -1
  46. package/dist/interfaces/handler/tool-handler.d.ts +14 -0
  47. package/dist/interfaces/handler/tool-handler.d.ts.map +1 -0
  48. package/dist/interfaces/manager/tool-manager.d.ts +8 -0
  49. package/dist/interfaces/manager/tool-manager.d.ts.map +1 -0
  50. package/dist/ioc/container.d.ts.map +1 -1
  51. package/dist/managers/display/display-manager.d.ts.map +1 -1
  52. package/dist/managers/select/select-manager.d.ts.map +1 -1
  53. package/dist/managers/tool/tool-manager.d.ts +18 -0
  54. package/dist/managers/tool/tool-manager.d.ts.map +1 -0
  55. package/dist/utils/renderer-api.d.ts +12 -11
  56. package/dist/utils/renderer-api.d.ts.map +1 -1
  57. package/package.json +5 -4
  58. package/dist/extensions/mesh-extension.d.ts +0 -12
  59. package/dist/extensions/mesh-extension.d.ts.map +0 -1
  60. package/dist/interfaces/api/renderer-api.d.ts +0 -27
  61. package/dist/interfaces/api/renderer-api.d.ts.map +0 -1
  62. package/dist/utils/program-settings.d.ts +0 -13
  63. package/dist/utils/program-settings.d.ts.map +0 -1
@@ -1,15 +1,8 @@
1
- import { Camera } from 'ogl';
2
1
  import { DisplayMode } from '@planara/types';
3
2
  import { Figure } from '@planara/types';
4
- import { Mesh } from 'ogl';
5
- import { MeshOptions } from 'ogl/types/core/Mesh';
6
- import { MeshRenderCallback } from 'ogl';
7
- import { OGLRenderingContext } from 'ogl/types/core/Renderer';
8
- import { OGLRenderingContext as OGLRenderingContext_2 } from 'ogl';
9
- import { Program } from 'ogl';
10
- import { Renderer as Renderer_2 } from 'ogl';
11
3
  import { SelectMode } from '@planara/types';
12
- import { Transform } from 'ogl';
4
+ import * as THREE from 'three';
5
+ import { ToolType } from '@planara/types';
13
6
 
14
7
  /**
15
8
  * Тип позиции камеры в мире.
@@ -35,12 +28,17 @@ export declare function createAppHub(canvas: HTMLCanvasElement): EditorHub;
35
28
  export declare type EditorEvents = {
36
29
  /** Событие наведения на объект (hover). Payload: объект с mesh или null */
37
30
  [EventTopics.SelectHover]: {
38
- mesh: Mesh;
31
+ mesh: THREE.Object3D;
39
32
  } | null;
40
33
  /** Событие клика по объекту. Payload: объект с mesh или null */
41
34
  [EventTopics.SelectClick]: {
42
- mesh: Mesh;
35
+ mesh: THREE.Object3D;
43
36
  } | null;
37
+ /** Событие выбора объекта для редактирования. Payload: выбранный режим выборки */
38
+ [EventTopics.ToolSelect]: {
39
+ mode: SelectMode;
40
+ mesh: THREE.Object3D | null;
41
+ };
44
42
  };
45
43
 
46
44
  /**
@@ -50,25 +48,18 @@ export declare type EditorEvents = {
50
48
  export declare class EditorHub {
51
49
  private _displayManager;
52
50
  private _selectManager;
51
+ private _toolManager;
53
52
  private _renderer;
54
- constructor(_displayManager: IDisplayManager, _selectManager: ISelectManager, _renderer: EditorRenderer);
53
+ constructor(_displayManager: IDisplayManager, _selectManager: ISelectManager, _toolManager: IToolManager, _renderer: EditorRenderer);
55
54
  setDisplayMode(mode: DisplayMode): void;
56
55
  setSelectMode(mode: SelectMode): void;
56
+ setToolMode(mode: ToolType): void;
57
57
  resizeRenderer(): void;
58
58
  updateRenderer(): void;
59
59
  addFigure(figure: Figure): void;
60
60
  destroy(): void;
61
61
  }
62
62
 
63
- /**
64
- * Расширение для Mesh с добавлением поля isHit, необходимого для raycast
65
- * @public
66
- */
67
- export declare class EditorMesh extends Mesh {
68
- isHit: boolean;
69
- constructor(gl: OGLRenderingContext, options?: Partial<MeshOptions>);
70
- }
71
-
72
63
  /**
73
64
  * Рендерер для редактора.
74
65
  * Добавляет сетку, оси координат и поддержку Orbit для управления камерой.
@@ -80,53 +71,52 @@ export declare class EditorRenderer extends Renderer {
80
71
  private _bus;
81
72
  /** Orbit-контроллер для управления камерой */
82
73
  private _orbit;
83
- /** Raycast для подсветки моделей при наведении */
84
- private _raycast;
85
- /** Курсор мыши для остлеживания наведения на 3D-модель */
86
- private _mouse;
87
- /** Были ли зарегистрированы обработчики событий для мыши */
74
+ /** Transform-контроллер для редактирования */
75
+ private _transform;
76
+ private readonly _transformHelper;
77
+ /** Raycast для получения событий наведения/клика по модели*/
78
+ private _raycaster;
79
+ /** Курсор мыши */
80
+ private readonly _mouse;
81
+ /** Были ли инициализированы обработчики событий (hover/click) */
88
82
  private _isEventListenersAdded;
89
83
  /**
90
- * Инициализация сцены редактора.
91
- * Создает сетку, оси координат и orbit-контроллер.
84
+ * Последняя модель на которую наводились,
85
+ * необходима для отправки только уникальных событий в event bus
92
86
  */
87
+ private _lastHovered;
93
88
  constructor(_canvas: HTMLCanvasElement, _bus: EventBus);
94
89
  /**
95
90
  * Обновление состояния рендерера.
96
91
  */
97
92
  protected update(): void;
93
+ /** Добавление фигуры на сцену */
94
+ addFigure(figure: Figure): THREE.Mesh<THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>, THREE.Material | THREE.Material[], THREE.Object3DEventMap>;
98
95
  /**
99
- * Метод для добавления фигуры.
100
- * Настройка raycast.
101
- * @param figure - Данные фигуры: position, normal, uv
102
- */
103
- addFigure(figure: Figure): EditorMesh;
104
- /**
105
- * Устанавливает callback, который будет вызываться перед рендером конкретного меша.
106
- *
107
- * @param mesh - Меш, для которого нужно задать callback.
108
- * @param f - Функция обратного вызова, выполняемая перед рендером меша.
96
+ * Смена отображения `TransformControls` в зависимости от типа инструмента.
97
+ * @param mode - тип инструмента для отображения `TransformControls`.
109
98
  * @internal
110
99
  */
111
- setMeshBeforeRender(mesh: Mesh, f: MeshRenderCallback): void;
100
+ setTransformControlsMode(mode: ToolType): void;
112
101
  /**
113
- * Инициализация обработчиков мыши для raycast
102
+ * Добавление `TransformControls` к объекту.
103
+ * @param object - объект, к которому добавляются `TransformControls`.
104
+ * @internal
114
105
  */
115
- private initMouseListeners;
106
+ attachTransformControls(object: THREE.Object3D): void;
116
107
  /**
117
- * Обработчик движения мыши
108
+ * Удаление `TransformControls` с последнего выбранного объекта.
109
+ * @internal
118
110
  */
111
+ detachTransformControls(): void;
112
+ /** Инициализация обработчиков событий на hover/click */
113
+ private _initMouseListeners;
114
+ /** Обработчик события для hover */
119
115
  private _handleMouseMove;
120
- /**
121
- * Обработчик клика мыши
122
- */
116
+ /** Обработчик события на click */
123
117
  private _handleMouseClick;
124
- /**
125
- * Универсальная логика raycast-события
126
- */
118
+ /** Вспомогательный метод для получения модели, которую выбрали и отправки события в event bus */
127
119
  private _processRaycastEvent;
128
- /** Деструктор */
129
- destroy(): void;
130
120
  }
131
121
 
132
122
  /**
@@ -154,7 +144,9 @@ export declare enum EventTopics {
154
144
  /** Событие наведения на объект (hover). Payload: mesh: Mesh | null */
155
145
  SelectHover = "select.hover",
156
146
  /** Событие клика по объекту. Payload: mesh: Mesh | null */
157
- SelectClick = "select.click"
147
+ SelectClick = "select.click",
148
+ /** Событие выбора объекта для редактирования. Payload: mode: SelectMode, object: THREE.Object3D | null */
149
+ ToolSelect = "tool.select"
158
150
  }
159
151
 
160
152
  /**
@@ -187,6 +179,13 @@ export declare interface IManager {
187
179
  export declare interface ISelectManager extends IManager {
188
180
  }
189
181
 
182
+ /**
183
+ * Маркерный интерфейс для менеджеров инструментов.
184
+ * @public
185
+ */
186
+ export declare interface IToolManager extends IManager {
187
+ }
188
+
190
189
  /** @public */
191
190
  export declare class ObjLoader {
192
191
  /** Позиции вершин */
@@ -211,17 +210,12 @@ export declare class ObjLoader {
211
210
 
212
211
  /**
213
212
  * Рендерер для предпросмотра 3D-модели.
214
- * Настраивает сцену, камеру и орбитальную навигацию (по горизонтали).
215
- * Наследуется от базового Renderer.
213
+ * Настраивает сцену, камеру и орбитальную навигацию по горизонтали.
216
214
  * @alpha
217
215
  */
218
216
  export declare class PreviewRenderer extends Renderer {
219
217
  /** Orbit-контроллер для управления камерой */
220
218
  private _orbit;
221
- /**
222
- * Инициализация сцены предпросмотра.
223
- * @param canvas - HTMLCanvasElement для рендеринга
224
- */
225
219
  constructor(canvas: HTMLCanvasElement);
226
220
  /**
227
221
  * Обновление состояния рендерера.
@@ -235,18 +229,16 @@ export declare class PreviewRenderer extends Renderer {
235
229
  * @public
236
230
  */
237
231
  export declare abstract class Renderer {
238
- /** Экземпляр рендерера OGL */
239
- protected gl: Renderer_2;
240
232
  /** Корневой объект сцены */
241
- protected scene: Transform;
233
+ protected scene: THREE.Scene;
242
234
  /** Камера для сцены */
243
- protected camera: Camera;
235
+ protected camera: THREE.PerspectiveCamera;
236
+ /** Экземпляр рендерера Three.js */
237
+ protected renderer: THREE.WebGLRenderer;
244
238
  /** HTML-элемент canvas, на котором рендерится сцена */
245
239
  protected canvas: HTMLCanvasElement;
246
- /** Program для настройки рендеринга моделей */
247
- protected program: Program;
248
240
  /** Массив моделей на сцене */
249
- protected meshes: Mesh[];
241
+ protected meshes: THREE.Mesh[];
250
242
  /**
251
243
  * Конструктор рендерера
252
244
  * @param canvas - HTMLCanvasElement для рендеринга
@@ -272,42 +264,28 @@ export declare abstract class Renderer {
272
264
  * Публичный метод для добавления фигуры.
273
265
  * @param figure - Данные фигуры: position, normal, uv
274
266
  */
275
- addFigure(figure: Figure): EditorMesh;
267
+ addFigure(figure: Figure): THREE.Mesh;
276
268
  /**
277
269
  * Добавляет фигуру в сцену и сохраняет его во внутреннем массиве.
278
270
  *
279
271
  * @param mesh - Фигура для добавления в сцену.
280
272
  * @internal
281
273
  */
282
- addMesh(mesh: Mesh): void;
283
- /**
284
- * Возвращает WebGL контекст рендерера.
285
- *
286
- * @returns Контекст WebGL (OGLRenderingContext) текущей сцены.
287
- * @internal
288
- */
289
- getContext(): OGLRenderingContext_2;
274
+ addMesh(mesh: THREE.Mesh): void;
290
275
  /**
291
276
  * Убирает фигуру со сцены
292
277
  *
293
278
  * @param mesh - Фигура для удаления со сцены.
294
279
  * @internal
295
280
  */
296
- removeMesh(mesh: Mesh): void;
281
+ removeMesh(mesh: THREE.Mesh): void;
297
282
  /**
298
283
  * Возвращает список всех фигур, находящихся в сцене.
299
284
  *
300
285
  * @returns Массив текущих фигур.
301
286
  * @internal
302
287
  */
303
- getMeshes(): Mesh[];
304
- /**
305
- * Возвращает настройку для рендеринга.
306
- *
307
- * @returns Program для настройки рендеринга моделей.
308
- * @internal
309
- */
310
- getProgram(): Program;
288
+ getMeshes(): THREE.Mesh[];
311
289
  /** Деструктор */
312
290
  destroy(): void;
313
291
  }
@@ -1,15 +1,8 @@
1
- import { Camera } from 'ogl';
2
1
  import { DisplayMode } from '@planara/types';
3
2
  import { Figure } from '@planara/types';
4
- import { Mesh } from 'ogl';
5
- import { MeshOptions } from 'ogl/types/core/Mesh';
6
- import { MeshRenderCallback } from 'ogl';
7
- import { OGLRenderingContext } from 'ogl/types/core/Renderer';
8
- import { OGLRenderingContext as OGLRenderingContext_2 } from 'ogl';
9
- import { Program } from 'ogl';
10
- import { Renderer as Renderer_2 } from 'ogl';
11
3
  import { SelectMode } from '@planara/types';
12
- import { Transform } from 'ogl';
4
+ import * as THREE from 'three';
5
+ import { ToolType } from '@planara/types';
13
6
 
14
7
  /**
15
8
  * Тип позиции камеры в мире.
@@ -35,12 +28,17 @@ export declare function createAppHub(canvas: HTMLCanvasElement): EditorHub;
35
28
  export declare type EditorEvents = {
36
29
  /** Событие наведения на объект (hover). Payload: объект с mesh или null */
37
30
  [EventTopics.SelectHover]: {
38
- mesh: Mesh;
31
+ mesh: THREE.Object3D;
39
32
  } | null;
40
33
  /** Событие клика по объекту. Payload: объект с mesh или null */
41
34
  [EventTopics.SelectClick]: {
42
- mesh: Mesh;
35
+ mesh: THREE.Object3D;
43
36
  } | null;
37
+ /** Событие выбора объекта для редактирования. Payload: выбранный режим выборки */
38
+ [EventTopics.ToolSelect]: {
39
+ mode: SelectMode;
40
+ mesh: THREE.Object3D | null;
41
+ };
44
42
  };
45
43
 
46
44
  /**
@@ -50,25 +48,18 @@ export declare type EditorEvents = {
50
48
  export declare class EditorHub {
51
49
  private _displayManager;
52
50
  private _selectManager;
51
+ private _toolManager;
53
52
  private _renderer;
54
- constructor(_displayManager: IDisplayManager, _selectManager: ISelectManager, _renderer: EditorRenderer);
53
+ constructor(_displayManager: IDisplayManager, _selectManager: ISelectManager, _toolManager: IToolManager, _renderer: EditorRenderer);
55
54
  setDisplayMode(mode: DisplayMode): void;
56
55
  setSelectMode(mode: SelectMode): void;
56
+ setToolMode(mode: ToolType): void;
57
57
  resizeRenderer(): void;
58
58
  updateRenderer(): void;
59
59
  addFigure(figure: Figure): void;
60
60
  destroy(): void;
61
61
  }
62
62
 
63
- /**
64
- * Расширение для Mesh с добавлением поля isHit, необходимого для raycast
65
- * @public
66
- */
67
- export declare class EditorMesh extends Mesh {
68
- isHit: boolean;
69
- constructor(gl: OGLRenderingContext, options?: Partial<MeshOptions>);
70
- }
71
-
72
63
  /**
73
64
  * Рендерер для редактора.
74
65
  * Добавляет сетку, оси координат и поддержку Orbit для управления камерой.
@@ -80,46 +71,38 @@ export declare class EditorRenderer extends Renderer {
80
71
  private _bus;
81
72
  /** Orbit-контроллер для управления камерой */
82
73
  private _orbit;
83
- /** Raycast для подсветки моделей при наведении */
84
- private _raycast;
85
- /** Курсор мыши для остлеживания наведения на 3D-модель */
86
- private _mouse;
87
- /** Были ли зарегистрированы обработчики событий для мыши */
74
+ /** Transform-контроллер для редактирования */
75
+ private _transform;
76
+ private readonly _transformHelper;
77
+ /** Raycast для получения событий наведения/клика по модели*/
78
+ private _raycaster;
79
+ /** Курсор мыши */
80
+ private readonly _mouse;
81
+ /** Были ли инициализированы обработчики событий (hover/click) */
88
82
  private _isEventListenersAdded;
89
83
  /**
90
- * Инициализация сцены редактора.
91
- * Создает сетку, оси координат и orbit-контроллер.
84
+ * Последняя модель на которую наводились,
85
+ * необходима для отправки только уникальных событий в event bus
92
86
  */
87
+ private _lastHovered;
93
88
  constructor(_canvas: HTMLCanvasElement, _bus: EventBus);
94
89
  /**
95
90
  * Обновление состояния рендерера.
96
91
  */
97
92
  protected update(): void;
98
- /**
99
- * Метод для добавления фигуры.
100
- * Настройка raycast.
101
- * @param figure - Данные фигуры: position, normal, uv
102
- */
103
- addFigure(figure: Figure): EditorMesh;
104
- /* Excluded from this release type: setMeshBeforeRender */
105
- /**
106
- * Инициализация обработчиков мыши для raycast
107
- */
108
- private initMouseListeners;
109
- /**
110
- * Обработчик движения мыши
111
- */
93
+ /** Добавление фигуры на сцену */
94
+ addFigure(figure: Figure): THREE.Mesh<THREE.BufferGeometry<THREE.NormalBufferAttributes, THREE.BufferGeometryEventMap>, THREE.Material | THREE.Material[], THREE.Object3DEventMap>;
95
+ /* Excluded from this release type: setTransformControlsMode */
96
+ /* Excluded from this release type: attachTransformControls */
97
+ /* Excluded from this release type: detachTransformControls */
98
+ /** Инициализация обработчиков событий на hover/click */
99
+ private _initMouseListeners;
100
+ /** Обработчик события для hover */
112
101
  private _handleMouseMove;
113
- /**
114
- * Обработчик клика мыши
115
- */
102
+ /** Обработчик события на click */
116
103
  private _handleMouseClick;
117
- /**
118
- * Универсальная логика raycast-события
119
- */
104
+ /** Вспомогательный метод для получения модели, которую выбрали и отправки события в event bus */
120
105
  private _processRaycastEvent;
121
- /** Деструктор */
122
- destroy(): void;
123
106
  }
124
107
 
125
108
  /**
@@ -147,7 +130,9 @@ export declare enum EventTopics {
147
130
  /** Событие наведения на объект (hover). Payload: mesh: Mesh | null */
148
131
  SelectHover = "select.hover",
149
132
  /** Событие клика по объекту. Payload: mesh: Mesh | null */
150
- SelectClick = "select.click"
133
+ SelectClick = "select.click",
134
+ /** Событие выбора объекта для редактирования. Payload: mode: SelectMode, object: THREE.Object3D | null */
135
+ ToolSelect = "tool.select"
151
136
  }
152
137
 
153
138
  /**
@@ -180,6 +165,13 @@ export declare interface IManager {
180
165
  export declare interface ISelectManager extends IManager {
181
166
  }
182
167
 
168
+ /**
169
+ * Маркерный интерфейс для менеджеров инструментов.
170
+ * @public
171
+ */
172
+ export declare interface IToolManager extends IManager {
173
+ }
174
+
183
175
  /** @public */
184
176
  export declare class ObjLoader {
185
177
  /** Позиции вершин */
@@ -210,18 +202,16 @@ export declare class ObjLoader {
210
202
  * @public
211
203
  */
212
204
  export declare abstract class Renderer {
213
- /** Экземпляр рендерера OGL */
214
- protected gl: Renderer_2;
215
205
  /** Корневой объект сцены */
216
- protected scene: Transform;
206
+ protected scene: THREE.Scene;
217
207
  /** Камера для сцены */
218
- protected camera: Camera;
208
+ protected camera: THREE.PerspectiveCamera;
209
+ /** Экземпляр рендерера Three.js */
210
+ protected renderer: THREE.WebGLRenderer;
219
211
  /** HTML-элемент canvas, на котором рендерится сцена */
220
212
  protected canvas: HTMLCanvasElement;
221
- /** Program для настройки рендеринга моделей */
222
- protected program: Program;
223
213
  /** Массив моделей на сцене */
224
- protected meshes: Mesh[];
214
+ protected meshes: THREE.Mesh[];
225
215
  /**
226
216
  * Конструктор рендерера
227
217
  * @param canvas - HTMLCanvasElement для рендеринга
@@ -247,12 +237,10 @@ export declare abstract class Renderer {
247
237
  * Публичный метод для добавления фигуры.
248
238
  * @param figure - Данные фигуры: position, normal, uv
249
239
  */
250
- addFigure(figure: Figure): EditorMesh;
240
+ addFigure(figure: Figure): THREE.Mesh;
251
241
  /* Excluded from this release type: addMesh */
252
- /* Excluded from this release type: getContext */
253
242
  /* Excluded from this release type: removeMesh */
254
243
  /* Excluded from this release type: getMeshes */
255
- /* Excluded from this release type: getProgram */
256
244
  /** Деструктор */
257
245
  destroy(): void;
258
246
  }