@planara/core 2.6.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/core/editor-renderer.d.ts +7 -0
  2. package/dist/core/editor-renderer.d.ts.map +1 -1
  3. package/dist/handlers/tool/base-tool-handler.d.ts +1 -0
  4. package/dist/handlers/tool/base-tool-handler.d.ts.map +1 -1
  5. package/dist/hub/app-hub.d.ts +1 -1
  6. package/dist/hub/app-hub.d.ts.map +1 -1
  7. package/dist/hub/editor-hub.d.ts +6 -2
  8. package/dist/hub/editor-hub.d.ts.map +1 -1
  9. package/dist/index.cjs.js +2 -2
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.es.js +291 -227
  13. package/dist/index.full.d.ts +66 -2
  14. package/dist/index.public.d.ts +62 -2
  15. package/dist/index.umd.js +2 -2
  16. package/dist/interfaces/api/transform-helpers-api.d.ts +4 -3
  17. package/dist/interfaces/api/transform-helpers-api.d.ts.map +1 -1
  18. package/dist/interfaces/policy/tool-availability-policy.d.ts +12 -0
  19. package/dist/interfaces/policy/tool-availability-policy.d.ts.map +1 -0
  20. package/dist/interfaces/store/editor-store.d.ts +10 -2
  21. package/dist/interfaces/store/editor-store.d.ts.map +1 -1
  22. package/dist/managers/scene/scene-manager.d.ts.map +1 -1
  23. package/dist/managers/tool/tool-manager.d.ts +3 -0
  24. package/dist/managers/tool/tool-manager.d.ts.map +1 -1
  25. package/dist/policy/tool-availability-policy.d.ts +13 -0
  26. package/dist/policy/tool-availability-policy.d.ts.map +1 -0
  27. package/dist/store/index.d.ts +10 -1
  28. package/dist/store/index.d.ts.map +1 -1
  29. package/dist/types/listener/selected-listener.d.ts +1 -0
  30. package/dist/types/listener/selected-listener.d.ts.map +1 -1
  31. package/dist/types/listener/transform-listener.d.ts +3 -0
  32. package/dist/types/listener/transform-listener.d.ts.map +1 -0
  33. package/dist/utils/helpers.d.ts +3 -0
  34. package/dist/utils/helpers.d.ts.map +1 -1
  35. package/dist/utils/renderer-api.d.ts +4 -1
  36. package/dist/utils/renderer-api.d.ts.map +1 -1
  37. package/package.json +2 -2
package/dist/index.es.js CHANGED
@@ -1,30 +1,30 @@
1
1
  import "reflect-metadata";
2
2
  import * as a from "three";
3
- import { Controls as Ye, Vector3 as D, MOUSE as j, TOUCH as x, Quaternion as be, Spherical as ve, Vector2 as E, Ray as Ue, Plane as We, MathUtils as ze } from "three";
4
- import { FigureType as P, SelectMode as v, Figure as Ze, DisplayMode as k, ToolType as C, SceneMode as V } from "@planara/types";
5
- import { SymmetricAxesHelper as $e, OrbitWithState as Fe, CameraAxesGizmo as Be, ModelingTransformControls as Xe } from "@planara/three";
6
- import { injectable as u, inject as h, injectAll as W, container as Ge } from "tsyringe";
7
- import { EventEmitter as Ke } from "events";
8
- import { makeAutoObservable as qe } from "mobx";
9
- const Qe = {
10
- [P.Plane]: () => new a.PlaneGeometry(1, 1, 1, 1),
11
- [P.Cube]: () => new a.BoxGeometry(1, 1, 1, 1, 1, 1),
12
- [P.UVSphere]: () => new a.SphereGeometry(0.5, 32, 16),
13
- [P.Icosphere]: () => new a.IcosahedronGeometry(0.5, 0),
14
- [P.Cylinder]: () => new a.CylinderGeometry(0.5, 0.5, 1, 32, 1, !1),
15
- [P.Cone]: () => new a.ConeGeometry(0.5, 1, 32, 1, !1),
16
- [P.Torus]: () => new a.TorusGeometry(0.5, 0.2, 16, 64),
17
- [P.Circle]: () => new a.CircleGeometry(0.5, 32),
18
- [P.Sphere]: () => new a.SphereGeometry(0.5, 32, 16),
19
- [P.Custom]: function() {
3
+ import { Controls as ze, Vector3 as T, MOUSE as j, TOUCH as R, Quaternion as be, Spherical as ve, Vector2 as w, Ray as Ue, Plane as We, MathUtils as Fe } from "three";
4
+ import { FigureType as E, SelectMode as v, Figure as Ze, DisplayMode as k, DEFAULT_TOOL_RULES as ye, ToolType as C, SceneMode as V } from "@planara/types";
5
+ import { SymmetricAxesHelper as $e, OrbitWithState as Be, CameraAxesGizmo as Xe, ModelingTransformControls as Ge } from "@planara/three";
6
+ import { injectable as u, inject as h, injectAll as U, container as Ke } from "tsyringe";
7
+ import { EventEmitter as qe } from "events";
8
+ import { makeAutoObservable as Qe } from "mobx";
9
+ const Je = {
10
+ [E.Plane]: () => new a.PlaneGeometry(1, 1, 1, 1),
11
+ [E.Cube]: () => new a.BoxGeometry(1, 1, 1, 1, 1, 1),
12
+ [E.UVSphere]: () => new a.SphereGeometry(0.5, 32, 16),
13
+ [E.Icosphere]: () => new a.IcosahedronGeometry(0.5, 0),
14
+ [E.Cylinder]: () => new a.CylinderGeometry(0.5, 0.5, 1, 32, 1, !1),
15
+ [E.Cone]: () => new a.ConeGeometry(0.5, 1, 32, 1, !1),
16
+ [E.Torus]: () => new a.TorusGeometry(0.5, 0.2, 16, 64),
17
+ [E.Circle]: () => new a.CircleGeometry(0.5, 32),
18
+ [E.Sphere]: () => new a.SphereGeometry(0.5, 32, 16),
19
+ [E.Custom]: function() {
20
20
  throw new Error("Custom geometry is not generated here.");
21
21
  }
22
22
  }, je = new a.MeshStandardMaterial({
23
23
  color: 12566463,
24
24
  metalness: 0,
25
25
  roughness: 0.6
26
- }), Je = 8;
27
- class Re {
26
+ }), et = 8;
27
+ class Ie {
28
28
  /** Корневой объект сцены */
29
29
  scene;
30
30
  /** Камера для сцены */
@@ -172,15 +172,15 @@ class Re {
172
172
  this.meshes && (this.meshes.length = 0, this.meshes = []), this.scene = null, this.camera = null, this.renderer?.dispose(), this.canvas = null;
173
173
  }
174
174
  }
175
- var et = Object.getOwnPropertyDescriptor, tt = (t, e, s, i) => {
176
- for (var r = i > 1 ? void 0 : i ? et(e, s) : e, o = t.length - 1, n; o >= 0; o--)
175
+ var tt = Object.getOwnPropertyDescriptor, st = (t, e, s, i) => {
176
+ for (var r = i > 1 ? void 0 : i ? tt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
177
177
  (n = t[o]) && (r = n(r) || r);
178
178
  return r;
179
179
  };
180
180
  let X = class {
181
181
  _emitter;
182
182
  constructor() {
183
- this._emitter = new Ke();
183
+ this._emitter = new qe();
184
184
  }
185
185
  /** Публикация события */
186
186
  emit(t, e) {
@@ -195,22 +195,22 @@ let X = class {
195
195
  this._emitter.off(t, e);
196
196
  }
197
197
  };
198
- X = tt([
198
+ X = st([
199
199
  u()
200
200
  ], X);
201
- var R = /* @__PURE__ */ ((t) => (t.SelectHover = "select.hover", t.SelectClick = "select.click", t.ToolSelect = "tool.select", t))(R || {});
202
- const st = 0.03, it = 0.05, Ie = 0, rt = 1, ot = 2, L = 31, z = 16776960, Z = 16755200, nt = 2236962, at = 2236962, ht = (t) => !!t && t.isMesh, He = (t) => {
201
+ var I = /* @__PURE__ */ ((t) => (t.SelectHover = "select.hover", t.SelectClick = "select.click", t.ToolSelect = "tool.select", t))(I || {});
202
+ const it = 0.03, rt = 0.05, He = 0, ot = 1, nt = 2, L = 31, W = 16776960, F = 16755200, at = 2236962, ht = 2236962, lt = (t) => !!t && t.isMesh, ke = (t) => {
203
203
  let e = t;
204
204
  for (; e; ) {
205
205
  if (e.isMesh) return e;
206
206
  e = e.parent;
207
207
  }
208
208
  return null;
209
- }, ke = (t) => {
209
+ }, Ve = (t) => {
210
210
  const e = new a.BufferGeometry();
211
211
  e.setAttribute("position", t.getAttribute("position")), e.computeBoundingSphere(), e.computeBoundingBox();
212
212
  const s = new a.PointsMaterial({
213
- color: at,
213
+ color: ht,
214
214
  size: 6,
215
215
  sizeAttenuation: !1,
216
216
  depthTest: !1,
@@ -218,31 +218,36 @@ const st = 0.03, it = 0.05, Ie = 0, rt = 1, ot = 2, L = 31, z = 16776960, Z = 16
218
218
  transparent: !0,
219
219
  opacity: 0.9
220
220
  }), i = new a.Points(e, s);
221
- return i.layers.set(ot), i.renderOrder = 1e3, i.visible = !1, i;
222
- }, Ve = (t) => {
221
+ return i.layers.set(nt), i.renderOrder = 1e3, i.visible = !1, i;
222
+ }, Ne = (t) => {
223
223
  const e = new a.EdgesGeometry(t), s = new a.LineSegments(
224
224
  e,
225
- new a.LineBasicMaterial({ color: nt, linewidth: 1 })
225
+ new a.LineBasicMaterial({ color: at, linewidth: 1 })
226
226
  );
227
- return s.layers.set(rt), s;
227
+ return s.layers.set(ot), s;
228
+ }, ct = (t) => {
229
+ 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();
230
+ r.getSize(o);
231
+ const n = { x: o.x, y: o.y, z: o.z };
232
+ return { position: e, rotation: s, scale: i, size: n };
228
233
  };
229
- var lt = Object.getOwnPropertyDescriptor, ct = (t, e, s, i) => {
230
- for (var r = i > 1 ? void 0 : i ? lt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
234
+ var dt = Object.getOwnPropertyDescriptor, _t = (t, e, s, i) => {
235
+ for (var r = i > 1 ? void 0 : i ? dt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
231
236
  (n = t[o]) && (r = n(r) || r);
232
237
  return r;
233
- }, ye = (t, e) => (s, i) => e(s, i, t);
234
- let G = class extends Re {
238
+ }, Me = (t, e) => (s, i) => e(s, i, t);
239
+ let G = class extends Ie {
235
240
  constructor(t, e) {
236
241
  super(t), this._canvas = t, this._bus = e;
237
242
  const s = new a.GridHelper(10, 10);
238
243
  s.position.y = -1e-3, this.scene.add(s);
239
244
  const i = new $e(6);
240
- this.scene.add(i), this._orbit = new Fe(this.camera, this.renderer.domElement), this._orbit.enableDamping = !0, this._orbit.dampingFactor = 0.05, this._cameraGizmo = new Be(this.renderer, this.camera, {
245
+ this.scene.add(i), this._orbit = new Be(this.camera, this.renderer.domElement), this._orbit.enableDamping = !0, this._orbit.dampingFactor = 0.05, this._cameraGizmo = new Xe(this.renderer, this.camera, {
241
246
  size: 96,
242
247
  // Размер квадрата
243
248
  margin: 36
244
249
  // Отступы по сторонам (снизу и справа)
245
- }), this._raycaster = new a.Raycaster(), this._mouse = new a.Vector2(), this.scene.add(new a.HemisphereLight(16777215, 4473924, 0.6)), this.camera.layers.enable(0), this.camera.layers.enable(1), this._transform = new Xe(this.camera, this.renderer.domElement), this._transformHelper = this._transform.getHelper(), this.scene.add(this._transformHelper), this._isEventListenersAdded || this._initMouseListeners();
250
+ }), this._raycaster = new a.Raycaster(), this._mouse = new a.Vector2(), this.scene.add(new a.HemisphereLight(16777215, 4473924, 0.6)), this.camera.layers.enable(0), this.camera.layers.enable(1), this._transform = new Ge(this.camera, this.renderer.domElement), this._transformHelper = this._transform.getHelper(), this.scene.add(this._transformHelper), this._isEventListenersAdded || this._initMouseListeners();
246
251
  }
247
252
  /** Orbit-контроллер для управления камерой */
248
253
  _orbit;
@@ -262,6 +267,7 @@ let G = class extends Re {
262
267
  _lastHovered = null;
263
268
  /** Gizmo для управления отображением perspective camera */
264
269
  _cameraGizmo;
270
+ _transformListeners = /* @__PURE__ */ new Set();
265
271
  /**
266
272
  * Обновление состояния рендерера.
267
273
  */
@@ -271,10 +277,10 @@ let G = class extends Re {
271
277
  /** Добавление фигуры на сцену */
272
278
  addFigure(t) {
273
279
  const e = super.addFigure(t);
274
- e.layers.enable(Ie);
275
- const s = Ve(e.geometry);
280
+ e.layers.enable(He);
281
+ const s = Ne(e.geometry);
276
282
  e.add(s);
277
- const i = ke(e.geometry);
283
+ const i = Ve(e.geometry);
278
284
  return e.add(i), e;
279
285
  }
280
286
  /**
@@ -300,6 +306,13 @@ let G = class extends Re {
300
306
  detachTransformControls() {
301
307
  this._transform.detach();
302
308
  }
309
+ /**
310
+ * Подписывает слушателя на изменения трансформации текущего объекта.
311
+ * @internal
312
+ */
313
+ onTransformChange(t) {
314
+ return this._transformListeners.add(t), () => this._transformListeners.delete(t);
315
+ }
303
316
  /**
304
317
  * Настройка режимов для `Raycaster`.
305
318
  * @internal
@@ -312,17 +325,17 @@ let G = class extends Re {
312
325
  e.layers.set(0);
313
326
  break;
314
327
  case v.Edge:
315
- e.layers.set(1), e.params.Line.threshold = st;
328
+ e.layers.set(1), e.params.Line.threshold = it;
316
329
  break;
317
330
  case v.Vertex:
318
- e.layers.set(2), e.params.Points.threshold = it;
331
+ e.layers.set(2), e.params.Points.threshold = rt;
319
332
  break;
320
333
  }
321
334
  }
322
335
  dispose() {
323
336
  this._isEventListenersAdded && (this.canvas.removeEventListener("mousemove", this._handleMouseMove, !1), this.canvas.removeEventListener("click", this._handleMouseClick, !1), this.canvas.removeEventListener("pointerdown", (t) => this._transform.pointerDown(t)), this.canvas.removeEventListener("pointermove", (t) => this._transform.pointerMove(t)), this.canvas.removeEventListener("pointerup", (t) => this._transform.pointerUp(t)), this.canvas.removeEventListener("pointerleave", () => this._transform.pointerHover(null)), this._transform.removeEventListener("dragging-changed", () => {
324
337
  this._orbit.enabled = !this._transform.dragging;
325
- }), this._isEventListenersAdded = !1), this._orbit?.dispose(), this._transform?.dispose(), this._transformHelper?.parent && this._transformHelper.parent.remove(this._transformHelper), this._lastHovered = null, super.dispose();
338
+ }), 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();
326
339
  }
327
340
  render() {
328
341
  super.render(), this._cameraGizmo.render(this.canvas.width, this.canvas.height);
@@ -331,15 +344,17 @@ let G = class extends Re {
331
344
  _initMouseListeners() {
332
345
  this.canvas.addEventListener("mousemove", this._handleMouseMove, !1), this.canvas.addEventListener("click", this._handleMouseClick, !1), this.canvas.addEventListener("pointerdown", (t) => this._transform.pointerDown(t)), this.canvas.addEventListener("pointermove", (t) => this._transform.pointerMove(t)), this.canvas.addEventListener("pointerup", (t) => this._transform.pointerUp(t)), this.canvas.addEventListener("pointerleave", () => this._transform.pointerHover(null)), this._transform.addEventListener("dragging-changed", () => {
333
346
  this._orbit.enabled = !this._transform.dragging;
347
+ }), this._transform.addEventListener("objectChange", () => {
348
+ for (const t of this._transformListeners) t();
334
349
  }), this._isEventListenersAdded = !0;
335
350
  }
336
351
  /** Обработчик события для hover */
337
352
  _handleMouseMove = (t) => {
338
- this._processRaycastEvent(t, R.SelectHover, !0);
353
+ this._processRaycastEvent(t, I.SelectHover, !0);
339
354
  };
340
355
  /** Обработчик события на click */
341
356
  _handleMouseClick = (t) => {
342
- this._processRaycastEvent(t, R.SelectClick, !1);
357
+ this._processRaycastEvent(t, I.SelectClick, !1);
343
358
  };
344
359
  /** Вспомогательный метод для получения модели, которую выбрали и отправки события в event bus */
345
360
  _processRaycastEvent(t, e, s) {
@@ -350,12 +365,12 @@ let G = class extends Re {
350
365
  s ? n !== this._lastHovered && (this.meshes.forEach((c) => c.userData.isHit = !1), n && (n.userData.isHit = !0), this._lastHovered = n, this._bus.emit(e, o ? { intersection: o } : null)) : this._bus.emit(e, o ? { intersection: o } : null);
351
366
  }
352
367
  };
353
- G = ct([
368
+ G = _t([
354
369
  u(),
355
- ye(0, h("Canvas")),
356
- ye(1, h("EventBus"))
370
+ Me(0, h("Canvas")),
371
+ Me(1, h("EventBus"))
357
372
  ], G);
358
- const Me = { type: "change" }, pe = { type: "start" }, Ne = { type: "end" }, U = new Ue(), we = new We(), dt = Math.cos(70 * ze.DEG2RAD), p = new D(), g = 2 * Math.PI, l = {
373
+ const Se = { type: "change" }, pe = { type: "start" }, Ye = { type: "end" }, z = new Ue(), we = new We(), pt = Math.cos(70 * Fe.DEG2RAD), p = new T(), g = 2 * Math.PI, l = {
359
374
  NONE: -1,
360
375
  ROTATE: 0,
361
376
  DOLLY: 1,
@@ -364,8 +379,8 @@ const Me = { type: "change" }, pe = { type: "start" }, Ne = { type: "end" }, U =
364
379
  TOUCH_PAN: 4,
365
380
  TOUCH_DOLLY_PAN: 5,
366
381
  TOUCH_DOLLY_ROTATE: 6
367
- }, F = 1e-6;
368
- class _t extends Ye {
382
+ }, $ = 1e-6;
383
+ class ut extends ze {
369
384
  /**
370
385
  * Constructs a new controls instance.
371
386
  *
@@ -373,7 +388,7 @@ class _t extends Ye {
373
388
  * @param {?HTMLElement} domElement - The HTML element used for event listeners.
374
389
  */
375
390
  constructor(e, s = null) {
376
- super(e, s), this.state = l.NONE, this.target = new D(), this.cursor = new D(), 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 = 0.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: j.ROTATE, MIDDLE: j.DOLLY, RIGHT: j.PAN }, this.touches = { ONE: x.ROTATE, TWO: x.DOLLY_PAN }, this.target0 = this.target.clone(), this.position0 = this.object.position.clone(), this.zoom0 = this.object.zoom, this._domElementKeyEvents = null, this._lastPosition = new D(), this._lastQuaternion = new be(), this._lastTargetPosition = new D(), this._quat = new be().setFromUnitVectors(e.up, new D(0, 1, 0)), this._quatInverse = this._quat.clone().invert(), this._spherical = new ve(), this._sphericalDelta = new ve(), this._scale = 1, this._panOffset = new D(), this._rotateStart = new E(), this._rotateEnd = new E(), this._rotateDelta = new E(), this._panStart = new E(), this._panEnd = new E(), this._panDelta = new E(), this._dollyStart = new E(), this._dollyEnd = new E(), this._dollyDelta = new E(), this._dollyDirection = new D(), this._mouse = new E(), this._performCursorZoom = !1, this._pointers = [], this._pointerPositions = {}, this._controlActive = !1, this._onPointerMove = ut.bind(this), this._onPointerDown = pt.bind(this), this._onPointerUp = mt.bind(this), this._onContextMenu = wt.bind(this), this._onMouseWheel = bt.bind(this), this._onKeyDown = vt.bind(this), this._onTouchStart = yt.bind(this), this._onTouchMove = Mt.bind(this), this._onMouseDown = ft.bind(this), this._onMouseMove = gt.bind(this), this._interceptControlDown = Et.bind(this), this._interceptControlUp = Pt.bind(this), this.domElement !== null && this.connect(this.domElement), this.update();
391
+ super(e, s), this.state = l.NONE, this.target = new T(), this.cursor = new T(), 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 = 0.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: j.ROTATE, MIDDLE: j.DOLLY, RIGHT: j.PAN }, this.touches = { ONE: R.ROTATE, TWO: R.DOLLY_PAN }, this.target0 = this.target.clone(), this.position0 = this.object.position.clone(), this.zoom0 = this.object.zoom, this._domElementKeyEvents = null, this._lastPosition = new T(), this._lastQuaternion = new be(), this._lastTargetPosition = new T(), this._quat = new be().setFromUnitVectors(e.up, new T(0, 1, 0)), this._quatInverse = this._quat.clone().invert(), this._spherical = new ve(), this._sphericalDelta = new ve(), this._scale = 1, this._panOffset = new T(), this._rotateStart = new w(), this._rotateEnd = new w(), this._rotateDelta = new w(), this._panStart = new w(), this._panEnd = new w(), this._panDelta = new w(), this._dollyStart = new w(), this._dollyEnd = new w(), this._dollyDelta = new w(), this._dollyDirection = new T(), this._mouse = new w(), this._performCursorZoom = !1, this._pointers = [], this._pointerPositions = {}, this._controlActive = !1, this._onPointerMove = ft.bind(this), this._onPointerDown = mt.bind(this), this._onPointerUp = gt.bind(this), this._onContextMenu = Et.bind(this), this._onMouseWheel = yt.bind(this), this._onKeyDown = Mt.bind(this), this._onTouchStart = St.bind(this), this._onTouchMove = wt.bind(this), this._onMouseDown = bt.bind(this), this._onMouseMove = vt.bind(this), this._interceptControlDown = Pt.bind(this), this._interceptControlUp = Ot.bind(this), this.domElement !== null && this.connect(this.domElement), this.update();
377
392
  }
378
393
  connect(e) {
379
394
  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";
@@ -434,7 +449,7 @@ class _t extends Ye {
434
449
  * was called, or the initial state.
435
450
  */
436
451
  reset() {
437
- 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 = l.NONE;
452
+ this.target.copy(this.target0), this.object.position.copy(this.position0), this.object.zoom = this.zoom0, this.object.updateProjectionMatrix(), this.dispatchEvent(Se), this.update(), this.state = l.NONE;
438
453
  }
439
454
  update(e = null) {
440
455
  const s = this.object.position;
@@ -456,20 +471,20 @@ class _t extends Ye {
456
471
  const _ = c - n;
457
472
  this.object.position.addScaledVector(this._dollyDirection, _), this.object.updateMatrixWorld(), o = !!_;
458
473
  } else if (this.object.isOrthographicCamera) {
459
- const c = new D(this._mouse.x, this._mouse.y, 0);
474
+ const c = new T(this._mouse.x, this._mouse.y, 0);
460
475
  c.unproject(this.object);
461
476
  const _ = this.object.zoom;
462
477
  this.object.zoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.object.zoom / this._scale)), this.object.updateProjectionMatrix(), o = _ !== this.object.zoom;
463
- const m = new D(this._mouse.x, this._mouse.y, 0);
478
+ const m = new T(this._mouse.x, this._mouse.y, 0);
464
479
  m.unproject(this.object), this.object.position.sub(m).add(c), this.object.updateMatrixWorld(), n = p.length();
465
480
  } else
466
481
  console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."), this.zoomToCursor = !1;
467
- n !== null && (this.screenSpacePanning ? this.target.set(0, 0, -1).transformDirection(this.object.matrix).multiplyScalar(n).add(this.object.position) : (U.origin.copy(this.object.position), U.direction.set(0, 0, -1).transformDirection(this.object.matrix), Math.abs(this.object.up.dot(U.direction)) < dt ? this.object.lookAt(this.target) : (we.setFromNormalAndCoplanarPoint(this.object.up, this.target), U.intersectPlane(we, this.target))));
482
+ n !== null && (this.screenSpacePanning ? this.target.set(0, 0, -1).transformDirection(this.object.matrix).multiplyScalar(n).add(this.object.position) : (z.origin.copy(this.object.position), z.direction.set(0, 0, -1).transformDirection(this.object.matrix), Math.abs(this.object.up.dot(z.direction)) < pt ? this.object.lookAt(this.target) : (we.setFromNormalAndCoplanarPoint(this.object.up, this.target), z.intersectPlane(we, this.target))));
468
483
  } else if (this.object.isOrthographicCamera) {
469
484
  const n = this.object.zoom;
470
485
  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);
471
486
  }
472
- return this._scale = 1, this._performCursorZoom = !1, o || this._lastPosition.distanceToSquared(this.object.position) > F || 8 * (1 - this._lastQuaternion.dot(this.object.quaternion)) > F || this._lastTargetPosition.distanceToSquared(this.target) > F ? (this.dispatchEvent(Me), this._lastPosition.copy(this.object.position), this._lastQuaternion.copy(this.object.quaternion), this._lastTargetPosition.copy(this.target), !0) : !1;
487
+ return this._scale = 1, this._performCursorZoom = !1, o || this._lastPosition.distanceToSquared(this.object.position) > $ || 8 * (1 - this._lastQuaternion.dot(this.object.quaternion)) > $ || this._lastTargetPosition.distanceToSquared(this.target) > $ ? (this.dispatchEvent(Se), this._lastPosition.copy(this.object.position), this._lastQuaternion.copy(this.object.quaternion), this._lastTargetPosition.copy(this.target), !0) : !1;
473
488
  }
474
489
  _getAutoRotationAngle(e) {
475
490
  return e !== null ? g / 60 * this.autoRotateSpeed * e : g / 60 / 60 * this.autoRotateSpeed;
@@ -637,7 +652,7 @@ class _t extends Ye {
637
652
  }
638
653
  _trackPointer(e) {
639
654
  let s = this._pointerPositions[e.pointerId];
640
- s === void 0 && (s = new E(), this._pointerPositions[e.pointerId] = s), s.set(e.pageX, e.pageY);
655
+ s === void 0 && (s = new w(), this._pointerPositions[e.pointerId] = s), s.set(e.pageX, e.pageY);
641
656
  }
642
657
  _getSecondPointerPosition(e) {
643
658
  const s = e.pointerId === this._pointers[0] ? this._pointers[1] : this._pointers[0];
@@ -661,16 +676,16 @@ class _t extends Ye {
661
676
  return e.ctrlKey && !this._controlActive && (i.deltaY *= 10), i;
662
677
  }
663
678
  }
664
- function pt(t) {
679
+ function mt(t) {
665
680
  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)));
666
681
  }
667
- function ut(t) {
682
+ function ft(t) {
668
683
  this.enabled !== !1 && (t.pointerType === "touch" ? this._onTouchMove(t) : this._onMouseMove(t));
669
684
  }
670
- function mt(t) {
685
+ function gt(t) {
671
686
  switch (this._removePointer(t), this._pointers.length) {
672
687
  case 0:
673
- this.domElement.releasePointerCapture(t.pointerId), this.domElement.removeEventListener("pointermove", this._onPointerMove), this.domElement.removeEventListener("pointerup", this._onPointerUp), this.dispatchEvent(Ne), this.state = l.NONE;
688
+ this.domElement.releasePointerCapture(t.pointerId), this.domElement.removeEventListener("pointermove", this._onPointerMove), this.domElement.removeEventListener("pointerup", this._onPointerUp), this.dispatchEvent(Ye), this.state = l.NONE;
674
689
  break;
675
690
  case 1:
676
691
  const e = this._pointers[0], s = this._pointerPositions[e];
@@ -678,7 +693,7 @@ function mt(t) {
678
693
  break;
679
694
  }
680
695
  }
681
- function ft(t) {
696
+ function bt(t) {
682
697
  let e;
683
698
  switch (t.button) {
684
699
  case 0:
@@ -721,7 +736,7 @@ function ft(t) {
721
736
  }
722
737
  this.state !== l.NONE && this.dispatchEvent(pe);
723
738
  }
724
- function gt(t) {
739
+ function vt(t) {
725
740
  switch (this.state) {
726
741
  case l.ROTATE:
727
742
  if (this.enableRotate === !1) return;
@@ -737,21 +752,21 @@ function gt(t) {
737
752
  break;
738
753
  }
739
754
  }
740
- function bt(t) {
741
- this.enabled === !1 || this.enableZoom === !1 || this.state !== l.NONE || (t.preventDefault(), this.dispatchEvent(pe), this._handleMouseWheel(this._customWheelEvent(t)), this.dispatchEvent(Ne));
755
+ function yt(t) {
756
+ this.enabled === !1 || this.enableZoom === !1 || this.state !== l.NONE || (t.preventDefault(), this.dispatchEvent(pe), this._handleMouseWheel(this._customWheelEvent(t)), this.dispatchEvent(Ye));
742
757
  }
743
- function vt(t) {
758
+ function Mt(t) {
744
759
  this.enabled !== !1 && this._handleKeyDown(t);
745
760
  }
746
- function yt(t) {
761
+ function St(t) {
747
762
  switch (this._trackPointer(t), this._pointers.length) {
748
763
  case 1:
749
764
  switch (this.touches.ONE) {
750
- case x.ROTATE:
765
+ case R.ROTATE:
751
766
  if (this.enableRotate === !1) return;
752
767
  this._handleTouchStartRotate(t), this.state = l.TOUCH_ROTATE;
753
768
  break;
754
- case x.PAN:
769
+ case R.PAN:
755
770
  if (this.enablePan === !1) return;
756
771
  this._handleTouchStartPan(t), this.state = l.TOUCH_PAN;
757
772
  break;
@@ -761,11 +776,11 @@ function yt(t) {
761
776
  break;
762
777
  case 2:
763
778
  switch (this.touches.TWO) {
764
- case x.DOLLY_PAN:
779
+ case R.DOLLY_PAN:
765
780
  if (this.enableZoom === !1 && this.enablePan === !1) return;
766
781
  this._handleTouchStartDollyPan(t), this.state = l.TOUCH_DOLLY_PAN;
767
782
  break;
768
- case x.DOLLY_ROTATE:
783
+ case R.DOLLY_ROTATE:
769
784
  if (this.enableZoom === !1 && this.enableRotate === !1) return;
770
785
  this._handleTouchStartDollyRotate(t), this.state = l.TOUCH_DOLLY_ROTATE;
771
786
  break;
@@ -778,7 +793,7 @@ function yt(t) {
778
793
  }
779
794
  this.state !== l.NONE && this.dispatchEvent(pe);
780
795
  }
781
- function Mt(t) {
796
+ function wt(t) {
782
797
  switch (this._trackPointer(t), this.state) {
783
798
  case l.TOUCH_ROTATE:
784
799
  if (this.enableRotate === !1) return;
@@ -800,20 +815,20 @@ function Mt(t) {
800
815
  this.state = l.NONE;
801
816
  }
802
817
  }
803
- function wt(t) {
818
+ function Et(t) {
804
819
  this.enabled !== !1 && t.preventDefault();
805
820
  }
806
- function Et(t) {
821
+ function Pt(t) {
807
822
  t.key === "Control" && (this._controlActive = !0, this.domElement.getRootNode().addEventListener("keyup", this._interceptControlUp, { passive: !0, capture: !0 }));
808
823
  }
809
- function Pt(t) {
824
+ function Ot(t) {
810
825
  t.key === "Control" && (this._controlActive = !1, this.domElement.getRootNode().removeEventListener("keyup", this._interceptControlUp, { passive: !0, capture: !0 }));
811
826
  }
812
- class bs extends Re {
827
+ class Ms extends Ie {
813
828
  /** Orbit-контроллер для управления камерой */
814
829
  _orbit;
815
830
  constructor(e) {
816
- super(e), this.camera.position.set(1, 1, 7), this.camera.lookAt(0, 0, 0), this._orbit = new _t(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;
831
+ super(e), this.camera.position.set(1, 1, 7), this.camera.lookAt(0, 0, 0), this._orbit = new ut(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;
817
832
  }
818
833
  /**
819
834
  * Обновление состояния рендерера.
@@ -822,7 +837,7 @@ class bs extends Re {
822
837
  this._orbit?.update();
823
838
  }
824
839
  }
825
- class vs {
840
+ class Ss {
826
841
  /** Позиции вершин */
827
842
  _positions = [];
828
843
  /** Нормали вершин */
@@ -859,7 +874,7 @@ class vs {
859
874
  }
860
875
  }
861
876
  const i = {
862
- type: P.Custom,
877
+ type: E.Custom,
863
878
  position: this._positions,
864
879
  ...this._normals.length > 0 && { normal: this._normals },
865
880
  ...this._uvs.length > 0 && { uv: this._uvs }
@@ -889,8 +904,8 @@ class vs {
889
904
  }
890
905
  }
891
906
  }
892
- var St = Object.getOwnPropertyDescriptor, Ot = (t, e, s, i) => {
893
- for (var r = i > 1 ? void 0 : i ? St(e, s) : e, o = t.length - 1, n; o >= 0; o--)
907
+ var Tt = Object.getOwnPropertyDescriptor, Lt = (t, e, s, i) => {
908
+ for (var r = i > 1 ? void 0 : i ? Tt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
894
909
  (n = t[o]) && (r = n(r) || r);
895
910
  return r;
896
911
  }, Ee = (t, e) => (s, i) => e(s, i, t);
@@ -911,19 +926,19 @@ let K = class {
911
926
  this._handlers && this._handlers.clear(), this._currentMode = k.Plane, this._store.setDisplayMode(this._currentMode);
912
927
  }
913
928
  };
914
- K = Ot([
929
+ K = Lt([
915
930
  u(),
916
- Ee(0, W("IDisplayHandler")),
931
+ Ee(0, U("IDisplayHandler")),
917
932
  Ee(1, h("IEditorStore"))
918
933
  ], K);
919
- var S = /* @__PURE__ */ ((t) => (t.Hover = "hover", t.Click = "click", t))(S || {}), Dt = Object.getOwnPropertyDescriptor, Lt = (t, e, s, i) => {
934
+ var P = /* @__PURE__ */ ((t) => (t.Hover = "hover", t.Click = "click", t))(P || {}), Dt = Object.getOwnPropertyDescriptor, Ct = (t, e, s, i) => {
920
935
  for (var r = i > 1 ? void 0 : i ? Dt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
921
936
  (n = t[o]) && (r = n(r) || r);
922
937
  return r;
923
938
  }, B = (t, e) => (s, i) => e(s, i, t);
924
939
  let q = class {
925
940
  constructor(t, e, s) {
926
- this._eventBus = t, this._store = s, this._handlers = new Map(e.map((i) => [i.mode, i])), this._eventBus.on(R.SelectHover, this._onHover), this._eventBus.on(R.SelectClick, this._onClick);
941
+ 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);
927
942
  }
928
943
  /** Текущий режим выборки */
929
944
  _currentMode = v.Mesh;
@@ -935,25 +950,35 @@ let q = class {
935
950
  }
936
951
  /** Обработчик события наведения на модель */
937
952
  _onHover = (t) => {
938
- this._handlers.get(this._currentMode)?.handle(t, S.Hover);
953
+ this._handlers.get(this._currentMode)?.handle(t, P.Hover);
939
954
  };
940
955
  /** Обработчик события клика на модель */
941
956
  _onClick = (t) => {
942
- this._handlers.get(this._currentMode)?.handle(t, S.Click);
957
+ this._handlers.get(this._currentMode)?.handle(t, P.Click);
943
958
  };
944
959
  /** Освобождает ресурсы менеджера. */
945
960
  dispose() {
946
- this._handlers && this._handlers.clear(), this._eventBus.off(R.SelectHover, this._onHover), this._currentMode = v.Mesh, this._store.setSelectMode(this._currentMode);
961
+ this._handlers && this._handlers.clear(), this._eventBus.off(I.SelectHover, this._onHover), this._currentMode = v.Mesh, this._store.setSelectMode(this._currentMode);
947
962
  }
948
963
  };
949
- q = Lt([
964
+ q = Ct([
950
965
  u(),
951
966
  B(0, h("EventBus")),
952
- B(1, W("ISelectHandler")),
967
+ B(1, U("ISelectHandler")),
953
968
  B(2, h("IEditorStore"))
954
969
  ], q);
955
- var Tt = Object.getOwnPropertyDescriptor, Ct = (t, e, s, i) => {
956
- for (var r = i > 1 ? void 0 : i ? Tt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
970
+ class xt {
971
+ /** Доступен ли инструмент при текущем режиме выборки */
972
+ isToolEnabled(e, s) {
973
+ return ye[s].includes(e);
974
+ }
975
+ /** Получение доступных инструментов для режима выборки*/
976
+ getEnabledTools(e) {
977
+ return ye[e];
978
+ }
979
+ }
980
+ var At = Object.getOwnPropertyDescriptor, Rt = (t, e, s, i) => {
981
+ for (var r = i > 1 ? void 0 : i ? At(e, s) : e, o = t.length - 1, n; o >= 0; o--)
957
982
  (n = t[o]) && (r = n(r) || r);
958
983
  return r;
959
984
  }, Pe = (t, e) => (s, i) => e(s, i, t);
@@ -961,31 +986,36 @@ let Q = class {
961
986
  constructor(t, e) {
962
987
  this._store = e, this._handlers = new Map(t.map((s) => [s.mode, s])), this._unsubSelected = this._store.onSelectedObjectChange(() => {
963
988
  this._handlers.get(this._currentTool)?.handle();
964
- });
989
+ }), this._policy = new xt();
965
990
  }
966
991
  /** Текущий выбранный инструмент */
967
992
  _currentTool = C.Translate;
968
993
  /** Хендлеры, которые управляют инструментами */
969
994
  _handlers;
995
+ /** Событие обновления выбора объекта */
970
996
  _unsubSelected;
997
+ /** Политика доступности инструментов */
998
+ _policy;
971
999
  manage(t) {
972
- this._currentTool !== t && (this._handlers.get(this._currentTool)?.rollback(), this._currentTool = t, this._store.setToolType(this._currentTool), this._handlers.get(this._currentTool)?.handle());
1000
+ if (this._currentTool === t) return;
1001
+ const e = this._store.getSelectMode();
1002
+ 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());
973
1003
  }
974
1004
  /** Освобождает ресурсы менеджера. */
975
1005
  dispose() {
976
1006
  this._unsubSelected?.(), this._handlers && this._handlers.clear(), this._currentTool = C.Translate, this._store.setToolType(this._currentTool);
977
1007
  }
978
1008
  };
979
- Q = Ct([
1009
+ Q = Rt([
980
1010
  u(),
981
- Pe(0, W("IToolHandler")),
1011
+ Pe(0, U("IToolHandler")),
982
1012
  Pe(1, h("IEditorStore"))
983
1013
  ], Q);
984
- var At = Object.getOwnPropertyDescriptor, xt = (t, e, s, i) => {
985
- for (var r = i > 1 ? void 0 : i ? At(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1014
+ var jt = Object.getOwnPropertyDescriptor, It = (t, e, s, i) => {
1015
+ for (var r = i > 1 ? void 0 : i ? jt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
986
1016
  (n = t[o]) && (r = n(r) || r);
987
1017
  return r;
988
- }, jt = (t, e) => (s, i) => e(s, i, t);
1018
+ }, Ht = (t, e) => (s, i) => e(s, i, t);
989
1019
  let J = class {
990
1020
  /** Текущий режим редактирования сцены */
991
1021
  _currentMode = V.AddFigure;
@@ -996,22 +1026,22 @@ let J = class {
996
1026
  }
997
1027
  /** Установка режима редактирования сцены */
998
1028
  manage(t, e) {
999
- console.log("manage", t), t === V.AddFigure ? this._handlers.get(t)?.handle(e) : this._handlers.get(t)?.handle(), this._currentMode = t;
1029
+ t === V.AddFigure ? this._handlers.get(t)?.handle(e) : this._handlers.get(t)?.handle(), this._currentMode = t;
1000
1030
  }
1001
1031
  /** Освобождает ресурсы менеджера. */
1002
1032
  dispose() {
1003
1033
  this._handlers && this._handlers.clear(), this._currentMode = V.AddFigure;
1004
1034
  }
1005
1035
  };
1006
- J = xt([
1036
+ J = It([
1007
1037
  u(),
1008
- jt(0, W("ISceneHandler"))
1038
+ Ht(0, U("ISceneHandler"))
1009
1039
  ], J);
1010
- var Rt = Object.getOwnPropertyDescriptor, It = (t, e, s, i) => {
1011
- for (var r = i > 1 ? void 0 : i ? Rt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1040
+ var kt = Object.getOwnPropertyDescriptor, Vt = (t, e, s, i) => {
1041
+ for (var r = i > 1 ? void 0 : i ? kt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1012
1042
  (n = t[o]) && (r = n(r) || r);
1013
1043
  return r;
1014
- }, Ht = (t, e) => (s, i) => e(s, i, t);
1044
+ }, Nt = (t, e) => (s, i) => e(s, i, t);
1015
1045
  let ee = class {
1016
1046
  constructor(t) {
1017
1047
  this._api = t;
@@ -1068,15 +1098,15 @@ let ee = class {
1068
1098
  "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));
1069
1099
  }
1070
1100
  };
1071
- ee = It([
1101
+ ee = Vt([
1072
1102
  u(),
1073
- Ht(0, h("RendererApi"))
1103
+ Nt(0, h("RendererApi"))
1074
1104
  ], ee);
1075
- var kt = Object.getOwnPropertyDescriptor, Vt = (t, e, s, i) => {
1076
- for (var r = i > 1 ? void 0 : i ? kt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1105
+ var Yt = Object.getOwnPropertyDescriptor, zt = (t, e, s, i) => {
1106
+ for (var r = i > 1 ? void 0 : i ? Yt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1077
1107
  (n = t[o]) && (r = n(r) || r);
1078
1108
  return r;
1079
- }, Se = (t, e) => (s, i) => e(s, i, t);
1109
+ }, Oe = (t, e) => (s, i) => e(s, i, t);
1080
1110
  let te = class {
1081
1111
  constructor(t, e) {
1082
1112
  this._api = t, this._store = e;
@@ -1089,13 +1119,13 @@ let te = class {
1089
1119
  _selectedMesh = null;
1090
1120
  // Цвета, необходимые для переключения
1091
1121
  /** Цвет ребер для фигуры, на которую навелись */
1092
- _hoverColor = z;
1122
+ _hoverColor = W;
1093
1123
  /** Цвет ребер для выделенной фигуры */
1094
- _selectColor = Z;
1124
+ _selectColor = F;
1095
1125
  /** Исходные цвета материалов линий для отката */
1096
1126
  _origLineColors = /* @__PURE__ */ new WeakMap();
1097
1127
  handle(t, e) {
1098
- if (this._api.setRaycastMode(this.mode), e === S.Hover) {
1128
+ if (this._api.setRaycastMode(this.mode), e === P.Hover) {
1099
1129
  if (!t) {
1100
1130
  this._hoveredMesh && this._hoveredMesh !== this._selectedMesh && this._restoreEdgesColor(this._hoveredMesh), this._hoveredMesh = null;
1101
1131
  return;
@@ -1103,7 +1133,7 @@ let te = class {
1103
1133
  const s = t.intersection.object;
1104
1134
  this._hoveredMesh !== s && (this._hoveredMesh && this._hoveredMesh !== this._selectedMesh && this._restoreEdgesColor(this._hoveredMesh), s !== this._selectedMesh && this._paintEdges(s, this._hoverColor), this._hoveredMesh = s);
1105
1135
  }
1106
- if (e === S.Click) {
1136
+ if (e === P.Click) {
1107
1137
  if (!t) {
1108
1138
  this._selectedMesh && (this._restoreEdgesColor(this._selectedMesh), this._selectedMesh = null, this._store.setSelectedObject(null));
1109
1139
  return;
@@ -1148,16 +1178,16 @@ let te = class {
1148
1178
  });
1149
1179
  }
1150
1180
  };
1151
- te = Vt([
1181
+ te = zt([
1152
1182
  u(),
1153
- Se(0, h("RendererApi")),
1154
- Se(1, h("IEditorStore"))
1183
+ Oe(0, h("RendererApi")),
1184
+ Oe(1, h("IEditorStore"))
1155
1185
  ], te);
1156
- var Nt = Object.getOwnPropertyDescriptor, Yt = (t, e, s, i) => {
1157
- for (var r = i > 1 ? void 0 : i ? Nt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1186
+ var Ut = Object.getOwnPropertyDescriptor, Wt = (t, e, s, i) => {
1187
+ for (var r = i > 1 ? void 0 : i ? Ut(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1158
1188
  (n = t[o]) && (r = n(r) || r);
1159
1189
  return r;
1160
- }, Ut = (t, e) => (s, i) => e(s, i, t);
1190
+ }, Ft = (t, e) => (s, i) => e(s, i, t);
1161
1191
  let se = class {
1162
1192
  constructor(t) {
1163
1193
  this._api = t;
@@ -1170,13 +1200,13 @@ let se = class {
1170
1200
  _selected = null;
1171
1201
  // Цвета, необходимые для переключения
1172
1202
  /** Цвет грани, на которую навелись */
1173
- _hoverColor = z;
1203
+ _hoverColor = W;
1174
1204
  /** Цвет выделенной граней */
1175
- _selectColor = Z;
1205
+ _selectColor = F;
1176
1206
  /** Изначальный цвет граней у модели, перед наложением эффектов*/
1177
1207
  _defaultColor = 2236962;
1178
1208
  handle(t, e) {
1179
- this._api.setRaycastMode(this.mode), e === S.Hover && console.log(t), e === S.Click && console.log(t);
1209
+ this._api.setRaycastMode(this.mode), e === P.Hover && console.log(t), e === P.Click && console.log(t);
1180
1210
  }
1181
1211
  rollback() {
1182
1212
  throw new Error("Method not implemented.");
@@ -1186,15 +1216,15 @@ let se = class {
1186
1216
  throw new Error("Method not implemented.");
1187
1217
  }
1188
1218
  };
1189
- se = Yt([
1219
+ se = Wt([
1190
1220
  u(),
1191
- Ut(0, h("RendererApi"))
1221
+ Ft(0, h("RendererApi"))
1192
1222
  ], se);
1193
- var Wt = Object.getOwnPropertyDescriptor, zt = (t, e, s, i) => {
1194
- for (var r = i > 1 ? void 0 : i ? Wt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1223
+ var Zt = Object.getOwnPropertyDescriptor, $t = (t, e, s, i) => {
1224
+ for (var r = i > 1 ? void 0 : i ? Zt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1195
1225
  (n = t[o]) && (r = n(r) || r);
1196
1226
  return r;
1197
- }, Oe = (t, e) => (s, i) => e(s, i, t);
1227
+ }, Te = (t, e) => (s, i) => e(s, i, t);
1198
1228
  let ie = class {
1199
1229
  constructor(t, e) {
1200
1230
  this._api = t, this._store = e, this._api.enableCameraLayer(L), this._hoverVertex = this._makeOverlayVertex(this._hoverColor), this._selectVertex = this._makeOverlayVertex(this._selectColor), this._api.addObject(this._hoverVertex, L), this._api.addObject(this._selectVertex, L);
@@ -1209,11 +1239,11 @@ let ie = class {
1209
1239
  _selectVertex;
1210
1240
  // Цвета, необходимые для переключения
1211
1241
  /** Цвет ребра, на которое навелись */
1212
- _hoverColor = z;
1242
+ _hoverColor = W;
1213
1243
  /** Цвет выделенного ребра */
1214
- _selectColor = Z;
1244
+ _selectColor = F;
1215
1245
  handle(t, e) {
1216
- if (this._api.setRaycastMode(this.mode), e === S.Hover) {
1246
+ if (this._api.setRaycastMode(this.mode), e === P.Hover) {
1217
1247
  if (!t) {
1218
1248
  this._hoverVertex.visible = !1, this._hovered = null;
1219
1249
  return;
@@ -1225,7 +1255,7 @@ let ie = class {
1225
1255
  this._selected && this._same({ points: i, index: r }, this._selected) ? this._hoverVertex.visible = !1 : (this._writeWorldVertex(this._hoverVertex, i, r), this._hoverVertex.visible = !0);
1226
1256
  return;
1227
1257
  }
1228
- if (e === S.Click) {
1258
+ if (e === P.Click) {
1229
1259
  if (!t) {
1230
1260
  this._selectVertex.visible = !1, this._selected = null, this._store.setSelectedObject(null);
1231
1261
  return;
@@ -1244,7 +1274,7 @@ let ie = class {
1244
1274
  dispose() {
1245
1275
  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();
1246
1276
  }
1247
- _makeOverlayVertex(t, e = Je) {
1277
+ _makeOverlayVertex(t, e = et) {
1248
1278
  const s = new a.BufferGeometry();
1249
1279
  s.setAttribute("position", new a.Float32BufferAttribute([0, 0, 0], 3));
1250
1280
  const i = new a.PointsMaterial({
@@ -1273,21 +1303,21 @@ let ie = class {
1273
1303
  }
1274
1304
  /** Готовит метаданные для выбранной вершины и пишет их в _selectVertex.userData */
1275
1305
  _prepareVertexMetadata(t, e) {
1276
- const s = He(t);
1306
+ const s = ke(t);
1277
1307
  if (!s) return;
1278
1308
  const i = t.geometry.getAttribute("position"), r = new a.Vector3(
1279
1309
  i.getX(e),
1280
1310
  i.getY(e),
1281
1311
  i.getZ(e)
1282
- ).applyMatrix4(t.matrixWorld), o = new a.Matrix4().copy(s.matrixWorld).invert(), n = r.clone().applyMatrix4(o), _ = s.geometry.getAttribute("position"), m = 1e-6, f = m * m, T = new a.Vector3(), b = [];
1312
+ ).applyMatrix4(t.matrixWorld), o = new a.Matrix4().copy(s.matrixWorld).invert(), n = r.clone().applyMatrix4(o), _ = s.geometry.getAttribute("position"), m = 1e-6, f = m * m, D = new a.Vector3(), b = [];
1283
1313
  for (let M = 0; M < _.count; M++)
1284
- T.fromBufferAttribute(_, M), T.distanceToSquared(n) < f && b.push(M);
1314
+ D.fromBufferAttribute(_, M), D.distanceToSquared(n) < f && b.push(M);
1285
1315
  const O = s.children.find((M) => M?.isLineSegments);
1286
1316
  let y = [];
1287
1317
  if (O) {
1288
- const M = new a.Matrix4().copy(O.matrixWorld).invert(), N = r.clone().applyMatrix4(M), I = O.geometry.getAttribute("position"), Y = new a.Vector3();
1289
- for (let A = 0; A < I.count; A++)
1290
- Y.fromBufferAttribute(I, A), Y.distanceToSquared(N) < f && y.push(A);
1318
+ const M = new a.Matrix4().copy(O.matrixWorld).invert(), N = r.clone().applyMatrix4(M), H = O.geometry.getAttribute("position"), Y = new a.Vector3();
1319
+ for (let x = 0; x < H.count; x++)
1320
+ Y.fromBufferAttribute(H, x), Y.distanceToSquared(N) < f && y.push(x);
1291
1321
  }
1292
1322
  this._selectVertex.userData.vertexInfo = {
1293
1323
  points: t,
@@ -1311,15 +1341,18 @@ let ie = class {
1311
1341
  (!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);
1312
1342
  }
1313
1343
  };
1314
- ie = zt([
1344
+ ie = $t([
1315
1345
  u(),
1316
- Oe(0, h("RendererApi")),
1317
- Oe(1, h("IEditorStore"))
1346
+ Te(0, h("RendererApi")),
1347
+ Te(1, h("IEditorStore"))
1318
1348
  ], ie);
1319
1349
  class ue {
1320
1350
  constructor(e, s) {
1321
- this.api = e, this.store = s;
1351
+ this.api = e, this.store = s, this._unsubscribeTransform = this.api.onTransformChange(() => {
1352
+ this.store.getSelectedObject() && this.store.notifySelectedTransformChange?.();
1353
+ });
1322
1354
  }
1355
+ _unsubscribeTransform;
1323
1356
  /**
1324
1357
  * Обновляет состояние инструмента под текущее выделение.
1325
1358
  */
@@ -1337,14 +1370,14 @@ class ue {
1337
1370
  }
1338
1371
  /** Освобождение ресурсов хендлера. */
1339
1372
  dispose() {
1340
- this.rollback();
1373
+ this.rollback(), this._unsubscribeTransform && this._unsubscribeTransform();
1341
1374
  }
1342
1375
  }
1343
- var Zt = Object.getOwnPropertyDescriptor, $t = (t, e, s, i) => {
1344
- for (var r = i > 1 ? void 0 : i ? Zt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1376
+ var Bt = Object.getOwnPropertyDescriptor, Xt = (t, e, s, i) => {
1377
+ for (var r = i > 1 ? void 0 : i ? Bt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1345
1378
  (n = t[o]) && (r = n(r) || r);
1346
1379
  return r;
1347
- }, De = (t, e) => (s, i) => e(s, i, t);
1380
+ }, Le = (t, e) => (s, i) => e(s, i, t);
1348
1381
  let re = class extends ue {
1349
1382
  /** Инструмент, которым управляет хендлер, нужен только менеджеру */
1350
1383
  mode = C.Translate;
@@ -1352,16 +1385,16 @@ let re = class extends ue {
1352
1385
  super(t, e);
1353
1386
  }
1354
1387
  };
1355
- re = $t([
1388
+ re = Xt([
1356
1389
  u(),
1357
- De(0, h("RendererApi")),
1358
- De(1, h("IEditorStore"))
1390
+ Le(0, h("RendererApi")),
1391
+ Le(1, h("IEditorStore"))
1359
1392
  ], re);
1360
- var Ft = Object.getOwnPropertyDescriptor, Bt = (t, e, s, i) => {
1361
- for (var r = i > 1 ? void 0 : i ? Ft(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1393
+ var Gt = Object.getOwnPropertyDescriptor, Kt = (t, e, s, i) => {
1394
+ for (var r = i > 1 ? void 0 : i ? Gt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1362
1395
  (n = t[o]) && (r = n(r) || r);
1363
1396
  return r;
1364
- }, Le = (t, e) => (s, i) => e(s, i, t);
1397
+ }, De = (t, e) => (s, i) => e(s, i, t);
1365
1398
  let oe = class extends ue {
1366
1399
  /** Инструмент, которым управляет хендлер, нужен только менеджеру */
1367
1400
  mode = C.Scale;
@@ -1369,16 +1402,16 @@ let oe = class extends ue {
1369
1402
  super(t, e);
1370
1403
  }
1371
1404
  };
1372
- oe = Bt([
1405
+ oe = Kt([
1373
1406
  u(),
1374
- Le(0, h("RendererApi")),
1375
- Le(1, h("IEditorStore"))
1407
+ De(0, h("RendererApi")),
1408
+ De(1, h("IEditorStore"))
1376
1409
  ], oe);
1377
- var Xt = Object.getOwnPropertyDescriptor, Gt = (t, e, s, i) => {
1378
- for (var r = i > 1 ? void 0 : i ? Xt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1410
+ var qt = Object.getOwnPropertyDescriptor, Qt = (t, e, s, i) => {
1411
+ for (var r = i > 1 ? void 0 : i ? qt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1379
1412
  (n = t[o]) && (r = n(r) || r);
1380
1413
  return r;
1381
- }, Te = (t, e) => (s, i) => e(s, i, t);
1414
+ }, Ce = (t, e) => (s, i) => e(s, i, t);
1382
1415
  let ne = class extends ue {
1383
1416
  /** Инструмент, которым управляет хендлер, нужен только менеджеру */
1384
1417
  mode = C.Rotate;
@@ -1386,16 +1419,16 @@ let ne = class extends ue {
1386
1419
  super(t, e);
1387
1420
  }
1388
1421
  };
1389
- ne = Gt([
1422
+ ne = Qt([
1390
1423
  u(),
1391
- Te(0, h("RendererApi")),
1392
- Te(1, h("IEditorStore"))
1424
+ Ce(0, h("RendererApi")),
1425
+ Ce(1, h("IEditorStore"))
1393
1426
  ], ne);
1394
- var Kt = Object.getOwnPropertyDescriptor, qt = (t, e, s, i) => {
1395
- for (var r = i > 1 ? void 0 : i ? Kt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1427
+ var Jt = Object.getOwnPropertyDescriptor, es = (t, e, s, i) => {
1428
+ for (var r = i > 1 ? void 0 : i ? Jt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1396
1429
  (n = t[o]) && (r = n(r) || r);
1397
1430
  return r;
1398
- }, Ce = (t, e) => (s, i) => e(s, i, t);
1431
+ }, xe = (t, e) => (s, i) => e(s, i, t);
1399
1432
  let ae = class {
1400
1433
  constructor(t, e) {
1401
1434
  this._api = t, this._store = e, this._api.enableCameraLayer(L), this._hoverLine = this._makeOverlayLine(this._hoverColor), this._selectLine = this._makeOverlayLine(this._selectColor), this._api.addObject(this._hoverLine, L), this._api.addObject(this._selectLine, L);
@@ -1412,12 +1445,12 @@ let ae = class {
1412
1445
  _selected = null;
1413
1446
  // Цвета, необходимые для переключения
1414
1447
  /** Цвет ребра, на которое навелись */
1415
- _hoverColor = z;
1448
+ _hoverColor = W;
1416
1449
  /** Цвет выделенного ребра */
1417
- _selectColor = Z;
1450
+ _selectColor = F;
1418
1451
  /** Обработка текущего режима выборки. */
1419
1452
  handle(t, e) {
1420
- if (this._api.setRaycastMode(this.mode), e === S.Hover) {
1453
+ if (this._api.setRaycastMode(this.mode), e === P.Hover) {
1421
1454
  if (!t) {
1422
1455
  this._hoverLine.visible = !1, this._hovered = null;
1423
1456
  return;
@@ -1429,7 +1462,7 @@ let ae = class {
1429
1462
  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 };
1430
1463
  return;
1431
1464
  }
1432
- if (e === S.Click) {
1465
+ if (e === P.Click) {
1433
1466
  if (!t) {
1434
1467
  this._selectLine.visible = !1, this._selected = null, this._store.setSelectedObject(null);
1435
1468
  return;
@@ -1488,26 +1521,26 @@ let ae = class {
1488
1521
  if (!isFinite(m) || m === 0) return;
1489
1522
  const f = new a.Vector3().addVectors(n, c).multiplyScalar(0.5);
1490
1523
  t.position.copy(f);
1491
- const T = t.geometry;
1492
- let b = T.getAttribute("position");
1493
- (!b || b.count < 2) && (T.setAttribute("position", new a.BufferAttribute(new Float32Array(6), 3)), b = T.getAttribute("position")), b.setXYZ(0, -m / 2, 0, 0), b.setXYZ(1, m / 2, 0, 0), b.needsUpdate = !0, _.normalize();
1524
+ const D = t.geometry;
1525
+ let b = D.getAttribute("position");
1526
+ (!b || b.count < 2) && (D.setAttribute("position", new a.BufferAttribute(new Float32Array(6), 3)), b = D.getAttribute("position")), b.setXYZ(0, -m / 2, 0, 0), b.setXYZ(1, m / 2, 0, 0), b.needsUpdate = !0, _.normalize();
1494
1527
  const O = new a.Quaternion().setFromUnitVectors(new a.Vector3(1, 0, 0), _);
1495
1528
  t.quaternion.copy(O), t.updateMatrixWorld(!0);
1496
1529
  }
1497
1530
  /** Запись метаданных выбранного ребра для использования инструментов */
1498
1531
  _prepareEdgeMetadata(t, e) {
1499
- const s = He(t);
1532
+ const s = ke(t);
1500
1533
  if (!s) return;
1501
1534
  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(
1502
1535
  t.matrixWorld
1503
1536
  ), c = new a.Vector3(i.getX(o), i.getY(o), i.getZ(o)).applyMatrix4(
1504
1537
  t.matrixWorld
1505
1538
  ), _ = new a.Matrix4().copy(s.matrixWorld).invert(), m = n.clone().applyMatrix4(_), f = c.clone().applyMatrix4(_), b = s.geometry.getAttribute("position"), O = new a.Vector3(), y = 1e-6, M = [], N = [];
1506
- for (let w = 0; w < b.count; w++)
1507
- O.fromBufferAttribute(b, w), O.distanceToSquared(m) < y * y ? M.push(w) : O.distanceToSquared(f) < y * y && N.push(w);
1508
- const I = new a.Matrix4().copy(t.matrixWorld).invert(), Y = n.clone().applyMatrix4(I), A = c.clone().applyMatrix4(I), me = t.geometry.getAttribute("position"), $ = new a.Vector3(), fe = [], ge = [];
1509
- for (let w = 0; w < me.count; w++)
1510
- $.fromBufferAttribute(me, w), $.distanceToSquared(Y) < y * y ? fe.push(w) : $.distanceToSquared(A) < y * y && ge.push(w);
1539
+ for (let S = 0; S < b.count; S++)
1540
+ O.fromBufferAttribute(b, S), O.distanceToSquared(m) < y * y ? M.push(S) : O.distanceToSquared(f) < y * y && N.push(S);
1541
+ const H = new a.Matrix4().copy(t.matrixWorld).invert(), Y = n.clone().applyMatrix4(H), x = c.clone().applyMatrix4(H), me = t.geometry.getAttribute("position"), Z = new a.Vector3(), fe = [], ge = [];
1542
+ for (let S = 0; S < me.count; S++)
1543
+ Z.fromBufferAttribute(me, S), Z.distanceToSquared(Y) < y * y ? fe.push(S) : Z.distanceToSquared(x) < y * y && ge.push(S);
1511
1544
  this._selectLine.userData.edgeInfo = {
1512
1545
  lines: t,
1513
1546
  seg: e,
@@ -1519,16 +1552,16 @@ let ae = class {
1519
1552
  };
1520
1553
  }
1521
1554
  };
1522
- ae = qt([
1555
+ ae = es([
1523
1556
  u(),
1524
- Ce(0, h("RendererApi")),
1525
- Ce(1, h("IEditorStore"))
1557
+ xe(0, h("RendererApi")),
1558
+ xe(1, h("IEditorStore"))
1526
1559
  ], ae);
1527
- var Qt = Object.getOwnPropertyDescriptor, Jt = (t, e, s, i) => {
1528
- for (var r = i > 1 ? void 0 : i ? Qt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1560
+ var ts = Object.getOwnPropertyDescriptor, ss = (t, e, s, i) => {
1561
+ for (var r = i > 1 ? void 0 : i ? ts(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1529
1562
  (n = t[o]) && (r = n(r) || r);
1530
1563
  return r;
1531
- }, es = (t, e) => (s, i) => e(s, i, t);
1564
+ }, is = (t, e) => (s, i) => e(s, i, t);
1532
1565
  let he = class {
1533
1566
  constructor(t) {
1534
1567
  this._api = t;
@@ -1539,13 +1572,13 @@ let he = class {
1539
1572
  _lastAddedMesh = null;
1540
1573
  /** Добавление базовых фигур на сцену, которые приписаны в `FigureType`. */
1541
1574
  handle(t) {
1542
- const e = Qe[t](), s = e.getAttribute("position");
1575
+ const e = Je[t](), s = e.getAttribute("position");
1543
1576
  s && s.setUsage && s.setUsage(a.DynamicDrawUsage);
1544
1577
  const i = new a.Mesh(e, je);
1545
- i.layers.enable(Ie);
1546
- const r = Ve(i.geometry);
1578
+ i.layers.enable(He);
1579
+ const r = Ne(i.geometry);
1547
1580
  i.add(r);
1548
- const o = ke(i.geometry);
1581
+ const o = Ve(i.geometry);
1549
1582
  i.add(o), this._api.addMesh(i), this._lastAddedMesh = i;
1550
1583
  }
1551
1584
  /** Срабатывает только на `ctrl + z`. */
@@ -1557,12 +1590,12 @@ let he = class {
1557
1590
  this._lastAddedMesh = null;
1558
1591
  }
1559
1592
  };
1560
- he = Jt([
1593
+ he = ss([
1561
1594
  u(),
1562
- es(0, h("RendererApi"))
1595
+ is(0, h("RendererApi"))
1563
1596
  ], he);
1564
- var ts = Object.getOwnPropertyDescriptor, ss = (t, e, s, i) => {
1565
- for (var r = i > 1 ? void 0 : i ? ts(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1597
+ var rs = Object.getOwnPropertyDescriptor, os = (t, e, s, i) => {
1598
+ for (var r = i > 1 ? void 0 : i ? rs(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1566
1599
  (n = t[o]) && (r = n(r) || r);
1567
1600
  return r;
1568
1601
  }, Ae = (t, e) => (s, i) => e(s, i, t);
@@ -1576,7 +1609,7 @@ let le = class {
1576
1609
  _lastDeletedMesh = null;
1577
1610
  handle() {
1578
1611
  const t = this._store.getSelectedObject();
1579
- ht(t) && (this._api.removeMesh(t), this._store.setSelectedObject(null), this._lastDeletedMesh = t);
1612
+ lt(t) && (this._api.removeMesh(t), this._store.setSelectedObject(null), this._lastDeletedMesh = t);
1580
1613
  }
1581
1614
  /** Срабатывает только на `ctrl + z`. */
1582
1615
  rollback() {
@@ -1587,16 +1620,16 @@ let le = class {
1587
1620
  this._lastDeletedMesh = null;
1588
1621
  }
1589
1622
  };
1590
- le = ss([
1623
+ le = os([
1591
1624
  u(),
1592
1625
  Ae(0, h("RendererApi")),
1593
1626
  Ae(1, h("IEditorStore"))
1594
1627
  ], le);
1595
- var is = Object.getOwnPropertyDescriptor, rs = (t, e, s, i) => {
1596
- for (var r = i > 1 ? void 0 : i ? is(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1628
+ var ns = Object.getOwnPropertyDescriptor, as = (t, e, s, i) => {
1629
+ for (var r = i > 1 ? void 0 : i ? ns(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1597
1630
  (n = t[o]) && (r = n(r) || r);
1598
1631
  return r;
1599
- }, os = (t, e) => (s, i) => e(s, i, t);
1632
+ }, hs = (t, e) => (s, i) => e(s, i, t);
1600
1633
  let ce = class {
1601
1634
  constructor(t) {
1602
1635
  this._renderer = t;
@@ -1651,19 +1684,23 @@ let ce = class {
1651
1684
  enableCameraLayer(t) {
1652
1685
  this._renderer.enableCameraLayer(t);
1653
1686
  }
1687
+ /** @inheritdoc */
1688
+ onTransformChange(t) {
1689
+ return this._renderer.onTransformChange(t);
1690
+ }
1654
1691
  };
1655
- ce = rs([
1692
+ ce = as([
1656
1693
  u(),
1657
- os(0, h("EditorRenderer"))
1694
+ hs(0, h("EditorRenderer"))
1658
1695
  ], ce);
1659
- var ns = Object.getOwnPropertyDescriptor, as = (t, e, s, i) => {
1660
- for (var r = i > 1 ? void 0 : i ? ns(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1696
+ var ls = Object.getOwnPropertyDescriptor, cs = (t, e, s, i) => {
1697
+ for (var r = i > 1 ? void 0 : i ? ls(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1661
1698
  (n = t[o]) && (r = n(r) || r);
1662
1699
  return r;
1663
- }, H = (t, e) => (s, i) => e(s, i, t);
1700
+ }, A = (t, e) => (s, i) => e(s, i, t);
1664
1701
  let de = class {
1665
- constructor(t, e, s, i, r) {
1666
- this._displayManager = t, this._selectManager = e, this._toolManager = s, this._sceneManager = i, this._renderer = r, this.setSelectMode(v.Mesh), this.setToolMode(C.Translate);
1702
+ constructor(t, e, s, i, r, o) {
1703
+ this._displayManager = t, this._selectManager = e, this._toolManager = s, this._sceneManager = i, this._renderer = r, this._store = o, this.setSelectMode(v.Mesh), this.setToolMode(C.Translate);
1667
1704
  }
1668
1705
  setDisplayMode(t) {
1669
1706
  this._displayManager.manage(t);
@@ -1686,20 +1723,34 @@ let de = class {
1686
1723
  addFigure(t, e) {
1687
1724
  this._sceneManager.manage(t, e);
1688
1725
  }
1726
+ getSelectionStats() {
1727
+ return this._store.getSelectionStats();
1728
+ }
1729
+ onSelectionStatsChange(t) {
1730
+ const e = this._store.onSelectedObjectChange(() => {
1731
+ t();
1732
+ }), s = this._store.onSelectedTransformChange(() => {
1733
+ t();
1734
+ });
1735
+ return () => {
1736
+ e(), s();
1737
+ };
1738
+ }
1689
1739
  dispose() {
1690
1740
  this._displayManager.dispose(), this._selectManager.dispose(), this._renderer.dispose();
1691
1741
  }
1692
1742
  };
1693
- de = as([
1743
+ de = cs([
1694
1744
  u(),
1695
- H(0, h("IDisplayManager")),
1696
- H(1, h("ISelectManager")),
1697
- H(2, h("IToolManager")),
1698
- H(3, h("ISceneManager")),
1699
- H(4, h("EditorRenderer"))
1745
+ A(0, h("IDisplayManager")),
1746
+ A(1, h("ISelectManager")),
1747
+ A(2, h("IToolManager")),
1748
+ A(3, h("ISceneManager")),
1749
+ A(4, h("EditorRenderer")),
1750
+ A(5, h("IEditorStore"))
1700
1751
  ], de);
1701
- var hs = Object.getOwnPropertyDescriptor, ls = (t, e, s, i) => {
1702
- for (var r = i > 1 ? void 0 : i ? hs(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1752
+ var ds = Object.getOwnPropertyDescriptor, _s = (t, e, s, i) => {
1753
+ for (var r = i > 1 ? void 0 : i ? ds(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1703
1754
  (n = t[o]) && (r = n(r) || r);
1704
1755
  return r;
1705
1756
  };
@@ -1714,8 +1765,10 @@ let _e = class {
1714
1765
  _selectedObject = null;
1715
1766
  /** Слушатели событий по изменению выбранного объекта. */
1716
1767
  _selectedListeners = /* @__PURE__ */ new Set();
1768
+ /** Слушатели событий трансформации выбранного объекта. */
1769
+ _transformListeners = /* @__PURE__ */ new Set();
1717
1770
  constructor() {
1718
- qe(this, {}, { autoBind: !0 });
1771
+ Qe(this, {}, { autoBind: !0 });
1719
1772
  }
1720
1773
  /** @inheritdoc */
1721
1774
  getSelectMode() {
@@ -1746,6 +1799,11 @@ let _e = class {
1746
1799
  return this._selectedObject;
1747
1800
  }
1748
1801
  /** @inheritdoc */
1802
+ getSelectionStats() {
1803
+ const t = this._selectedObject;
1804
+ return t ? ct(t) : null;
1805
+ }
1806
+ /** @inheritdoc */
1749
1807
  setSelectedObject(t) {
1750
1808
  if (this._selectedObject !== t) {
1751
1809
  this._selectedObject = t;
@@ -1756,25 +1814,31 @@ let _e = class {
1756
1814
  onSelectedObjectChange(t) {
1757
1815
  return this._selectedListeners.add(t), () => this._selectedListeners.delete(t);
1758
1816
  }
1817
+ /** @inheritdoc */
1818
+ onSelectedTransformChange(t) {
1819
+ return this._transformListeners.add(t), () => this._transformListeners.delete(t);
1820
+ }
1821
+ /** @inheritdoc */
1822
+ notifySelectedTransformChange() {
1823
+ for (const t of this._transformListeners) t();
1824
+ }
1759
1825
  };
1760
- _e = ls([
1826
+ _e = _s([
1761
1827
  u()
1762
1828
  ], _e);
1763
- let xe = !1;
1764
- const d = Ge.createChildContainer();
1765
- function cs(t) {
1766
- return xe || (d.registerInstance("Canvas", t), d.registerSingleton("EventBus", X), d.registerSingleton("EditorRenderer", G), d.registerSingleton("RendererApi", ce), d.registerSingleton("IDisplayHandler", ee), d.registerSingleton("ISelectHandler", te), d.registerSingleton("ISelectHandler", se), d.registerSingleton("ISelectHandler", ae), d.registerSingleton("ISelectHandler", ie), d.registerSingleton("IToolHandler", re), d.registerSingleton("IToolHandler", oe), d.registerSingleton("IToolHandler", ne), d.registerSingleton("ISceneHandler", he), d.registerSingleton("ISceneHandler", le), d.registerSingleton("IDisplayManager", K), d.registerSingleton("ISelectManager", q), d.registerSingleton("IToolManager", Q), d.registerSingleton("ISceneManager", J), d.registerSingleton("EditorHub", de), d.registerSingleton("IEditorStore", _e), xe = !0), d;
1767
- }
1768
- function ys(t) {
1769
- return cs(t).resolve("EditorHub");
1829
+ let Re = !1;
1830
+ const d = Ke.createChildContainer();
1831
+ function ps(t) {
1832
+ return Re || (d.registerInstance("Canvas", t), d.registerSingleton("EventBus", X), d.registerSingleton("EditorRenderer", G), d.registerSingleton("RendererApi", ce), d.registerSingleton("IDisplayHandler", ee), d.registerSingleton("ISelectHandler", te), d.registerSingleton("ISelectHandler", se), d.registerSingleton("ISelectHandler", ae), d.registerSingleton("ISelectHandler", ie), d.registerSingleton("IToolHandler", re), d.registerSingleton("IToolHandler", oe), d.registerSingleton("IToolHandler", ne), d.registerSingleton("ISceneHandler", he), d.registerSingleton("ISceneHandler", le), d.registerSingleton("IDisplayManager", K), d.registerSingleton("ISelectManager", q), d.registerSingleton("IToolManager", Q), d.registerSingleton("ISceneManager", J), d.registerSingleton("EditorHub", de), d.registerSingleton("IEditorStore", _e), Re = !0), d;
1770
1833
  }
1834
+ const ws = (t) => ps(t).resolve("EditorHub");
1771
1835
  export {
1772
1836
  de as EditorHub,
1773
1837
  G as EditorRenderer,
1774
1838
  X as EventBus,
1775
- R as EventTopics,
1776
- vs as ObjLoader,
1777
- bs as PreviewRenderer,
1778
- Re as Renderer,
1779
- ys as createAppHub
1839
+ I as EventTopics,
1840
+ Ss as ObjLoader,
1841
+ Ms as PreviewRenderer,
1842
+ Ie as Renderer,
1843
+ ws as createAppHub
1780
1844
  };