@planara/core 2.6.1 → 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.
package/dist/index.es.js CHANGED
@@ -1,25 +1,25 @@
1
1
  import "reflect-metadata";
2
2
  import * as a from "three";
3
- import { Controls as Ue, Vector3 as D, MOUSE as j, TOUCH as x, Quaternion as be, Spherical as ve, Vector2 as w, Ray as We, Plane as ze, MathUtils as Fe } from "three";
4
- import { FigureType as P, SelectMode as v, Figure as Ze, DisplayMode as k, DEFAULT_TOOL_RULES as ye, ToolType as C, SceneMode as V } from "@planara/types";
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
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 W, container as Ke } from "tsyringe";
6
+ import { injectable as u, inject as h, injectAll as U, container as Ke } from "tsyringe";
7
7
  import { EventEmitter as qe } from "events";
8
8
  import { makeAutoObservable as Qe } from "mobx";
9
9
  const Je = {
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() {
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
- }, Re = new a.MeshStandardMaterial({
22
+ }, je = new a.MeshStandardMaterial({
23
23
  color: 12566463,
24
24
  metalness: 0,
25
25
  roughness: 0.6
@@ -81,7 +81,7 @@ class Ie {
81
81
  addFigure(e) {
82
82
  const s = new a.BufferGeometry();
83
83
  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));
84
- const i = new a.Mesh(s, Re);
84
+ const i = new a.Mesh(s, je);
85
85
  return this.scene.add(i), this.meshes.push(i), i;
86
86
  }
87
87
  /**
@@ -198,8 +198,8 @@ let X = class {
198
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 it = 0.03, rt = 0.05, He = 0, ot = 1, nt = 2, T = 31, z = 16776960, F = 16755200, at = 2236962, ht = 2236962, lt = (t) => !!t && t.isMesh, ke = (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;
@@ -225,9 +225,14 @@ const it = 0.03, rt = 0.05, He = 0, ot = 1, nt = 2, T = 31, z = 16776960, F = 16
225
225
  new a.LineBasicMaterial({ color: at, linewidth: 1 })
226
226
  );
227
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 ct = Object.getOwnPropertyDescriptor, dt = (t, e, s, i) => {
230
- for (var r = i > 1 ? void 0 : i ? ct(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
238
  }, Me = (t, e) => (s, i) => e(s, i, t);
@@ -262,6 +267,7 @@ let G = class extends Ie {
262
267
  _lastHovered = null;
263
268
  /** Gizmo для управления отображением perspective camera */
264
269
  _cameraGizmo;
270
+ _transformListeners = /* @__PURE__ */ new Set();
265
271
  /**
266
272
  * Обновление состояния рендерера.
267
273
  */
@@ -300,6 +306,13 @@ let G = class extends Ie {
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
@@ -322,7 +335,7 @@ let G = class extends Ie {
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 Ie {
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 Ie {
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 = dt([
368
+ G = _t([
354
369
  u(),
355
370
  Me(0, h("Canvas")),
356
371
  Me(1, h("EventBus"))
357
372
  ], G);
358
- const Ee = { type: "change" }, pe = { type: "start" }, Ye = { type: "end" }, U = new We(), we = new ze(), _t = Math.cos(70 * Fe.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,
@@ -365,7 +380,7 @@ const Ee = { type: "change" }, pe = { type: "start" }, Ye = { type: "end" }, U =
365
380
  TOUCH_DOLLY_PAN: 5,
366
381
  TOUCH_DOLLY_ROTATE: 6
367
382
  }, $ = 1e-6;
368
- class pt extends Ue {
383
+ class ut extends ze {
369
384
  /**
370
385
  * Constructs a new controls instance.
371
386
  *
@@ -373,7 +388,7 @@ class pt extends Ue {
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 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 D(), this._mouse = new w(), this._performCursorZoom = !1, this._pointers = [], this._pointerPositions = {}, this._controlActive = !1, this._onPointerMove = mt.bind(this), this._onPointerDown = ut.bind(this), this._onPointerUp = ft.bind(this), this._onContextMenu = wt.bind(this), this._onMouseWheel = vt.bind(this), this._onKeyDown = yt.bind(this), this._onTouchStart = Mt.bind(this), this._onTouchMove = Et.bind(this), this._onMouseDown = gt.bind(this), this._onMouseMove = bt.bind(this), this._interceptControlDown = Pt.bind(this), this._interceptControlUp = St.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 pt extends Ue {
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(Ee), 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 pt extends Ue {
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)) < _t ? 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) > $ || 8 * (1 - this._lastQuaternion.dot(this.object.quaternion)) > $ || this._lastTargetPosition.distanceToSquared(this.target) > $ ? (this.dispatchEvent(Ee), 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;
@@ -661,13 +676,13 @@ class pt extends Ue {
661
676
  return e.ctrlKey && !this._controlActive && (i.deltaY *= 10), i;
662
677
  }
663
678
  }
664
- function ut(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 mt(t) {
682
+ function ft(t) {
668
683
  this.enabled !== !1 && (t.pointerType === "touch" ? this._onTouchMove(t) : this._onMouseMove(t));
669
684
  }
670
- function ft(t) {
685
+ function gt(t) {
671
686
  switch (this._removePointer(t), this._pointers.length) {
672
687
  case 0:
673
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;
@@ -678,7 +693,7 @@ function ft(t) {
678
693
  break;
679
694
  }
680
695
  }
681
- function gt(t) {
696
+ function bt(t) {
682
697
  let e;
683
698
  switch (t.button) {
684
699
  case 0:
@@ -721,7 +736,7 @@ function gt(t) {
721
736
  }
722
737
  this.state !== l.NONE && this.dispatchEvent(pe);
723
738
  }
724
- function bt(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 bt(t) {
737
752
  break;
738
753
  }
739
754
  }
740
- function vt(t) {
755
+ function yt(t) {
741
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 yt(t) {
758
+ function Mt(t) {
744
759
  this.enabled !== !1 && this._handleKeyDown(t);
745
760
  }
746
- function Mt(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 Mt(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 Mt(t) {
778
793
  }
779
794
  this.state !== l.NONE && this.dispatchEvent(pe);
780
795
  }
781
- function Et(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 Et(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
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 St(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 ys extends Ie {
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 pt(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 ys extends Ie {
822
837
  this._orbit?.update();
823
838
  }
824
839
  }
825
- class Ms {
840
+ class Ss {
826
841
  /** Позиции вершин */
827
842
  _positions = [];
828
843
  /** Нормали вершин */
@@ -859,7 +874,7 @@ class Ms {
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,11 +904,11 @@ class Ms {
889
904
  }
890
905
  }
891
906
  }
892
- var Ot = Object.getOwnPropertyDescriptor, Dt = (t, e, s, i) => {
893
- for (var r = i > 1 ? void 0 : i ? Ot(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
- }, Pe = (t, e) => (s, i) => e(s, i, t);
911
+ }, Ee = (t, e) => (s, i) => e(s, i, t);
897
912
  let K = class {
898
913
  constructor(t, e) {
899
914
  this._store = e, this._handlers = new Map(t.map((s) => [s.mode, s]));
@@ -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 = Dt([
929
+ K = Lt([
915
930
  u(),
916
- Pe(0, W("IDisplayHandler")),
917
- Pe(1, h("IEditorStore"))
931
+ Ee(0, U("IDisplayHandler")),
932
+ Ee(1, h("IEditorStore"))
918
933
  ], K);
919
- var S = /* @__PURE__ */ ((t) => (t.Hover = "hover", t.Click = "click", t))(S || {}), Tt = Object.getOwnPropertyDescriptor, Lt = (t, e, s, i) => {
920
- for (var r = i > 1 ? void 0 : i ? Tt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
934
+ var P = /* @__PURE__ */ ((t) => (t.Hover = "hover", t.Click = "click", t))(P || {}), Dt = Object.getOwnPropertyDescriptor, Ct = (t, e, s, i) => {
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,24 +950,24 @@ 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
- class Ct {
970
+ class xt {
956
971
  /** Доступен ли инструмент при текущем режиме выборки */
957
972
  isToolEnabled(e, s) {
958
973
  return ye[s].includes(e);
@@ -962,16 +977,16 @@ class Ct {
962
977
  return ye[e];
963
978
  }
964
979
  }
965
- var At = Object.getOwnPropertyDescriptor, xt = (t, e, s, i) => {
980
+ var At = Object.getOwnPropertyDescriptor, Rt = (t, e, s, i) => {
966
981
  for (var r = i > 1 ? void 0 : i ? At(e, s) : e, o = t.length - 1, n; o >= 0; o--)
967
982
  (n = t[o]) && (r = n(r) || r);
968
983
  return r;
969
- }, Se = (t, e) => (s, i) => e(s, i, t);
984
+ }, Pe = (t, e) => (s, i) => e(s, i, t);
970
985
  let Q = class {
971
986
  constructor(t, e) {
972
987
  this._store = e, this._handlers = new Map(t.map((s) => [s.mode, s])), this._unsubSelected = this._store.onSelectedObjectChange(() => {
973
988
  this._handlers.get(this._currentTool)?.handle();
974
- }), this._policy = new Ct();
989
+ }), this._policy = new xt();
975
990
  }
976
991
  /** Текущий выбранный инструмент */
977
992
  _currentTool = C.Translate;
@@ -991,16 +1006,16 @@ let Q = class {
991
1006
  this._unsubSelected?.(), this._handlers && this._handlers.clear(), this._currentTool = C.Translate, this._store.setToolType(this._currentTool);
992
1007
  }
993
1008
  };
994
- Q = xt([
1009
+ Q = Rt([
995
1010
  u(),
996
- Se(0, W("IToolHandler")),
997
- Se(1, h("IEditorStore"))
1011
+ Pe(0, U("IToolHandler")),
1012
+ Pe(1, h("IEditorStore"))
998
1013
  ], Q);
999
- var jt = Object.getOwnPropertyDescriptor, Rt = (t, e, s, i) => {
1014
+ var jt = Object.getOwnPropertyDescriptor, It = (t, e, s, i) => {
1000
1015
  for (var r = i > 1 ? void 0 : i ? jt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1001
1016
  (n = t[o]) && (r = n(r) || r);
1002
1017
  return r;
1003
- }, It = (t, e) => (s, i) => e(s, i, t);
1018
+ }, Ht = (t, e) => (s, i) => e(s, i, t);
1004
1019
  let J = class {
1005
1020
  /** Текущий режим редактирования сцены */
1006
1021
  _currentMode = V.AddFigure;
@@ -1011,22 +1026,22 @@ let J = class {
1011
1026
  }
1012
1027
  /** Установка режима редактирования сцены */
1013
1028
  manage(t, e) {
1014
- 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;
1015
1030
  }
1016
1031
  /** Освобождает ресурсы менеджера. */
1017
1032
  dispose() {
1018
1033
  this._handlers && this._handlers.clear(), this._currentMode = V.AddFigure;
1019
1034
  }
1020
1035
  };
1021
- J = Rt([
1036
+ J = It([
1022
1037
  u(),
1023
- It(0, W("ISceneHandler"))
1038
+ Ht(0, U("ISceneHandler"))
1024
1039
  ], J);
1025
- var Ht = Object.getOwnPropertyDescriptor, kt = (t, e, s, i) => {
1026
- for (var r = i > 1 ? void 0 : i ? Ht(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--)
1027
1042
  (n = t[o]) && (r = n(r) || r);
1028
1043
  return r;
1029
- }, Vt = (t, e) => (s, i) => e(s, i, t);
1044
+ }, Nt = (t, e) => (s, i) => e(s, i, t);
1030
1045
  let ee = class {
1031
1046
  constructor(t) {
1032
1047
  this._api = t;
@@ -1083,12 +1098,12 @@ let ee = class {
1083
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));
1084
1099
  }
1085
1100
  };
1086
- ee = kt([
1101
+ ee = Vt([
1087
1102
  u(),
1088
- Vt(0, h("RendererApi"))
1103
+ Nt(0, h("RendererApi"))
1089
1104
  ], ee);
1090
- var Nt = Object.getOwnPropertyDescriptor, Yt = (t, e, s, i) => {
1091
- for (var r = i > 1 ? void 0 : i ? Nt(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--)
1092
1107
  (n = t[o]) && (r = n(r) || r);
1093
1108
  return r;
1094
1109
  }, Oe = (t, e) => (s, i) => e(s, i, t);
@@ -1104,13 +1119,13 @@ let te = class {
1104
1119
  _selectedMesh = null;
1105
1120
  // Цвета, необходимые для переключения
1106
1121
  /** Цвет ребер для фигуры, на которую навелись */
1107
- _hoverColor = z;
1122
+ _hoverColor = W;
1108
1123
  /** Цвет ребер для выделенной фигуры */
1109
1124
  _selectColor = F;
1110
1125
  /** Исходные цвета материалов линий для отката */
1111
1126
  _origLineColors = /* @__PURE__ */ new WeakMap();
1112
1127
  handle(t, e) {
1113
- if (this._api.setRaycastMode(this.mode), e === S.Hover) {
1128
+ if (this._api.setRaycastMode(this.mode), e === P.Hover) {
1114
1129
  if (!t) {
1115
1130
  this._hoveredMesh && this._hoveredMesh !== this._selectedMesh && this._restoreEdgesColor(this._hoveredMesh), this._hoveredMesh = null;
1116
1131
  return;
@@ -1118,7 +1133,7 @@ let te = class {
1118
1133
  const s = t.intersection.object;
1119
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);
1120
1135
  }
1121
- if (e === S.Click) {
1136
+ if (e === P.Click) {
1122
1137
  if (!t) {
1123
1138
  this._selectedMesh && (this._restoreEdgesColor(this._selectedMesh), this._selectedMesh = null, this._store.setSelectedObject(null));
1124
1139
  return;
@@ -1163,7 +1178,7 @@ let te = class {
1163
1178
  });
1164
1179
  }
1165
1180
  };
1166
- te = Yt([
1181
+ te = zt([
1167
1182
  u(),
1168
1183
  Oe(0, h("RendererApi")),
1169
1184
  Oe(1, h("IEditorStore"))
@@ -1172,7 +1187,7 @@ var Ut = Object.getOwnPropertyDescriptor, Wt = (t, e, s, i) => {
1172
1187
  for (var r = i > 1 ? void 0 : i ? Ut(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1173
1188
  (n = t[o]) && (r = n(r) || r);
1174
1189
  return r;
1175
- }, zt = (t, e) => (s, i) => e(s, i, t);
1190
+ }, Ft = (t, e) => (s, i) => e(s, i, t);
1176
1191
  let se = class {
1177
1192
  constructor(t) {
1178
1193
  this._api = t;
@@ -1185,13 +1200,13 @@ let se = class {
1185
1200
  _selected = null;
1186
1201
  // Цвета, необходимые для переключения
1187
1202
  /** Цвет грани, на которую навелись */
1188
- _hoverColor = z;
1203
+ _hoverColor = W;
1189
1204
  /** Цвет выделенной граней */
1190
1205
  _selectColor = F;
1191
1206
  /** Изначальный цвет граней у модели, перед наложением эффектов*/
1192
1207
  _defaultColor = 2236962;
1193
1208
  handle(t, e) {
1194
- 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);
1195
1210
  }
1196
1211
  rollback() {
1197
1212
  throw new Error("Method not implemented.");
@@ -1203,16 +1218,16 @@ let se = class {
1203
1218
  };
1204
1219
  se = Wt([
1205
1220
  u(),
1206
- zt(0, h("RendererApi"))
1221
+ Ft(0, h("RendererApi"))
1207
1222
  ], se);
1208
- var Ft = Object.getOwnPropertyDescriptor, Zt = (t, e, s, i) => {
1209
- for (var r = i > 1 ? void 0 : i ? Ft(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--)
1210
1225
  (n = t[o]) && (r = n(r) || r);
1211
1226
  return r;
1212
- }, De = (t, e) => (s, i) => e(s, i, t);
1227
+ }, Te = (t, e) => (s, i) => e(s, i, t);
1213
1228
  let ie = class {
1214
1229
  constructor(t, e) {
1215
- 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);
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);
1216
1231
  }
1217
1232
  /** Режим, которым управляет хендлер, нужен только менеджеру */
1218
1233
  mode = v.Vertex;
@@ -1224,11 +1239,11 @@ let ie = class {
1224
1239
  _selectVertex;
1225
1240
  // Цвета, необходимые для переключения
1226
1241
  /** Цвет ребра, на которое навелись */
1227
- _hoverColor = z;
1242
+ _hoverColor = W;
1228
1243
  /** Цвет выделенного ребра */
1229
1244
  _selectColor = F;
1230
1245
  handle(t, e) {
1231
- if (this._api.setRaycastMode(this.mode), e === S.Hover) {
1246
+ if (this._api.setRaycastMode(this.mode), e === P.Hover) {
1232
1247
  if (!t) {
1233
1248
  this._hoverVertex.visible = !1, this._hovered = null;
1234
1249
  return;
@@ -1240,7 +1255,7 @@ let ie = class {
1240
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);
1241
1256
  return;
1242
1257
  }
1243
- if (e === S.Click) {
1258
+ if (e === P.Click) {
1244
1259
  if (!t) {
1245
1260
  this._selectVertex.visible = !1, this._selected = null, this._store.setSelectedObject(null);
1246
1261
  return;
@@ -1272,7 +1287,7 @@ let ie = class {
1272
1287
  opacity: 1
1273
1288
  }), r = new a.Points(s, i);
1274
1289
  return r.renderOrder = 1e3, r.raycast = () => {
1275
- }, r.layers.set(T), r.visible = !1, r;
1290
+ }, r.layers.set(L), r.visible = !1, r;
1276
1291
  }
1277
1292
  /** Локальную вершину points переводим в world и пишем в target (прокси-точку) */
1278
1293
  _writeWorldVertex(t, e, s) {
@@ -1294,15 +1309,15 @@ let ie = class {
1294
1309
  i.getX(e),
1295
1310
  i.getY(e),
1296
1311
  i.getZ(e)
1297
- ).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, L = 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 = [];
1298
1313
  for (let M = 0; M < _.count; M++)
1299
- L.fromBufferAttribute(_, M), L.distanceToSquared(n) < f && b.push(M);
1314
+ D.fromBufferAttribute(_, M), D.distanceToSquared(n) < f && b.push(M);
1300
1315
  const O = s.children.find((M) => M?.isLineSegments);
1301
1316
  let y = [];
1302
1317
  if (O) {
1303
- const M = new a.Matrix4().copy(O.matrixWorld).invert(), N = r.clone().applyMatrix4(M), I = O.geometry.getAttribute("position"), Y = new a.Vector3();
1304
- for (let A = 0; A < I.count; A++)
1305
- 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);
1306
1321
  }
1307
1322
  this._selectVertex.userData.vertexInfo = {
1308
1323
  points: t,
@@ -1326,15 +1341,18 @@ let ie = class {
1326
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);
1327
1342
  }
1328
1343
  };
1329
- ie = Zt([
1344
+ ie = $t([
1330
1345
  u(),
1331
- De(0, h("RendererApi")),
1332
- De(1, h("IEditorStore"))
1346
+ Te(0, h("RendererApi")),
1347
+ Te(1, h("IEditorStore"))
1333
1348
  ], ie);
1334
1349
  class ue {
1335
1350
  constructor(e, s) {
1336
- 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
+ });
1337
1354
  }
1355
+ _unsubscribeTransform;
1338
1356
  /**
1339
1357
  * Обновляет состояние инструмента под текущее выделение.
1340
1358
  */
@@ -1352,14 +1370,14 @@ class ue {
1352
1370
  }
1353
1371
  /** Освобождение ресурсов хендлера. */
1354
1372
  dispose() {
1355
- this.rollback();
1373
+ this.rollback(), this._unsubscribeTransform && this._unsubscribeTransform();
1356
1374
  }
1357
1375
  }
1358
- var $t = Object.getOwnPropertyDescriptor, Bt = (t, e, s, i) => {
1359
- for (var r = i > 1 ? void 0 : i ? $t(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--)
1360
1378
  (n = t[o]) && (r = n(r) || r);
1361
1379
  return r;
1362
- }, Te = (t, e) => (s, i) => e(s, i, t);
1380
+ }, Le = (t, e) => (s, i) => e(s, i, t);
1363
1381
  let re = class extends ue {
1364
1382
  /** Инструмент, которым управляет хендлер, нужен только менеджеру */
1365
1383
  mode = C.Translate;
@@ -1367,16 +1385,16 @@ let re = class extends ue {
1367
1385
  super(t, e);
1368
1386
  }
1369
1387
  };
1370
- re = Bt([
1388
+ re = Xt([
1371
1389
  u(),
1372
- Te(0, h("RendererApi")),
1373
- Te(1, h("IEditorStore"))
1390
+ Le(0, h("RendererApi")),
1391
+ Le(1, h("IEditorStore"))
1374
1392
  ], re);
1375
- var Xt = Object.getOwnPropertyDescriptor, Gt = (t, e, s, i) => {
1376
- for (var r = i > 1 ? void 0 : i ? Xt(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--)
1377
1395
  (n = t[o]) && (r = n(r) || r);
1378
1396
  return r;
1379
- }, Le = (t, e) => (s, i) => e(s, i, t);
1397
+ }, De = (t, e) => (s, i) => e(s, i, t);
1380
1398
  let oe = class extends ue {
1381
1399
  /** Инструмент, которым управляет хендлер, нужен только менеджеру */
1382
1400
  mode = C.Scale;
@@ -1384,13 +1402,13 @@ let oe = class extends ue {
1384
1402
  super(t, e);
1385
1403
  }
1386
1404
  };
1387
- oe = Gt([
1405
+ oe = Kt([
1388
1406
  u(),
1389
- Le(0, h("RendererApi")),
1390
- Le(1, h("IEditorStore"))
1407
+ De(0, h("RendererApi")),
1408
+ De(1, h("IEditorStore"))
1391
1409
  ], oe);
1392
- var Kt = Object.getOwnPropertyDescriptor, qt = (t, e, s, i) => {
1393
- for (var r = i > 1 ? void 0 : i ? Kt(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--)
1394
1412
  (n = t[o]) && (r = n(r) || r);
1395
1413
  return r;
1396
1414
  }, Ce = (t, e) => (s, i) => e(s, i, t);
@@ -1401,19 +1419,19 @@ let ne = class extends ue {
1401
1419
  super(t, e);
1402
1420
  }
1403
1421
  };
1404
- ne = qt([
1422
+ ne = Qt([
1405
1423
  u(),
1406
1424
  Ce(0, h("RendererApi")),
1407
1425
  Ce(1, h("IEditorStore"))
1408
1426
  ], ne);
1409
- var Qt = Object.getOwnPropertyDescriptor, Jt = (t, e, s, i) => {
1410
- for (var r = i > 1 ? void 0 : i ? Qt(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--)
1411
1429
  (n = t[o]) && (r = n(r) || r);
1412
1430
  return r;
1413
- }, Ae = (t, e) => (s, i) => e(s, i, t);
1431
+ }, xe = (t, e) => (s, i) => e(s, i, t);
1414
1432
  let ae = class {
1415
1433
  constructor(t, e) {
1416
- 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);
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);
1417
1435
  }
1418
1436
  /** Режим, которым управляет хендлер, нужен только менеджеру */
1419
1437
  mode = v.Edge;
@@ -1427,12 +1445,12 @@ let ae = class {
1427
1445
  _selected = null;
1428
1446
  // Цвета, необходимые для переключения
1429
1447
  /** Цвет ребра, на которое навелись */
1430
- _hoverColor = z;
1448
+ _hoverColor = W;
1431
1449
  /** Цвет выделенного ребра */
1432
1450
  _selectColor = F;
1433
1451
  /** Обработка текущего режима выборки. */
1434
1452
  handle(t, e) {
1435
- if (this._api.setRaycastMode(this.mode), e === S.Hover) {
1453
+ if (this._api.setRaycastMode(this.mode), e === P.Hover) {
1436
1454
  if (!t) {
1437
1455
  this._hoverLine.visible = !1, this._hovered = null;
1438
1456
  return;
@@ -1444,7 +1462,7 @@ let ae = class {
1444
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 };
1445
1463
  return;
1446
1464
  }
1447
- if (e === S.Click) {
1465
+ if (e === P.Click) {
1448
1466
  if (!t) {
1449
1467
  this._selectLine.visible = !1, this._selected = null, this._store.setSelectedObject(null);
1450
1468
  return;
@@ -1479,7 +1497,7 @@ let ae = class {
1479
1497
  opacity: 1
1480
1498
  }), i = new a.Line(e, s);
1481
1499
  return i.renderOrder = 1e3, i.raycast = () => {
1482
- }, i.layers.set(T), i.visible = !1, i;
1500
+ }, i.layers.set(L), i.visible = !1, i;
1483
1501
  }
1484
1502
  /** Локальные точки сегмента переводим в target (который висит на сцене) */
1485
1503
  _writeWorldSegment(t, e, s) {
@@ -1503,9 +1521,9 @@ let ae = class {
1503
1521
  if (!isFinite(m) || m === 0) return;
1504
1522
  const f = new a.Vector3().addVectors(n, c).multiplyScalar(0.5);
1505
1523
  t.position.copy(f);
1506
- const L = t.geometry;
1507
- let b = L.getAttribute("position");
1508
- (!b || b.count < 2) && (L.setAttribute("position", new a.BufferAttribute(new Float32Array(6), 3)), b = L.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();
1509
1527
  const O = new a.Quaternion().setFromUnitVectors(new a.Vector3(1, 0, 0), _);
1510
1528
  t.quaternion.copy(O), t.updateMatrixWorld(!0);
1511
1529
  }
@@ -1518,11 +1536,11 @@ let ae = class {
1518
1536
  ), c = new a.Vector3(i.getX(o), i.getY(o), i.getZ(o)).applyMatrix4(
1519
1537
  t.matrixWorld
1520
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 = [];
1521
- for (let E = 0; E < b.count; E++)
1522
- O.fromBufferAttribute(b, E), O.distanceToSquared(m) < y * y ? M.push(E) : O.distanceToSquared(f) < y * y && N.push(E);
1523
- const I = new a.Matrix4().copy(t.matrixWorld).invert(), Y = n.clone().applyMatrix4(I), A = c.clone().applyMatrix4(I), me = t.geometry.getAttribute("position"), Z = new a.Vector3(), fe = [], ge = [];
1524
- for (let E = 0; E < me.count; E++)
1525
- Z.fromBufferAttribute(me, E), Z.distanceToSquared(Y) < y * y ? fe.push(E) : Z.distanceToSquared(A) < y * y && ge.push(E);
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);
1526
1544
  this._selectLine.userData.edgeInfo = {
1527
1545
  lines: t,
1528
1546
  seg: e,
@@ -1534,16 +1552,16 @@ let ae = class {
1534
1552
  };
1535
1553
  }
1536
1554
  };
1537
- ae = Jt([
1555
+ ae = es([
1538
1556
  u(),
1539
- Ae(0, h("RendererApi")),
1540
- Ae(1, h("IEditorStore"))
1557
+ xe(0, h("RendererApi")),
1558
+ xe(1, h("IEditorStore"))
1541
1559
  ], ae);
1542
- var es = Object.getOwnPropertyDescriptor, ts = (t, e, s, i) => {
1543
- for (var r = i > 1 ? void 0 : i ? es(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--)
1544
1562
  (n = t[o]) && (r = n(r) || r);
1545
1563
  return r;
1546
- }, ss = (t, e) => (s, i) => e(s, i, t);
1564
+ }, is = (t, e) => (s, i) => e(s, i, t);
1547
1565
  let he = class {
1548
1566
  constructor(t) {
1549
1567
  this._api = t;
@@ -1556,7 +1574,7 @@ let he = class {
1556
1574
  handle(t) {
1557
1575
  const e = Je[t](), s = e.getAttribute("position");
1558
1576
  s && s.setUsage && s.setUsage(a.DynamicDrawUsage);
1559
- const i = new a.Mesh(e, Re);
1577
+ const i = new a.Mesh(e, je);
1560
1578
  i.layers.enable(He);
1561
1579
  const r = Ne(i.geometry);
1562
1580
  i.add(r);
@@ -1572,15 +1590,15 @@ let he = class {
1572
1590
  this._lastAddedMesh = null;
1573
1591
  }
1574
1592
  };
1575
- he = ts([
1593
+ he = ss([
1576
1594
  u(),
1577
- ss(0, h("RendererApi"))
1595
+ is(0, h("RendererApi"))
1578
1596
  ], he);
1579
- var is = Object.getOwnPropertyDescriptor, rs = (t, e, s, i) => {
1580
- for (var r = i > 1 ? void 0 : i ? is(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--)
1581
1599
  (n = t[o]) && (r = n(r) || r);
1582
1600
  return r;
1583
- }, xe = (t, e) => (s, i) => e(s, i, t);
1601
+ }, Ae = (t, e) => (s, i) => e(s, i, t);
1584
1602
  let le = class {
1585
1603
  constructor(t, e) {
1586
1604
  this._api = t, this._store = e;
@@ -1602,16 +1620,16 @@ let le = class {
1602
1620
  this._lastDeletedMesh = null;
1603
1621
  }
1604
1622
  };
1605
- le = rs([
1623
+ le = os([
1606
1624
  u(),
1607
- xe(0, h("RendererApi")),
1608
- xe(1, h("IEditorStore"))
1625
+ Ae(0, h("RendererApi")),
1626
+ Ae(1, h("IEditorStore"))
1609
1627
  ], le);
1610
- var os = Object.getOwnPropertyDescriptor, ns = (t, e, s, i) => {
1611
- for (var r = i > 1 ? void 0 : i ? os(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--)
1612
1630
  (n = t[o]) && (r = n(r) || r);
1613
1631
  return r;
1614
- }, as = (t, e) => (s, i) => e(s, i, t);
1632
+ }, hs = (t, e) => (s, i) => e(s, i, t);
1615
1633
  let ce = class {
1616
1634
  constructor(t) {
1617
1635
  this._renderer = t;
@@ -1666,19 +1684,23 @@ let ce = class {
1666
1684
  enableCameraLayer(t) {
1667
1685
  this._renderer.enableCameraLayer(t);
1668
1686
  }
1687
+ /** @inheritdoc */
1688
+ onTransformChange(t) {
1689
+ return this._renderer.onTransformChange(t);
1690
+ }
1669
1691
  };
1670
- ce = ns([
1692
+ ce = as([
1671
1693
  u(),
1672
- as(0, h("EditorRenderer"))
1694
+ hs(0, h("EditorRenderer"))
1673
1695
  ], ce);
1674
- var hs = Object.getOwnPropertyDescriptor, ls = (t, e, s, i) => {
1675
- for (var r = i > 1 ? void 0 : i ? hs(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--)
1676
1698
  (n = t[o]) && (r = n(r) || r);
1677
1699
  return r;
1678
- }, H = (t, e) => (s, i) => e(s, i, t);
1700
+ }, A = (t, e) => (s, i) => e(s, i, t);
1679
1701
  let de = class {
1680
- constructor(t, e, s, i, r) {
1681
- 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);
1682
1704
  }
1683
1705
  setDisplayMode(t) {
1684
1706
  this._displayManager.manage(t);
@@ -1701,20 +1723,34 @@ let de = class {
1701
1723
  addFigure(t, e) {
1702
1724
  this._sceneManager.manage(t, e);
1703
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
+ }
1704
1739
  dispose() {
1705
1740
  this._displayManager.dispose(), this._selectManager.dispose(), this._renderer.dispose();
1706
1741
  }
1707
1742
  };
1708
- de = ls([
1743
+ de = cs([
1709
1744
  u(),
1710
- H(0, h("IDisplayManager")),
1711
- H(1, h("ISelectManager")),
1712
- H(2, h("IToolManager")),
1713
- H(3, h("ISceneManager")),
1714
- 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"))
1715
1751
  ], de);
1716
- var cs = Object.getOwnPropertyDescriptor, ds = (t, e, s, i) => {
1717
- for (var r = i > 1 ? void 0 : i ? cs(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--)
1718
1754
  (n = t[o]) && (r = n(r) || r);
1719
1755
  return r;
1720
1756
  };
@@ -1729,6 +1765,8 @@ let _e = class {
1729
1765
  _selectedObject = null;
1730
1766
  /** Слушатели событий по изменению выбранного объекта. */
1731
1767
  _selectedListeners = /* @__PURE__ */ new Set();
1768
+ /** Слушатели событий трансформации выбранного объекта. */
1769
+ _transformListeners = /* @__PURE__ */ new Set();
1732
1770
  constructor() {
1733
1771
  Qe(this, {}, { autoBind: !0 });
1734
1772
  }
@@ -1761,6 +1799,11 @@ let _e = class {
1761
1799
  return this._selectedObject;
1762
1800
  }
1763
1801
  /** @inheritdoc */
1802
+ getSelectionStats() {
1803
+ const t = this._selectedObject;
1804
+ return t ? ct(t) : null;
1805
+ }
1806
+ /** @inheritdoc */
1764
1807
  setSelectedObject(t) {
1765
1808
  if (this._selectedObject !== t) {
1766
1809
  this._selectedObject = t;
@@ -1771,25 +1814,31 @@ let _e = class {
1771
1814
  onSelectedObjectChange(t) {
1772
1815
  return this._selectedListeners.add(t), () => this._selectedListeners.delete(t);
1773
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
+ }
1774
1825
  };
1775
- _e = ds([
1826
+ _e = _s([
1776
1827
  u()
1777
1828
  ], _e);
1778
- let je = !1;
1829
+ let Re = !1;
1779
1830
  const d = Ke.createChildContainer();
1780
- function _s(t) {
1781
- return je || (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), je = !0), d;
1782
- }
1783
- function Es(t) {
1784
- return _s(t).resolve("EditorHub");
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;
1785
1833
  }
1834
+ const ws = (t) => ps(t).resolve("EditorHub");
1786
1835
  export {
1787
1836
  de as EditorHub,
1788
1837
  G as EditorRenderer,
1789
1838
  X as EventBus,
1790
- R as EventTopics,
1791
- Ms as ObjLoader,
1792
- ys as PreviewRenderer,
1839
+ I as EventTopics,
1840
+ Ss as ObjLoader,
1841
+ Ms as PreviewRenderer,
1793
1842
  Ie as Renderer,
1794
- Es as createAppHub
1843
+ ws as createAppHub
1795
1844
  };