@planara/core 2.7.0 → 2.8.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.
- package/dist/core/editor-renderer.d.ts +12 -2
- package/dist/core/editor-renderer.d.ts.map +1 -1
- package/dist/handlers/select/edge-select-handler.d.ts.map +1 -1
- package/dist/handlers/select/face-select-handler.d.ts +58 -5
- package/dist/handlers/select/face-select-handler.d.ts.map +1 -1
- package/dist/handlers/select/mesh-select-handler.d.ts.map +1 -1
- package/dist/handlers/select/vertex-select-handler.d.ts.map +1 -1
- package/dist/hub/app-hub.d.ts +7 -1
- package/dist/hub/app-hub.d.ts.map +1 -1
- package/dist/index.cjs.js +2 -2
- package/dist/index.es.js +744 -438
- package/dist/index.full.d.ts +20 -3
- package/dist/index.public.d.ts +20 -3
- package/dist/index.umd.js +2 -2
- package/dist/types/select/face-group.d.ts +24 -0
- package/dist/types/select/face-group.d.ts.map +1 -0
- package/package.json +2 -2
|
@@ -24,10 +24,11 @@ export declare class EditorRenderer extends Renderer {
|
|
|
24
24
|
/** Были ли инициализированы обработчики событий (hover/click) */
|
|
25
25
|
private _isEventListenersAdded;
|
|
26
26
|
/**
|
|
27
|
-
*
|
|
27
|
+
* Ключ последней модели, на которую наводились,
|
|
28
28
|
* необходима для отправки только уникальных событий в event bus
|
|
29
29
|
*/
|
|
30
|
-
private
|
|
30
|
+
private _lastHoverKey;
|
|
31
|
+
private _currentRaycastMode;
|
|
31
32
|
/** Gizmo для управления отображением perspective camera */
|
|
32
33
|
private _cameraGizmo;
|
|
33
34
|
private _transformListeners;
|
|
@@ -73,7 +74,16 @@ export declare class EditorRenderer extends Renderer {
|
|
|
73
74
|
private _handleMouseMove;
|
|
74
75
|
/** Обработчик события на click */
|
|
75
76
|
private _handleMouseClick;
|
|
77
|
+
/** Возвращает ближайшее пересечение по текущему положению курсора */
|
|
78
|
+
private _getHitIntersection;
|
|
79
|
+
private _handleDoubleClick;
|
|
76
80
|
/** Вспомогательный метод для получения модели, которую выбрали и отправки события в event bus */
|
|
77
81
|
private _processRaycastEvent;
|
|
82
|
+
/** Поиск видимой части меша
|
|
83
|
+
* необходимо это для того, чтобы отправлять только видимые элементы модели, а не все попадания
|
|
84
|
+
*/
|
|
85
|
+
private _getVisibleHit;
|
|
86
|
+
/** Строит ключ hover-пересечения с учетом текущего режима выборки */
|
|
87
|
+
private _makeHoverKey;
|
|
78
88
|
}
|
|
79
89
|
//# sourceMappingURL=editor-renderer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor-renderer.d.ts","sourceRoot":"","sources":["../../src/core/editor-renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAWtC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG/C,OAAO,EAAE,KAAK,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAO9E;;;;;GAKG;AACH,qBACa,cAAe,SAAQ,QAAQ;
|
|
1
|
+
{"version":3,"file":"editor-renderer.d.ts","sourceRoot":"","sources":["../../src/core/editor-renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAWtC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG/C,OAAO,EAAE,KAAK,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAO9E;;;;;GAKG;AACH,qBACa,cAAe,SAAQ,QAAQ;IA+BtB,OAAO,CAAC,OAAO;IACb,OAAO,CAAC,IAAI;IA/BlC,8CAA8C;IAC9C,OAAO,CAAC,MAAM,CAAkB;IAEhC,8CAA8C;IAC9C,OAAO,CAAC,UAAU,CAA6B;IAC/C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IAEnD,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmB;IAE9C,kBAAkB;IAClB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IAExC,iEAAiE;IACjE,OAAO,CAAC,sBAAsB,CAAS;IAEvC;;;OAGG;IACH,OAAO,CAAC,aAAa,CAAuB;IAE5C,OAAO,CAAC,mBAAmB,CAA+B;IAE1D,2DAA2D;IAC3D,OAAO,CAAC,YAAY,CAAmB;IAEvC,OAAO,CAAC,mBAAmB,CAAgC;gBAG/B,OAAO,EAAE,iBAAiB,EACxB,IAAI,EAAE,QAAQ;IA6C5C;;OAEG;IACH,SAAS,CAAC,MAAM;IAIhB,iCAAiC;IACjB,SAAS,CAAC,MAAM,EAAE,MAAM;IAexC;;;;OAIG;IACI,wBAAwB,CAAC,IAAI,EAAE,QAAQ;IAI9C;;;;OAIG;IACI,uBAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ;IAIrD;;;OAGG;IACI,uBAAuB;IAI9B;;;OAGG;IACI,iBAAiB,CAAC,EAAE,EAAE,iBAAiB,GAAG,MAAM,IAAI;IAK3D;;;OAGG;IACI,cAAc,CAAC,IAAI,EAAE,UAAU;IAyBtB,OAAO;cAgCJ,MAAM;IAMzB,wDAAwD;IACxD,OAAO,CAAC,mBAAmB;IAqB3B,mCAAmC;IACnC,OAAO,CAAC,gBAAgB,CAEtB;IAEF,kCAAkC;IAClC,OAAO,CAAC,iBAAiB,CAEvB;IAEF,qEAAqE;IACrE,OAAO,CAAC,mBAAmB;IAgC3B,OAAO,CAAC,kBAAkB,CAQxB;IAIF,iGAAiG;IACjG,OAAO,CAAC,oBAAoB;IAwC5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAWtB,qEAAqE;IACrE,OAAO,CAAC,aAAa;CAoBtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edge-select-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/select/edge-select-handler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAExE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAOtE;;;;;;GAMG;AACH,qBACa,iBAAkB,YAAW,cAAc;IAqB7B,OAAO,CAAC,IAAI;IACX,OAAO,CAAC,MAAM;IArBxC,+DAA+D;IAC/D,SAAgB,IAAI,EAAE,UAAU,CAAmB;IAEnD,gCAAgC;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,+BAA+B;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IAEzC,iEAAiE;IACjE,OAAO,CAAC,QAAQ,CAA2D;IAC3E,gEAAgE;IAChE,OAAO,CAAC,SAAS,CAA2D;IAG5E,sCAAsC;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;gBAGZ,IAAI,EAAE,UAAU,EACf,MAAM,EAAE,YAAY;IActD,yCAAyC;IAClC,MAAM,CACX,OAAO,EAAE,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,EACtF,IAAI,EAAE,eAAe,GACpB,IAAI;IAoEP,oCAAoC;IAC7B,QAAQ,IAAI,IAAI;
|
|
1
|
+
{"version":3,"file":"edge-select-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/select/edge-select-handler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAExE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAOtE;;;;;;GAMG;AACH,qBACa,iBAAkB,YAAW,cAAc;IAqB7B,OAAO,CAAC,IAAI;IACX,OAAO,CAAC,MAAM;IArBxC,+DAA+D;IAC/D,SAAgB,IAAI,EAAE,UAAU,CAAmB;IAEnD,gCAAgC;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,+BAA+B;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IAEzC,iEAAiE;IACjE,OAAO,CAAC,QAAQ,CAA2D;IAC3E,gEAAgE;IAChE,OAAO,CAAC,SAAS,CAA2D;IAG5E,sCAAsC;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;gBAGZ,IAAI,EAAE,UAAU,EACf,MAAM,EAAE,YAAY;IActD,yCAAyC;IAClC,MAAM,CACX,OAAO,EAAE,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,EACtF,IAAI,EAAE,eAAe,GACpB,IAAI;IAoEP,oCAAoC;IAC7B,QAAQ,IAAI,IAAI;IAUvB,mFAAmF;IAC5E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IActC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAyBxB,2EAA2E;IAC3E,OAAO,CAAC,kBAAkB;IAkB1B,OAAO,CAAC,KAAK;IAOb,qEAAqE;IACrE,OAAO,CAAC,6BAA6B;IAsCrC,wEAAwE;IACxE,OAAO,CAAC,oBAAoB;CA2E7B"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ISelectHandler } from '../../interfaces/handler/select-handler';
|
|
2
|
-
import {
|
|
2
|
+
import { IEditorStore } from '../../interfaces/store/editor-store';
|
|
3
|
+
import { IEditorApi } from '../../types/api/editor-api';
|
|
3
4
|
import { SelectMode } from '@planara/types';
|
|
4
5
|
import { EditorEvents } from '../../events/editor-events';
|
|
5
6
|
import { EventTopics } from '../../events/event-topics';
|
|
@@ -13,22 +14,74 @@ import { SelectEventType } from '../../types/event/select-event-type';
|
|
|
13
14
|
*/
|
|
14
15
|
export declare class FaceSelectHandler implements ISelectHandler {
|
|
15
16
|
private _api;
|
|
17
|
+
private _store;
|
|
16
18
|
/** Режим, которым управляет хендлер, нужен только менеджеру */
|
|
17
19
|
readonly mode: SelectMode;
|
|
18
20
|
/** Текущая наведённая грань */
|
|
19
|
-
private
|
|
21
|
+
private readonly _hoverFace;
|
|
20
22
|
/** Текущая выбранная грань */
|
|
23
|
+
private readonly _selectFace;
|
|
24
|
+
/** Текущая группа треугольников для наведённой грани */
|
|
25
|
+
private _hovered;
|
|
26
|
+
/** Текущая группа треугольников для выбранной грани */
|
|
21
27
|
private _selected;
|
|
22
28
|
/** Цвет грани, на которую навелись */
|
|
23
29
|
private readonly _hoverColor;
|
|
24
30
|
/** Цвет выделенной граней */
|
|
25
31
|
private readonly _selectColor;
|
|
26
|
-
/**
|
|
27
|
-
private readonly
|
|
28
|
-
|
|
32
|
+
/** Погрешность на сравнение нормалей */
|
|
33
|
+
private readonly _normalEps;
|
|
34
|
+
/** Погрешность на принадлежность одной плоскости */
|
|
35
|
+
private readonly _planeEps;
|
|
36
|
+
constructor(_api: IEditorApi, _store: IEditorStore);
|
|
37
|
+
/** Обработка текущего режима выборки. */
|
|
29
38
|
handle(payload: EditorEvents[EventTopics.SelectHover] | EditorEvents[EventTopics.SelectClick], type: SelectEventType): void;
|
|
39
|
+
/** Откат текущего режима выборки */
|
|
30
40
|
rollback(): void;
|
|
31
41
|
/** Освобождает ресурсы хендлера, удаляет слушатели и очищает внутренние данные. */
|
|
32
42
|
dispose(): Promise<void> | void;
|
|
43
|
+
/**
|
|
44
|
+
* Инициализация overlay mesh для режима (hover и click).
|
|
45
|
+
* На весь режим используются 2 глобальных mesh на сцене,
|
|
46
|
+
* геометрия которых переписывается под текущую грань.
|
|
47
|
+
*/
|
|
48
|
+
private _makeOverlayFace;
|
|
49
|
+
/**
|
|
50
|
+
* Сбор логической грани как связной группы компланарных треугольников.
|
|
51
|
+
* Если geometry неиндексированная — пока возвращаем только стартовый triangle.
|
|
52
|
+
*/
|
|
53
|
+
private _collectFaceGroup;
|
|
54
|
+
/** Перезаписывает overlay mesh world-space треугольниками выбранной грани */
|
|
55
|
+
private _writeWorldFaceGroup;
|
|
56
|
+
/** Сравнение двух логических граней */
|
|
57
|
+
private _same;
|
|
58
|
+
/** Подготовка метаданных выбранной грани для инструментов */
|
|
59
|
+
private _prepareFaceMetadata;
|
|
60
|
+
/**
|
|
61
|
+
* Центрирует proxy-грань, чтобы TransformControls работали с ней как с обычным объектом.
|
|
62
|
+
* После записи world-space вершин переносит геометрию в локальные координаты proxy mesh.
|
|
63
|
+
*/
|
|
64
|
+
private _centerFaceProxy;
|
|
65
|
+
/** Регистрирует ребро треугольника в edge map */
|
|
66
|
+
private _pushEdge;
|
|
67
|
+
/** Строит граф соседства треугольников по общим ребрам */
|
|
68
|
+
private _buildTriangleAdjacency;
|
|
69
|
+
/** Возвращает индексы трех вершин треугольника */
|
|
70
|
+
private _getTriangleIndices;
|
|
71
|
+
/** Читает вершину из position buffer в local space geometry */
|
|
72
|
+
private _readVertex;
|
|
73
|
+
/** Построение ключа вершины по позиции */
|
|
74
|
+
private _vertexKey;
|
|
75
|
+
/**
|
|
76
|
+
* Строит отображение исходных индексов вершин в "сваренные" ids по координате.
|
|
77
|
+
* Нужно для случаев, когда соседние треугольники визуально делят ребро,
|
|
78
|
+
* но используют разные индексы вершин (например, цилиндрические крышки, UV seams и т.п.).
|
|
79
|
+
*/
|
|
80
|
+
private _buildWeldMap;
|
|
81
|
+
/** Сбрасывает transform proxy-граням */
|
|
82
|
+
private _resetFaceProxyTransform;
|
|
83
|
+
private _buildFaceVertexGroups;
|
|
84
|
+
private _findChildLines;
|
|
85
|
+
private _buildLineVertexGroups;
|
|
33
86
|
}
|
|
34
87
|
//# sourceMappingURL=face-select-handler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"face-select-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/select/face-select-handler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"face-select-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/select/face-select-handler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAG5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAyBtE;;;;;;GAMG;AACH,qBACa,iBAAkB,YAAW,cAAc;IA+B7B,OAAO,CAAC,IAAI;IACX,OAAO,CAAC,MAAM;IA/BxC,+DAA+D;IAC/D,SAAgB,IAAI,EAAE,UAAU,CAAmB;IAEnD,+BAA+B;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,8BAA8B;IAC9B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IAMzC,wDAAwD;IACxD,OAAO,CAAC,QAAQ,CAA0B;IAC1C,uDAAuD;IACvD,OAAO,CAAC,SAAS,CAA0B;IAG3C,sCAAsC;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAG7C,wCAAwC;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,oDAAoD;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAGD,IAAI,EAAE,UAAU,EACf,MAAM,EAAE,YAAY;IActD,yCAAyC;IAClC,MAAM,CACX,OAAO,EAAE,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,EACtF,IAAI,EAAE,eAAe,GACpB,IAAI;IAyEP,oCAAoC;IAC7B,QAAQ,IAAI,IAAI;IAWvB,mFAAmF;IAC5E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAatC;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IA0BxB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAuGzB,6EAA6E;IAC7E,OAAO,CAAC,oBAAoB;IA8C5B,uCAAuC;IACvC,OAAO,CAAC,KAAK;IAUb,6DAA6D;IAC7D,OAAO,CAAC,oBAAoB;IAgB5B;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA8BxB,iDAAiD;IACjD,OAAO,CAAC,SAAS;IAQjB,0DAA0D;IAC1D,OAAO,CAAC,uBAAuB;IA6C/B,kDAAkD;IAClD,OAAO,CAAC,mBAAmB;IAO3B,+DAA+D;IAC/D,OAAO,CAAC,WAAW;IAInB,0CAA0C;IAC1C,OAAO,CAAC,UAAU;IAOlB;;;;OAIG;IACH,OAAO,CAAC,aAAa;IA0BrB,wCAAwC;IACxC,OAAO,CAAC,wBAAwB;IAOhC,OAAO,CAAC,sBAAsB;IAqE9B,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,sBAAsB;CAiC/B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mesh-select-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/select/mesh-select-handler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAItE;;;;;;GAMG;AACH,qBACa,iBAAkB,YAAW,cAAc;IAkB7B,OAAO,CAAC,IAAI;IACX,OAAO,CAAC,MAAM;IAlBxC,+DAA+D;IAC/D,SAAgB,IAAI,EAAE,UAAU,CAAmB;IAEnD,kDAAkD;IAClD,OAAO,CAAC,YAAY,CAA2B;IAC/C,8CAA8C;IAC9C,OAAO,CAAC,aAAa,CAA2B;IAGhD,iDAAiD;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,uCAAuC;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,iDAAiD;IACjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkD;gBAGjD,IAAI,EAAE,WAAW,EAChB,MAAM,EAAE,YAAY;IAG/C,MAAM,CACX,OAAO,EAAE,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,EACtF,IAAI,EAAE,eAAe,GACpB,IAAI;IAuDA,QAAQ,IAAI,IAAI;
|
|
1
|
+
{"version":3,"file":"mesh-select-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/select/mesh-select-handler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAItE;;;;;;GAMG;AACH,qBACa,iBAAkB,YAAW,cAAc;IAkB7B,OAAO,CAAC,IAAI;IACX,OAAO,CAAC,MAAM;IAlBxC,+DAA+D;IAC/D,SAAgB,IAAI,EAAE,UAAU,CAAmB;IAEnD,kDAAkD;IAClD,OAAO,CAAC,YAAY,CAA2B;IAC/C,8CAA8C;IAC9C,OAAO,CAAC,aAAa,CAA2B;IAGhD,iDAAiD;IACjD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,uCAAuC;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,iDAAiD;IACjD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkD;gBAGjD,IAAI,EAAE,WAAW,EAChB,MAAM,EAAE,YAAY;IAG/C,MAAM,CACX,OAAO,EAAE,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,EACtF,IAAI,EAAE,eAAe,GACpB,IAAI;IAuDA,QAAQ,IAAI,IAAI;IAUvB,mFAAmF;IAC5E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAItC;;OAEG;IACH,OAAO,CAAC,WAAW;IAenB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;CAa3B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vertex-select-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/select/vertex-select-handler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAExE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAQtE;;;;;;GAMG;AACH,qBACa,mBAAoB,YAAW,cAAc;IAmB/B,OAAO,CAAC,IAAI;IACX,OAAO,CAAC,MAAM;IAnBxC,+DAA+D;IAC/D,SAAgB,IAAI,EAAE,UAAU,CAAqB;IAErD,OAAO,CAAC,QAAQ,CAAwD;IACxE,OAAO,CAAC,SAAS,CAAwD;IAEzE,kCAAkC;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,iCAAiC;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAG7C,sCAAsC;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;gBAGZ,IAAI,EAAE,UAAU,EACf,MAAM,EAAE,YAAY;IAc/C,MAAM,CACX,OAAO,EAAE,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,EACtF,IAAI,EAAE,eAAe,GACpB,IAAI;IAqEA,QAAQ,IAAI,IAAI;
|
|
1
|
+
{"version":3,"file":"vertex-select-handler.d.ts","sourceRoot":"","sources":["../../../src/handlers/select/vertex-select-handler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAExE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAQtE;;;;;;GAMG;AACH,qBACa,mBAAoB,YAAW,cAAc;IAmB/B,OAAO,CAAC,IAAI;IACX,OAAO,CAAC,MAAM;IAnBxC,+DAA+D;IAC/D,SAAgB,IAAI,EAAE,UAAU,CAAqB;IAErD,OAAO,CAAC,QAAQ,CAAwD;IACxE,OAAO,CAAC,SAAS,CAAwD;IAEzE,kCAAkC;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,iCAAiC;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAG7C,sCAAsC;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;gBAGZ,IAAI,EAAE,UAAU,EACf,MAAM,EAAE,YAAY;IAc/C,MAAM,CACX,OAAO,EAAE,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,WAAW,CAAC,EACtF,IAAI,EAAE,eAAe,GACpB,IAAI;IAqEA,QAAQ,IAAI,IAAI;IAUhB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAetC,OAAO,CAAC,kBAAkB;IA2B1B,iFAAiF;IACjF,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,KAAK;IAOb,mFAAmF;IACnF,OAAO,CAAC,sBAAsB;IAuE9B,iDAAiD;IACjD,OAAO,CAAC,oBAAoB;CA2B7B"}
|
package/dist/hub/app-hub.d.ts
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import { EditorHub } from './editor-hub';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Инициализирует редактор и возвращает хаб.
|
|
4
|
+
* Вызывать один раз при старте (когда есть canvas).
|
|
4
5
|
* @public
|
|
5
6
|
*/
|
|
6
7
|
export declare const createAppHub: (canvas: HTMLCanvasElement) => EditorHub;
|
|
8
|
+
/**
|
|
9
|
+
* Возвращает уже созданный хаб, если редактор инициализирован.
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
export declare const getAppHub: () => EditorHub;
|
|
7
13
|
//# sourceMappingURL=app-hub.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-hub.d.ts","sourceRoot":"","sources":["../../src/hub/app-hub.ts"],"names":[],"mappings":"AACA,OAAO,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"app-hub.d.ts","sourceRoot":"","sources":["../../src/hub/app-hub.ts"],"names":[],"mappings":"AACA,OAAO,kBAAkB,CAAC;AAG1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAM9C;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,QAAQ,iBAAiB,KAAG,SAOxD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,QAAO,SAM5B,CAAC"}
|
package/dist/index.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("reflect-metadata");const c=require("three"),l=require("@planara/types"),x=require("@planara/three"),h=require("tsyringe"),Pe=require("events"),Le=require("mobx");function De(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const s in t)if(s!=="default"){const i=Object.getOwnPropertyDescriptor(t,s);Object.defineProperty(e,s,i.get?i:{enumerable:!0,get:()=>t[s]})}}return e.default=t,Object.freeze(e)}const a=De(c),Ce={[l.FigureType.Plane]:()=>new a.PlaneGeometry(1,1,1,1),[l.FigureType.Cube]:()=>new a.BoxGeometry(1,1,1,1,1,1),[l.FigureType.UVSphere]:()=>new a.SphereGeometry(.5,32,16),[l.FigureType.Icosphere]:()=>new a.IcosahedronGeometry(.5,0),[l.FigureType.Cylinder]:()=>new a.CylinderGeometry(.5,.5,1,32,1,!1),[l.FigureType.Cone]:()=>new a.ConeGeometry(.5,1,32,1,!1),[l.FigureType.Torus]:()=>new a.TorusGeometry(.5,.2,16,64),[l.FigureType.Circle]:()=>new a.CircleGeometry(.5,32),[l.FigureType.Sphere]:()=>new a.SphereGeometry(.5,32,16),[l.FigureType.Custom]:function(){throw new Error("Custom geometry is not generated here.")}},Me=new a.MeshStandardMaterial({color:12566463,metalness:0,roughness:.6}),je=8;class se{scene;camera;renderer;canvas;meshes=[];constructor(e){this.canvas=e,this.scene=new a.Scene,this.scene.background=new a.Color(1710618),this.camera=new a.PerspectiveCamera(45,e.clientWidth/e.clientHeight,.1,1e3),this.camera.position.set(1,1,7),this.renderer=new a.WebGLRenderer({canvas:e,antialias:!0}),this.renderer.setSize(e.clientWidth,e.clientHeight);const s=new a.AmbientLight(16777215,.5);this.scene.add(s);const i=new a.DirectionalLight(16777215,1);i.position.set(5,10,7),this.scene.add(i)}resize(){this.camera.aspect=this.canvas.clientWidth/this.canvas.clientHeight,this.camera.updateProjectionMatrix(),this.renderer.setSize(this.canvas.clientWidth,this.canvas.clientHeight)}render(){this.renderer.render(this.scene,this.camera)}update(){}loop(){this.update(),this.render(),requestAnimationFrame(()=>this.loop())}addFigure(e){const s=new a.BufferGeometry;s.setAttribute("position",new a.Float32BufferAttribute(e.position,3)),e.normal&&s.setAttribute("normal",new a.Float32BufferAttribute(e.normal,3)),e.uv&&s.setAttribute("uv",new a.Float32BufferAttribute(e.uv,2));const i=new a.Mesh(s,Me);return this.scene.add(i),this.meshes.push(i),i}addMesh(e){this.scene&&(this.scene.add(e),this.meshes.push(e))}removeMesh(e){this.scene&&(this.scene.remove(e),this.meshes=this.meshes.filter(s=>s!==e))}getMeshes(){return this.meshes}addObject(e,s){this.scene&&(typeof s=="number"&&e.layers.set(s),this.scene.add(e))}removeObject(e){this.scene&&(e.parent?e.parent.remove(e):this.scene.remove(e))}enableCameraLayer(e){this.camera&&this.camera.layers.enable(e)}dispose(){this.meshes&&(this.meshes.length=0,this.meshes=[]),this.scene=null,this.camera=null,this.renderer?.dispose(),this.canvas=null}}var Ae=Object.getOwnPropertyDescriptor,xe=(t,e,s,i)=>{for(var r=i>1?void 0:i?Ae(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r};exports.EventBus=class{_emitter;constructor(){this._emitter=new Pe.EventEmitter}emit(e,s){this._emitter.emit(e,s)}on(e,s){this._emitter.on(e,s)}off(e,s){this._emitter.off(e,s)}};exports.EventBus=xe([h.injectable()],exports.EventBus);var P=(t=>(t.SelectHover="select.hover",t.SelectClick="select.click",t.ToolSelect="tool.select",t))(P||{});const Re=.03,He=.05,Se=0,Ie=1,Ve=2,T=31,H=16776960,I=16755200,ke=2236962,Ue=2236962,Ne=t=>!!t&&t.isMesh,Ee=t=>{let e=t;for(;e;){if(e.isMesh)return e;e=e.parent}return null},we=t=>{const e=new a.BufferGeometry;e.setAttribute("position",t.getAttribute("position")),e.computeBoundingSphere(),e.computeBoundingBox();const s=new a.PointsMaterial({color:Ue,size:6,sizeAttenuation:!1,depthTest:!1,depthWrite:!1,transparent:!0,opacity:.9}),i=new a.Points(e,s);return i.layers.set(Ve),i.renderOrder=1e3,i.visible=!1,i},Te=t=>{const e=new a.EdgesGeometry(t),s=new a.LineSegments(e,new a.LineBasicMaterial({color:ke,linewidth:1}));return s.layers.set(Ie),s},Fe=t=>{const e={x:t.position.x,y:t.position.y,z:t.position.z},s={x:t.rotation.x,y:t.rotation.y,z:t.rotation.z},i={x:t.scale.x,y:t.scale.y,z:t.scale.z},r=new a.Box3().setFromObject(t),o=new a.Vector3;r.getSize(o);const n={x:o.x,y:o.y,z:o.z};return{position:e,rotation:s,scale:i,size:n}};var Ye=Object.getOwnPropertyDescriptor,ze=(t,e,s,i)=>{for(var r=i>1?void 0:i?Ye(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},he=(t,e)=>(s,i)=>e(s,i,t);exports.EditorRenderer=class extends se{constructor(e,s){super(e),this._canvas=e,this._bus=s;const i=new a.GridHelper(10,10);i.position.y=-.001,this.scene.add(i);const r=new x.SymmetricAxesHelper(6);this.scene.add(r),this._orbit=new x.OrbitWithState(this.camera,this.renderer.domElement),this._orbit.enableDamping=!0,this._orbit.dampingFactor=.05,this._cameraGizmo=new x.CameraAxesGizmo(this.renderer,this.camera,{size:96,margin:36}),this._raycaster=new a.Raycaster,this._mouse=new a.Vector2,this.scene.add(new a.HemisphereLight(16777215,4473924,.6)),this.camera.layers.enable(0),this.camera.layers.enable(1),this._transform=new x.ModelingTransformControls(this.camera,this.renderer.domElement),this._transformHelper=this._transform.getHelper(),this.scene.add(this._transformHelper),this._isEventListenersAdded||this._initMouseListeners()}_orbit;_transform;_transformHelper;_raycaster;_mouse;_isEventListenersAdded=!1;_lastHovered=null;_cameraGizmo;_transformListeners=new Set;update(){this._orbit.update()}addFigure(e){const s=super.addFigure(e);s.layers.enable(Se);const i=Te(s.geometry);s.add(i);const r=we(s.geometry);return s.add(r),s}setTransformControlsMode(e){this._transform.setMode(e)}attachTransformControls(e){this._transform.attach(e)}detachTransformControls(){this._transform.detach()}onTransformChange(e){return this._transformListeners.add(e),()=>this._transformListeners.delete(e)}setRaycastMode(e){const s=this._raycaster;switch(s.params.Line.threshold=0,s.params.Points.threshold=0,e){case l.SelectMode.Mesh:case l.SelectMode.Face:s.layers.set(0);break;case l.SelectMode.Edge:s.layers.set(1),s.params.Line.threshold=Re;break;case l.SelectMode.Vertex:s.layers.set(2),s.params.Points.threshold=He;break}}dispose(){this._isEventListenersAdded&&(this.canvas.removeEventListener("mousemove",this._handleMouseMove,!1),this.canvas.removeEventListener("click",this._handleMouseClick,!1),this.canvas.removeEventListener("pointerdown",e=>this._transform.pointerDown(e)),this.canvas.removeEventListener("pointermove",e=>this._transform.pointerMove(e)),this.canvas.removeEventListener("pointerup",e=>this._transform.pointerUp(e)),this.canvas.removeEventListener("pointerleave",()=>this._transform.pointerHover(null)),this._transform.removeEventListener("dragging-changed",()=>{this._orbit.enabled=!this._transform.dragging}),this._transformListeners.clear(),this._isEventListenersAdded=!1),this._orbit?.dispose(),this._transform?.dispose(),this._transformHelper?.parent&&this._transformHelper.parent.remove(this._transformHelper),this._lastHovered=null,super.dispose()}render(){super.render(),this._cameraGizmo.render(this.canvas.width,this.canvas.height)}_initMouseListeners(){this.canvas.addEventListener("mousemove",this._handleMouseMove,!1),this.canvas.addEventListener("click",this._handleMouseClick,!1),this.canvas.addEventListener("pointerdown",e=>this._transform.pointerDown(e)),this.canvas.addEventListener("pointermove",e=>this._transform.pointerMove(e)),this.canvas.addEventListener("pointerup",e=>this._transform.pointerUp(e)),this.canvas.addEventListener("pointerleave",()=>this._transform.pointerHover(null)),this._transform.addEventListener("dragging-changed",()=>{this._orbit.enabled=!this._transform.dragging}),this._transform.addEventListener("objectChange",()=>{for(const e of this._transformListeners)e()}),this._isEventListenersAdded=!0}_handleMouseMove=e=>{this._processRaycastEvent(e,P.SelectHover,!0)};_handleMouseClick=e=>{this._processRaycastEvent(e,P.SelectClick,!1)};_processRaycastEvent(e,s,i){if(this._orbit.isInteracting||this._transform.dragging)return;const r=this._canvas.getBoundingClientRect();this._mouse.x=(e.clientX-r.left)/r.width*2-1,this._mouse.y=-((e.clientY-r.top)/r.height)*2+1,this._raycaster.setFromCamera(this._mouse,this.camera);const n=this._raycaster.intersectObjects(this.meshes,!0)[0]??null,d=n?.object??null;i?d!==this._lastHovered&&(this.meshes.forEach(p=>p.userData.isHit=!1),d&&(d.userData.isHit=!0),this._lastHovered=d,this._bus.emit(s,n?{intersection:n}:null)):this._bus.emit(s,n?{intersection:n}:null)}};exports.EditorRenderer=ze([h.injectable(),he(0,h.inject("Canvas")),he(1,h.inject("EventBus"))],exports.EditorRenderer);const le={type:"change"},ie={type:"start"},Oe={type:"end"},R=new c.Ray,ce=new c.Plane,We=Math.cos(70*c.MathUtils.DEG2RAD),m=new c.Vector3,b=2*Math.PI,_={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6},k=1e-6;class Be extends c.Controls{constructor(e,s=null){super(e,s),this.state=_.NONE,this.target=new c.Vector3,this.cursor=new c.Vector3,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minTargetRadius=0,this.maxTargetRadius=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.05,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.keyRotateSpeed=1,this.enablePan=!0,this.panSpeed=1,this.screenSpacePanning=!0,this.keyPanSpeed=7,this.zoomToCursor=!1,this.autoRotate=!1,this.autoRotateSpeed=2,this.keys={LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",BOTTOM:"ArrowDown"},this.mouseButtons={LEFT:c.MOUSE.ROTATE,MIDDLE:c.MOUSE.DOLLY,RIGHT:c.MOUSE.PAN},this.touches={ONE:c.TOUCH.ROTATE,TWO:c.TOUCH.DOLLY_PAN},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this._domElementKeyEvents=null,this._lastPosition=new c.Vector3,this._lastQuaternion=new c.Quaternion,this._lastTargetPosition=new c.Vector3,this._quat=new c.Quaternion().setFromUnitVectors(e.up,new c.Vector3(0,1,0)),this._quatInverse=this._quat.clone().invert(),this._spherical=new c.Spherical,this._sphericalDelta=new c.Spherical,this._scale=1,this._panOffset=new c.Vector3,this._rotateStart=new c.Vector2,this._rotateEnd=new c.Vector2,this._rotateDelta=new c.Vector2,this._panStart=new c.Vector2,this._panEnd=new c.Vector2,this._panDelta=new c.Vector2,this._dollyStart=new c.Vector2,this._dollyEnd=new c.Vector2,this._dollyDelta=new c.Vector2,this._dollyDirection=new c.Vector3,this._mouse=new c.Vector2,this._performCursorZoom=!1,this._pointers=[],this._pointerPositions={},this._controlActive=!1,this._onPointerMove=$e.bind(this),this._onPointerDown=Ze.bind(this),this._onPointerUp=Xe.bind(this),this._onContextMenu=tt.bind(this),this._onMouseWheel=qe.bind(this),this._onKeyDown=Qe.bind(this),this._onTouchStart=Je.bind(this),this._onTouchMove=et.bind(this),this._onMouseDown=Ge.bind(this),this._onMouseMove=Ke.bind(this),this._interceptControlDown=st.bind(this),this._interceptControlUp=it.bind(this),this.domElement!==null&&this.connect(this.domElement),this.update()}connect(e){super.connect(e),this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointercancel",this._onPointerUp),this.domElement.addEventListener("contextmenu",this._onContextMenu),this.domElement.addEventListener("wheel",this._onMouseWheel,{passive:!1}),this.domElement.getRootNode().addEventListener("keydown",this._interceptControlDown,{passive:!0,capture:!0}),this.domElement.style.touchAction="none"}disconnect(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.domElement.removeEventListener("pointercancel",this._onPointerUp),this.domElement.removeEventListener("wheel",this._onMouseWheel),this.domElement.removeEventListener("contextmenu",this._onContextMenu),this.stopListenToKeyEvents(),this.domElement.getRootNode().removeEventListener("keydown",this._interceptControlDown,{capture:!0}),this.domElement.style.touchAction="auto"}dispose(){this.disconnect()}getPolarAngle(){return this._spherical.phi}getAzimuthalAngle(){return this._spherical.theta}getDistance(){return this.object.position.distanceTo(this.target)}listenToKeyEvents(e){e.addEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=e}stopListenToKeyEvents(){this._domElementKeyEvents!==null&&(this._domElementKeyEvents.removeEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=null)}saveState(){this.target0.copy(this.target),this.position0.copy(this.object.position),this.zoom0=this.object.zoom}reset(){this.target.copy(this.target0),this.object.position.copy(this.position0),this.object.zoom=this.zoom0,this.object.updateProjectionMatrix(),this.dispatchEvent(le),this.update(),this.state=_.NONE}update(e=null){const s=this.object.position;m.copy(s).sub(this.target),m.applyQuaternion(this._quat),this._spherical.setFromVector3(m),this.autoRotate&&this.state===_.NONE&&this._rotateLeft(this._getAutoRotationAngle(e)),this.enableDamping?(this._spherical.theta+=this._sphericalDelta.theta*this.dampingFactor,this._spherical.phi+=this._sphericalDelta.phi*this.dampingFactor):(this._spherical.theta+=this._sphericalDelta.theta,this._spherical.phi+=this._sphericalDelta.phi);let i=this.minAzimuthAngle,r=this.maxAzimuthAngle;isFinite(i)&&isFinite(r)&&(i<-Math.PI?i+=b:i>Math.PI&&(i-=b),r<-Math.PI?r+=b:r>Math.PI&&(r-=b),i<=r?this._spherical.theta=Math.max(i,Math.min(r,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(i+r)/2?Math.max(i,this._spherical.theta):Math.min(r,this._spherical.theta)),this._spherical.phi=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,this._spherical.phi)),this._spherical.makeSafe(),this.enableDamping===!0?this.target.addScaledVector(this._panOffset,this.dampingFactor):this.target.add(this._panOffset),this.target.sub(this.cursor),this.target.clampLength(this.minTargetRadius,this.maxTargetRadius),this.target.add(this.cursor);let o=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{const n=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),o=n!=this._spherical.radius}if(m.setFromSpherical(this._spherical),m.applyQuaternion(this._quatInverse),s.copy(this.target).add(m),this.object.lookAt(this.target),this.enableDamping===!0?(this._sphericalDelta.theta*=1-this.dampingFactor,this._sphericalDelta.phi*=1-this.dampingFactor,this._panOffset.multiplyScalar(1-this.dampingFactor)):(this._sphericalDelta.set(0,0,0),this._panOffset.set(0,0,0)),this.zoomToCursor&&this._performCursorZoom){let n=null;if(this.object.isPerspectiveCamera){const d=m.length();n=this._clampDistance(d*this._scale);const p=d-n;this.object.position.addScaledVector(this._dollyDirection,p),this.object.updateMatrixWorld(),o=!!p}else if(this.object.isOrthographicCamera){const d=new c.Vector3(this._mouse.x,this._mouse.y,0);d.unproject(this.object);const p=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),o=p!==this.object.zoom;const f=new c.Vector3(this._mouse.x,this._mouse.y,0);f.unproject(this.object),this.object.position.sub(f).add(d),this.object.updateMatrixWorld(),n=m.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),this.zoomToCursor=!1;n!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(n).add(this.object.position):(R.origin.copy(this.object.position),R.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(R.direction))<We?this.object.lookAt(this.target):(ce.setFromNormalAndCoplanarPoint(this.object.up,this.target),R.intersectPlane(ce,this.target))))}else if(this.object.isOrthographicCamera){const n=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),n!==this.object.zoom&&(this.object.updateProjectionMatrix(),o=!0)}return this._scale=1,this._performCursorZoom=!1,o||this._lastPosition.distanceToSquared(this.object.position)>k||8*(1-this._lastQuaternion.dot(this.object.quaternion))>k||this._lastTargetPosition.distanceToSquared(this.target)>k?(this.dispatchEvent(le),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(e){return e!==null?b/60*this.autoRotateSpeed*e:b/60/60*this.autoRotateSpeed}_getZoomScale(e){const s=Math.abs(e*.01);return Math.pow(.95,this.zoomSpeed*s)}_rotateLeft(e){this._sphericalDelta.theta-=e}_rotateUp(e){this._sphericalDelta.phi-=e}_panLeft(e,s){m.setFromMatrixColumn(s,0),m.multiplyScalar(-e),this._panOffset.add(m)}_panUp(e,s){this.screenSpacePanning===!0?m.setFromMatrixColumn(s,1):(m.setFromMatrixColumn(s,0),m.crossVectors(this.object.up,m)),m.multiplyScalar(e),this._panOffset.add(m)}_pan(e,s){const i=this.domElement;if(this.object.isPerspectiveCamera){const r=this.object.position;m.copy(r).sub(this.target);let o=m.length();o*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*e*o/i.clientHeight,this.object.matrix),this._panUp(2*s*o/i.clientHeight,this.object.matrix)}else this.object.isOrthographicCamera?(this._panLeft(e*(this.object.right-this.object.left)/this.object.zoom/i.clientWidth,this.object.matrix),this._panUp(s*(this.object.top-this.object.bottom)/this.object.zoom/i.clientHeight,this.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),this.enablePan=!1)}_dollyOut(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale/=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_dollyIn(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale*=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_updateZoomParameters(e,s){if(!this.zoomToCursor)return;this._performCursorZoom=!0;const i=this.domElement.getBoundingClientRect(),r=e-i.left,o=s-i.top,n=i.width,d=i.height;this._mouse.x=r/n*2-1,this._mouse.y=-(o/d)*2+1,this._dollyDirection.set(this._mouse.x,this._mouse.y,1).unproject(this.object).sub(this.object.position).normalize()}_clampDistance(e){return Math.max(this.minDistance,Math.min(this.maxDistance,e))}_handleMouseDownRotate(e){this._rotateStart.set(e.clientX,e.clientY)}_handleMouseDownDolly(e){this._updateZoomParameters(e.clientX,e.clientX),this._dollyStart.set(e.clientX,e.clientY)}_handleMouseDownPan(e){this._panStart.set(e.clientX,e.clientY)}_handleMouseMoveRotate(e){this._rotateEnd.set(e.clientX,e.clientY),this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const s=this.domElement;this._rotateLeft(b*this._rotateDelta.x/s.clientHeight),this._rotateUp(b*this._rotateDelta.y/s.clientHeight),this._rotateStart.copy(this._rotateEnd),this.update()}_handleMouseMoveDolly(e){this._dollyEnd.set(e.clientX,e.clientY),this._dollyDelta.subVectors(this._dollyEnd,this._dollyStart),this._dollyDelta.y>0?this._dollyOut(this._getZoomScale(this._dollyDelta.y)):this._dollyDelta.y<0&&this._dollyIn(this._getZoomScale(this._dollyDelta.y)),this._dollyStart.copy(this._dollyEnd),this.update()}_handleMouseMovePan(e){this._panEnd.set(e.clientX,e.clientY),this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd),this.update()}_handleMouseWheel(e){this._updateZoomParameters(e.clientX,e.clientY),e.deltaY<0?this._dollyIn(this._getZoomScale(e.deltaY)):e.deltaY>0&&this._dollyOut(this._getZoomScale(e.deltaY)),this.update()}_handleKeyDown(e){let s=!1;switch(e.code){case this.keys.UP:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(b*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,this.keyPanSpeed),s=!0;break;case this.keys.BOTTOM:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(-b*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,-this.keyPanSpeed),s=!0;break;case this.keys.LEFT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(b*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(this.keyPanSpeed,0),s=!0;break;case this.keys.RIGHT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(-b*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(-this.keyPanSpeed,0),s=!0;break}s&&(e.preventDefault(),this.update())}_handleTouchStartRotate(e){if(this._pointers.length===1)this._rotateStart.set(e.pageX,e.pageY);else{const s=this._getSecondPointerPosition(e),i=.5*(e.pageX+s.x),r=.5*(e.pageY+s.y);this._rotateStart.set(i,r)}}_handleTouchStartPan(e){if(this._pointers.length===1)this._panStart.set(e.pageX,e.pageY);else{const s=this._getSecondPointerPosition(e),i=.5*(e.pageX+s.x),r=.5*(e.pageY+s.y);this._panStart.set(i,r)}}_handleTouchStartDolly(e){const s=this._getSecondPointerPosition(e),i=e.pageX-s.x,r=e.pageY-s.y,o=Math.sqrt(i*i+r*r);this._dollyStart.set(0,o)}_handleTouchStartDollyPan(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enablePan&&this._handleTouchStartPan(e)}_handleTouchStartDollyRotate(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enableRotate&&this._handleTouchStartRotate(e)}_handleTouchMoveRotate(e){if(this._pointers.length==1)this._rotateEnd.set(e.pageX,e.pageY);else{const i=this._getSecondPointerPosition(e),r=.5*(e.pageX+i.x),o=.5*(e.pageY+i.y);this._rotateEnd.set(r,o)}this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const s=this.domElement;this._rotateLeft(b*this._rotateDelta.x/s.clientHeight),this._rotateUp(b*this._rotateDelta.y/s.clientHeight),this._rotateStart.copy(this._rotateEnd)}_handleTouchMovePan(e){if(this._pointers.length===1)this._panEnd.set(e.pageX,e.pageY);else{const s=this._getSecondPointerPosition(e),i=.5*(e.pageX+s.x),r=.5*(e.pageY+s.y);this._panEnd.set(i,r)}this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd)}_handleTouchMoveDolly(e){const s=this._getSecondPointerPosition(e),i=e.pageX-s.x,r=e.pageY-s.y,o=Math.sqrt(i*i+r*r);this._dollyEnd.set(0,o),this._dollyDelta.set(0,Math.pow(this._dollyEnd.y/this._dollyStart.y,this.zoomSpeed)),this._dollyOut(this._dollyDelta.y),this._dollyStart.copy(this._dollyEnd);const n=(e.pageX+s.x)*.5,d=(e.pageY+s.y)*.5;this._updateZoomParameters(n,d)}_handleTouchMoveDollyPan(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enablePan&&this._handleTouchMovePan(e)}_handleTouchMoveDollyRotate(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enableRotate&&this._handleTouchMoveRotate(e)}_addPointer(e){this._pointers.push(e.pointerId)}_removePointer(e){delete this._pointerPositions[e.pointerId];for(let s=0;s<this._pointers.length;s++)if(this._pointers[s]==e.pointerId){this._pointers.splice(s,1);return}}_isTrackingPointer(e){for(let s=0;s<this._pointers.length;s++)if(this._pointers[s]==e.pointerId)return!0;return!1}_trackPointer(e){let s=this._pointerPositions[e.pointerId];s===void 0&&(s=new c.Vector2,this._pointerPositions[e.pointerId]=s),s.set(e.pageX,e.pageY)}_getSecondPointerPosition(e){const s=e.pointerId===this._pointers[0]?this._pointers[1]:this._pointers[0];return this._pointerPositions[s]}_customWheelEvent(e){const s=e.deltaMode,i={clientX:e.clientX,clientY:e.clientY,deltaY:e.deltaY};switch(s){case 1:i.deltaY*=16;break;case 2:i.deltaY*=100;break}return e.ctrlKey&&!this._controlActive&&(i.deltaY*=10),i}}function Ze(t){this.enabled!==!1&&(this._pointers.length===0&&(this.domElement.setPointerCapture(t.pointerId),this.domElement.addEventListener("pointermove",this._onPointerMove),this.domElement.addEventListener("pointerup",this._onPointerUp)),!this._isTrackingPointer(t)&&(this._addPointer(t),t.pointerType==="touch"?this._onTouchStart(t):this._onMouseDown(t)))}function $e(t){this.enabled!==!1&&(t.pointerType==="touch"?this._onTouchMove(t):this._onMouseMove(t))}function Xe(t){switch(this._removePointer(t),this._pointers.length){case 0:this.domElement.releasePointerCapture(t.pointerId),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.dispatchEvent(Oe),this.state=_.NONE;break;case 1:const e=this._pointers[0],s=this._pointerPositions[e];this._onTouchStart({pointerId:e,pageX:s.x,pageY:s.y});break}}function Ge(t){let e;switch(t.button){case 0:e=this.mouseButtons.LEFT;break;case 1:e=this.mouseButtons.MIDDLE;break;case 2:e=this.mouseButtons.RIGHT;break;default:e=-1}switch(e){case c.MOUSE.DOLLY:if(this.enableZoom===!1)return;this._handleMouseDownDolly(t),this.state=_.DOLLY;break;case c.MOUSE.ROTATE:if(t.ctrlKey||t.metaKey||t.shiftKey){if(this.enablePan===!1)return;this._handleMouseDownPan(t),this.state=_.PAN}else{if(this.enableRotate===!1)return;this._handleMouseDownRotate(t),this.state=_.ROTATE}break;case c.MOUSE.PAN:if(t.ctrlKey||t.metaKey||t.shiftKey){if(this.enableRotate===!1)return;this._handleMouseDownRotate(t),this.state=_.ROTATE}else{if(this.enablePan===!1)return;this._handleMouseDownPan(t),this.state=_.PAN}break;default:this.state=_.NONE}this.state!==_.NONE&&this.dispatchEvent(ie)}function Ke(t){switch(this.state){case _.ROTATE:if(this.enableRotate===!1)return;this._handleMouseMoveRotate(t);break;case _.DOLLY:if(this.enableZoom===!1)return;this._handleMouseMoveDolly(t);break;case _.PAN:if(this.enablePan===!1)return;this._handleMouseMovePan(t);break}}function qe(t){this.enabled===!1||this.enableZoom===!1||this.state!==_.NONE||(t.preventDefault(),this.dispatchEvent(ie),this._handleMouseWheel(this._customWheelEvent(t)),this.dispatchEvent(Oe))}function Qe(t){this.enabled!==!1&&this._handleKeyDown(t)}function Je(t){switch(this._trackPointer(t),this._pointers.length){case 1:switch(this.touches.ONE){case c.TOUCH.ROTATE:if(this.enableRotate===!1)return;this._handleTouchStartRotate(t),this.state=_.TOUCH_ROTATE;break;case c.TOUCH.PAN:if(this.enablePan===!1)return;this._handleTouchStartPan(t),this.state=_.TOUCH_PAN;break;default:this.state=_.NONE}break;case 2:switch(this.touches.TWO){case c.TOUCH.DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchStartDollyPan(t),this.state=_.TOUCH_DOLLY_PAN;break;case c.TOUCH.DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchStartDollyRotate(t),this.state=_.TOUCH_DOLLY_ROTATE;break;default:this.state=_.NONE}break;default:this.state=_.NONE}this.state!==_.NONE&&this.dispatchEvent(ie)}function et(t){switch(this._trackPointer(t),this.state){case _.TOUCH_ROTATE:if(this.enableRotate===!1)return;this._handleTouchMoveRotate(t),this.update();break;case _.TOUCH_PAN:if(this.enablePan===!1)return;this._handleTouchMovePan(t),this.update();break;case _.TOUCH_DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchMoveDollyPan(t),this.update();break;case _.TOUCH_DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchMoveDollyRotate(t),this.update();break;default:this.state=_.NONE}}function tt(t){this.enabled!==!1&&t.preventDefault()}function st(t){t.key==="Control"&&(this._controlActive=!0,this.domElement.getRootNode().addEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}function it(t){t.key==="Control"&&(this._controlActive=!1,this.domElement.getRootNode().removeEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}class rt extends se{_orbit;constructor(e){super(e),this.camera.position.set(1,1,7),this.camera.lookAt(0,0,0),this._orbit=new Be(this.camera,this.canvas),this._orbit.target.set(0,0,0),this._orbit.minPolarAngle=Math.PI/2,this._orbit.maxPolarAngle=Math.PI/2,this._orbit.enableRotate=!0,this._orbit.enableZoom=!1,this._orbit.enablePan=!1}update(){this._orbit?.update()}}class ot{_positions=[];_normals=[];_uvs=[];_tmpPositions=[];_tmpNormals=[];_tmpUVs=[];load(e){const s=e.split(`
|
|
2
|
-
`);for(const r of s){if(!r.trim()||r.startsWith("#"))continue;const o=r.trim().split(/\s+/);switch(o[0]){case"v":this._tmpPositions.push(o.slice(1).map(Number));break;case"vn":this._tmpNormals.push(o.slice(1).map(Number));break;case"vt":this._tmpUVs.push(o.slice(1).map(Number));break;case"f":this.processFaceLine(o);break}}const i={type:l.FigureType.Custom,position:this._positions,...this._normals.length>0&&{normal:this._normals},...this._uvs.length>0&&{uv:this._uvs}};return new l.Figure(i)}processFaceLine(e){for(let s=1;s<e.length;s++){const i=e[s];if(!i)continue;const[r,o,n]=i.split("/"),d=r?parseInt(r,10):void 0,p=o?parseInt(o,10):void 0,f=n?parseInt(n,10):void 0;if(d!==void 0){const g=this._tmpPositions[d-1];g&&this._positions.push(...g)}if(p!==void 0){const g=this._tmpUVs[p-1];g&&this._uvs.push(...g)}if(f!==void 0){const g=this._tmpNormals[f-1];g&&this._normals.push(...g)}}}}var nt=Object.getOwnPropertyDescriptor,at=(t,e,s,i)=>{for(var r=i>1?void 0:i?nt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},de=(t,e)=>(s,i)=>e(s,i,t);let N=class{constructor(t,e){this._store=e,this._handlers=new Map(t.map(s=>[s.mode,s]))}_currentMode=l.DisplayMode.Plane;_handlers;manage(t){t!==this._currentMode&&(this._handlers.get(this._currentMode)?.rollback(),t!==l.DisplayMode.Plane&&this._handlers.get(t)?.handle(),this._currentMode=t,this._store.setDisplayMode(this._currentMode))}dispose(){this._handlers&&this._handlers.clear(),this._currentMode=l.DisplayMode.Plane,this._store.setDisplayMode(this._currentMode)}};N=at([h.injectable(),de(0,h.injectAll("IDisplayHandler")),de(1,h.inject("IEditorStore"))],N);var E=(t=>(t.Hover="hover",t.Click="click",t))(E||{}),ht=Object.getOwnPropertyDescriptor,lt=(t,e,s,i)=>{for(var r=i>1?void 0:i?ht(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},U=(t,e)=>(s,i)=>e(s,i,t);let F=class{constructor(t,e,s){this._eventBus=t,this._store=s,this._handlers=new Map(e.map(i=>[i.mode,i])),this._eventBus.on(P.SelectHover,this._onHover),this._eventBus.on(P.SelectClick,this._onClick)}_currentMode=l.SelectMode.Mesh;_handlers;manage(t){t!==this._currentMode&&(this._handlers.get(this._currentMode)?.rollback(),this._currentMode=t,this._store.setSelectMode(this._currentMode))}_onHover=t=>{this._handlers.get(this._currentMode)?.handle(t,E.Hover)};_onClick=t=>{this._handlers.get(this._currentMode)?.handle(t,E.Click)};dispose(){this._handlers&&this._handlers.clear(),this._eventBus.off(P.SelectHover,this._onHover),this._currentMode=l.SelectMode.Mesh,this._store.setSelectMode(this._currentMode)}};F=lt([h.injectable(),U(0,h.inject("EventBus")),U(1,h.injectAll("ISelectHandler")),U(2,h.inject("IEditorStore"))],F);class ct{isToolEnabled(e,s){return l.DEFAULT_TOOL_RULES[s].includes(e)}getEnabledTools(e){return l.DEFAULT_TOOL_RULES[e]}}var dt=Object.getOwnPropertyDescriptor,_t=(t,e,s,i)=>{for(var r=i>1?void 0:i?dt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},_e=(t,e)=>(s,i)=>e(s,i,t);let Y=class{constructor(t,e){this._store=e,this._handlers=new Map(t.map(s=>[s.mode,s])),this._unsubSelected=this._store.onSelectedObjectChange(()=>{this._handlers.get(this._currentTool)?.handle()}),this._policy=new ct}_currentTool=l.ToolType.Translate;_handlers;_unsubSelected;_policy;manage(t){if(this._currentTool===t)return;const e=this._store.getSelectMode();this._policy.isToolEnabled(t,e)&&(this._handlers.get(this._currentTool)?.rollback(),this._currentTool=t,this._store.setToolType(this._currentTool),this._handlers.get(this._currentTool)?.handle())}dispose(){this._unsubSelected?.(),this._handlers&&this._handlers.clear(),this._currentTool=l.ToolType.Translate,this._store.setToolType(this._currentTool)}};Y=_t([h.injectable(),_e(0,h.injectAll("IToolHandler")),_e(1,h.inject("IEditorStore"))],Y);var pt=Object.getOwnPropertyDescriptor,ut=(t,e,s,i)=>{for(var r=i>1?void 0:i?pt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},mt=(t,e)=>(s,i)=>e(s,i,t);let z=class{_currentMode=l.SceneMode.AddFigure;_handlers;constructor(t){this._handlers=new Map(t.map(e=>[e.mode,e]))}manage(t,e){t===l.SceneMode.AddFigure?this._handlers.get(t)?.handle(e):this._handlers.get(t)?.handle(),this._currentMode=t}dispose(){this._handlers&&this._handlers.clear(),this._currentMode=l.SceneMode.AddFigure}};z=ut([h.injectable(),mt(0,h.injectAll("ISceneHandler"))],z);var ft=Object.getOwnPropertyDescriptor,gt=(t,e,s,i)=>{for(var r=i>1?void 0:i?ft(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},bt=(t,e)=>(s,i)=>e(s,i,t);let W=class{constructor(t){this._api=t}mode=l.DisplayMode.Wireframe;_prevWireframe=new Map;_prevColorMesh=new Map;_prevColorLines=new Map;_wireColor=new a.Color(65535);handle(){const t=this._api.getMeshes();for(const e of t){const s=Array.isArray(e.material)?e.material:[e.material];for(const i of s)this._enableWireframeOnMaterial(i);e.traverse(i=>{if(i.isLineSegments){const r=i;if(!this._prevColorLines.has(r.material)){const n=r.material;this._prevColorLines.set(n,n.color.clone())}const o=r.material;o.color.copy(this._wireColor),o.needsUpdate=!0}})}}rollback(){for(const[t,e]of this._prevWireframe)"wireframe"in t&&(t.wireframe=e),t.needsUpdate=!0;this._prevWireframe.clear();for(const[t,e]of this._prevColorMesh){const s=t;s.color?.isColor&&s.color.copy(e)}this._prevColorMesh.clear();for(const[t,e]of this._prevColorLines)t.color.copy(e);this._prevColorLines.clear()}dispose(){this.rollback()}_enableWireframeOnMaterial(t){const e=t;"wireframe"in e&&!this._prevWireframe.has(t)&&(this._prevWireframe.set(t,!!e.wireframe),e.wireframe=!0,t.needsUpdate=!0),e.color?.isColor&&(this._prevColorMesh.has(t)||this._prevColorMesh.set(t,e.color.clone()),e.color.copy(this._wireColor))}};W=gt([h.injectable(),bt(0,h.inject("RendererApi"))],W);var vt=Object.getOwnPropertyDescriptor,yt=(t,e,s,i)=>{for(var r=i>1?void 0:i?vt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},pe=(t,e)=>(s,i)=>e(s,i,t);let B=class{constructor(t,e){this._api=t,this._store=e}mode=l.SelectMode.Mesh;_hoveredMesh=null;_selectedMesh=null;_hoverColor=H;_selectColor=I;_origLineColors=new WeakMap;handle(t,e){if(this._api.setRaycastMode(this.mode),e===E.Hover){if(!t){this._hoveredMesh&&this._hoveredMesh!==this._selectedMesh&&this._restoreEdgesColor(this._hoveredMesh),this._hoveredMesh=null;return}const s=t.intersection.object;this._hoveredMesh!==s&&(this._hoveredMesh&&this._hoveredMesh!==this._selectedMesh&&this._restoreEdgesColor(this._hoveredMesh),s!==this._selectedMesh&&this._paintEdges(s,this._hoverColor),this._hoveredMesh=s)}if(e===E.Click){if(!t){this._selectedMesh&&(this._restoreEdgesColor(this._selectedMesh),this._selectedMesh=null,this._store.setSelectedObject(null));return}const s=t.intersection.object;this._selectedMesh&&this._selectedMesh!==s&&this._restoreEdgesColor(this._selectedMesh),this._paintEdges(s,this._selectColor),this._selectedMesh=s,this._store.setSelectedObject(s)}}rollback(){this._hoveredMesh&&this._restoreEdgesColor(this._hoveredMesh),this._selectedMesh&&this._restoreEdgesColor(this._selectedMesh),this._hoveredMesh=this._selectedMesh=null}dispose(){this.rollback()}_paintEdges(t,e){t.children.forEach(s=>{const i=s;if(i.isLineSegments&&i.material){const r=i.material;this._origLineColors.has(i)||this._origLineColors.set(i,r.color.clone()),r.color.setHex(e),r.needsUpdate=!0}})}_restoreEdgesColor(t){t.children.forEach(e=>{const s=e;if(s.isLineSegments&&s.material){const i=this._origLineColors.get(s);if(i){const r=s.material;r.color.copy(i),r.needsUpdate=!0}}})}};B=yt([h.injectable(),pe(0,h.inject("RendererApi")),pe(1,h.inject("IEditorStore"))],B);var Mt=Object.getOwnPropertyDescriptor,St=(t,e,s,i)=>{for(var r=i>1?void 0:i?Mt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},Et=(t,e)=>(s,i)=>e(s,i,t);let Z=class{constructor(t){this._api=t}mode=l.SelectMode.Face;_hovered=null;_selected=null;_hoverColor=H;_selectColor=I;_defaultColor=2236962;handle(t,e){this._api.setRaycastMode(this.mode),e===E.Hover&&console.log(t),e===E.Click&&console.log(t)}rollback(){throw new Error("Method not implemented.")}dispose(){throw new Error("Method not implemented.")}};Z=St([h.injectable(),Et(0,h.inject("RendererApi"))],Z);var wt=Object.getOwnPropertyDescriptor,Tt=(t,e,s,i)=>{for(var r=i>1?void 0:i?wt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},ue=(t,e)=>(s,i)=>e(s,i,t);let $=class{constructor(t,e){this._api=t,this._store=e,this._api.enableCameraLayer(T),this._hoverVertex=this._makeOverlayVertex(this._hoverColor),this._selectVertex=this._makeOverlayVertex(this._selectColor),this._api.addObject(this._hoverVertex,T),this._api.addObject(this._selectVertex,T)}mode=l.SelectMode.Vertex;_hovered=null;_selected=null;_hoverVertex;_selectVertex;_hoverColor=H;_selectColor=I;handle(t,e){if(this._api.setRaycastMode(this.mode),e===E.Hover){if(!t){this._hoverVertex.visible=!1,this._hovered=null;return}const s=t.intersection.object;if(!s?.isPoints)return;const i=s,r=t.intersection.index??-1;if(r<0)return;this._selected&&this._same({points:i,index:r},this._selected)?this._hoverVertex.visible=!1:(this._writeWorldVertex(this._hoverVertex,i,r),this._hoverVertex.visible=!0);return}if(e===E.Click){if(!t){this._selectVertex.visible=!1,this._selected=null,this._store.setSelectedObject(null);return}const s=t.intersection.object;if(!s?.isPoints)return;const i=s,r=t.intersection.index??-1;if(r<0)return;this._writeWorldVertex(this._selectVertex,i,r),this._centerVertexOnPoint(this._selectVertex,i,r),this._selectVertex.visible=!0,this._prepareVertexMetadata(i,r),this._store.setSelectedObject(this._selectVertex),this._selected={points:i,index:r},this._hovered&&this._same(this._hovered,this._selected)&&(this._hoverVertex.visible=!1);return}}rollback(){this._hoverVertex.visible=!1,this._selectVertex.visible=!1,this._hovered=this._selected=null}dispose(){this.rollback(),this._api.removeObject(this._hoverVertex),this._api.removeObject(this._selectVertex),this._hoverVertex.geometry.dispose(),this._hoverVertex.material.dispose(),this._selectVertex.geometry.dispose(),this._selectVertex.material.dispose()}_makeOverlayVertex(t,e=je){const s=new a.BufferGeometry;s.setAttribute("position",new a.Float32BufferAttribute([0,0,0],3));const i=new a.PointsMaterial({color:t,size:e,sizeAttenuation:!1,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1}),r=new a.Points(s,i);return r.renderOrder=1e3,r.raycast=()=>{},r.layers.set(T),r.visible=!1,r}_writeWorldVertex(t,e,s){const i=e.geometry.getAttribute("position"),r=new a.Vector3(i.getX(s),i.getY(s),i.getZ(s)).applyMatrix4(e.matrixWorld),o=t.geometry.getAttribute("position");o.setXYZ(0,r.x,r.y,r.z),o.needsUpdate=!0}_same(t,e){return!!t&&!!e&&t.points===e.points&&t.index===e.index}_prepareVertexMetadata(t,e){const s=Ee(t);if(!s)return;const i=t.geometry.getAttribute("position"),r=new a.Vector3(i.getX(e),i.getY(e),i.getZ(e)).applyMatrix4(t.matrixWorld),o=new a.Matrix4().copy(s.matrixWorld).invert(),n=r.clone().applyMatrix4(o),p=s.geometry.getAttribute("position"),f=1e-6,g=f*f,O=new a.Vector3,v=[];for(let M=0;M<p.count;M++)O.fromBufferAttribute(p,M),O.distanceToSquared(n)<g&&v.push(M);const w=s.children.find(M=>M?.isLineSegments);let y=[];if(w){const M=new a.Matrix4().copy(w.matrixWorld).invert(),j=r.clone().applyMatrix4(M),C=w.geometry.getAttribute("position"),A=new a.Vector3;for(let L=0;L<C.count;L++)A.fromBufferAttribute(C,L),A.distanceToSquared(j)<g&&y.push(L)}this._selectVertex.userData.vertexInfo={points:t,index:e,mesh:s,vertexIndices:v,lines:w??null,edgeVertexIndices:y}}_centerVertexOnPoint(t,e,s){const i=e.geometry.getAttribute("position"),r=new a.Vector3(i.getX(s),i.getY(s),i.getZ(s)).applyMatrix4(e.matrixWorld);t.position.copy(r);const o=t.geometry;let n=o.getAttribute("position");(!n||n.count<1)&&(o.setAttribute("position",new a.BufferAttribute(new Float32Array(3),3)),n=o.getAttribute("position")),n.setXYZ(0,0,0,0),n.needsUpdate=!0,t.quaternion.identity(),t.scale.set(1,1,1),t.updateMatrixWorld(!0)}};$=Tt([h.injectable(),ue(0,h.inject("RendererApi")),ue(1,h.inject("IEditorStore"))],$);class re{constructor(e,s){this.api=e,this.store=s,this._unsubscribeTransform=this.api.onTransformChange(()=>{this.store.getSelectedObject()&&this.store.notifySelectedTransformChange?.()})}_unsubscribeTransform;handle(){const e=this.store.getSelectedObject();this.api.setMode(this.mode),e?this.api.attach(e):this.api.detach()}rollback(){this.api.detach()}dispose(){this.rollback(),this._unsubscribeTransform&&this._unsubscribeTransform()}}var Ot=Object.getOwnPropertyDescriptor,Pt=(t,e,s,i)=>{for(var r=i>1?void 0:i?Ot(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},me=(t,e)=>(s,i)=>e(s,i,t);let X=class extends re{mode=l.ToolType.Translate;constructor(t,e){super(t,e)}};X=Pt([h.injectable(),me(0,h.inject("RendererApi")),me(1,h.inject("IEditorStore"))],X);var Lt=Object.getOwnPropertyDescriptor,Dt=(t,e,s,i)=>{for(var r=i>1?void 0:i?Lt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},fe=(t,e)=>(s,i)=>e(s,i,t);let G=class extends re{mode=l.ToolType.Scale;constructor(t,e){super(t,e)}};G=Dt([h.injectable(),fe(0,h.inject("RendererApi")),fe(1,h.inject("IEditorStore"))],G);var Ct=Object.getOwnPropertyDescriptor,jt=(t,e,s,i)=>{for(var r=i>1?void 0:i?Ct(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},ge=(t,e)=>(s,i)=>e(s,i,t);let K=class extends re{mode=l.ToolType.Rotate;constructor(t,e){super(t,e)}};K=jt([h.injectable(),ge(0,h.inject("RendererApi")),ge(1,h.inject("IEditorStore"))],K);var At=Object.getOwnPropertyDescriptor,xt=(t,e,s,i)=>{for(var r=i>1?void 0:i?At(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},be=(t,e)=>(s,i)=>e(s,i,t);let q=class{constructor(t,e){this._api=t,this._store=e,this._api.enableCameraLayer(T),this._hoverLine=this._makeOverlayLine(this._hoverColor),this._selectLine=this._makeOverlayLine(this._selectColor),this._api.addObject(this._hoverLine,T),this._api.addObject(this._selectLine,T)}mode=l.SelectMode.Edge;_hoverLine;_selectLine;_hovered=null;_selected=null;_hoverColor=H;_selectColor=I;handle(t,e){if(this._api.setRaycastMode(this.mode),e===E.Hover){if(!t){this._hoverLine.visible=!1,this._hovered=null;return}const s=t.intersection.object;if(!s?.isLineSegments)return;const i=s,r=Math.floor((t.intersection.index??-1)/2);if(r<0)return;this._selected&&this._same({lines:i,seg:r},this._selected)?this._hoverLine.visible=!1:(this._writeWorldSegment(this._hoverLine,i,r),this._hoverLine.visible=!0),this._hovered={lines:i,seg:r};return}if(e===E.Click){if(!t){this._selectLine.visible=!1,this._selected=null,this._store.setSelectedObject(null);return}const s=t.intersection.object;if(!s?.isLineSegments)return;const i=s,r=Math.floor((t.intersection.index??-1)/2);if(r<0)return;this._writeWorldSegment(this._selectLine,i,r),this._centerAndOrientLineOnSegment(this._selectLine,i,r),this._selectLine.visible=!0,this._prepareEdgeMetadata(i,r),this._store.setSelectedObject(this._selectLine),this._selected={lines:i,seg:r},this._hovered&&this._same(this._hovered,this._selected)&&(this._hoverLine.visible=!1)}}rollback(){this._hoverLine.visible=!1,this._selectLine.visible=!1,this._hovered=this._selected=null}dispose(){this.rollback(),this._api.removeObject(this._hoverLine),this._api.removeObject(this._selectLine),this._hoverLine.geometry.dispose(),this._hoverLine.material.dispose(),this._selectLine.geometry.dispose(),this._selectLine.material.dispose()}_makeOverlayLine(t){const e=new a.BufferGeometry;e.setAttribute("position",new a.Float32BufferAttribute(6,3));const s=new a.LineBasicMaterial({color:t,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1}),i=new a.Line(e,s);return i.renderOrder=1e3,i.raycast=()=>{},i.layers.set(T),i.visible=!1,i}_writeWorldSegment(t,e,s){const i=e.geometry.getAttribute("position"),r=s*2,o=r+1,n=new a.Vector3(i.getX(r),i.getY(r),i.getZ(r)).applyMatrix4(e.matrixWorld),d=new a.Vector3(i.getX(o),i.getY(o),i.getZ(o)).applyMatrix4(e.matrixWorld),p=t.geometry.getAttribute("position");p.setXYZ(0,n.x,n.y,n.z),p.setXYZ(1,d.x,d.y,d.z),p.needsUpdate=!0}_same(t,e){return!!t&&!!e&&t.lines===e.lines&&t.seg===e.seg}_centerAndOrientLineOnSegment(t,e,s){const i=e.geometry.getAttribute("position"),r=s*2,o=r+1,n=new a.Vector3(i.getX(r),i.getY(r),i.getZ(r)).applyMatrix4(e.matrixWorld),d=new a.Vector3(i.getX(o),i.getY(o),i.getZ(o)).applyMatrix4(e.matrixWorld),p=new a.Vector3().subVectors(d,n),f=p.length();if(!isFinite(f)||f===0)return;const g=new a.Vector3().addVectors(n,d).multiplyScalar(.5);t.position.copy(g);const O=t.geometry;let v=O.getAttribute("position");(!v||v.count<2)&&(O.setAttribute("position",new a.BufferAttribute(new Float32Array(6),3)),v=O.getAttribute("position")),v.setXYZ(0,-f/2,0,0),v.setXYZ(1,f/2,0,0),v.needsUpdate=!0,p.normalize();const w=new a.Quaternion().setFromUnitVectors(new a.Vector3(1,0,0),p);t.quaternion.copy(w),t.updateMatrixWorld(!0)}_prepareEdgeMetadata(t,e){const s=Ee(t);if(!s)return;const i=t.geometry.getAttribute("position"),r=e*2,o=r+1,n=new a.Vector3(i.getX(r),i.getY(r),i.getZ(r)).applyMatrix4(t.matrixWorld),d=new a.Vector3(i.getX(o),i.getY(o),i.getZ(o)).applyMatrix4(t.matrixWorld),p=new a.Matrix4().copy(s.matrixWorld).invert(),f=n.clone().applyMatrix4(p),g=d.clone().applyMatrix4(p),v=s.geometry.getAttribute("position"),w=new a.Vector3,y=1e-6,M=[],j=[];for(let S=0;S<v.count;S++)w.fromBufferAttribute(v,S),w.distanceToSquared(f)<y*y?M.push(S):w.distanceToSquared(g)<y*y&&j.push(S);const C=new a.Matrix4().copy(t.matrixWorld).invert(),A=n.clone().applyMatrix4(C),L=d.clone().applyMatrix4(C),oe=t.geometry.getAttribute("position"),V=new a.Vector3,ne=[],ae=[];for(let S=0;S<oe.count;S++)V.fromBufferAttribute(oe,S),V.distanceToSquared(A)<y*y?ne.push(S):V.distanceToSquared(L)<y*y&&ae.push(S);this._selectLine.userData.edgeInfo={lines:t,seg:e,mesh:s,aIndices:M,bIndices:j,aEdgeIndices:ne,bEdgeIndices:ae}}};q=xt([h.injectable(),be(0,h.inject("RendererApi")),be(1,h.inject("IEditorStore"))],q);var Rt=Object.getOwnPropertyDescriptor,Ht=(t,e,s,i)=>{for(var r=i>1?void 0:i?Rt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},It=(t,e)=>(s,i)=>e(s,i,t);let Q=class{constructor(t){this._api=t}mode=l.SceneMode.AddFigure;_lastAddedMesh=null;handle(t){const e=Ce[t](),s=e.getAttribute("position");s&&s.setUsage&&s.setUsage(a.DynamicDrawUsage);const i=new a.Mesh(e,Me);i.layers.enable(Se);const r=Te(i.geometry);i.add(r);const o=we(i.geometry);i.add(o),this._api.addMesh(i),this._lastAddedMesh=i}rollback(){this._lastAddedMesh!==null&&(this._api.removeMesh(this._lastAddedMesh),this._lastAddedMesh=null)}dispose(){this._lastAddedMesh=null}};Q=Ht([h.injectable(),It(0,h.inject("RendererApi"))],Q);var Vt=Object.getOwnPropertyDescriptor,kt=(t,e,s,i)=>{for(var r=i>1?void 0:i?Vt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},ve=(t,e)=>(s,i)=>e(s,i,t);let J=class{constructor(t,e){this._api=t,this._store=e}mode=l.SceneMode.DeleteFigure;_lastDeletedMesh=null;handle(){const t=this._store.getSelectedObject();Ne(t)&&(this._api.removeMesh(t),this._store.setSelectedObject(null),this._lastDeletedMesh=t)}rollback(){this._lastDeletedMesh&&(this._api.addMesh(this._lastDeletedMesh),this._lastDeletedMesh=null)}dispose(){this._lastDeletedMesh=null}};J=kt([h.injectable(),ve(0,h.inject("RendererApi")),ve(1,h.inject("IEditorStore"))],J);var Ut=Object.getOwnPropertyDescriptor,Nt=(t,e,s,i)=>{for(var r=i>1?void 0:i?Ut(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},Ft=(t,e)=>(s,i)=>e(s,i,t);let ee=class{constructor(t){this._renderer=t}addMesh(t){this._renderer.addMesh(t)}addMeshes(t){for(const e of t)this._renderer.addMesh(e)}removeMesh(t){this._renderer.removeMesh(t)}removeMeshes(t){for(const e of t)this._renderer.removeMesh(e)}getMeshes(){return this._renderer.getMeshes()}setMode(t){this._renderer.setTransformControlsMode(t)}attach(t){this._renderer.attachTransformControls(t)}detach(){this._renderer.detachTransformControls()}setRaycastMode(t){this._renderer.setRaycastMode(t)}addObject(t,e){this._renderer.addObject(t,e)}removeObject(t){this._renderer.removeObject(t)}enableCameraLayer(t){this._renderer.enableCameraLayer(t)}onTransformChange(t){return this._renderer.onTransformChange(t)}};ee=Nt([h.injectable(),Ft(0,h.inject("EditorRenderer"))],ee);var Yt=Object.getOwnPropertyDescriptor,zt=(t,e,s,i)=>{for(var r=i>1?void 0:i?Yt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},D=(t,e)=>(s,i)=>e(s,i,t);exports.EditorHub=class{constructor(e,s,i,r,o,n){this._displayManager=e,this._selectManager=s,this._toolManager=i,this._sceneManager=r,this._renderer=o,this._store=n,this.setSelectMode(l.SelectMode.Mesh),this.setToolMode(l.ToolType.Translate)}setDisplayMode(e){this._displayManager.manage(e)}setSceneMode(e){this._sceneManager.manage(e)}setSelectMode(e){this._selectManager.manage(e)}setToolMode(e){this._toolManager.manage(e)}resizeRenderer(){this._renderer.resize()}updateRenderer(){this._renderer.loop()}addFigure(e,s){this._sceneManager.manage(e,s)}getSelectionStats(){return this._store.getSelectionStats()}onSelectionStatsChange(e){const s=this._store.onSelectedObjectChange(()=>{e()}),i=this._store.onSelectedTransformChange(()=>{e()});return()=>{s(),i()}}dispose(){this._displayManager.dispose(),this._selectManager.dispose(),this._renderer.dispose()}};exports.EditorHub=zt([h.injectable(),D(0,h.inject("IDisplayManager")),D(1,h.inject("ISelectManager")),D(2,h.inject("IToolManager")),D(3,h.inject("ISceneManager")),D(4,h.inject("EditorRenderer")),D(5,h.inject("IEditorStore"))],exports.EditorHub);var Wt=Object.getOwnPropertyDescriptor,Bt=(t,e,s,i)=>{for(var r=i>1?void 0:i?Wt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r};let te=class{_selectMode=l.SelectMode.Mesh;_toolType=l.ToolType.Translate;_displayMode=l.DisplayMode.Plane;_selectedObject=null;_selectedListeners=new Set;_transformListeners=new Set;constructor(){Le.makeAutoObservable(this,{},{autoBind:!0})}getSelectMode(){return this._selectMode}getToolType(){return this._toolType}getDisplayMode(){return this._displayMode}setSelectMode(t){this._selectMode=t}setToolType(t){this._toolType=t}setDisplayMode(t){this._displayMode=t}getSelectedObject(){return this._selectedObject}getSelectionStats(){const t=this._selectedObject;return t?Fe(t):null}setSelectedObject(t){if(this._selectedObject!==t){this._selectedObject=t;for(const e of this._selectedListeners)e(this._selectedObject)}}onSelectedObjectChange(t){return this._selectedListeners.add(t),()=>this._selectedListeners.delete(t)}onSelectedTransformChange(t){return this._transformListeners.add(t),()=>this._transformListeners.delete(t)}notifySelectedTransformChange(){for(const t of this._transformListeners)t()}};te=Bt([h.injectable()],te);let ye=!1;const u=h.container.createChildContainer();function Zt(t){return ye||(u.registerInstance("Canvas",t),u.registerSingleton("EventBus",exports.EventBus),u.registerSingleton("EditorRenderer",exports.EditorRenderer),u.registerSingleton("RendererApi",ee),u.registerSingleton("IDisplayHandler",W),u.registerSingleton("ISelectHandler",B),u.registerSingleton("ISelectHandler",Z),u.registerSingleton("ISelectHandler",q),u.registerSingleton("ISelectHandler",$),u.registerSingleton("IToolHandler",X),u.registerSingleton("IToolHandler",G),u.registerSingleton("IToolHandler",K),u.registerSingleton("ISceneHandler",Q),u.registerSingleton("ISceneHandler",J),u.registerSingleton("IDisplayManager",N),u.registerSingleton("ISelectManager",F),u.registerSingleton("IToolManager",Y),u.registerSingleton("ISceneManager",z),u.registerSingleton("EditorHub",exports.EditorHub),u.registerSingleton("IEditorStore",te),ye=!0),u}const $t=t=>Zt(t).resolve("EditorHub");exports.EventTopics=P;exports.ObjLoader=ot;exports.PreviewRenderer=rt;exports.Renderer=se;exports.createAppHub=$t;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("reflect-metadata");const _=require("three"),c=require("@planara/types"),k=require("@planara/three"),l=require("tsyringe"),Ve=require("events"),He=require("mobx");function ke(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const s in t)if(s!=="default"){const i=Object.getOwnPropertyDescriptor(t,s);Object.defineProperty(e,s,i.get?i:{enumerable:!0,get:()=>t[s]})}}return e.default=t,Object.freeze(e)}const a=ke(_),Fe={[c.FigureType.Plane]:()=>new a.PlaneGeometry(1,1,1,1),[c.FigureType.Cube]:()=>new a.BoxGeometry(1,1,1,1,1,1),[c.FigureType.UVSphere]:()=>new a.SphereGeometry(.5,32,16),[c.FigureType.Icosphere]:()=>new a.IcosahedronGeometry(.5,0),[c.FigureType.Cylinder]:()=>new a.CylinderGeometry(.5,.5,1,32,1,!1),[c.FigureType.Cone]:()=>new a.ConeGeometry(.5,1,32,1,!1),[c.FigureType.Torus]:()=>new a.TorusGeometry(.5,.2,16,64),[c.FigureType.Circle]:()=>new a.CircleGeometry(.5,32),[c.FigureType.Sphere]:()=>new a.SphereGeometry(.5,32,16),[c.FigureType.Custom]:function(){throw new Error("Custom geometry is not generated here.")}},Pe=new a.MeshStandardMaterial({color:12566463,metalness:0,roughness:.6}),We=8;class ae{scene;camera;renderer;canvas;meshes=[];constructor(e){this.canvas=e,this.scene=new a.Scene,this.scene.background=new a.Color(1710618),this.camera=new a.PerspectiveCamera(45,e.clientWidth/e.clientHeight,.1,1e3),this.camera.position.set(1,1,7),this.renderer=new a.WebGLRenderer({canvas:e,antialias:!0}),this.renderer.setSize(e.clientWidth,e.clientHeight);const s=new a.AmbientLight(16777215,.5);this.scene.add(s);const i=new a.DirectionalLight(16777215,1);i.position.set(5,10,7),this.scene.add(i)}resize(){this.camera.aspect=this.canvas.clientWidth/this.canvas.clientHeight,this.camera.updateProjectionMatrix(),this.renderer.setSize(this.canvas.clientWidth,this.canvas.clientHeight)}render(){this.renderer.render(this.scene,this.camera)}update(){}loop(){this.update(),this.render(),requestAnimationFrame(()=>this.loop())}addFigure(e){const s=new a.BufferGeometry;s.setAttribute("position",new a.Float32BufferAttribute(e.position,3)),e.normal&&s.setAttribute("normal",new a.Float32BufferAttribute(e.normal,3)),e.uv&&s.setAttribute("uv",new a.Float32BufferAttribute(e.uv,2));const i=new a.Mesh(s,Pe);return this.scene.add(i),this.meshes.push(i),i}addMesh(e){this.scene&&(this.scene.add(e),this.meshes.push(e))}removeMesh(e){this.scene&&(this.scene.remove(e),this.meshes=this.meshes.filter(s=>s!==e))}getMeshes(){return this.meshes}addObject(e,s){this.scene&&(typeof s=="number"&&e.layers.set(s),this.scene.add(e))}removeObject(e){this.scene&&(e.parent?e.parent.remove(e):this.scene.remove(e))}enableCameraLayer(e){this.camera&&this.camera.layers.enable(e)}dispose(){this.meshes&&(this.meshes.length=0,this.meshes=[]),this.scene=null,this.camera=null,this.renderer?.dispose(),this.canvas=null}}var Ue=Object.getOwnPropertyDescriptor,ze=(t,e,s,i)=>{for(var r=i>1?void 0:i?Ue(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r};exports.EventBus=class{_emitter;constructor(){this._emitter=new Ve.EventEmitter}emit(e,s){this._emitter.emit(e,s)}on(e,s){this._emitter.on(e,s)}off(e,s){this._emitter.off(e,s)}};exports.EventBus=ze([l.injectable()],exports.EventBus);var I=(t=>(t.SelectHover="select.hover",t.SelectClick="select.click",t.ToolSelect="tool.select",t))(I||{});const Ne=.03,Ye=.05,Y=0,$e=1,Be=2,P=31,W=16776960,U=16755200,Ge=2236962,Ze=2236962,Xe=t=>!!t&&t.isMesh,Le=t=>{let e=t;for(;e;){if(e.isMesh)return e;e=e.parent}return null},je=t=>{const e=new a.BufferGeometry;e.setAttribute("position",t.getAttribute("position")),e.computeBoundingSphere(),e.computeBoundingBox();const s=new a.PointsMaterial({color:Ze,size:6,sizeAttenuation:!1,depthTest:!1,depthWrite:!1,transparent:!0,opacity:.9}),i=new a.Points(e,s);return i.layers.set(Be),i.renderOrder=1e3,i.visible=!1,i},De=t=>{const e=new a.EdgesGeometry(t),s=new a.LineSegments(e,new a.LineBasicMaterial({color:Ge,linewidth:1}));return s.layers.set($e),s},Ke=t=>{const e={x:t.position.x,y:t.position.y,z:t.position.z},s={x:t.rotation.x,y:t.rotation.y,z:t.rotation.z},i={x:t.scale.x,y:t.scale.y,z:t.scale.z},r=new a.Box3().setFromObject(t),o=new a.Vector3;r.getSize(o);const n={x:o.x,y:o.y,z:o.z};return{position:e,rotation:s,scale:i,size:n}};var qe=Object.getOwnPropertyDescriptor,Qe=(t,e,s,i)=>{for(var r=i>1?void 0:i?qe(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},pe=(t,e)=>(s,i)=>e(s,i,t);exports.EditorRenderer=class extends ae{constructor(e,s){super(e),this._canvas=e,this._bus=s;const i=new a.GridHelper(10,10);i.position.y=-.001,this.scene.add(i);const r=new k.SymmetricAxesHelper(6);this.scene.add(r),this._orbit=new k.OrbitWithState(this.camera,this.renderer.domElement),this._orbit.enableDamping=!0,this._orbit.dampingFactor=.05,this._cameraGizmo=new k.CameraAxesGizmo(this.renderer,this.camera,{size:96,margin:36}),this._raycaster=new a.Raycaster,this._mouse=new a.Vector2,this.scene.add(new a.HemisphereLight(16777215,4473924,.6)),this.camera.layers.enable(0),this.camera.layers.enable(1),this._transform=new k.ModelingTransformControls(this.camera,this.renderer.domElement),this._transformHelper=this._transform.getHelper(),this.scene.add(this._transformHelper),this._isEventListenersAdded||this._initMouseListeners()}_orbit;_transform;_transformHelper;_raycaster;_mouse;_isEventListenersAdded=!1;_lastHoverKey=null;_currentRaycastMode=c.SelectMode.Mesh;_cameraGizmo;_transformListeners=new Set;update(){this._orbit.update()}addFigure(e){const s=super.addFigure(e);s.layers.enable(Y);const i=De(s.geometry);s.add(i);const r=je(s.geometry);return s.add(r),s}setTransformControlsMode(e){this._transform.setMode(e)}attachTransformControls(e){this._transform.attach(e)}detachTransformControls(){this._transform.detach()}onTransformChange(e){return this._transformListeners.add(e),()=>this._transformListeners.delete(e)}setRaycastMode(e){const s=this._raycaster;switch(s.params.Line.threshold=0,s.params.Points.threshold=0,this._currentRaycastMode=e,this._lastHoverKey=null,e){case c.SelectMode.Mesh:case c.SelectMode.Face:s.layers.set(0);break;case c.SelectMode.Edge:s.layers.set(1),s.params.Line.threshold=Ne;break;case c.SelectMode.Vertex:s.layers.set(2),s.params.Points.threshold=Ye;break}}dispose(){this._isEventListenersAdded&&(this._canvas.removeEventListener("mousemove",this._handleMouseMove,!1),this._canvas.removeEventListener("click",this._handleMouseClick,!1),this._canvas.removeEventListener("dblclick",this._handleDoubleClick,!1),this._canvas.removeEventListener("pointerdown",e=>this._transform.pointerDown(e)),this._canvas.removeEventListener("pointermove",e=>this._transform.pointerMove(e)),this._canvas.removeEventListener("pointerup",e=>this._transform.pointerUp(e)),this._canvas.removeEventListener("pointerleave",()=>this._transform.pointerHover(null)),this._transform.removeEventListener("dragging-changed",()=>{this._orbit.enabled=!this._transform.dragging}),this._transformListeners.clear(),this._isEventListenersAdded=!1),this._orbit?.dispose(),this._transform?.dispose(),this._transformHelper?.parent&&this._transformHelper.parent.remove(this._transformHelper),this._lastHoverKey=null,super.dispose()}render(){super.render(),this._cameraGizmo.render(this._canvas.width,this._canvas.height)}_initMouseListeners(){this._canvas.addEventListener("mousemove",this._handleMouseMove,!1),this._canvas.addEventListener("click",this._handleMouseClick,!1),this._canvas.addEventListener("dblclick",this._handleDoubleClick,!1),this._canvas.addEventListener("pointerdown",e=>this._transform.pointerDown(e)),this._canvas.addEventListener("pointermove",e=>this._transform.pointerMove(e)),this._canvas.addEventListener("pointerup",e=>this._transform.pointerUp(e)),this._canvas.addEventListener("pointerleave",()=>this._transform.pointerHover(null)),this._transform.addEventListener("dragging-changed",()=>{this._orbit.enabled=!this._transform.dragging}),this._transform.addEventListener("objectChange",()=>{for(const e of this._transformListeners)e()}),this._isEventListenersAdded=!0}_handleMouseMove=e=>{this._processRaycastEvent(e,I.SelectHover,!0)};_handleMouseClick=e=>{this._processRaycastEvent(e,I.SelectClick,!1)};_getHitIntersection(e){if(this._orbit.isInteracting||this._transform.dragging)return;const s=this._canvas.getBoundingClientRect();this._mouse.x=(e.clientX-s.left)/s.width*2-1,this._mouse.y=-((e.clientY-s.top)/s.height)*2+1,this._raycaster.setFromCamera(this._mouse,this.camera);const i=this._raycaster.intersectObjects(this.meshes,!0)[0]??null;if(this._currentRaycastMode===c.SelectMode.Mesh||this._currentRaycastMode===c.SelectMode.Face)return i;const r=this._raycaster.layers.mask;this._raycaster.layers.set(Y);const o=this._raycaster.intersectObjects(this.meshes,!0)[0]??null;return this._raycaster.layers.mask=r,this._getVisibleHit(i,o)}_handleDoubleClick=e=>{const s=this._getHitIntersection(e);s!==void 0&&(s||this._bus.emit(I.SelectClick,null))};_processRaycastEvent(e,s,i){const r=this._getHitIntersection(e);if(r===void 0)return;const o=r?.object??null;if(i){if(!r){this.meshes.forEach(h=>h.userData.isHit=!1),this._lastHoverKey=null,this._bus.emit(s,null);return}const n=this._makeHoverKey(r);n!==this._lastHoverKey&&(this.meshes.forEach(h=>h.userData.isHit=!1),o&&(o.userData.isHit=!0),this._lastHoverKey=n,this._bus.emit(s,{intersection:r}));return}r&&this._bus.emit(s,{intersection:r})}_getVisibleHit(e,s,i=1e-4){return e?s?e.distance<=s.distance+i?e:null:e:null}_makeHoverKey(e){if(!e)return null;const s=e.object.uuid;switch(this._currentRaycastMode){case c.SelectMode.Face:return`${s}:face:${e.faceIndex??-1}`;case c.SelectMode.Edge:return`${s}:edge:${Math.floor((e.index??-1)/2)}`;case c.SelectMode.Vertex:return`${s}:vertex:${e.index??-1}`;case c.SelectMode.Mesh:default:return`${s}:mesh`}}};exports.EditorRenderer=Qe([l.injectable(),pe(0,l.inject("Canvas")),pe(1,l.inject("EventBus"))],exports.EditorRenderer);const me={type:"change"},he={type:"start"},Ce={type:"end"},F=new _.Ray,fe=new _.Plane,Je=Math.cos(70*_.MathUtils.DEG2RAD),M=new _.Vector3,T=2*Math.PI,f={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6},z=1e-6;class et extends _.Controls{constructor(e,s=null){super(e,s),this.state=f.NONE,this.target=new _.Vector3,this.cursor=new _.Vector3,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minTargetRadius=0,this.maxTargetRadius=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.05,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.keyRotateSpeed=1,this.enablePan=!0,this.panSpeed=1,this.screenSpacePanning=!0,this.keyPanSpeed=7,this.zoomToCursor=!1,this.autoRotate=!1,this.autoRotateSpeed=2,this.keys={LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",BOTTOM:"ArrowDown"},this.mouseButtons={LEFT:_.MOUSE.ROTATE,MIDDLE:_.MOUSE.DOLLY,RIGHT:_.MOUSE.PAN},this.touches={ONE:_.TOUCH.ROTATE,TWO:_.TOUCH.DOLLY_PAN},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this._domElementKeyEvents=null,this._lastPosition=new _.Vector3,this._lastQuaternion=new _.Quaternion,this._lastTargetPosition=new _.Vector3,this._quat=new _.Quaternion().setFromUnitVectors(e.up,new _.Vector3(0,1,0)),this._quatInverse=this._quat.clone().invert(),this._spherical=new _.Spherical,this._sphericalDelta=new _.Spherical,this._scale=1,this._panOffset=new _.Vector3,this._rotateStart=new _.Vector2,this._rotateEnd=new _.Vector2,this._rotateDelta=new _.Vector2,this._panStart=new _.Vector2,this._panEnd=new _.Vector2,this._panDelta=new _.Vector2,this._dollyStart=new _.Vector2,this._dollyEnd=new _.Vector2,this._dollyDelta=new _.Vector2,this._dollyDirection=new _.Vector3,this._mouse=new _.Vector2,this._performCursorZoom=!1,this._pointers=[],this._pointerPositions={},this._controlActive=!1,this._onPointerMove=st.bind(this),this._onPointerDown=tt.bind(this),this._onPointerUp=it.bind(this),this._onContextMenu=ct.bind(this),this._onMouseWheel=nt.bind(this),this._onKeyDown=at.bind(this),this._onTouchStart=ht.bind(this),this._onTouchMove=lt.bind(this),this._onMouseDown=rt.bind(this),this._onMouseMove=ot.bind(this),this._interceptControlDown=dt.bind(this),this._interceptControlUp=_t.bind(this),this.domElement!==null&&this.connect(this.domElement),this.update()}connect(e){super.connect(e),this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointercancel",this._onPointerUp),this.domElement.addEventListener("contextmenu",this._onContextMenu),this.domElement.addEventListener("wheel",this._onMouseWheel,{passive:!1}),this.domElement.getRootNode().addEventListener("keydown",this._interceptControlDown,{passive:!0,capture:!0}),this.domElement.style.touchAction="none"}disconnect(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.domElement.removeEventListener("pointercancel",this._onPointerUp),this.domElement.removeEventListener("wheel",this._onMouseWheel),this.domElement.removeEventListener("contextmenu",this._onContextMenu),this.stopListenToKeyEvents(),this.domElement.getRootNode().removeEventListener("keydown",this._interceptControlDown,{capture:!0}),this.domElement.style.touchAction="auto"}dispose(){this.disconnect()}getPolarAngle(){return this._spherical.phi}getAzimuthalAngle(){return this._spherical.theta}getDistance(){return this.object.position.distanceTo(this.target)}listenToKeyEvents(e){e.addEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=e}stopListenToKeyEvents(){this._domElementKeyEvents!==null&&(this._domElementKeyEvents.removeEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=null)}saveState(){this.target0.copy(this.target),this.position0.copy(this.object.position),this.zoom0=this.object.zoom}reset(){this.target.copy(this.target0),this.object.position.copy(this.position0),this.object.zoom=this.zoom0,this.object.updateProjectionMatrix(),this.dispatchEvent(me),this.update(),this.state=f.NONE}update(e=null){const s=this.object.position;M.copy(s).sub(this.target),M.applyQuaternion(this._quat),this._spherical.setFromVector3(M),this.autoRotate&&this.state===f.NONE&&this._rotateLeft(this._getAutoRotationAngle(e)),this.enableDamping?(this._spherical.theta+=this._sphericalDelta.theta*this.dampingFactor,this._spherical.phi+=this._sphericalDelta.phi*this.dampingFactor):(this._spherical.theta+=this._sphericalDelta.theta,this._spherical.phi+=this._sphericalDelta.phi);let i=this.minAzimuthAngle,r=this.maxAzimuthAngle;isFinite(i)&&isFinite(r)&&(i<-Math.PI?i+=T:i>Math.PI&&(i-=T),r<-Math.PI?r+=T:r>Math.PI&&(r-=T),i<=r?this._spherical.theta=Math.max(i,Math.min(r,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(i+r)/2?Math.max(i,this._spherical.theta):Math.min(r,this._spherical.theta)),this._spherical.phi=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,this._spherical.phi)),this._spherical.makeSafe(),this.enableDamping===!0?this.target.addScaledVector(this._panOffset,this.dampingFactor):this.target.add(this._panOffset),this.target.sub(this.cursor),this.target.clampLength(this.minTargetRadius,this.maxTargetRadius),this.target.add(this.cursor);let o=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{const n=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),o=n!=this._spherical.radius}if(M.setFromSpherical(this._spherical),M.applyQuaternion(this._quatInverse),s.copy(this.target).add(M),this.object.lookAt(this.target),this.enableDamping===!0?(this._sphericalDelta.theta*=1-this.dampingFactor,this._sphericalDelta.phi*=1-this.dampingFactor,this._panOffset.multiplyScalar(1-this.dampingFactor)):(this._sphericalDelta.set(0,0,0),this._panOffset.set(0,0,0)),this.zoomToCursor&&this._performCursorZoom){let n=null;if(this.object.isPerspectiveCamera){const h=M.length();n=this._clampDistance(h*this._scale);const d=h-n;this.object.position.addScaledVector(this._dollyDirection,d),this.object.updateMatrixWorld(),o=!!d}else if(this.object.isOrthographicCamera){const h=new _.Vector3(this._mouse.x,this._mouse.y,0);h.unproject(this.object);const d=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),o=d!==this.object.zoom;const u=new _.Vector3(this._mouse.x,this._mouse.y,0);u.unproject(this.object),this.object.position.sub(u).add(h),this.object.updateMatrixWorld(),n=M.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),this.zoomToCursor=!1;n!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(n).add(this.object.position):(F.origin.copy(this.object.position),F.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(F.direction))<Je?this.object.lookAt(this.target):(fe.setFromNormalAndCoplanarPoint(this.object.up,this.target),F.intersectPlane(fe,this.target))))}else if(this.object.isOrthographicCamera){const n=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),n!==this.object.zoom&&(this.object.updateProjectionMatrix(),o=!0)}return this._scale=1,this._performCursorZoom=!1,o||this._lastPosition.distanceToSquared(this.object.position)>z||8*(1-this._lastQuaternion.dot(this.object.quaternion))>z||this._lastTargetPosition.distanceToSquared(this.target)>z?(this.dispatchEvent(me),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(e){return e!==null?T/60*this.autoRotateSpeed*e:T/60/60*this.autoRotateSpeed}_getZoomScale(e){const s=Math.abs(e*.01);return Math.pow(.95,this.zoomSpeed*s)}_rotateLeft(e){this._sphericalDelta.theta-=e}_rotateUp(e){this._sphericalDelta.phi-=e}_panLeft(e,s){M.setFromMatrixColumn(s,0),M.multiplyScalar(-e),this._panOffset.add(M)}_panUp(e,s){this.screenSpacePanning===!0?M.setFromMatrixColumn(s,1):(M.setFromMatrixColumn(s,0),M.crossVectors(this.object.up,M)),M.multiplyScalar(e),this._panOffset.add(M)}_pan(e,s){const i=this.domElement;if(this.object.isPerspectiveCamera){const r=this.object.position;M.copy(r).sub(this.target);let o=M.length();o*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*e*o/i.clientHeight,this.object.matrix),this._panUp(2*s*o/i.clientHeight,this.object.matrix)}else this.object.isOrthographicCamera?(this._panLeft(e*(this.object.right-this.object.left)/this.object.zoom/i.clientWidth,this.object.matrix),this._panUp(s*(this.object.top-this.object.bottom)/this.object.zoom/i.clientHeight,this.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),this.enablePan=!1)}_dollyOut(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale/=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_dollyIn(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale*=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_updateZoomParameters(e,s){if(!this.zoomToCursor)return;this._performCursorZoom=!0;const i=this.domElement.getBoundingClientRect(),r=e-i.left,o=s-i.top,n=i.width,h=i.height;this._mouse.x=r/n*2-1,this._mouse.y=-(o/h)*2+1,this._dollyDirection.set(this._mouse.x,this._mouse.y,1).unproject(this.object).sub(this.object.position).normalize()}_clampDistance(e){return Math.max(this.minDistance,Math.min(this.maxDistance,e))}_handleMouseDownRotate(e){this._rotateStart.set(e.clientX,e.clientY)}_handleMouseDownDolly(e){this._updateZoomParameters(e.clientX,e.clientX),this._dollyStart.set(e.clientX,e.clientY)}_handleMouseDownPan(e){this._panStart.set(e.clientX,e.clientY)}_handleMouseMoveRotate(e){this._rotateEnd.set(e.clientX,e.clientY),this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const s=this.domElement;this._rotateLeft(T*this._rotateDelta.x/s.clientHeight),this._rotateUp(T*this._rotateDelta.y/s.clientHeight),this._rotateStart.copy(this._rotateEnd),this.update()}_handleMouseMoveDolly(e){this._dollyEnd.set(e.clientX,e.clientY),this._dollyDelta.subVectors(this._dollyEnd,this._dollyStart),this._dollyDelta.y>0?this._dollyOut(this._getZoomScale(this._dollyDelta.y)):this._dollyDelta.y<0&&this._dollyIn(this._getZoomScale(this._dollyDelta.y)),this._dollyStart.copy(this._dollyEnd),this.update()}_handleMouseMovePan(e){this._panEnd.set(e.clientX,e.clientY),this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd),this.update()}_handleMouseWheel(e){this._updateZoomParameters(e.clientX,e.clientY),e.deltaY<0?this._dollyIn(this._getZoomScale(e.deltaY)):e.deltaY>0&&this._dollyOut(this._getZoomScale(e.deltaY)),this.update()}_handleKeyDown(e){let s=!1;switch(e.code){case this.keys.UP:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(T*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,this.keyPanSpeed),s=!0;break;case this.keys.BOTTOM:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateUp(-T*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(0,-this.keyPanSpeed),s=!0;break;case this.keys.LEFT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(T*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(this.keyPanSpeed,0),s=!0;break;case this.keys.RIGHT:e.ctrlKey||e.metaKey||e.shiftKey?this.enableRotate&&this._rotateLeft(-T*this.keyRotateSpeed/this.domElement.clientHeight):this.enablePan&&this._pan(-this.keyPanSpeed,0),s=!0;break}s&&(e.preventDefault(),this.update())}_handleTouchStartRotate(e){if(this._pointers.length===1)this._rotateStart.set(e.pageX,e.pageY);else{const s=this._getSecondPointerPosition(e),i=.5*(e.pageX+s.x),r=.5*(e.pageY+s.y);this._rotateStart.set(i,r)}}_handleTouchStartPan(e){if(this._pointers.length===1)this._panStart.set(e.pageX,e.pageY);else{const s=this._getSecondPointerPosition(e),i=.5*(e.pageX+s.x),r=.5*(e.pageY+s.y);this._panStart.set(i,r)}}_handleTouchStartDolly(e){const s=this._getSecondPointerPosition(e),i=e.pageX-s.x,r=e.pageY-s.y,o=Math.sqrt(i*i+r*r);this._dollyStart.set(0,o)}_handleTouchStartDollyPan(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enablePan&&this._handleTouchStartPan(e)}_handleTouchStartDollyRotate(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enableRotate&&this._handleTouchStartRotate(e)}_handleTouchMoveRotate(e){if(this._pointers.length==1)this._rotateEnd.set(e.pageX,e.pageY);else{const i=this._getSecondPointerPosition(e),r=.5*(e.pageX+i.x),o=.5*(e.pageY+i.y);this._rotateEnd.set(r,o)}this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const s=this.domElement;this._rotateLeft(T*this._rotateDelta.x/s.clientHeight),this._rotateUp(T*this._rotateDelta.y/s.clientHeight),this._rotateStart.copy(this._rotateEnd)}_handleTouchMovePan(e){if(this._pointers.length===1)this._panEnd.set(e.pageX,e.pageY);else{const s=this._getSecondPointerPosition(e),i=.5*(e.pageX+s.x),r=.5*(e.pageY+s.y);this._panEnd.set(i,r)}this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd)}_handleTouchMoveDolly(e){const s=this._getSecondPointerPosition(e),i=e.pageX-s.x,r=e.pageY-s.y,o=Math.sqrt(i*i+r*r);this._dollyEnd.set(0,o),this._dollyDelta.set(0,Math.pow(this._dollyEnd.y/this._dollyStart.y,this.zoomSpeed)),this._dollyOut(this._dollyDelta.y),this._dollyStart.copy(this._dollyEnd);const n=(e.pageX+s.x)*.5,h=(e.pageY+s.y)*.5;this._updateZoomParameters(n,h)}_handleTouchMoveDollyPan(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enablePan&&this._handleTouchMovePan(e)}_handleTouchMoveDollyRotate(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enableRotate&&this._handleTouchMoveRotate(e)}_addPointer(e){this._pointers.push(e.pointerId)}_removePointer(e){delete this._pointerPositions[e.pointerId];for(let s=0;s<this._pointers.length;s++)if(this._pointers[s]==e.pointerId){this._pointers.splice(s,1);return}}_isTrackingPointer(e){for(let s=0;s<this._pointers.length;s++)if(this._pointers[s]==e.pointerId)return!0;return!1}_trackPointer(e){let s=this._pointerPositions[e.pointerId];s===void 0&&(s=new _.Vector2,this._pointerPositions[e.pointerId]=s),s.set(e.pageX,e.pageY)}_getSecondPointerPosition(e){const s=e.pointerId===this._pointers[0]?this._pointers[1]:this._pointers[0];return this._pointerPositions[s]}_customWheelEvent(e){const s=e.deltaMode,i={clientX:e.clientX,clientY:e.clientY,deltaY:e.deltaY};switch(s){case 1:i.deltaY*=16;break;case 2:i.deltaY*=100;break}return e.ctrlKey&&!this._controlActive&&(i.deltaY*=10),i}}function tt(t){this.enabled!==!1&&(this._pointers.length===0&&(this.domElement.setPointerCapture(t.pointerId),this.domElement.addEventListener("pointermove",this._onPointerMove),this.domElement.addEventListener("pointerup",this._onPointerUp)),!this._isTrackingPointer(t)&&(this._addPointer(t),t.pointerType==="touch"?this._onTouchStart(t):this._onMouseDown(t)))}function st(t){this.enabled!==!1&&(t.pointerType==="touch"?this._onTouchMove(t):this._onMouseMove(t))}function it(t){switch(this._removePointer(t),this._pointers.length){case 0:this.domElement.releasePointerCapture(t.pointerId),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.dispatchEvent(Ce),this.state=f.NONE;break;case 1:const e=this._pointers[0],s=this._pointerPositions[e];this._onTouchStart({pointerId:e,pageX:s.x,pageY:s.y});break}}function rt(t){let e;switch(t.button){case 0:e=this.mouseButtons.LEFT;break;case 1:e=this.mouseButtons.MIDDLE;break;case 2:e=this.mouseButtons.RIGHT;break;default:e=-1}switch(e){case _.MOUSE.DOLLY:if(this.enableZoom===!1)return;this._handleMouseDownDolly(t),this.state=f.DOLLY;break;case _.MOUSE.ROTATE:if(t.ctrlKey||t.metaKey||t.shiftKey){if(this.enablePan===!1)return;this._handleMouseDownPan(t),this.state=f.PAN}else{if(this.enableRotate===!1)return;this._handleMouseDownRotate(t),this.state=f.ROTATE}break;case _.MOUSE.PAN:if(t.ctrlKey||t.metaKey||t.shiftKey){if(this.enableRotate===!1)return;this._handleMouseDownRotate(t),this.state=f.ROTATE}else{if(this.enablePan===!1)return;this._handleMouseDownPan(t),this.state=f.PAN}break;default:this.state=f.NONE}this.state!==f.NONE&&this.dispatchEvent(he)}function ot(t){switch(this.state){case f.ROTATE:if(this.enableRotate===!1)return;this._handleMouseMoveRotate(t);break;case f.DOLLY:if(this.enableZoom===!1)return;this._handleMouseMoveDolly(t);break;case f.PAN:if(this.enablePan===!1)return;this._handleMouseMovePan(t);break}}function nt(t){this.enabled===!1||this.enableZoom===!1||this.state!==f.NONE||(t.preventDefault(),this.dispatchEvent(he),this._handleMouseWheel(this._customWheelEvent(t)),this.dispatchEvent(Ce))}function at(t){this.enabled!==!1&&this._handleKeyDown(t)}function ht(t){switch(this._trackPointer(t),this._pointers.length){case 1:switch(this.touches.ONE){case _.TOUCH.ROTATE:if(this.enableRotate===!1)return;this._handleTouchStartRotate(t),this.state=f.TOUCH_ROTATE;break;case _.TOUCH.PAN:if(this.enablePan===!1)return;this._handleTouchStartPan(t),this.state=f.TOUCH_PAN;break;default:this.state=f.NONE}break;case 2:switch(this.touches.TWO){case _.TOUCH.DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchStartDollyPan(t),this.state=f.TOUCH_DOLLY_PAN;break;case _.TOUCH.DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchStartDollyRotate(t),this.state=f.TOUCH_DOLLY_ROTATE;break;default:this.state=f.NONE}break;default:this.state=f.NONE}this.state!==f.NONE&&this.dispatchEvent(he)}function lt(t){switch(this._trackPointer(t),this.state){case f.TOUCH_ROTATE:if(this.enableRotate===!1)return;this._handleTouchMoveRotate(t),this.update();break;case f.TOUCH_PAN:if(this.enablePan===!1)return;this._handleTouchMovePan(t),this.update();break;case f.TOUCH_DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchMoveDollyPan(t),this.update();break;case f.TOUCH_DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchMoveDollyRotate(t),this.update();break;default:this.state=f.NONE}}function ct(t){this.enabled!==!1&&t.preventDefault()}function dt(t){t.key==="Control"&&(this._controlActive=!0,this.domElement.getRootNode().addEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}function _t(t){t.key==="Control"&&(this._controlActive=!1,this.domElement.getRootNode().removeEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}class ut extends ae{_orbit;constructor(e){super(e),this.camera.position.set(1,1,7),this.camera.lookAt(0,0,0),this._orbit=new et(this.camera,this.canvas),this._orbit.target.set(0,0,0),this._orbit.minPolarAngle=Math.PI/2,this._orbit.maxPolarAngle=Math.PI/2,this._orbit.enableRotate=!0,this._orbit.enableZoom=!1,this._orbit.enablePan=!1}update(){this._orbit?.update()}}class pt{_positions=[];_normals=[];_uvs=[];_tmpPositions=[];_tmpNormals=[];_tmpUVs=[];load(e){const s=e.split(`
|
|
2
|
+
`);for(const r of s){if(!r.trim()||r.startsWith("#"))continue;const o=r.trim().split(/\s+/);switch(o[0]){case"v":this._tmpPositions.push(o.slice(1).map(Number));break;case"vn":this._tmpNormals.push(o.slice(1).map(Number));break;case"vt":this._tmpUVs.push(o.slice(1).map(Number));break;case"f":this.processFaceLine(o);break}}const i={type:c.FigureType.Custom,position:this._positions,...this._normals.length>0&&{normal:this._normals},...this._uvs.length>0&&{uv:this._uvs}};return new c.Figure(i)}processFaceLine(e){for(let s=1;s<e.length;s++){const i=e[s];if(!i)continue;const[r,o,n]=i.split("/"),h=r?parseInt(r,10):void 0,d=o?parseInt(o,10):void 0,u=n?parseInt(n,10):void 0;if(h!==void 0){const p=this._tmpPositions[h-1];p&&this._positions.push(...p)}if(d!==void 0){const p=this._tmpUVs[d-1];p&&this._uvs.push(...p)}if(u!==void 0){const p=this._tmpNormals[u-1];p&&this._normals.push(...p)}}}}var mt=Object.getOwnPropertyDescriptor,ft=(t,e,s,i)=>{for(var r=i>1?void 0:i?mt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},ge=(t,e)=>(s,i)=>e(s,i,t);let $=class{constructor(t,e){this._store=e,this._handlers=new Map(t.map(s=>[s.mode,s]))}_currentMode=c.DisplayMode.Plane;_handlers;manage(t){t!==this._currentMode&&(this._handlers.get(this._currentMode)?.rollback(),t!==c.DisplayMode.Plane&&this._handlers.get(t)?.handle(),this._currentMode=t,this._store.setDisplayMode(this._currentMode))}dispose(){this._handlers&&this._handlers.clear(),this._currentMode=c.DisplayMode.Plane,this._store.setDisplayMode(this._currentMode)}};$=ft([l.injectable(),ge(0,l.injectAll("IDisplayHandler")),ge(1,l.inject("IEditorStore"))],$);var L=(t=>(t.Hover="hover",t.Click="click",t))(L||{}),gt=Object.getOwnPropertyDescriptor,bt=(t,e,s,i)=>{for(var r=i>1?void 0:i?gt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},N=(t,e)=>(s,i)=>e(s,i,t);let B=class{constructor(t,e,s){this._eventBus=t,this._store=s,this._handlers=new Map(e.map(i=>[i.mode,i])),this._eventBus.on(I.SelectHover,this._onHover),this._eventBus.on(I.SelectClick,this._onClick)}_currentMode=c.SelectMode.Mesh;_handlers;manage(t){t!==this._currentMode&&(this._handlers.get(this._currentMode)?.rollback(),this._currentMode=t,this._store.setSelectMode(this._currentMode))}_onHover=t=>{this._handlers.get(this._currentMode)?.handle(t,L.Hover)};_onClick=t=>{this._handlers.get(this._currentMode)?.handle(t,L.Click)};dispose(){this._handlers&&this._handlers.clear(),this._eventBus.off(I.SelectHover,this._onHover),this._currentMode=c.SelectMode.Mesh,this._store.setSelectMode(this._currentMode)}};B=bt([l.injectable(),N(0,l.inject("EventBus")),N(1,l.injectAll("ISelectHandler")),N(2,l.inject("IEditorStore"))],B);class yt{isToolEnabled(e,s){return c.DEFAULT_TOOL_RULES[s].includes(e)}getEnabledTools(e){return c.DEFAULT_TOOL_RULES[e]}}var vt=Object.getOwnPropertyDescriptor,Mt=(t,e,s,i)=>{for(var r=i>1?void 0:i?vt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},be=(t,e)=>(s,i)=>e(s,i,t);let G=class{constructor(t,e){this._store=e,this._handlers=new Map(t.map(s=>[s.mode,s])),this._unsubSelected=this._store.onSelectedObjectChange(()=>{this._handlers.get(this._currentTool)?.handle()}),this._policy=new yt}_currentTool=c.ToolType.Translate;_handlers;_unsubSelected;_policy;manage(t){if(this._currentTool===t)return;const e=this._store.getSelectMode();this._policy.isToolEnabled(t,e)&&(this._handlers.get(this._currentTool)?.rollback(),this._currentTool=t,this._store.setToolType(this._currentTool),this._handlers.get(this._currentTool)?.handle())}dispose(){this._unsubSelected?.(),this._handlers&&this._handlers.clear(),this._currentTool=c.ToolType.Translate,this._store.setToolType(this._currentTool)}};G=Mt([l.injectable(),be(0,l.injectAll("IToolHandler")),be(1,l.inject("IEditorStore"))],G);var St=Object.getOwnPropertyDescriptor,Et=(t,e,s,i)=>{for(var r=i>1?void 0:i?St(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},wt=(t,e)=>(s,i)=>e(s,i,t);let Z=class{_currentMode=c.SceneMode.AddFigure;_handlers;constructor(t){this._handlers=new Map(t.map(e=>[e.mode,e]))}manage(t,e){t===c.SceneMode.AddFigure?this._handlers.get(t)?.handle(e):this._handlers.get(t)?.handle(),this._currentMode=t}dispose(){this._handlers&&this._handlers.clear(),this._currentMode=c.SceneMode.AddFigure}};Z=Et([l.injectable(),wt(0,l.injectAll("ISceneHandler"))],Z);var xt=Object.getOwnPropertyDescriptor,Tt=(t,e,s,i)=>{for(var r=i>1?void 0:i?xt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},Ot=(t,e)=>(s,i)=>e(s,i,t);let X=class{constructor(t){this._api=t}mode=c.DisplayMode.Wireframe;_prevWireframe=new Map;_prevColorMesh=new Map;_prevColorLines=new Map;_wireColor=new a.Color(65535);handle(){const t=this._api.getMeshes();for(const e of t){const s=Array.isArray(e.material)?e.material:[e.material];for(const i of s)this._enableWireframeOnMaterial(i);e.traverse(i=>{if(i.isLineSegments){const r=i;if(!this._prevColorLines.has(r.material)){const n=r.material;this._prevColorLines.set(n,n.color.clone())}const o=r.material;o.color.copy(this._wireColor),o.needsUpdate=!0}})}}rollback(){for(const[t,e]of this._prevWireframe)"wireframe"in t&&(t.wireframe=e),t.needsUpdate=!0;this._prevWireframe.clear();for(const[t,e]of this._prevColorMesh){const s=t;s.color?.isColor&&s.color.copy(e)}this._prevColorMesh.clear();for(const[t,e]of this._prevColorLines)t.color.copy(e);this._prevColorLines.clear()}dispose(){this.rollback()}_enableWireframeOnMaterial(t){const e=t;"wireframe"in e&&!this._prevWireframe.has(t)&&(this._prevWireframe.set(t,!!e.wireframe),e.wireframe=!0,t.needsUpdate=!0),e.color?.isColor&&(this._prevColorMesh.has(t)||this._prevColorMesh.set(t,e.color.clone()),e.color.copy(this._wireColor))}};X=Tt([l.injectable(),Ot(0,l.inject("RendererApi"))],X);var Pt=Object.getOwnPropertyDescriptor,Lt=(t,e,s,i)=>{for(var r=i>1?void 0:i?Pt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},ye=(t,e)=>(s,i)=>e(s,i,t);let K=class{constructor(t,e){this._api=t,this._store=e}mode=c.SelectMode.Mesh;_hoveredMesh=null;_selectedMesh=null;_hoverColor=W;_selectColor=U;_origLineColors=new WeakMap;handle(t,e){if(this._api.setRaycastMode(this.mode),e===L.Hover){if(!t){this._hoveredMesh&&this._hoveredMesh!==this._selectedMesh&&this._restoreEdgesColor(this._hoveredMesh),this._hoveredMesh=null;return}const s=t.intersection.object;this._hoveredMesh!==s&&(this._hoveredMesh&&this._hoveredMesh!==this._selectedMesh&&this._restoreEdgesColor(this._hoveredMesh),s!==this._selectedMesh&&this._paintEdges(s,this._hoverColor),this._hoveredMesh=s)}if(e===L.Click){if(!t){this._selectedMesh&&(this._restoreEdgesColor(this._selectedMesh),this._selectedMesh=null,this._store.setSelectedObject(null));return}const s=t.intersection.object;this._selectedMesh&&this._selectedMesh!==s&&this._restoreEdgesColor(this._selectedMesh),this._paintEdges(s,this._selectColor),this._selectedMesh=s,this._store.setSelectedObject(s)}}rollback(){this._hoveredMesh&&this._restoreEdgesColor(this._hoveredMesh),this._selectedMesh&&this._restoreEdgesColor(this._selectedMesh),this._hoveredMesh=this._selectedMesh=null,this._store.setSelectedObject(null)}dispose(){this.rollback()}_paintEdges(t,e){t.children.forEach(s=>{const i=s;if(i.isLineSegments&&i.material){const r=i.material;this._origLineColors.has(i)||this._origLineColors.set(i,r.color.clone()),r.color.setHex(e),r.needsUpdate=!0}})}_restoreEdgesColor(t){t.children.forEach(e=>{const s=e;if(s.isLineSegments&&s.material){const i=this._origLineColors.get(s);if(i){const r=s.material;r.color.copy(i),r.needsUpdate=!0}}})}};K=Lt([l.injectable(),ye(0,l.inject("RendererApi")),ye(1,l.inject("IEditorStore"))],K);var jt=Object.getOwnPropertyDescriptor,Dt=(t,e,s,i)=>{for(var r=i>1?void 0:i?jt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},ve=(t,e)=>(s,i)=>e(s,i,t);let q=class{constructor(t,e){this._api=t,this._store=e,this._api.enableCameraLayer(P),this._hoverFace=this._makeOverlayFace(this._hoverColor),this._selectFace=this._makeOverlayFace(this._selectColor),this._api.addObject(this._hoverFace,P),this._api.addObject(this._selectFace,P)}mode=c.SelectMode.Face;_hoverFace;_selectFace;_hovered=null;_selected=null;_hoverColor=W;_selectColor=U;_normalEps=1e-4;_planeEps=1e-4;handle(t,e){if(this._api.setRaycastMode(this.mode),e===L.Hover){if(!t){this._hoverFace.visible=!1,this._hovered=null;return}const s=t.intersection.object;if(!s?.isMesh)return;const i=s,r=t.intersection.faceIndex??-1;if(r<0)return;const o=this._collectFaceGroup(i,r);if(!o)return;this._selected&&this._same(o,this._selected)?this._hoverFace.visible=!1:(this._writeWorldFaceGroup(this._hoverFace,o),this._hoverFace.visible=!0),this._hovered=o;return}if(e===L.Click){if(!t){this._selectFace.visible=!1,this._selected=null,this._store.setSelectedObject(null);return}const s=t.intersection.object;if(!s?.isMesh)return;const i=s,r=t.intersection.faceIndex??-1;if(r<0)return;const o=this._collectFaceGroup(i,r);if(!o)return;this._writeWorldFaceGroup(this._selectFace,o),this._centerFaceProxy(this._selectFace),this._selectFace.visible=!0,this._prepareFaceMetadata(o),this._store.setSelectedObject(this._selectFace),this._selected=o,this._hovered&&this._same(this._hovered,this._selected)&&(this._hoverFace.visible=!1)}}rollback(){this._hoverFace.visible=!1,this._selectFace.visible=!1,this._resetFaceProxyTransform(this._selectFace),this._resetFaceProxyTransform(this._hoverFace),this._hovered=this._selected=null,this._store.setSelectedObject(null)}dispose(){this.rollback(),this._api.removeObject(this._hoverFace),this._api.removeObject(this._selectFace),this._hoverFace.geometry.dispose(),this._hoverFace.material.dispose(),this._selectFace.geometry.dispose(),this._selectFace.material.dispose()}_makeOverlayFace(t){const e=new a.BufferGeometry,s=new a.MeshBasicMaterial({color:t,transparent:!0,opacity:.35,depthTest:!1,depthWrite:!1,side:a.DoubleSide,polygonOffset:!0,polygonOffsetFactor:-1,polygonOffsetUnits:-1}),i=new a.Mesh(e,s);return i.renderOrder=1e3,i.layers.set(P),i.visible=!1,i.raycast=()=>{},i}_collectFaceGroup(t,e){const s=t.geometry,i=s.getAttribute("position");if(!i)return null;const r=s.index;if(!r){const w=e*3,O=e*3+1,j=e*3+2;return{mesh:t,faceIndex:e,triangleIndices:[e],vertexIndices:[w,O,j],proxyVertexMap:[w,O,j]}}const o=Math.floor(r.count/3);if(e<0||e>=o)return null;const n=this._buildTriangleAdjacency(r,i),[h,d,u]=this._getTriangleIndices(r,e),p=this._readVertex(i,h),y=this._readVertex(i,d),g=this._readVertex(i,u),b=new a.Vector3().subVectors(y,p).cross(new a.Vector3().subVectors(g,p)).normalize(),m=new a.Plane().setFromNormalAndCoplanarPoint(b,p),S=new Set,E=[],D=[e];for(;D.length>0;){const w=D.pop();if(S.has(w))continue;S.add(w);const[O,j,R]=this._getTriangleIndices(r,w),x=this._readVertex(i,O),ce=this._readVertex(i,j),de=this._readVertex(i,R),Ae=new a.Vector3().subVectors(ce,x).cross(new a.Vector3().subVectors(de,x)).normalize(),Ie=Math.abs(Ae.dot(b))>=1-this._normalEps,Re=Math.abs(m.distanceToPoint(x))<this._planeEps&&Math.abs(m.distanceToPoint(ce))<this._planeEps&&Math.abs(m.distanceToPoint(de))<this._planeEps;if(!Ie||!Re)continue;E.push(w);const _e=n.get(w);if(_e)for(const ue of _e)S.has(ue)||D.push(ue)}E.sort((w,O)=>w-O);const C=new Set,A=[];for(const w of E){const[O,j,R]=this._getTriangleIndices(r,w);C.add(O),C.add(j),C.add(R),A.push(O,j,R)}return{mesh:t,faceIndex:e,triangleIndices:E,vertexIndices:Array.from(C),proxyVertexMap:A}}_writeWorldFaceGroup(t,e){const s=e.mesh.geometry,i=s.getAttribute("position"),r=s.index,o=new Float32Array(e.triangleIndices.length*9);let n=0;for(const d of e.triangleIndices){let u,p,y;r?[u,p,y]=this._getTriangleIndices(r,d):(u=d*3,p=d*3+1,y=d*3+2);const g=this._readVertex(i,u).applyMatrix4(e.mesh.matrixWorld),b=this._readVertex(i,p).applyMatrix4(e.mesh.matrixWorld),m=this._readVertex(i,y).applyMatrix4(e.mesh.matrixWorld);o[n++]=g.x,o[n++]=g.y,o[n++]=g.z,o[n++]=b.x,o[n++]=b.y,o[n++]=b.z,o[n++]=m.x,o[n++]=m.y,o[n++]=m.z}const h=t.geometry;h.setAttribute("position",new a.BufferAttribute(o,3)),h.setIndex(null),h.computeVertexNormals(),h.computeBoundingBox(),h.computeBoundingSphere()}_same(t,e){return!!t&&!!e&&t.mesh===e.mesh&&t.triangleIndices.length===e.triangleIndices.length&&t.triangleIndices.every((s,i)=>s===e.triangleIndices[i])}_prepareFaceMetadata(t){const{vertexIndexGroups:e,proxyVertexMap:s,lines:i,lineVertexIndexGroups:r}=this._buildFaceVertexGroups(t);this._selectFace.userData.faceInfo={mesh:t.mesh,faceIndex:t.faceIndex,triangleIndices:t.triangleIndices,vertexIndices:t.vertexIndices,vertexIndexGroups:e,proxyVertexMap:s,lines:i,lineVertexIndexGroups:r}}_centerFaceProxy(t){const e=t.geometry,s=e.getAttribute("position");if(!s||s.count===0)return;const i=new a.Vector3;for(let r=0;r<s.count;r++)i.x+=s.getX(r),i.y+=s.getY(r),i.z+=s.getZ(r);i.multiplyScalar(1/s.count);for(let r=0;r<s.count;r++)s.setXYZ(r,s.getX(r)-i.x,s.getY(r)-i.y,s.getZ(r)-i.z);s.needsUpdate=!0,t.position.copy(i),t.quaternion.identity(),t.scale.set(1,1,1),t.updateMatrixWorld(!0),e.computeBoundingBox(),e.computeBoundingSphere()}_pushEdge(t,e,s,i){const r=e<s?`${e}_${s}`:`${s}_${e}`,o=t.get(r);o?o.push(i):t.set(r,[i])}_buildTriangleAdjacency(t,e){const s=Math.floor(t.count/3),i=new Map,r=this._buildWeldMap(t,e);for(let h=0;h<s;h++){const[d,u,p]=this._getTriangleIndices(t,h),y=r.get(d),g=r.get(u),b=r.get(p);this._pushEdge(i,y,g,h),this._pushEdge(i,g,b,h),this._pushEdge(i,b,y,h)}const o=new Map;for(let h=0;h<s;h++)o.set(h,new Set);for(const h of i.values())if(!(h.length<2))for(let d=0;d<h.length;d++)for(let u=0;u<h.length;u++)d!==u&&o.get(h[d])?.add(h[u]);const n=new Map;for(const[h,d]of o)n.set(h,Array.from(d));return n}_getTriangleIndices(t,e){return[t.getX(e*3),t.getX(e*3+1),t.getX(e*3+2)]}_readVertex(t,e){return new a.Vector3(t.getX(e),t.getY(e),t.getZ(e))}_vertexKey(t,e,s=1e-6){const i=Math.round(t.getX(e)/s),r=Math.round(t.getY(e)/s),o=Math.round(t.getZ(e)/s);return`${i}_${r}_${o}`}_buildWeldMap(t,e){const s=new Map,i=new Map;let r=0;for(let o=0;o<t.count;o++){const n=t.getX(o);if(i.has(n))continue;const h=this._vertexKey(e,n);let d=s.get(h);d==null&&(d=r++,s.set(h,d)),i.set(n,d)}return i}_resetFaceProxyTransform(t){t.position.set(0,0,0),t.quaternion.identity(),t.scale.set(1,1,1),t.updateMatrixWorld(!0)}_buildFaceVertexGroups(t){const s=t.mesh.geometry.getAttribute("position"),i=1e-6,r=new a.Vector3,o=t.vertexIndices,n=[],h=new Map;for(const g of o){const b=this._readVertex(s,g),m=[];for(let E=0;E<s.count;E++)r.fromBufferAttribute(s,E),r.distanceToSquared(b)<i*i&&m.push(E);const S=n.length;n.push(m);for(const E of m)h.set(E,S)}const d=[];for(const g of t.proxyVertexMap){const b=h.get(g);d.push(b??-1)}const u=this._findChildLines(t.mesh),p=u?this._buildLineVertexGroups(t,u):void 0,y={vertexIndexGroups:n,proxyVertexMap:d};return u&&(y.lines=u),p&&(y.lineVertexIndexGroups=p),y}_findChildLines(t){for(const e of t.children)if(e.isLineSegments)return e;return null}_buildLineVertexGroups(t,e){const i=e.geometry.getAttribute("position"),o=t.mesh.geometry.getAttribute("position"),n=1e-6,h=new a.Vector3,d=e.matrixWorld,u=t.mesh.matrixWorld,p=[];for(const y of t.vertexIndices){const g=this._readVertex(o,y).applyMatrix4(u),b=[];for(let m=0;m<i.count;m++)h.fromBufferAttribute(i,m).applyMatrix4(d),h.distanceToSquared(g)<n*n&&b.push(m);p.push(b)}return p}};q=Dt([l.injectable(),ve(0,l.inject("RendererApi")),ve(1,l.inject("IEditorStore"))],q);var Ct=Object.getOwnPropertyDescriptor,At=(t,e,s,i)=>{for(var r=i>1?void 0:i?Ct(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},Me=(t,e)=>(s,i)=>e(s,i,t);let Q=class{constructor(t,e){this._api=t,this._store=e,this._api.enableCameraLayer(P),this._hoverVertex=this._makeOverlayVertex(this._hoverColor),this._selectVertex=this._makeOverlayVertex(this._selectColor),this._api.addObject(this._hoverVertex,P),this._api.addObject(this._selectVertex,P)}mode=c.SelectMode.Vertex;_hovered=null;_selected=null;_hoverVertex;_selectVertex;_hoverColor=W;_selectColor=U;handle(t,e){if(this._api.setRaycastMode(this.mode),e===L.Hover){if(!t){this._hoverVertex.visible=!1,this._hovered=null;return}const s=t.intersection.object;if(!s?.isPoints)return;const i=s,r=t.intersection.index??-1;if(r<0)return;this._selected&&this._same({points:i,index:r},this._selected)?this._hoverVertex.visible=!1:(this._writeWorldVertex(this._hoverVertex,i,r),this._hoverVertex.visible=!0);return}if(e===L.Click){if(!t){this._selectVertex.visible=!1,this._selected=null,this._store.setSelectedObject(null);return}const s=t.intersection.object;if(!s?.isPoints)return;const i=s,r=t.intersection.index??-1;if(r<0)return;this._writeWorldVertex(this._selectVertex,i,r),this._centerVertexOnPoint(this._selectVertex,i,r),this._selectVertex.visible=!0,this._prepareVertexMetadata(i,r),this._store.setSelectedObject(this._selectVertex),this._selected={points:i,index:r},this._hovered&&this._same(this._hovered,this._selected)&&(this._hoverVertex.visible=!1);return}}rollback(){this._hoverVertex.visible=!1,this._selectVertex.visible=!1,this._hovered=this._selected=null,this._store.setSelectedObject(null)}dispose(){this.rollback(),this._api.removeObject(this._hoverVertex),this._api.removeObject(this._selectVertex),this._hoverVertex.geometry.dispose(),this._hoverVertex.material.dispose(),this._selectVertex.geometry.dispose(),this._selectVertex.material.dispose()}_makeOverlayVertex(t,e=We){const s=new a.BufferGeometry;s.setAttribute("position",new a.Float32BufferAttribute([0,0,0],3));const i=new a.PointsMaterial({color:t,size:e,sizeAttenuation:!1,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1}),r=new a.Points(s,i);return r.renderOrder=1e3,r.raycast=()=>{},r.layers.set(P),r.visible=!1,r}_writeWorldVertex(t,e,s){const i=e.geometry.getAttribute("position"),r=new a.Vector3(i.getX(s),i.getY(s),i.getZ(s)).applyMatrix4(e.matrixWorld),o=t.geometry.getAttribute("position");o.setXYZ(0,r.x,r.y,r.z),o.needsUpdate=!0}_same(t,e){return!!t&&!!e&&t.points===e.points&&t.index===e.index}_prepareVertexMetadata(t,e){const s=Le(t);if(!s)return;const i=t.geometry.getAttribute("position"),r=new a.Vector3(i.getX(e),i.getY(e),i.getZ(e)).applyMatrix4(t.matrixWorld),o=new a.Matrix4().copy(s.matrixWorld).invert(),n=r.clone().applyMatrix4(o),d=s.geometry.getAttribute("position"),u=1e-6,p=u*u,y=new a.Vector3,g=[];for(let S=0;S<d.count;S++)y.fromBufferAttribute(d,S),y.distanceToSquared(n)<p&&g.push(S);const b=s.children.find(S=>S?.isLineSegments);let m=[];if(b){const S=new a.Matrix4().copy(b.matrixWorld).invert(),E=r.clone().applyMatrix4(S),D=b.geometry.getAttribute("position"),C=new a.Vector3;for(let A=0;A<D.count;A++)C.fromBufferAttribute(D,A),C.distanceToSquared(E)<p&&m.push(A)}this._selectVertex.userData.vertexInfo={points:t,index:e,mesh:s,vertexIndices:g,lines:b??null,edgeVertexIndices:m}}_centerVertexOnPoint(t,e,s){const i=e.geometry.getAttribute("position"),r=new a.Vector3(i.getX(s),i.getY(s),i.getZ(s)).applyMatrix4(e.matrixWorld);t.position.copy(r);const o=t.geometry;let n=o.getAttribute("position");(!n||n.count<1)&&(o.setAttribute("position",new a.BufferAttribute(new Float32Array(3),3)),n=o.getAttribute("position")),n.setXYZ(0,0,0,0),n.needsUpdate=!0,t.quaternion.identity(),t.scale.set(1,1,1),t.updateMatrixWorld(!0)}};Q=At([l.injectable(),Me(0,l.inject("RendererApi")),Me(1,l.inject("IEditorStore"))],Q);class le{constructor(e,s){this.api=e,this.store=s,this._unsubscribeTransform=this.api.onTransformChange(()=>{this.store.getSelectedObject()&&this.store.notifySelectedTransformChange?.()})}_unsubscribeTransform;handle(){const e=this.store.getSelectedObject();this.api.setMode(this.mode),e?this.api.attach(e):this.api.detach()}rollback(){this.api.detach()}dispose(){this.rollback(),this._unsubscribeTransform&&this._unsubscribeTransform()}}var It=Object.getOwnPropertyDescriptor,Rt=(t,e,s,i)=>{for(var r=i>1?void 0:i?It(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},Se=(t,e)=>(s,i)=>e(s,i,t);let J=class extends le{mode=c.ToolType.Translate;constructor(t,e){super(t,e)}};J=Rt([l.injectable(),Se(0,l.inject("RendererApi")),Se(1,l.inject("IEditorStore"))],J);var Vt=Object.getOwnPropertyDescriptor,Ht=(t,e,s,i)=>{for(var r=i>1?void 0:i?Vt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},Ee=(t,e)=>(s,i)=>e(s,i,t);let ee=class extends le{mode=c.ToolType.Scale;constructor(t,e){super(t,e)}};ee=Ht([l.injectable(),Ee(0,l.inject("RendererApi")),Ee(1,l.inject("IEditorStore"))],ee);var kt=Object.getOwnPropertyDescriptor,Ft=(t,e,s,i)=>{for(var r=i>1?void 0:i?kt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},we=(t,e)=>(s,i)=>e(s,i,t);let te=class extends le{mode=c.ToolType.Rotate;constructor(t,e){super(t,e)}};te=Ft([l.injectable(),we(0,l.inject("RendererApi")),we(1,l.inject("IEditorStore"))],te);var Wt=Object.getOwnPropertyDescriptor,Ut=(t,e,s,i)=>{for(var r=i>1?void 0:i?Wt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},xe=(t,e)=>(s,i)=>e(s,i,t);let se=class{constructor(t,e){this._api=t,this._store=e,this._api.enableCameraLayer(P),this._hoverLine=this._makeOverlayLine(this._hoverColor),this._selectLine=this._makeOverlayLine(this._selectColor),this._api.addObject(this._hoverLine,P),this._api.addObject(this._selectLine,P)}mode=c.SelectMode.Edge;_hoverLine;_selectLine;_hovered=null;_selected=null;_hoverColor=W;_selectColor=U;handle(t,e){if(this._api.setRaycastMode(this.mode),e===L.Hover){if(!t){this._hoverLine.visible=!1,this._hovered=null;return}const s=t.intersection.object;if(!s?.isLineSegments)return;const i=s,r=Math.floor((t.intersection.index??-1)/2);if(r<0)return;this._selected&&this._same({lines:i,seg:r},this._selected)?this._hoverLine.visible=!1:(this._writeWorldSegment(this._hoverLine,i,r),this._hoverLine.visible=!0),this._hovered={lines:i,seg:r};return}if(e===L.Click){if(!t){this._selectLine.visible=!1,this._selected=null,this._store.setSelectedObject(null);return}const s=t.intersection.object;if(!s?.isLineSegments)return;const i=s,r=Math.floor((t.intersection.index??-1)/2);if(r<0)return;this._writeWorldSegment(this._selectLine,i,r),this._centerAndOrientLineOnSegment(this._selectLine,i,r),this._selectLine.visible=!0,this._prepareEdgeMetadata(i,r),this._store.setSelectedObject(this._selectLine),this._selected={lines:i,seg:r},this._hovered&&this._same(this._hovered,this._selected)&&(this._hoverLine.visible=!1)}}rollback(){this._hoverLine.visible=!1,this._selectLine.visible=!1,this._hovered=this._selected=null,this._store.setSelectedObject(null)}dispose(){this.rollback(),this._api.removeObject(this._hoverLine),this._api.removeObject(this._selectLine),this._hoverLine.geometry.dispose(),this._hoverLine.material.dispose(),this._selectLine.geometry.dispose(),this._selectLine.material.dispose()}_makeOverlayLine(t){const e=new a.BufferGeometry;e.setAttribute("position",new a.Float32BufferAttribute(6,3));const s=new a.LineBasicMaterial({color:t,depthTest:!1,depthWrite:!1,transparent:!0,opacity:1}),i=new a.Line(e,s);return i.renderOrder=1e3,i.raycast=()=>{},i.layers.set(P),i.visible=!1,i}_writeWorldSegment(t,e,s){const i=e.geometry.getAttribute("position"),r=s*2,o=r+1,n=new a.Vector3(i.getX(r),i.getY(r),i.getZ(r)).applyMatrix4(e.matrixWorld),h=new a.Vector3(i.getX(o),i.getY(o),i.getZ(o)).applyMatrix4(e.matrixWorld),d=t.geometry.getAttribute("position");d.setXYZ(0,n.x,n.y,n.z),d.setXYZ(1,h.x,h.y,h.z),d.needsUpdate=!0}_same(t,e){return!!t&&!!e&&t.lines===e.lines&&t.seg===e.seg}_centerAndOrientLineOnSegment(t,e,s){const i=e.geometry.getAttribute("position"),r=s*2,o=r+1,n=new a.Vector3(i.getX(r),i.getY(r),i.getZ(r)).applyMatrix4(e.matrixWorld),h=new a.Vector3(i.getX(o),i.getY(o),i.getZ(o)).applyMatrix4(e.matrixWorld),d=new a.Vector3().subVectors(h,n),u=d.length();if(!isFinite(u)||u===0)return;const p=new a.Vector3().addVectors(n,h).multiplyScalar(.5);t.position.copy(p);const y=t.geometry;let g=y.getAttribute("position");(!g||g.count<2)&&(y.setAttribute("position",new a.BufferAttribute(new Float32Array(6),3)),g=y.getAttribute("position")),g.setXYZ(0,-u/2,0,0),g.setXYZ(1,u/2,0,0),g.needsUpdate=!0,d.normalize();const b=new a.Quaternion().setFromUnitVectors(new a.Vector3(1,0,0),d);t.quaternion.copy(b),t.updateMatrixWorld(!0)}_prepareEdgeMetadata(t,e){const s=Le(t);if(!s)return;const i=t.geometry.getAttribute("position"),r=e*2,o=r+1,n=new a.Vector3(i.getX(r),i.getY(r),i.getZ(r)).applyMatrix4(t.matrixWorld),h=new a.Vector3(i.getX(o),i.getY(o),i.getZ(o)).applyMatrix4(t.matrixWorld),d=new a.Matrix4().copy(s.matrixWorld).invert(),u=n.clone().applyMatrix4(d),p=h.clone().applyMatrix4(d),g=s.geometry.getAttribute("position"),b=new a.Vector3,m=1e-6,S=[],E=[];for(let x=0;x<g.count;x++)b.fromBufferAttribute(g,x),b.distanceToSquared(u)<m*m?S.push(x):b.distanceToSquared(p)<m*m&&E.push(x);const D=new a.Matrix4().copy(t.matrixWorld).invert(),C=n.clone().applyMatrix4(D),A=h.clone().applyMatrix4(D),w=t.geometry.getAttribute("position"),O=new a.Vector3,j=[],R=[];for(let x=0;x<w.count;x++)O.fromBufferAttribute(w,x),O.distanceToSquared(C)<m*m?j.push(x):O.distanceToSquared(A)<m*m&&R.push(x);this._selectLine.userData.edgeInfo={lines:t,seg:e,mesh:s,aIndices:S,bIndices:E,aEdgeIndices:j,bEdgeIndices:R}}};se=Ut([l.injectable(),xe(0,l.inject("RendererApi")),xe(1,l.inject("IEditorStore"))],se);var zt=Object.getOwnPropertyDescriptor,Nt=(t,e,s,i)=>{for(var r=i>1?void 0:i?zt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},Yt=(t,e)=>(s,i)=>e(s,i,t);let ie=class{constructor(t){this._api=t}mode=c.SceneMode.AddFigure;_lastAddedMesh=null;handle(t){const e=Fe[t](),s=e.getAttribute("position");s&&s.setUsage&&s.setUsage(a.DynamicDrawUsage);const i=new a.Mesh(e,Pe);i.layers.enable(Y);const r=De(i.geometry);i.add(r);const o=je(i.geometry);i.add(o),this._api.addMesh(i),this._lastAddedMesh=i}rollback(){this._lastAddedMesh!==null&&(this._api.removeMesh(this._lastAddedMesh),this._lastAddedMesh=null)}dispose(){this._lastAddedMesh=null}};ie=Nt([l.injectable(),Yt(0,l.inject("RendererApi"))],ie);var $t=Object.getOwnPropertyDescriptor,Bt=(t,e,s,i)=>{for(var r=i>1?void 0:i?$t(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},Te=(t,e)=>(s,i)=>e(s,i,t);let re=class{constructor(t,e){this._api=t,this._store=e}mode=c.SceneMode.DeleteFigure;_lastDeletedMesh=null;handle(){const t=this._store.getSelectedObject();Xe(t)&&(this._api.removeMesh(t),this._store.setSelectedObject(null),this._lastDeletedMesh=t)}rollback(){this._lastDeletedMesh&&(this._api.addMesh(this._lastDeletedMesh),this._lastDeletedMesh=null)}dispose(){this._lastDeletedMesh=null}};re=Bt([l.injectable(),Te(0,l.inject("RendererApi")),Te(1,l.inject("IEditorStore"))],re);var Gt=Object.getOwnPropertyDescriptor,Zt=(t,e,s,i)=>{for(var r=i>1?void 0:i?Gt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},Xt=(t,e)=>(s,i)=>e(s,i,t);let oe=class{constructor(t){this._renderer=t}addMesh(t){this._renderer.addMesh(t)}addMeshes(t){for(const e of t)this._renderer.addMesh(e)}removeMesh(t){this._renderer.removeMesh(t)}removeMeshes(t){for(const e of t)this._renderer.removeMesh(e)}getMeshes(){return this._renderer.getMeshes()}setMode(t){this._renderer.setTransformControlsMode(t)}attach(t){this._renderer.attachTransformControls(t)}detach(){this._renderer.detachTransformControls()}setRaycastMode(t){this._renderer.setRaycastMode(t)}addObject(t,e){this._renderer.addObject(t,e)}removeObject(t){this._renderer.removeObject(t)}enableCameraLayer(t){this._renderer.enableCameraLayer(t)}onTransformChange(t){return this._renderer.onTransformChange(t)}};oe=Zt([l.injectable(),Xt(0,l.inject("EditorRenderer"))],oe);var Kt=Object.getOwnPropertyDescriptor,qt=(t,e,s,i)=>{for(var r=i>1?void 0:i?Kt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r},V=(t,e)=>(s,i)=>e(s,i,t);exports.EditorHub=class{constructor(e,s,i,r,o,n){this._displayManager=e,this._selectManager=s,this._toolManager=i,this._sceneManager=r,this._renderer=o,this._store=n,this.setSelectMode(c.SelectMode.Mesh),this.setToolMode(c.ToolType.Translate)}setDisplayMode(e){this._displayManager.manage(e)}setSceneMode(e){this._sceneManager.manage(e)}setSelectMode(e){this._selectManager.manage(e)}setToolMode(e){this._toolManager.manage(e)}resizeRenderer(){this._renderer.resize()}updateRenderer(){this._renderer.loop()}addFigure(e,s){this._sceneManager.manage(e,s)}getSelectionStats(){return this._store.getSelectionStats()}onSelectionStatsChange(e){const s=this._store.onSelectedObjectChange(()=>{e()}),i=this._store.onSelectedTransformChange(()=>{e()});return()=>{s(),i()}}dispose(){this._displayManager.dispose(),this._selectManager.dispose(),this._renderer.dispose()}};exports.EditorHub=qt([l.injectable(),V(0,l.inject("IDisplayManager")),V(1,l.inject("ISelectManager")),V(2,l.inject("IToolManager")),V(3,l.inject("ISceneManager")),V(4,l.inject("EditorRenderer")),V(5,l.inject("IEditorStore"))],exports.EditorHub);var Qt=Object.getOwnPropertyDescriptor,Jt=(t,e,s,i)=>{for(var r=i>1?void 0:i?Qt(e,s):e,o=t.length-1,n;o>=0;o--)(n=t[o])&&(r=n(r)||r);return r};let ne=class{_selectMode=c.SelectMode.Mesh;_toolType=c.ToolType.Translate;_displayMode=c.DisplayMode.Plane;_selectedObject=null;_selectedListeners=new Set;_transformListeners=new Set;constructor(){He.makeAutoObservable(this,{},{autoBind:!0})}getSelectMode(){return this._selectMode}getToolType(){return this._toolType}getDisplayMode(){return this._displayMode}setSelectMode(t){this._selectMode=t}setToolType(t){this._toolType=t}setDisplayMode(t){this._displayMode=t}getSelectedObject(){return this._selectedObject}getSelectionStats(){const t=this._selectedObject;return t?Ke(t):null}setSelectedObject(t){if(this._selectedObject!==t){this._selectedObject=t;for(const e of this._selectedListeners)e(this._selectedObject)}}onSelectedObjectChange(t){return this._selectedListeners.add(t),()=>this._selectedListeners.delete(t)}onSelectedTransformChange(t){return this._transformListeners.add(t),()=>this._transformListeners.delete(t)}notifySelectedTransformChange(){for(const t of this._transformListeners)t()}};ne=Jt([l.injectable()],ne);let Oe=!1;const v=l.container.createChildContainer();function es(t){return Oe||(v.registerInstance("Canvas",t),v.registerSingleton("EventBus",exports.EventBus),v.registerSingleton("EditorRenderer",exports.EditorRenderer),v.registerSingleton("RendererApi",oe),v.registerSingleton("IDisplayHandler",X),v.registerSingleton("ISelectHandler",K),v.registerSingleton("ISelectHandler",q),v.registerSingleton("ISelectHandler",se),v.registerSingleton("ISelectHandler",Q),v.registerSingleton("IToolHandler",J),v.registerSingleton("IToolHandler",ee),v.registerSingleton("IToolHandler",te),v.registerSingleton("ISceneHandler",ie),v.registerSingleton("ISceneHandler",re),v.registerSingleton("IDisplayManager",$),v.registerSingleton("ISelectManager",B),v.registerSingleton("IToolManager",G),v.registerSingleton("ISceneManager",Z),v.registerSingleton("EditorHub",exports.EditorHub),v.registerSingleton("IEditorStore",ne),Oe=!0),v}let H=null;const ts=t=>(H||(H=es(t)),H.resolve("EditorHub")),ss=()=>{if(!H)throw new Error("EditorHub is not initialized. Call createAppHub(canvas) first.");return H.resolve("EditorHub")};exports.EventTopics=I;exports.ObjLoader=pt;exports.PreviewRenderer=ut;exports.Renderer=ae;exports.createAppHub=ts;exports.getAppHub=ss;
|