@planara/core 2.6.1 → 2.7.1

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,30 +1,30 @@
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";
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";
7
- import { EventEmitter as qe } from "events";
8
- import { makeAutoObservable as Qe } from "mobx";
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() {
3
+ import { Controls as Ue, Vector3 as T, MOUSE as I, TOUCH as R, Quaternion as ve, Spherical as ye, Vector2 as w, Ray as We, Plane as Fe, MathUtils as Ze } from "three";
4
+ import { FigureType as S, SelectMode as v, Figure as $e, DisplayMode as V, DEFAULT_TOOL_RULES as Me, ToolType as C, SceneMode as N } from "@planara/types";
5
+ import { SymmetricAxesHelper as Be, OrbitWithState as Xe, CameraAxesGizmo as Ge, ModelingTransformControls as Ke } from "@planara/three";
6
+ import { injectable as u, inject as h, injectAll as W, container as qe } from "tsyringe";
7
+ import { EventEmitter as Qe } from "events";
8
+ import { makeAutoObservable as Je } from "mobx";
9
+ const et = {
10
+ [S.Plane]: () => new a.PlaneGeometry(1, 1, 1, 1),
11
+ [S.Cube]: () => new a.BoxGeometry(1, 1, 1, 1, 1, 1),
12
+ [S.UVSphere]: () => new a.SphereGeometry(0.5, 32, 16),
13
+ [S.Icosphere]: () => new a.IcosahedronGeometry(0.5, 0),
14
+ [S.Cylinder]: () => new a.CylinderGeometry(0.5, 0.5, 1, 32, 1, !1),
15
+ [S.Cone]: () => new a.ConeGeometry(0.5, 1, 32, 1, !1),
16
+ [S.Torus]: () => new a.TorusGeometry(0.5, 0.2, 16, 64),
17
+ [S.Circle]: () => new a.CircleGeometry(0.5, 32),
18
+ [S.Sphere]: () => new a.SphereGeometry(0.5, 32, 16),
19
+ [S.Custom]: function() {
20
20
  throw new Error("Custom geometry is not generated here.");
21
21
  }
22
- }, Re = new a.MeshStandardMaterial({
22
+ }, Ie = new a.MeshStandardMaterial({
23
23
  color: 12566463,
24
24
  metalness: 0,
25
25
  roughness: 0.6
26
- }), et = 8;
27
- class Ie {
26
+ }), tt = 8;
27
+ class He {
28
28
  /** Корневой объект сцены */
29
29
  scene;
30
30
  /** Камера для сцены */
@@ -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, Ie);
85
85
  return this.scene.add(i), this.meshes.push(i), i;
86
86
  }
87
87
  /**
@@ -172,15 +172,15 @@ class Ie {
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 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--)
175
+ var st = Object.getOwnPropertyDescriptor, it = (t, e, s, i) => {
176
+ for (var r = i > 1 ? void 0 : i ? st(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
- let X = class {
180
+ let G = class {
181
181
  _emitter;
182
182
  constructor() {
183
- this._emitter = new qe();
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 = st([
198
+ G = it([
199
199
  u()
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) => {
200
+ ], G);
201
+ var H = /* @__PURE__ */ ((t) => (t.SelectHover = "select.hover", t.SelectClick = "select.click", t.ToolSelect = "tool.select", t))(H || {});
202
+ const rt = 0.03, ot = 0.05, ke = 0, nt = 1, at = 2, L = 31, F = 16776960, Z = 16755200, ht = 2236962, lt = 2236962, ct = (t) => !!t && t.isMesh, Ve = (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
- }, Ve = (t) => {
209
+ }, Ne = (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: ht,
213
+ color: lt,
214
214
  size: 6,
215
215
  sizeAttenuation: !1,
216
216
  depthTest: !1,
@@ -218,31 +218,36 @@ const it = 0.03, rt = 0.05, He = 0, ot = 1, nt = 2, T = 31, z = 16776960, F = 16
218
218
  transparent: !0,
219
219
  opacity: 0.9
220
220
  }), i = new a.Points(e, s);
221
- return i.layers.set(nt), i.renderOrder = 1e3, i.visible = !1, i;
222
- }, Ne = (t) => {
221
+ return i.layers.set(at), i.renderOrder = 1e3, i.visible = !1, i;
222
+ }, Ye = (t) => {
223
223
  const e = new a.EdgesGeometry(t), s = new a.LineSegments(
224
224
  e,
225
- new a.LineBasicMaterial({ color: at, linewidth: 1 })
225
+ new a.LineBasicMaterial({ color: ht, linewidth: 1 })
226
226
  );
227
- return s.layers.set(ot), s;
227
+ return s.layers.set(nt), s;
228
+ }, dt = (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 _t = Object.getOwnPropertyDescriptor, pt = (t, e, s, i) => {
235
+ for (var r = i > 1 ? void 0 : i ? _t(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
- }, Me = (t, e) => (s, i) => e(s, i, t);
234
- let G = class extends Ie {
238
+ }, Ee = (t, e) => (s, i) => e(s, i, t);
239
+ let K = class extends He {
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
- const i = new $e(6);
240
- 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, {
244
+ const i = new Be(6);
245
+ this.scene.add(i), this._orbit = new Xe(this.camera, this.renderer.domElement), this._orbit.enableDamping = !0, this._orbit.dampingFactor = 0.05, this._cameraGizmo = new Ge(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 Ge(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 Ke(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 Ie {
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 Ie {
271
277
  /** Добавление фигуры на сцену */
272
278
  addFigure(t) {
273
279
  const e = super.addFigure(t);
274
- e.layers.enable(He);
275
- const s = Ne(e.geometry);
280
+ e.layers.enable(ke);
281
+ const s = Ye(e.geometry);
276
282
  e.add(s);
277
- const i = Ve(e.geometry);
283
+ const i = Ne(e.geometry);
278
284
  return e.add(i), e;
279
285
  }
280
286
  /**
@@ -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
@@ -312,17 +325,17 @@ let G = class extends Ie {
312
325
  e.layers.set(0);
313
326
  break;
314
327
  case v.Edge:
315
- e.layers.set(1), e.params.Line.threshold = it;
328
+ e.layers.set(1), e.params.Line.threshold = rt;
316
329
  break;
317
330
  case v.Vertex:
318
- e.layers.set(2), e.params.Points.threshold = rt;
331
+ e.layers.set(2), e.params.Points.threshold = ot;
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 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, H.SelectHover, !0);
339
354
  };
340
355
  /** Обработчик события на click */
341
356
  _handleMouseClick = (t) => {
342
- this._processRaycastEvent(t, R.SelectClick, !1);
357
+ this._processRaycastEvent(t, H.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
+ K = pt([
354
369
  u(),
355
- Me(0, h("Canvas")),
356
- Me(1, h("EventBus"))
357
- ], 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 = {
370
+ Ee(0, h("Canvas")),
371
+ Ee(1, h("EventBus"))
372
+ ], K);
373
+ const we = { type: "change" }, ue = { type: "start" }, ze = { type: "end" }, U = new We(), Se = new Fe(), ut = Math.cos(70 * Ze.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 Ee = { type: "change" }, pe = { type: "start" }, Ye = { type: "end" }, U =
364
379
  TOUCH_PAN: 4,
365
380
  TOUCH_DOLLY_PAN: 5,
366
381
  TOUCH_DOLLY_ROTATE: 6
367
- }, $ = 1e-6;
368
- class pt extends Ue {
382
+ }, B = 1e-6;
383
+ class mt extends Ue {
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: I.ROTATE, MIDDLE: I.DOLLY, RIGHT: I.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 ve(), this._lastTargetPosition = new T(), this._quat = new ve().setFromUnitVectors(e.up, new T(0, 1, 0)), this._quatInverse = this._quat.clone().invert(), this._spherical = new ye(), this._sphericalDelta = new ye(), 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 = gt.bind(this), this._onPointerDown = ft.bind(this), this._onPointerUp = bt.bind(this), this._onContextMenu = Pt.bind(this), this._onMouseWheel = Mt.bind(this), this._onKeyDown = Et.bind(this), this._onTouchStart = wt.bind(this), this._onTouchMove = St.bind(this), this._onMouseDown = vt.bind(this), this._onMouseMove = yt.bind(this), this._interceptControlDown = Ot.bind(this), this._interceptControlUp = Tt.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(we), 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) : (U.origin.copy(this.object.position), U.direction.set(0, 0, -1).transformDirection(this.object.matrix), Math.abs(this.object.up.dot(U.direction)) < ut ? this.object.lookAt(this.target) : (Se.setFromNormalAndCoplanarPoint(this.object.up, this.target), U.intersectPlane(Se, 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) > B || 8 * (1 - this._lastQuaternion.dot(this.object.quaternion)) > B || this._lastTargetPosition.distanceToSquared(this.target) > B ? (this.dispatchEvent(we), 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,16 +676,16 @@ 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 ft(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 gt(t) {
668
683
  this.enabled !== !1 && (t.pointerType === "touch" ? this._onTouchMove(t) : this._onMouseMove(t));
669
684
  }
670
- function ft(t) {
685
+ function bt(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(Ye), this.state = l.NONE;
688
+ this.domElement.releasePointerCapture(t.pointerId), this.domElement.removeEventListener("pointermove", this._onPointerMove), this.domElement.removeEventListener("pointerup", this._onPointerUp), this.dispatchEvent(ze), 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 ft(t) {
678
693
  break;
679
694
  }
680
695
  }
681
- function gt(t) {
696
+ function vt(t) {
682
697
  let e;
683
698
  switch (t.button) {
684
699
  case 0:
@@ -694,11 +709,11 @@ function gt(t) {
694
709
  e = -1;
695
710
  }
696
711
  switch (e) {
697
- case j.DOLLY:
712
+ case I.DOLLY:
698
713
  if (this.enableZoom === !1) return;
699
714
  this._handleMouseDownDolly(t), this.state = l.DOLLY;
700
715
  break;
701
- case j.ROTATE:
716
+ case I.ROTATE:
702
717
  if (t.ctrlKey || t.metaKey || t.shiftKey) {
703
718
  if (this.enablePan === !1) return;
704
719
  this._handleMouseDownPan(t), this.state = l.PAN;
@@ -707,7 +722,7 @@ function gt(t) {
707
722
  this._handleMouseDownRotate(t), this.state = l.ROTATE;
708
723
  }
709
724
  break;
710
- case j.PAN:
725
+ case I.PAN:
711
726
  if (t.ctrlKey || t.metaKey || t.shiftKey) {
712
727
  if (this.enableRotate === !1) return;
713
728
  this._handleMouseDownRotate(t), this.state = l.ROTATE;
@@ -719,9 +734,9 @@ function gt(t) {
719
734
  default:
720
735
  this.state = l.NONE;
721
736
  }
722
- this.state !== l.NONE && this.dispatchEvent(pe);
737
+ this.state !== l.NONE && this.dispatchEvent(ue);
723
738
  }
724
- function bt(t) {
739
+ function yt(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) {
741
- this.enabled === !1 || this.enableZoom === !1 || this.state !== l.NONE || (t.preventDefault(), this.dispatchEvent(pe), this._handleMouseWheel(this._customWheelEvent(t)), this.dispatchEvent(Ye));
755
+ function Mt(t) {
756
+ this.enabled === !1 || this.enableZoom === !1 || this.state !== l.NONE || (t.preventDefault(), this.dispatchEvent(ue), this._handleMouseWheel(this._customWheelEvent(t)), this.dispatchEvent(ze));
742
757
  }
743
- function yt(t) {
758
+ function Et(t) {
744
759
  this.enabled !== !1 && this._handleKeyDown(t);
745
760
  }
746
- function Mt(t) {
761
+ function wt(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;
@@ -776,9 +791,9 @@ function Mt(t) {
776
791
  default:
777
792
  this.state = l.NONE;
778
793
  }
779
- this.state !== l.NONE && this.dispatchEvent(pe);
794
+ this.state !== l.NONE && this.dispatchEvent(ue);
780
795
  }
781
- function Et(t) {
796
+ function St(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 Pt(t) {
804
819
  this.enabled !== !1 && t.preventDefault();
805
820
  }
806
- function Pt(t) {
821
+ function Ot(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 Tt(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 Es extends He {
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 mt(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 ws {
826
841
  /** Позиции вершин */
827
842
  _positions = [];
828
843
  /** Нормали вершин */
@@ -859,12 +874,12 @@ class Ms {
859
874
  }
860
875
  }
861
876
  const i = {
862
- type: P.Custom,
877
+ type: S.Custom,
863
878
  position: this._positions,
864
879
  ...this._normals.length > 0 && { normal: this._normals },
865
880
  ...this._uvs.length > 0 && { uv: this._uvs }
866
881
  };
867
- return new Ze(i);
882
+ return new $e(i);
868
883
  }
869
884
  /**
870
885
  * Обрабатывает строку face (f) и разворачивает индексы в массивы для рендеринга
@@ -889,41 +904,41 @@ 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 Lt = Object.getOwnPropertyDescriptor, Dt = (t, e, s, i) => {
908
+ for (var r = i > 1 ? void 0 : i ? Lt(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
  }, Pe = (t, e) => (s, i) => e(s, i, t);
897
- let K = class {
912
+ let q = class {
898
913
  constructor(t, e) {
899
914
  this._store = e, this._handlers = new Map(t.map((s) => [s.mode, s]));
900
915
  }
901
916
  /** Текущий режим отображения */
902
- _currentMode = k.Plane;
917
+ _currentMode = V.Plane;
903
918
  /** Хендлеры, которые управляют отображением */
904
919
  _handlers;
905
920
  /** Установка режима отображения */
906
921
  manage(t) {
907
- t !== this._currentMode && (this._handlers.get(this._currentMode)?.rollback(), t !== k.Plane && this._handlers.get(t)?.handle(), this._currentMode = t, this._store.setDisplayMode(this._currentMode));
922
+ t !== this._currentMode && (this._handlers.get(this._currentMode)?.rollback(), t !== V.Plane && this._handlers.get(t)?.handle(), this._currentMode = t, this._store.setDisplayMode(this._currentMode));
908
923
  }
909
924
  /** Освобождает ресурсы менеджера. */
910
925
  dispose() {
911
- this._handlers && this._handlers.clear(), this._currentMode = k.Plane, this._store.setDisplayMode(this._currentMode);
926
+ this._handlers && this._handlers.clear(), this._currentMode = V.Plane, this._store.setDisplayMode(this._currentMode);
912
927
  }
913
928
  };
914
- K = Dt([
929
+ q = Dt([
915
930
  u(),
916
931
  Pe(0, W("IDisplayHandler")),
917
932
  Pe(1, h("IEditorStore"))
918
- ], 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--)
933
+ ], q);
934
+ var P = /* @__PURE__ */ ((t) => (t.Hover = "hover", t.Click = "click", t))(P || {}), Ct = Object.getOwnPropertyDescriptor, At = (t, e, s, i) => {
935
+ for (var r = i > 1 ? void 0 : i ? Ct(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
- }, B = (t, e) => (s, i) => e(s, i, t);
924
- let q = class {
938
+ }, X = (t, e) => (s, i) => e(s, i, t);
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(H.SelectHover, this._onHover), this._eventBus.on(H.SelectClick, this._onClick);
927
942
  }
928
943
  /** Текущий режим выборки */
929
944
  _currentMode = v.Mesh;
@@ -935,43 +950,43 @@ 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(H.SelectHover, this._onHover), this._currentMode = v.Mesh, this._store.setSelectMode(this._currentMode);
947
962
  }
948
963
  };
949
- q = Lt([
964
+ Q = At([
950
965
  u(),
951
- B(0, h("EventBus")),
952
- B(1, W("ISelectHandler")),
953
- B(2, h("IEditorStore"))
954
- ], q);
955
- class Ct {
966
+ X(0, h("EventBus")),
967
+ X(1, W("ISelectHandler")),
968
+ X(2, h("IEditorStore"))
969
+ ], Q);
970
+ class xt {
956
971
  /** Доступен ли инструмент при текущем режиме выборки */
957
972
  isToolEnabled(e, s) {
958
- return ye[s].includes(e);
973
+ return Me[s].includes(e);
959
974
  }
960
975
  /** Получение доступных инструментов для режима выборки*/
961
976
  getEnabledTools(e) {
962
- return ye[e];
977
+ return Me[e];
963
978
  }
964
979
  }
965
- var At = Object.getOwnPropertyDescriptor, xt = (t, e, s, i) => {
966
- for (var r = i > 1 ? void 0 : i ? At(e, s) : e, o = t.length - 1, n; o >= 0; o--)
980
+ var Rt = Object.getOwnPropertyDescriptor, jt = (t, e, s, i) => {
981
+ for (var r = i > 1 ? void 0 : i ? Rt(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);
970
- let Q = class {
984
+ }, Oe = (t, e) => (s, i) => e(s, i, t);
985
+ let J = 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,19 +1006,19 @@ 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
+ J = jt([
995
1010
  u(),
996
- Se(0, W("IToolHandler")),
997
- Se(1, h("IEditorStore"))
998
- ], Q);
999
- var jt = Object.getOwnPropertyDescriptor, Rt = (t, e, s, i) => {
1000
- for (var r = i > 1 ? void 0 : i ? jt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1011
+ Oe(0, W("IToolHandler")),
1012
+ Oe(1, h("IEditorStore"))
1013
+ ], J);
1014
+ var It = Object.getOwnPropertyDescriptor, Ht = (t, e, s, i) => {
1015
+ for (var r = i > 1 ? void 0 : i ? It(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);
1004
- let J = class {
1018
+ }, kt = (t, e) => (s, i) => e(s, i, t);
1019
+ let ee = class {
1005
1020
  /** Текущий режим редактирования сцены */
1006
- _currentMode = V.AddFigure;
1021
+ _currentMode = N.AddFigure;
1007
1022
  /** Хендлеры, которые управляют отображением */
1008
1023
  _handlers;
1009
1024
  constructor(t) {
@@ -1011,28 +1026,28 @@ 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 === N.AddFigure ? this._handlers.get(t)?.handle(e) : this._handlers.get(t)?.handle(), this._currentMode = t;
1015
1030
  }
1016
1031
  /** Освобождает ресурсы менеджера. */
1017
1032
  dispose() {
1018
- this._handlers && this._handlers.clear(), this._currentMode = V.AddFigure;
1033
+ this._handlers && this._handlers.clear(), this._currentMode = N.AddFigure;
1019
1034
  }
1020
1035
  };
1021
- J = Rt([
1036
+ ee = Ht([
1022
1037
  u(),
1023
- It(0, W("ISceneHandler"))
1024
- ], 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--)
1038
+ kt(0, W("ISceneHandler"))
1039
+ ], ee);
1040
+ var Vt = Object.getOwnPropertyDescriptor, Nt = (t, e, s, i) => {
1041
+ for (var r = i > 1 ? void 0 : i ? Vt(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);
1030
- let ee = class {
1044
+ }, Yt = (t, e) => (s, i) => e(s, i, t);
1045
+ let te = class {
1031
1046
  constructor(t) {
1032
1047
  this._api = t;
1033
1048
  }
1034
1049
  /** Режим отображения. */
1035
- mode = k.Wireframe;
1050
+ mode = V.Wireframe;
1036
1051
  /** Сохраняем предыдущие значения wireframe для отката. */
1037
1052
  _prevWireframe = /* @__PURE__ */ new Map();
1038
1053
  /** Сохраняем исходные цвета материалов для отката */
@@ -1083,16 +1098,16 @@ 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
+ te = Nt([
1087
1102
  u(),
1088
- Vt(0, h("RendererApi"))
1089
- ], 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--)
1103
+ Yt(0, h("RendererApi"))
1104
+ ], te);
1105
+ var zt = Object.getOwnPropertyDescriptor, Ut = (t, e, s, i) => {
1106
+ for (var r = i > 1 ? void 0 : i ? zt(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
- }, Oe = (t, e) => (s, i) => e(s, i, t);
1095
- let te = class {
1109
+ }, Te = (t, e) => (s, i) => e(s, i, t);
1110
+ let se = class {
1096
1111
  constructor(t, e) {
1097
1112
  this._api = t, this._store = e;
1098
1113
  }
@@ -1104,13 +1119,13 @@ let te = class {
1104
1119
  _selectedMesh = null;
1105
1120
  // Цвета, необходимые для переключения
1106
1121
  /** Цвет ребер для фигуры, на которую навелись */
1107
- _hoverColor = z;
1122
+ _hoverColor = F;
1108
1123
  /** Цвет ребер для выделенной фигуры */
1109
- _selectColor = F;
1124
+ _selectColor = Z;
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,17 +1178,17 @@ let te = class {
1163
1178
  });
1164
1179
  }
1165
1180
  };
1166
- te = Yt([
1181
+ se = Ut([
1167
1182
  u(),
1168
- Oe(0, h("RendererApi")),
1169
- Oe(1, h("IEditorStore"))
1170
- ], te);
1171
- var Ut = Object.getOwnPropertyDescriptor, Wt = (t, e, s, i) => {
1172
- for (var r = i > 1 ? void 0 : i ? Ut(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1183
+ Te(0, h("RendererApi")),
1184
+ Te(1, h("IEditorStore"))
1185
+ ], se);
1186
+ var Wt = Object.getOwnPropertyDescriptor, Ft = (t, e, s, i) => {
1187
+ for (var r = i > 1 ? void 0 : i ? Wt(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);
1176
- let se = class {
1190
+ }, Zt = (t, e) => (s, i) => e(s, i, t);
1191
+ let ie = class {
1177
1192
  constructor(t) {
1178
1193
  this._api = t;
1179
1194
  }
@@ -1185,13 +1200,13 @@ let se = class {
1185
1200
  _selected = null;
1186
1201
  // Цвета, необходимые для переключения
1187
1202
  /** Цвет грани, на которую навелись */
1188
- _hoverColor = z;
1203
+ _hoverColor = F;
1189
1204
  /** Цвет выделенной граней */
1190
- _selectColor = F;
1205
+ _selectColor = Z;
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.");
@@ -1201,18 +1216,18 @@ let se = class {
1201
1216
  throw new Error("Method not implemented.");
1202
1217
  }
1203
1218
  };
1204
- se = Wt([
1219
+ ie = Ft([
1205
1220
  u(),
1206
- zt(0, h("RendererApi"))
1207
- ], 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--)
1221
+ Zt(0, h("RendererApi"))
1222
+ ], ie);
1223
+ var $t = Object.getOwnPropertyDescriptor, Bt = (t, e, s, i) => {
1224
+ for (var r = i > 1 ? void 0 : i ? $t(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);
1213
- let ie = class {
1227
+ }, Le = (t, e) => (s, i) => e(s, i, t);
1228
+ let re = 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 = F;
1228
1243
  /** Цвет выделенного ребра */
1229
- _selectColor = F;
1244
+ _selectColor = Z;
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;
@@ -1259,7 +1274,7 @@ let ie = class {
1259
1274
  dispose() {
1260
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();
1261
1276
  }
1262
- _makeOverlayVertex(t, e = et) {
1277
+ _makeOverlayVertex(t, e = tt) {
1263
1278
  const s = new a.BufferGeometry();
1264
1279
  s.setAttribute("position", new a.Float32BufferAttribute([0, 0, 0], 3));
1265
1280
  const i = new a.PointsMaterial({
@@ -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) {
@@ -1288,21 +1303,21 @@ let ie = class {
1288
1303
  }
1289
1304
  /** Готовит метаданные для выбранной вершины и пишет их в _selectVertex.userData */
1290
1305
  _prepareVertexMetadata(t, e) {
1291
- const s = ke(t);
1306
+ const s = Ve(t);
1292
1307
  if (!s) return;
1293
1308
  const i = t.geometry.getAttribute("position"), r = new a.Vector3(
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(), Y = r.clone().applyMatrix4(M), k = O.geometry.getAttribute("position"), z = new a.Vector3();
1319
+ for (let A = 0; A < k.count; A++)
1320
+ z.fromBufferAttribute(k, A), z.distanceToSquared(Y) < f && y.push(A);
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
+ re = Bt([
1330
1345
  u(),
1331
- De(0, h("RendererApi")),
1332
- De(1, h("IEditorStore"))
1333
- ], ie);
1334
- class ue {
1346
+ Le(0, h("RendererApi")),
1347
+ Le(1, h("IEditorStore"))
1348
+ ], re);
1349
+ class me {
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,51 +1370,34 @@ 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--)
1360
- (n = t[o]) && (r = n(r) || r);
1361
- return r;
1362
- }, Te = (t, e) => (s, i) => e(s, i, t);
1363
- let re = class extends ue {
1364
- /** Инструмент, которым управляет хендлер, нужен только менеджеру */
1365
- mode = C.Translate;
1366
- constructor(t, e) {
1367
- super(t, e);
1368
- }
1369
- };
1370
- re = Bt([
1371
- u(),
1372
- Te(0, h("RendererApi")),
1373
- Te(1, h("IEditorStore"))
1374
- ], re);
1375
1376
  var Xt = Object.getOwnPropertyDescriptor, Gt = (t, e, s, i) => {
1376
1377
  for (var r = i > 1 ? void 0 : i ? Xt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1377
1378
  (n = t[o]) && (r = n(r) || r);
1378
1379
  return r;
1379
- }, Le = (t, e) => (s, i) => e(s, i, t);
1380
- let oe = class extends ue {
1380
+ }, De = (t, e) => (s, i) => e(s, i, t);
1381
+ let oe = class extends me {
1381
1382
  /** Инструмент, которым управляет хендлер, нужен только менеджеру */
1382
- mode = C.Scale;
1383
+ mode = C.Translate;
1383
1384
  constructor(t, e) {
1384
1385
  super(t, e);
1385
1386
  }
1386
1387
  };
1387
1388
  oe = Gt([
1388
1389
  u(),
1389
- Le(0, h("RendererApi")),
1390
- Le(1, h("IEditorStore"))
1390
+ De(0, h("RendererApi")),
1391
+ De(1, h("IEditorStore"))
1391
1392
  ], oe);
1392
1393
  var Kt = Object.getOwnPropertyDescriptor, qt = (t, e, s, i) => {
1393
1394
  for (var r = i > 1 ? void 0 : i ? Kt(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1394
1395
  (n = t[o]) && (r = n(r) || r);
1395
1396
  return r;
1396
1397
  }, Ce = (t, e) => (s, i) => e(s, i, t);
1397
- let ne = class extends ue {
1398
+ let ne = class extends me {
1398
1399
  /** Инструмент, которым управляет хендлер, нужен только менеджеру */
1399
- mode = C.Rotate;
1400
+ mode = C.Scale;
1400
1401
  constructor(t, e) {
1401
1402
  super(t, e);
1402
1403
  }
@@ -1411,9 +1412,26 @@ var Qt = Object.getOwnPropertyDescriptor, Jt = (t, e, s, i) => {
1411
1412
  (n = t[o]) && (r = n(r) || r);
1412
1413
  return r;
1413
1414
  }, Ae = (t, e) => (s, i) => e(s, i, t);
1414
- let ae = class {
1415
+ let ae = class extends me {
1416
+ /** Инструмент, которым управляет хендлер, нужен только менеджеру */
1417
+ mode = C.Rotate;
1415
1418
  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);
1419
+ super(t, e);
1420
+ }
1421
+ };
1422
+ ae = Jt([
1423
+ u(),
1424
+ Ae(0, h("RendererApi")),
1425
+ Ae(1, h("IEditorStore"))
1426
+ ], ae);
1427
+ var es = Object.getOwnPropertyDescriptor, ts = (t, e, s, i) => {
1428
+ for (var r = i > 1 ? void 0 : i ? es(e, s) : e, o = t.length - 1, n; o >= 0; o--)
1429
+ (n = t[o]) && (r = n(r) || r);
1430
+ return r;
1431
+ }, xe = (t, e) => (s, i) => e(s, i, t);
1432
+ let he = class {
1433
+ constructor(t, e) {
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 = F;
1431
1449
  /** Цвет выделенного ребра */
1432
- _selectColor = F;
1450
+ _selectColor = Z;
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,64 +1521,64 @@ 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
  }
1512
1530
  /** Запись метаданных выбранного ребра для использования инструментов */
1513
1531
  _prepareEdgeMetadata(t, e) {
1514
- const s = ke(t);
1532
+ const s = Ve(t);
1515
1533
  if (!s) return;
1516
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(
1517
1535
  t.matrixWorld
1518
1536
  ), c = new a.Vector3(i.getX(o), i.getY(o), i.getZ(o)).applyMatrix4(
1519
1537
  t.matrixWorld
1520
- ), _ = 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 = [];
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 = [], Y = [];
1521
1539
  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);
1540
+ O.fromBufferAttribute(b, E), O.distanceToSquared(m) < y * y ? M.push(E) : O.distanceToSquared(f) < y * y && Y.push(E);
1541
+ const k = new a.Matrix4().copy(t.matrixWorld).invert(), z = n.clone().applyMatrix4(k), A = c.clone().applyMatrix4(k), fe = t.geometry.getAttribute("position"), $ = new a.Vector3(), ge = [], be = [];
1542
+ for (let E = 0; E < fe.count; E++)
1543
+ $.fromBufferAttribute(fe, E), $.distanceToSquared(z) < y * y ? ge.push(E) : $.distanceToSquared(A) < y * y && be.push(E);
1526
1544
  this._selectLine.userData.edgeInfo = {
1527
1545
  lines: t,
1528
1546
  seg: e,
1529
1547
  mesh: s,
1530
1548
  aIndices: M,
1531
- bIndices: N,
1532
- aEdgeIndices: fe,
1533
- bEdgeIndices: ge
1549
+ bIndices: Y,
1550
+ aEdgeIndices: ge,
1551
+ bEdgeIndices: be
1534
1552
  };
1535
1553
  }
1536
1554
  };
1537
- ae = Jt([
1555
+ he = ts([
1538
1556
  u(),
1539
- Ae(0, h("RendererApi")),
1540
- Ae(1, h("IEditorStore"))
1541
- ], 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--)
1557
+ xe(0, h("RendererApi")),
1558
+ xe(1, h("IEditorStore"))
1559
+ ], he);
1560
+ var ss = Object.getOwnPropertyDescriptor, is = (t, e, s, i) => {
1561
+ for (var r = i > 1 ? void 0 : i ? ss(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);
1547
- let he = class {
1564
+ }, rs = (t, e) => (s, i) => e(s, i, t);
1565
+ let le = class {
1548
1566
  constructor(t) {
1549
1567
  this._api = t;
1550
1568
  }
1551
1569
  /** Режим редактирования сцены */
1552
- mode = V.AddFigure;
1570
+ mode = N.AddFigure;
1553
1571
  /** Последняя добавленная фигура, нужно для отката через `ctrl + z`. */
1554
1572
  _lastAddedMesh = null;
1555
1573
  /** Добавление базовых фигур на сцену, которые приписаны в `FigureType`. */
1556
1574
  handle(t) {
1557
- const e = Je[t](), s = e.getAttribute("position");
1575
+ const e = et[t](), s = e.getAttribute("position");
1558
1576
  s && s.setUsage && s.setUsage(a.DynamicDrawUsage);
1559
- const i = new a.Mesh(e, Re);
1560
- i.layers.enable(He);
1561
- const r = Ne(i.geometry);
1577
+ const i = new a.Mesh(e, Ie);
1578
+ i.layers.enable(ke);
1579
+ const r = Ye(i.geometry);
1562
1580
  i.add(r);
1563
- const o = Ve(i.geometry);
1581
+ const o = Ne(i.geometry);
1564
1582
  i.add(o), this._api.addMesh(i), this._lastAddedMesh = i;
1565
1583
  }
1566
1584
  /** Срабатывает только на `ctrl + z`. */
@@ -1572,26 +1590,26 @@ let he = class {
1572
1590
  this._lastAddedMesh = null;
1573
1591
  }
1574
1592
  };
1575
- he = ts([
1593
+ le = is([
1576
1594
  u(),
1577
- ss(0, h("RendererApi"))
1578
- ], 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--)
1595
+ rs(0, h("RendererApi"))
1596
+ ], le);
1597
+ var os = Object.getOwnPropertyDescriptor, ns = (t, e, s, i) => {
1598
+ for (var r = i > 1 ? void 0 : i ? os(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);
1584
- let le = class {
1601
+ }, Re = (t, e) => (s, i) => e(s, i, t);
1602
+ let ce = class {
1585
1603
  constructor(t, e) {
1586
1604
  this._api = t, this._store = e;
1587
1605
  }
1588
1606
  /** Режим редактирования сцены */
1589
- mode = V.DeleteFigure;
1607
+ mode = N.DeleteFigure;
1590
1608
  /** Последняя удаленная фигура, сохраняем для отката через `ctrl + z` */
1591
1609
  _lastDeletedMesh = null;
1592
1610
  handle() {
1593
1611
  const t = this._store.getSelectedObject();
1594
- lt(t) && (this._api.removeMesh(t), this._store.setSelectedObject(null), this._lastDeletedMesh = t);
1612
+ ct(t) && (this._api.removeMesh(t), this._store.setSelectedObject(null), this._lastDeletedMesh = t);
1595
1613
  }
1596
1614
  /** Срабатывает только на `ctrl + z`. */
1597
1615
  rollback() {
@@ -1602,17 +1620,17 @@ let le = class {
1602
1620
  this._lastDeletedMesh = null;
1603
1621
  }
1604
1622
  };
1605
- le = rs([
1623
+ ce = ns([
1606
1624
  u(),
1607
- xe(0, h("RendererApi")),
1608
- xe(1, h("IEditorStore"))
1609
- ], 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--)
1625
+ Re(0, h("RendererApi")),
1626
+ Re(1, h("IEditorStore"))
1627
+ ], ce);
1628
+ var as = Object.getOwnPropertyDescriptor, hs = (t, e, s, i) => {
1629
+ for (var r = i > 1 ? void 0 : i ? as(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);
1615
- let ce = class {
1632
+ }, ls = (t, e) => (s, i) => e(s, i, t);
1633
+ let de = class {
1616
1634
  constructor(t) {
1617
1635
  this._renderer = t;
1618
1636
  }
@@ -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
+ de = hs([
1671
1693
  u(),
1672
- as(0, h("EditorRenderer"))
1673
- ], 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--)
1694
+ ls(0, h("EditorRenderer"))
1695
+ ], de);
1696
+ var cs = Object.getOwnPropertyDescriptor, ds = (t, e, s, i) => {
1697
+ for (var r = i > 1 ? void 0 : i ? cs(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);
1679
- 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);
1700
+ }, x = (t, e) => (s, i) => e(s, i, t);
1701
+ let _e = class {
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,36 +1723,52 @@ 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
+ _e = ds([
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"))
1715
- ], 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--)
1745
+ x(0, h("IDisplayManager")),
1746
+ x(1, h("ISelectManager")),
1747
+ x(2, h("IToolManager")),
1748
+ x(3, h("ISceneManager")),
1749
+ x(4, h("EditorRenderer")),
1750
+ x(5, h("IEditorStore"))
1751
+ ], _e);
1752
+ var _s = Object.getOwnPropertyDescriptor, ps = (t, e, s, i) => {
1753
+ for (var r = i > 1 ? void 0 : i ? _s(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
  };
1721
- let _e = class {
1757
+ let pe = class {
1722
1758
  /** Текущий режим выборки. */
1723
1759
  _selectMode = v.Mesh;
1724
1760
  /** Текущий выбранный инструмент. */
1725
1761
  _toolType = C.Translate;
1726
1762
  /** Выбранный режим отображения. */
1727
- _displayMode = k.Plane;
1763
+ _displayMode = V.Plane;
1728
1764
  /** Выбранный объект на сцене. */
1729
1765
  _selectedObject = null;
1730
1766
  /** Слушатели событий по изменению выбранного объекта. */
1731
1767
  _selectedListeners = /* @__PURE__ */ new Set();
1768
+ /** Слушатели событий трансформации выбранного объекта. */
1769
+ _transformListeners = /* @__PURE__ */ new Set();
1732
1770
  constructor() {
1733
- Qe(this, {}, { autoBind: !0 });
1771
+ Je(this, {}, { autoBind: !0 });
1734
1772
  }
1735
1773
  /** @inheritdoc */
1736
1774
  getSelectMode() {
@@ -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 ? dt(t) : null;
1805
+ }
1806
+ /** @inheritdoc */
1764
1807
  setSelectedObject(t) {
1765
1808
  if (this._selectedObject !== t) {
1766
1809
  this._selectedObject = t;
@@ -1771,25 +1814,37 @@ 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
+ pe = ps([
1776
1827
  u()
1777
- ], _e);
1828
+ ], pe);
1778
1829
  let je = !1;
1779
- 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");
1830
+ const d = qe.createChildContainer();
1831
+ function us(t) {
1832
+ return je || (d.registerInstance("Canvas", t), d.registerSingleton("EventBus", G), d.registerSingleton("EditorRenderer", K), d.registerSingleton("RendererApi", de), d.registerSingleton("IDisplayHandler", te), d.registerSingleton("ISelectHandler", se), d.registerSingleton("ISelectHandler", ie), d.registerSingleton("ISelectHandler", he), d.registerSingleton("ISelectHandler", re), d.registerSingleton("IToolHandler", oe), d.registerSingleton("IToolHandler", ne), d.registerSingleton("IToolHandler", ae), d.registerSingleton("ISceneHandler", le), d.registerSingleton("ISceneHandler", ce), d.registerSingleton("IDisplayManager", q), d.registerSingleton("ISelectManager", Q), d.registerSingleton("IToolManager", J), d.registerSingleton("ISceneManager", ee), d.registerSingleton("EditorHub", _e), d.registerSingleton("IEditorStore", pe), je = !0), d;
1785
1833
  }
1834
+ let j = null;
1835
+ const Ss = (t) => (j || (j = us(t)), j.resolve("EditorHub")), Ps = () => {
1836
+ if (!j)
1837
+ throw new Error("EditorHub is not initialized. Call createAppHub(canvas) first.");
1838
+ return j.resolve("EditorHub");
1839
+ };
1786
1840
  export {
1787
- de as EditorHub,
1788
- G as EditorRenderer,
1789
- X as EventBus,
1790
- R as EventTopics,
1791
- Ms as ObjLoader,
1792
- ys as PreviewRenderer,
1793
- Ie as Renderer,
1794
- Es as createAppHub
1841
+ _e as EditorHub,
1842
+ K as EditorRenderer,
1843
+ G as EventBus,
1844
+ H as EventTopics,
1845
+ ws as ObjLoader,
1846
+ Es as PreviewRenderer,
1847
+ He as Renderer,
1848
+ Ss as createAppHub,
1849
+ Ps as getAppHub
1795
1850
  };