@planara/core 3.1.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/dist/core/renderer.d.ts +6 -4
  2. package/dist/core/renderer.d.ts.map +1 -1
  3. package/dist/handlers/benchmark/base-benchmark-handler.d.ts +81 -0
  4. package/dist/handlers/benchmark/base-benchmark-handler.d.ts.map +1 -0
  5. package/dist/handlers/benchmark/heavy-benchmark-handler.d.ts +33 -0
  6. package/dist/handlers/benchmark/heavy-benchmark-handler.d.ts.map +1 -0
  7. package/dist/handlers/benchmark/index.d.ts +6 -0
  8. package/dist/handlers/benchmark/index.d.ts.map +1 -0
  9. package/dist/handlers/benchmark/light-benchmark-handler.d.ts +33 -0
  10. package/dist/handlers/benchmark/light-benchmark-handler.d.ts.map +1 -0
  11. package/dist/handlers/benchmark/medium-benchmark-handler.d.ts +33 -0
  12. package/dist/handlers/benchmark/medium-benchmark-handler.d.ts.map +1 -0
  13. package/dist/handlers/benchmark/mixed-benchmark-handler.d.ts +37 -0
  14. package/dist/handlers/benchmark/mixed-benchmark-handler.d.ts.map +1 -0
  15. package/dist/handlers/select/edge-select-handler.d.ts +1 -1
  16. package/dist/handlers/select/edge-select-handler.d.ts.map +1 -1
  17. package/dist/handlers/select/face-select-handler.d.ts +1 -1
  18. package/dist/handlers/select/face-select-handler.d.ts.map +1 -1
  19. package/dist/handlers/select/mesh-select-handler.d.ts +1 -1
  20. package/dist/handlers/select/mesh-select-handler.d.ts.map +1 -1
  21. package/dist/handlers/select/vertex-select-handler.d.ts +1 -1
  22. package/dist/handlers/select/vertex-select-handler.d.ts.map +1 -1
  23. package/dist/hub/benchmark-hub.d.ts +65 -0
  24. package/dist/hub/benchmark-hub.d.ts.map +1 -0
  25. package/dist/hub/editor-hub.d.ts +3 -3
  26. package/dist/hub/editor-hub.d.ts.map +1 -1
  27. package/dist/hub/index.d.ts +13 -1
  28. package/dist/hub/index.d.ts.map +1 -1
  29. package/dist/hub/viewer-hub.d.ts +3 -3
  30. package/dist/hub/viewer-hub.d.ts.map +1 -1
  31. package/dist/index.cjs.js +18 -18
  32. package/dist/index.d.ts +13 -20
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.es.js +2024 -1143
  35. package/dist/index.full.d.ts +214 -46
  36. package/dist/index.public.d.ts +214 -46
  37. package/dist/index.umd.js +18 -18
  38. package/dist/interfaces/api/index.d.ts +3 -0
  39. package/dist/interfaces/api/index.d.ts.map +1 -1
  40. package/dist/interfaces/api/interaction-api.d.ts +26 -0
  41. package/dist/interfaces/api/interaction-api.d.ts.map +1 -0
  42. package/dist/interfaces/api/metrics-api.d.ts +49 -0
  43. package/dist/interfaces/api/metrics-api.d.ts.map +1 -0
  44. package/dist/interfaces/api/renderer/index.d.ts +1 -0
  45. package/dist/interfaces/api/renderer/index.d.ts.map +1 -1
  46. package/dist/interfaces/api/renderer/renderer-info-access.d.ts +20 -0
  47. package/dist/interfaces/api/renderer/renderer-info-access.d.ts.map +1 -0
  48. package/dist/interfaces/api/renderer-info-api.d.ts +19 -0
  49. package/dist/interfaces/api/renderer-info-api.d.ts.map +1 -0
  50. package/dist/interfaces/api/scene-api.d.ts +2 -1
  51. package/dist/interfaces/api/scene-api.d.ts.map +1 -1
  52. package/dist/interfaces/handler/benchmark-handler.d.ts +22 -0
  53. package/dist/interfaces/handler/benchmark-handler.d.ts.map +1 -0
  54. package/dist/interfaces/handler/index.d.ts +1 -0
  55. package/dist/interfaces/handler/index.d.ts.map +1 -1
  56. package/dist/interfaces/manager/benchmark-manager.d.ts +10 -0
  57. package/dist/interfaces/manager/benchmark-manager.d.ts.map +1 -0
  58. package/dist/interfaces/manager/index.d.ts +1 -0
  59. package/dist/interfaces/manager/index.d.ts.map +1 -1
  60. package/dist/interfaces/module/index.d.ts +2 -0
  61. package/dist/interfaces/module/index.d.ts.map +1 -1
  62. package/dist/interfaces/module/interactive-module.d.ts +32 -0
  63. package/dist/interfaces/module/interactive-module.d.ts.map +1 -0
  64. package/dist/interfaces/module/observer-module.d.ts +27 -0
  65. package/dist/interfaces/module/observer-module.d.ts.map +1 -0
  66. package/dist/interfaces/store/index.d.ts +1 -0
  67. package/dist/interfaces/store/index.d.ts.map +1 -1
  68. package/dist/interfaces/store/metrics-store.d.ts +60 -0
  69. package/dist/interfaces/store/metrics-store.d.ts.map +1 -0
  70. package/dist/interfaces/{controller → worker}/index.d.ts +4 -4
  71. package/dist/interfaces/worker/index.d.ts.map +1 -0
  72. package/dist/managers/benchmark/benchmark-manager.d.ts +27 -0
  73. package/dist/managers/benchmark/benchmark-manager.d.ts.map +1 -0
  74. package/dist/managers/benchmark/index.d.ts +2 -0
  75. package/dist/managers/benchmark/index.d.ts.map +1 -0
  76. package/dist/managers/index.d.ts +1 -0
  77. package/dist/managers/index.d.ts.map +1 -1
  78. package/dist/managers/select/select-manager.d.ts +1 -1
  79. package/dist/managers/select/select-manager.d.ts.map +1 -1
  80. package/dist/modules/controls-module.d.ts +30 -5
  81. package/dist/modules/controls-module.d.ts.map +1 -1
  82. package/dist/modules/gizmo-module.d.ts +17 -3
  83. package/dist/modules/gizmo-module.d.ts.map +1 -1
  84. package/dist/modules/index.d.ts +1 -0
  85. package/dist/modules/index.d.ts.map +1 -1
  86. package/dist/modules/metrics-module.d.ts +156 -0
  87. package/dist/modules/metrics-module.d.ts.map +1 -0
  88. package/dist/modules/raycast-module.d.ts +21 -4
  89. package/dist/modules/raycast-module.d.ts.map +1 -1
  90. package/dist/{api → shared/api}/modules/controls-state-api.d.ts +1 -1
  91. package/dist/shared/api/modules/controls-state-api.d.ts.map +1 -0
  92. package/dist/{api → shared/api}/modules/index.d.ts +1 -0
  93. package/dist/shared/api/modules/index.d.ts.map +1 -0
  94. package/dist/shared/api/modules/interaction-api.d.ts +21 -0
  95. package/dist/shared/api/modules/interaction-api.d.ts.map +1 -0
  96. package/dist/{api → shared/api}/modules/mesh-api.d.ts +1 -1
  97. package/dist/shared/api/modules/mesh-api.d.ts.map +1 -0
  98. package/dist/{api → shared/api}/modules/raycast-api.d.ts +1 -1
  99. package/dist/shared/api/modules/raycast-api.d.ts.map +1 -0
  100. package/dist/{api → shared/api}/modules/transform-api.d.ts +2 -2
  101. package/dist/shared/api/modules/transform-api.d.ts.map +1 -0
  102. package/dist/{api → shared/api}/renderer/camera-api.d.ts +2 -2
  103. package/dist/shared/api/renderer/camera-api.d.ts.map +1 -0
  104. package/dist/{api → shared/api}/renderer/dom-api.d.ts +2 -2
  105. package/dist/shared/api/renderer/dom-api.d.ts.map +1 -0
  106. package/dist/{api → shared/api}/renderer/index.d.ts +1 -0
  107. package/dist/shared/api/renderer/index.d.ts.map +1 -0
  108. package/dist/shared/api/renderer/renderer-info-api.d.ts +25 -0
  109. package/dist/shared/api/renderer/renderer-info-api.d.ts.map +1 -0
  110. package/dist/{api → shared/api}/renderer/scene-api.d.ts +21 -3
  111. package/dist/shared/api/renderer/scene-api.d.ts.map +1 -0
  112. package/dist/shared/constants/benchmark.d.ts +5 -0
  113. package/dist/shared/constants/benchmark.d.ts.map +1 -0
  114. package/dist/shared/constants/colors.d.ts.map +1 -0
  115. package/dist/shared/constants/figure-geometries.d.ts.map +1 -0
  116. package/dist/{constants → shared/constants}/index.d.ts +1 -0
  117. package/dist/shared/constants/index.d.ts.map +1 -0
  118. package/dist/shared/constants/layers.d.ts.map +1 -0
  119. package/dist/shared/constants/messages.d.ts.map +1 -0
  120. package/dist/shared/constants/threshold.d.ts.map +1 -0
  121. package/dist/shared/decorators/index.d.ts.map +1 -0
  122. package/dist/{decorators → shared/decorators}/use-policy.d.ts +1 -1
  123. package/dist/shared/decorators/use-policy.d.ts.map +1 -0
  124. package/dist/{decorators → shared/decorators}/use-validator.d.ts +1 -1
  125. package/dist/shared/decorators/use-validator.d.ts.map +1 -0
  126. package/dist/shared/errors/index.d.ts.map +1 -0
  127. package/dist/shared/errors/policy-error.d.ts.map +1 -0
  128. package/dist/shared/errors/validation-error.d.ts.map +1 -0
  129. package/dist/shared/events/editor-events.d.ts.map +1 -0
  130. package/dist/shared/events/event-bus.d.ts.map +1 -0
  131. package/dist/shared/events/event-topics.d.ts.map +1 -0
  132. package/dist/shared/events/index.d.ts.map +1 -0
  133. package/dist/shared/ioc/container.d.ts +10 -0
  134. package/dist/shared/ioc/container.d.ts.map +1 -0
  135. package/dist/shared/loaders/obj-loader.d.ts.map +1 -0
  136. package/dist/shared/policy/index.d.ts.map +1 -0
  137. package/dist/{policy → shared/policy}/tool-policy.d.ts +2 -2
  138. package/dist/shared/policy/tool-policy.d.ts.map +1 -0
  139. package/dist/shared/utils/default-renderer-config.d.ts.map +1 -0
  140. package/dist/shared/utils/helpers.d.ts.map +1 -0
  141. package/dist/shared/utils/index.d.ts.map +1 -0
  142. package/dist/shared/validators/index.d.ts.map +1 -0
  143. package/dist/{validators → shared/validators}/obj-validator.d.ts +1 -1
  144. package/dist/shared/validators/obj-validator.d.ts.map +1 -0
  145. package/dist/store/index.d.ts +1 -0
  146. package/dist/store/index.d.ts.map +1 -1
  147. package/dist/store/metrics-store.d.ts +32 -0
  148. package/dist/store/metrics-store.d.ts.map +1 -0
  149. package/dist/types/feature/feature-type.d.ts +3 -1
  150. package/dist/types/feature/feature-type.d.ts.map +1 -1
  151. package/dist/types/listener/index.d.ts +1 -0
  152. package/dist/types/listener/index.d.ts.map +1 -1
  153. package/dist/types/listener/metrics-listener.d.ts +4 -0
  154. package/dist/types/listener/metrics-listener.d.ts.map +1 -0
  155. package/dist/types/renderer/index.d.ts +2 -0
  156. package/dist/types/renderer/index.d.ts.map +1 -0
  157. package/dist/types/renderer/renderer-info-metrics.d.ts +8 -0
  158. package/dist/types/renderer/renderer-info-metrics.d.ts.map +1 -0
  159. package/dist/workers/index.d.ts +2 -0
  160. package/dist/workers/index.d.ts.map +1 -0
  161. package/dist/{controllers/renderer-controller.d.ts → workers/renderer-worker.d.ts} +10 -7
  162. package/dist/workers/renderer-worker.d.ts.map +1 -0
  163. package/package.json +3 -3
  164. package/dist/api/modules/controls-state-api.d.ts.map +0 -1
  165. package/dist/api/modules/index.d.ts.map +0 -1
  166. package/dist/api/modules/mesh-api.d.ts.map +0 -1
  167. package/dist/api/modules/raycast-api.d.ts.map +0 -1
  168. package/dist/api/modules/transform-api.d.ts.map +0 -1
  169. package/dist/api/renderer/camera-api.d.ts.map +0 -1
  170. package/dist/api/renderer/dom-api.d.ts.map +0 -1
  171. package/dist/api/renderer/index.d.ts.map +0 -1
  172. package/dist/api/renderer/scene-api.d.ts.map +0 -1
  173. package/dist/constants/colors.d.ts.map +0 -1
  174. package/dist/constants/figure-geometries.d.ts.map +0 -1
  175. package/dist/constants/index.d.ts.map +0 -1
  176. package/dist/constants/layers.d.ts.map +0 -1
  177. package/dist/constants/messages.d.ts.map +0 -1
  178. package/dist/constants/threshold.d.ts.map +0 -1
  179. package/dist/controllers/index.d.ts +0 -2
  180. package/dist/controllers/index.d.ts.map +0 -1
  181. package/dist/controllers/renderer-controller.d.ts.map +0 -1
  182. package/dist/decorators/index.d.ts.map +0 -1
  183. package/dist/decorators/use-policy.d.ts.map +0 -1
  184. package/dist/decorators/use-validator.d.ts.map +0 -1
  185. package/dist/errors/index.d.ts.map +0 -1
  186. package/dist/errors/policy-error.d.ts.map +0 -1
  187. package/dist/errors/validation-error.d.ts.map +0 -1
  188. package/dist/events/editor-events.d.ts.map +0 -1
  189. package/dist/events/event-bus.d.ts.map +0 -1
  190. package/dist/events/event-topics.d.ts.map +0 -1
  191. package/dist/events/index.d.ts.map +0 -1
  192. package/dist/interfaces/controller/index.d.ts.map +0 -1
  193. package/dist/ioc/container.d.ts +0 -7
  194. package/dist/ioc/container.d.ts.map +0 -1
  195. package/dist/loaders/obj-loader.d.ts.map +0 -1
  196. package/dist/policy/index.d.ts.map +0 -1
  197. package/dist/policy/tool-policy.d.ts.map +0 -1
  198. package/dist/utils/default-renderer-config.d.ts.map +0 -1
  199. package/dist/utils/helpers.d.ts.map +0 -1
  200. package/dist/utils/index.d.ts.map +0 -1
  201. package/dist/validators/index.d.ts.map +0 -1
  202. package/dist/validators/obj-validator.d.ts.map +0 -1
  203. /package/dist/{constants → shared/constants}/colors.d.ts +0 -0
  204. /package/dist/{constants → shared/constants}/figure-geometries.d.ts +0 -0
  205. /package/dist/{constants → shared/constants}/layers.d.ts +0 -0
  206. /package/dist/{constants → shared/constants}/messages.d.ts +0 -0
  207. /package/dist/{constants → shared/constants}/threshold.d.ts +0 -0
  208. /package/dist/{decorators → shared/decorators}/index.d.ts +0 -0
  209. /package/dist/{errors → shared/errors}/index.d.ts +0 -0
  210. /package/dist/{errors → shared/errors}/policy-error.d.ts +0 -0
  211. /package/dist/{errors → shared/errors}/validation-error.d.ts +0 -0
  212. /package/dist/{events → shared/events}/editor-events.d.ts +0 -0
  213. /package/dist/{events → shared/events}/event-bus.d.ts +0 -0
  214. /package/dist/{events → shared/events}/event-topics.d.ts +0 -0
  215. /package/dist/{events → shared/events}/index.d.ts +0 -0
  216. /package/dist/{loaders → shared/loaders}/obj-loader.d.ts +0 -0
  217. /package/dist/{policy → shared/policy}/index.d.ts +0 -0
  218. /package/dist/{utils → shared/utils}/default-renderer-config.d.ts +0 -0
  219. /package/dist/{utils → shared/utils}/helpers.d.ts +0 -0
  220. /package/dist/{utils → shared/utils}/index.d.ts +0 -0
  221. /package/dist/{validators → shared/validators}/index.d.ts +0 -0
package/dist/index.es.js CHANGED
@@ -1,13 +1,13 @@
1
1
  import "reflect-metadata";
2
- import * as l from "three";
3
- import { Loader as Ut, FileLoader as Nt, Color as St, SRGBColorSpace as wt, Group as Xt, BufferGeometry as it, Float32BufferAttribute as X, LineBasicMaterial as Se, Material as nt, PointsMaterial as ee, MeshPhongMaterial as Yt, LineSegments as ot, Points as we, Mesh as at, Vector3 as W, Vector2 as qt, Matrix3 as Zt, ColorManagement as Kt } from "three";
4
- import { injectable as w, inject as _, injectAll as B, container as Jt } from "tsyringe";
5
- import { FigureType as L, Figure as Qt, SelectMode as P, DisplayMode as K, SceneMode as T, ToolType as U, DEFAULT_TOOL_RULES as es, ResponseType as G } from "@planara/types";
6
- import { OrbitWithState as ts, ModelingTransformControls as ss, CameraAxesGizmo as rs, SymmetricAxesHelper as is } from "@planara/three";
7
- import { EventEmitter as ns } from "events";
8
- import { makeAutoObservable as At, observable as os } from "mobx";
9
- const as = /^[og]\s*(.+)?/, ls = /^mtllib /, cs = /^usemtl /, hs = /^usemap /, lt = /\s+/, ct = new W(), Ae = new W(), ht = new W(), dt = new W(), j = new W(), te = new St();
10
- function ds() {
2
+ import * as a from "three";
3
+ import { Loader as wr, FileLoader as Sr, Color as Kt, SRGBColorSpace as qt, Group as xr, BufferGeometry as Ct, Float32BufferAttribute as U, LineBasicMaterial as we, Material as Ot, PointsMaterial as te, MeshPhongMaterial as Ar, LineSegments as Et, Points as Se, Mesh as Pt, Vector3 as z, Vector2 as Ir, Matrix3 as Cr, ColorManagement as Or } from "three";
4
+ import { injectable as v, inject as c, injectAll as H, container as Er } from "tsyringe";
5
+ import { FigureType as E, Figure as Pr, SelectMode as O, DisplayMode as J, SceneMode as T, ToolType as W, BenchmarkTestType as X, BenchmarkTestStatus as Pe, DEFAULT_TOOL_RULES as Lr, ResponseType as G } from "@planara/types";
6
+ import { OrbitWithState as Tr, ModelingTransformControls as Dr, CameraAxesGizmo as jr, SymmetricAxesHelper as Vr } from "@planara/three";
7
+ import { EventEmitter as Hr } from "events";
8
+ import { makeAutoObservable as bt, observable as $r } from "mobx";
9
+ const Rr = /^[og]\s*(.+)?/, Br = /^mtllib /, Fr = /^usemtl /, kr = /^usemap /, Lt = /\s+/, Tt = new z(), xe = new z(), Dt = new z(), jt = new z(), V = new z(), re = new Kt();
10
+ function Gr() {
11
11
  const e = {
12
12
  objects: [],
13
13
  object: {},
@@ -17,15 +17,15 @@ function ds() {
17
17
  uvs: [],
18
18
  materials: {},
19
19
  materialLibraries: [],
20
- startObject: function(t, s) {
20
+ startObject: function(t, r) {
21
21
  if (this.object && this.object.fromDeclaration === !1) {
22
- this.object.name = t, this.object.fromDeclaration = s !== !1;
22
+ this.object.name = t, this.object.fromDeclaration = r !== !1;
23
23
  return;
24
24
  }
25
- const r = this.object && typeof this.object.currentMaterial == "function" ? this.object.currentMaterial() : void 0;
25
+ const s = this.object && typeof this.object.currentMaterial == "function" ? this.object.currentMaterial() : void 0;
26
26
  if (this.object && typeof this.object._finalize == "function" && this.object._finalize(!0), this.object = {
27
27
  name: t || "",
28
- fromDeclaration: s !== !1,
28
+ fromDeclaration: r !== !1,
29
29
  geometry: {
30
30
  vertices: [],
31
31
  normals: [],
@@ -38,7 +38,7 @@ function ds() {
38
38
  startMaterial: function(i, n) {
39
39
  const o = this._finalize(!1);
40
40
  o && (o.inherited || o.groupCount <= 0) && this.materials.splice(o.index, 1);
41
- const c = {
41
+ const l = {
42
42
  index: this.materials.length,
43
43
  name: i || "",
44
44
  mtllib: Array.isArray(n) && n.length > 0 ? n[n.length - 1] : "",
@@ -47,9 +47,9 @@ function ds() {
47
47
  groupEnd: -1,
48
48
  groupCount: -1,
49
49
  inherited: !1,
50
- clone: function(u) {
50
+ clone: function(h) {
51
51
  const d = {
52
- index: typeof u == "number" ? u : this.index,
52
+ index: typeof h == "number" ? h : this.index,
53
53
  name: this.name,
54
54
  mtllib: this.mtllib,
55
55
  smooth: this.smooth,
@@ -61,7 +61,7 @@ function ds() {
61
61
  return d.clone = this.clone.bind(d), d;
62
62
  }
63
63
  };
64
- return this.materials.push(c), c;
64
+ return this.materials.push(l), l;
65
65
  },
66
66
  currentMaterial: function() {
67
67
  if (this.materials.length > 0)
@@ -77,8 +77,8 @@ function ds() {
77
77
  smooth: this.smooth
78
78
  }), n;
79
79
  }
80
- }, r && r.name && typeof r.clone == "function") {
81
- const i = r.clone(0);
80
+ }, s && s.name && typeof s.clone == "function") {
81
+ const i = s.clone(0);
82
82
  i.inherited = !0, this.object.materials.push(i);
83
83
  }
84
84
  this.objects.push(this.object);
@@ -86,88 +86,88 @@ function ds() {
86
86
  finalize: function() {
87
87
  this.object && typeof this.object._finalize == "function" && this.object._finalize(!0);
88
88
  },
89
- parseVertexIndex: function(t, s) {
90
- const r = parseInt(t, 10);
91
- return (r >= 0 ? r - 1 : r + s / 3) * 3;
89
+ parseVertexIndex: function(t, r) {
90
+ const s = parseInt(t, 10);
91
+ return (s >= 0 ? s - 1 : s + r / 3) * 3;
92
92
  },
93
- parseNormalIndex: function(t, s) {
94
- const r = parseInt(t, 10);
95
- return (r >= 0 ? r - 1 : r + s / 3) * 3;
93
+ parseNormalIndex: function(t, r) {
94
+ const s = parseInt(t, 10);
95
+ return (s >= 0 ? s - 1 : s + r / 3) * 3;
96
96
  },
97
- parseUVIndex: function(t, s) {
98
- const r = parseInt(t, 10);
99
- return (r >= 0 ? r - 1 : r + s / 2) * 2;
97
+ parseUVIndex: function(t, r) {
98
+ const s = parseInt(t, 10);
99
+ return (s >= 0 ? s - 1 : s + r / 2) * 2;
100
100
  },
101
- addVertex: function(t, s, r) {
101
+ addVertex: function(t, r, s) {
102
102
  const i = this.vertices, n = this.object.geometry.vertices;
103
- n.push(i[t + 0], i[t + 1], i[t + 2]), n.push(i[s + 0], i[s + 1], i[s + 2]), n.push(i[r + 0], i[r + 1], i[r + 2]);
103
+ n.push(i[t + 0], i[t + 1], i[t + 2]), n.push(i[r + 0], i[r + 1], i[r + 2]), n.push(i[s + 0], i[s + 1], i[s + 2]);
104
104
  },
105
105
  addVertexPoint: function(t) {
106
- const s = this.vertices;
107
- this.object.geometry.vertices.push(s[t + 0], s[t + 1], s[t + 2]);
106
+ const r = this.vertices;
107
+ this.object.geometry.vertices.push(r[t + 0], r[t + 1], r[t + 2]);
108
108
  },
109
109
  addVertexLine: function(t) {
110
- const s = this.vertices;
111
- this.object.geometry.vertices.push(s[t + 0], s[t + 1], s[t + 2]);
110
+ const r = this.vertices;
111
+ this.object.geometry.vertices.push(r[t + 0], r[t + 1], r[t + 2]);
112
112
  },
113
- addNormal: function(t, s, r) {
113
+ addNormal: function(t, r, s) {
114
114
  const i = this.normals, n = this.object.geometry.normals;
115
- n.push(i[t + 0], i[t + 1], i[t + 2]), n.push(i[s + 0], i[s + 1], i[s + 2]), n.push(i[r + 0], i[r + 1], i[r + 2]);
115
+ n.push(i[t + 0], i[t + 1], i[t + 2]), n.push(i[r + 0], i[r + 1], i[r + 2]), n.push(i[s + 0], i[s + 1], i[s + 2]);
116
116
  },
117
- addFaceNormal: function(t, s, r) {
117
+ addFaceNormal: function(t, r, s) {
118
118
  const i = this.vertices, n = this.object.geometry.normals;
119
- ct.fromArray(i, t), Ae.fromArray(i, s), ht.fromArray(i, r), j.subVectors(ht, Ae), dt.subVectors(ct, Ae), j.cross(dt), j.normalize(), n.push(j.x, j.y, j.z), n.push(j.x, j.y, j.z), n.push(j.x, j.y, j.z);
119
+ Tt.fromArray(i, t), xe.fromArray(i, r), Dt.fromArray(i, s), V.subVectors(Dt, xe), jt.subVectors(Tt, xe), V.cross(jt), V.normalize(), n.push(V.x, V.y, V.z), n.push(V.x, V.y, V.z), n.push(V.x, V.y, V.z);
120
120
  },
121
- addColor: function(t, s, r) {
121
+ addColor: function(t, r, s) {
122
122
  const i = this.colors, n = this.object.geometry.colors;
123
- i[t] !== void 0 && n.push(i[t + 0], i[t + 1], i[t + 2]), i[s] !== void 0 && n.push(i[s + 0], i[s + 1], i[s + 2]), i[r] !== void 0 && n.push(i[r + 0], i[r + 1], i[r + 2]);
123
+ i[t] !== void 0 && n.push(i[t + 0], i[t + 1], i[t + 2]), i[r] !== void 0 && n.push(i[r + 0], i[r + 1], i[r + 2]), i[s] !== void 0 && n.push(i[s + 0], i[s + 1], i[s + 2]);
124
124
  },
125
- addUV: function(t, s, r) {
125
+ addUV: function(t, r, s) {
126
126
  const i = this.uvs, n = this.object.geometry.uvs;
127
- n.push(i[t + 0], i[t + 1]), n.push(i[s + 0], i[s + 1]), n.push(i[r + 0], i[r + 1]);
127
+ n.push(i[t + 0], i[t + 1]), n.push(i[r + 0], i[r + 1]), n.push(i[s + 0], i[s + 1]);
128
128
  },
129
129
  addDefaultUV: function() {
130
130
  const t = this.object.geometry.uvs;
131
131
  t.push(0, 0), t.push(0, 0), t.push(0, 0);
132
132
  },
133
133
  addUVLine: function(t) {
134
- const s = this.uvs;
135
- this.object.geometry.uvs.push(s[t + 0], s[t + 1]);
134
+ const r = this.uvs;
135
+ this.object.geometry.uvs.push(r[t + 0], r[t + 1]);
136
136
  },
137
- addFace: function(t, s, r, i, n, o, c, u, d) {
138
- const m = this.vertices.length;
139
- let p = this.parseVertexIndex(t, m), g = this.parseVertexIndex(s, m), f = this.parseVertexIndex(r, m);
140
- if (this.addVertex(p, g, f), this.addColor(p, g, f), c !== void 0 && c !== "") {
141
- const h = this.normals.length;
142
- p = this.parseNormalIndex(c, h), g = this.parseNormalIndex(u, h), f = this.parseNormalIndex(d, h), this.addNormal(p, g, f);
137
+ addFace: function(t, r, s, i, n, o, l, h, d) {
138
+ const p = this.vertices.length;
139
+ let u = this.parseVertexIndex(t, p), m = this.parseVertexIndex(r, p), f = this.parseVertexIndex(s, p);
140
+ if (this.addVertex(u, m, f), this.addColor(u, m, f), l !== void 0 && l !== "") {
141
+ const _ = this.normals.length;
142
+ u = this.parseNormalIndex(l, _), m = this.parseNormalIndex(h, _), f = this.parseNormalIndex(d, _), this.addNormal(u, m, f);
143
143
  } else
144
- this.addFaceNormal(p, g, f);
144
+ this.addFaceNormal(u, m, f);
145
145
  if (i !== void 0 && i !== "") {
146
- const h = this.uvs.length;
147
- p = this.parseUVIndex(i, h), g = this.parseUVIndex(n, h), f = this.parseUVIndex(o, h), this.addUV(p, g, f), this.object.geometry.hasUVIndices = !0;
146
+ const _ = this.uvs.length;
147
+ u = this.parseUVIndex(i, _), m = this.parseUVIndex(n, _), f = this.parseUVIndex(o, _), this.addUV(u, m, f), this.object.geometry.hasUVIndices = !0;
148
148
  } else
149
149
  this.addDefaultUV();
150
150
  },
151
151
  addPointGeometry: function(t) {
152
152
  this.object.geometry.type = "Points";
153
- const s = this.vertices.length;
154
- for (let r = 0, i = t.length; r < i; r++) {
155
- const n = this.parseVertexIndex(t[r], s);
153
+ const r = this.vertices.length;
154
+ for (let s = 0, i = t.length; s < i; s++) {
155
+ const n = this.parseVertexIndex(t[s], r);
156
156
  this.addVertexPoint(n), this.addColor(n);
157
157
  }
158
158
  },
159
- addLineGeometry: function(t, s) {
159
+ addLineGeometry: function(t, r) {
160
160
  this.object.geometry.type = "Line";
161
- const r = this.vertices.length, i = this.uvs.length;
161
+ const s = this.vertices.length, i = this.uvs.length;
162
162
  for (let n = 0, o = t.length; n < o; n++)
163
- this.addVertexLine(this.parseVertexIndex(t[n], r));
164
- for (let n = 0, o = s.length; n < o; n++)
165
- this.addUVLine(this.parseUVIndex(s[n], i));
163
+ this.addVertexLine(this.parseVertexIndex(t[n], s));
164
+ for (let n = 0, o = r.length; n < o; n++)
165
+ this.addUVLine(this.parseUVIndex(r[n], i));
166
166
  }
167
167
  };
168
168
  return e.startObject("", !1), e;
169
169
  }
170
- class us extends Ut {
170
+ class zr extends wr {
171
171
  /**
172
172
  * Constructs a new OBJ loader.
173
173
  *
@@ -185,15 +185,15 @@ class us extends Ut {
185
185
  * @param {onProgressCallback} onProgress - Executed while the loading is in progress.
186
186
  * @param {onErrorCallback} onError - Executed when errors occur.
187
187
  */
188
- load(t, s, r, i) {
189
- const n = this, o = new Nt(this.manager);
190
- o.setPath(this.path), o.setRequestHeader(this.requestHeader), o.setWithCredentials(this.withCredentials), o.load(t, function(c) {
188
+ load(t, r, s, i) {
189
+ const n = this, o = new Sr(this.manager);
190
+ o.setPath(this.path), o.setRequestHeader(this.requestHeader), o.setWithCredentials(this.withCredentials), o.load(t, function(l) {
191
191
  try {
192
- s(n.parse(c));
193
- } catch (u) {
194
- i ? i(u) : console.error(u), n.manager.itemError(t);
192
+ r(n.parse(l));
193
+ } catch (h) {
194
+ i ? i(h) : console.error(h), n.manager.itemError(t);
195
195
  }
196
- }, r, i);
196
+ }, s, i);
197
197
  }
198
198
  /**
199
199
  * Sets the material creator for this OBJ. This object is loaded via {@link MTLLoader}.
@@ -211,277 +211,277 @@ class us extends Ut {
211
211
  * @return {Group} The parsed OBJ.
212
212
  */
213
213
  parse(t) {
214
- const s = new ds();
214
+ const r = new Gr();
215
215
  t.indexOf(`\r
216
216
  `) !== -1 && (t = t.replace(/\r\n/g, `
217
217
  `)), t.indexOf(`\\
218
218
  `) !== -1 && (t = t.replace(/\\\n/g, ""));
219
- const r = t.split(`
219
+ const s = t.split(`
220
220
  `);
221
221
  let i = [];
222
- for (let c = 0, u = r.length; c < u; c++) {
223
- const d = r[c].trimStart();
222
+ for (let l = 0, h = s.length; l < h; l++) {
223
+ const d = s[l].trimStart();
224
224
  if (d.length === 0) continue;
225
- const m = d.charAt(0);
226
- if (m !== "#")
227
- if (m === "v") {
228
- const p = d.split(lt);
229
- switch (p[0]) {
225
+ const p = d.charAt(0);
226
+ if (p !== "#")
227
+ if (p === "v") {
228
+ const u = d.split(Lt);
229
+ switch (u[0]) {
230
230
  case "v":
231
- s.vertices.push(
232
- parseFloat(p[1]),
233
- parseFloat(p[2]),
234
- parseFloat(p[3])
235
- ), p.length >= 7 ? (te.setRGB(
236
- parseFloat(p[4]),
237
- parseFloat(p[5]),
238
- parseFloat(p[6]),
239
- wt
240
- ), s.colors.push(te.r, te.g, te.b)) : s.colors.push(void 0, void 0, void 0);
231
+ r.vertices.push(
232
+ parseFloat(u[1]),
233
+ parseFloat(u[2]),
234
+ parseFloat(u[3])
235
+ ), u.length >= 7 ? (re.setRGB(
236
+ parseFloat(u[4]),
237
+ parseFloat(u[5]),
238
+ parseFloat(u[6]),
239
+ qt
240
+ ), r.colors.push(re.r, re.g, re.b)) : r.colors.push(void 0, void 0, void 0);
241
241
  break;
242
242
  case "vn":
243
- s.normals.push(
244
- parseFloat(p[1]),
245
- parseFloat(p[2]),
246
- parseFloat(p[3])
243
+ r.normals.push(
244
+ parseFloat(u[1]),
245
+ parseFloat(u[2]),
246
+ parseFloat(u[3])
247
247
  );
248
248
  break;
249
249
  case "vt":
250
- s.uvs.push(
251
- parseFloat(p[1]),
252
- parseFloat(p[2])
250
+ r.uvs.push(
251
+ parseFloat(u[1]),
252
+ parseFloat(u[2])
253
253
  );
254
254
  break;
255
255
  }
256
- } else if (m === "f") {
257
- const g = d.slice(1).trim().split(lt), f = [];
258
- for (let v = 0, y = g.length; v < y; v++) {
259
- const A = g[v];
260
- if (A.length > 0) {
261
- const S = A.split("/");
256
+ } else if (p === "f") {
257
+ const m = d.slice(1).trim().split(Lt), f = [];
258
+ for (let g = 0, b = m.length; g < b; g++) {
259
+ const x = m[g];
260
+ if (x.length > 0) {
261
+ const S = x.split("/");
262
262
  f.push(S);
263
263
  }
264
264
  }
265
- const h = f[0];
266
- for (let v = 1, y = f.length - 1; v < y; v++) {
267
- const A = f[v], S = f[v + 1];
268
- s.addFace(
269
- h[0],
270
- A[0],
265
+ const _ = f[0];
266
+ for (let g = 1, b = f.length - 1; g < b; g++) {
267
+ const x = f[g], S = f[g + 1];
268
+ r.addFace(
269
+ _[0],
270
+ x[0],
271
271
  S[0],
272
- h[1],
273
- A[1],
272
+ _[1],
273
+ x[1],
274
274
  S[1],
275
- h[2],
276
- A[2],
275
+ _[2],
276
+ x[2],
277
277
  S[2]
278
278
  );
279
279
  }
280
- } else if (m === "l") {
281
- const p = d.substring(1).trim().split(" ");
282
- let g = [];
280
+ } else if (p === "l") {
281
+ const u = d.substring(1).trim().split(" ");
282
+ let m = [];
283
283
  const f = [];
284
284
  if (d.indexOf("/") === -1)
285
- g = p;
285
+ m = u;
286
286
  else
287
- for (let h = 0, v = p.length; h < v; h++) {
288
- const y = p[h].split("/");
289
- y[0] !== "" && g.push(y[0]), y[1] !== "" && f.push(y[1]);
287
+ for (let _ = 0, g = u.length; _ < g; _++) {
288
+ const b = u[_].split("/");
289
+ b[0] !== "" && m.push(b[0]), b[1] !== "" && f.push(b[1]);
290
290
  }
291
- s.addLineGeometry(g, f);
292
- } else if (m === "p") {
293
- const g = d.slice(1).trim().split(" ");
294
- s.addPointGeometry(g);
295
- } else if ((i = as.exec(d)) !== null) {
296
- const p = (" " + i[0].slice(1).trim()).slice(1);
297
- s.startObject(p);
298
- } else if (cs.test(d))
299
- s.object.startMaterial(d.substring(7).trim(), s.materialLibraries);
300
- else if (ls.test(d))
301
- s.materialLibraries.push(d.substring(7).trim());
302
- else if (hs.test(d))
291
+ r.addLineGeometry(m, f);
292
+ } else if (p === "p") {
293
+ const m = d.slice(1).trim().split(" ");
294
+ r.addPointGeometry(m);
295
+ } else if ((i = Rr.exec(d)) !== null) {
296
+ const u = (" " + i[0].slice(1).trim()).slice(1);
297
+ r.startObject(u);
298
+ } else if (Fr.test(d))
299
+ r.object.startMaterial(d.substring(7).trim(), r.materialLibraries);
300
+ else if (Br.test(d))
301
+ r.materialLibraries.push(d.substring(7).trim());
302
+ else if (kr.test(d))
303
303
  console.warn('THREE.OBJLoader: Rendering identifier "usemap" not supported. Textures must be defined in MTL files.');
304
- else if (m === "s") {
304
+ else if (p === "s") {
305
305
  if (i = d.split(" "), i.length > 1) {
306
- const g = i[1].trim().toLowerCase();
307
- s.object.smooth = g !== "0" && g !== "off";
306
+ const m = i[1].trim().toLowerCase();
307
+ r.object.smooth = m !== "0" && m !== "off";
308
308
  } else
309
- s.object.smooth = !0;
310
- const p = s.object.currentMaterial();
311
- p && (p.smooth = s.object.smooth);
309
+ r.object.smooth = !0;
310
+ const u = r.object.currentMaterial();
311
+ u && (u.smooth = r.object.smooth);
312
312
  } else {
313
313
  if (d === "\0") continue;
314
314
  console.warn('THREE.OBJLoader: Unexpected line: "' + d + '"');
315
315
  }
316
316
  }
317
- s.finalize();
318
- const n = new Xt();
319
- if (n.materialLibraries = [].concat(s.materialLibraries), !(s.objects.length === 1 && s.objects[0].geometry.vertices.length === 0) === !0)
320
- for (let c = 0, u = s.objects.length; c < u; c++) {
321
- const d = s.objects[c], m = d.geometry, p = d.materials, g = m.type === "Line", f = m.type === "Points";
322
- let h = !1;
323
- if (m.vertices.length === 0) continue;
324
- const v = new it();
325
- v.setAttribute("position", new X(m.vertices, 3)), m.normals.length > 0 && v.setAttribute("normal", new X(m.normals, 3)), m.colors.length > 0 && (h = !0, v.setAttribute("color", new X(m.colors, 3))), m.hasUVIndices === !0 && v.setAttribute("uv", new X(m.uvs, 2));
326
- const y = [];
327
- for (let S = 0, x = p.length; S < x; S++) {
328
- const b = p[S], C = b.name + "_" + b.smooth + "_" + h;
329
- let M = s.materials[C];
317
+ r.finalize();
318
+ const n = new xr();
319
+ if (n.materialLibraries = [].concat(r.materialLibraries), !(r.objects.length === 1 && r.objects[0].geometry.vertices.length === 0) === !0)
320
+ for (let l = 0, h = r.objects.length; l < h; l++) {
321
+ const d = r.objects[l], p = d.geometry, u = d.materials, m = p.type === "Line", f = p.type === "Points";
322
+ let _ = !1;
323
+ if (p.vertices.length === 0) continue;
324
+ const g = new Ct();
325
+ g.setAttribute("position", new U(p.vertices, 3)), p.normals.length > 0 && g.setAttribute("normal", new U(p.normals, 3)), p.colors.length > 0 && (_ = !0, g.setAttribute("color", new U(p.colors, 3))), p.hasUVIndices === !0 && g.setAttribute("uv", new U(p.uvs, 2));
326
+ const b = [];
327
+ for (let S = 0, w = u.length; S < w; S++) {
328
+ const M = u[S], I = M.name + "_" + M.smooth + "_" + _;
329
+ let y = r.materials[I];
330
330
  if (this.materials !== null) {
331
- if (M = this.materials.create(b.name), g && M && !(M instanceof Se)) {
332
- const I = new Se();
333
- nt.prototype.copy.call(I, M), I.color.copy(M.color), M = I;
334
- } else if (f && M && !(M instanceof ee)) {
335
- const I = new ee({ size: 10, sizeAttenuation: !1 });
336
- nt.prototype.copy.call(I, M), I.color.copy(M.color), I.map = M.map, M = I;
331
+ if (y = this.materials.create(M.name), m && y && !(y instanceof we)) {
332
+ const C = new we();
333
+ Ot.prototype.copy.call(C, y), C.color.copy(y.color), y = C;
334
+ } else if (f && y && !(y instanceof te)) {
335
+ const C = new te({ size: 10, sizeAttenuation: !1 });
336
+ Ot.prototype.copy.call(C, y), C.color.copy(y.color), C.map = y.map, y = C;
337
337
  }
338
338
  }
339
- M === void 0 && (g ? M = new Se() : f ? M = new ee({ size: 1, sizeAttenuation: !1 }) : M = new Yt(), M.name = b.name, M.flatShading = !b.smooth, M.vertexColors = h, s.materials[C] = M), y.push(M);
339
+ y === void 0 && (m ? y = new we() : f ? y = new te({ size: 1, sizeAttenuation: !1 }) : y = new Ar(), y.name = M.name, y.flatShading = !M.smooth, y.vertexColors = _, r.materials[I] = y), b.push(y);
340
340
  }
341
- let A;
342
- if (y.length > 1) {
343
- for (let S = 0, x = p.length; S < x; S++) {
344
- const b = p[S];
345
- v.addGroup(b.groupStart, b.groupCount, S);
341
+ let x;
342
+ if (b.length > 1) {
343
+ for (let S = 0, w = u.length; S < w; S++) {
344
+ const M = u[S];
345
+ g.addGroup(M.groupStart, M.groupCount, S);
346
346
  }
347
- g ? A = new ot(v, y) : f ? A = new we(v, y) : A = new at(v, y);
347
+ m ? x = new Et(g, b) : f ? x = new Se(g, b) : x = new Pt(g, b);
348
348
  } else
349
- g ? A = new ot(v, y[0]) : f ? A = new we(v, y[0]) : A = new at(v, y[0]);
350
- A.name = d.name, n.add(A);
349
+ m ? x = new Et(g, b[0]) : f ? x = new Se(g, b[0]) : x = new Pt(g, b[0]);
350
+ x.name = d.name, n.add(x);
351
351
  }
352
- else if (s.vertices.length > 0) {
353
- const c = new ee({ size: 1, sizeAttenuation: !1 }), u = new it();
354
- u.setAttribute("position", new X(s.vertices, 3)), s.colors.length > 0 && s.colors[0] !== void 0 && (u.setAttribute("color", new X(s.colors, 3)), c.vertexColors = !0);
355
- const d = new we(u, c);
352
+ else if (r.vertices.length > 0) {
353
+ const l = new te({ size: 1, sizeAttenuation: !1 }), h = new Ct();
354
+ h.setAttribute("position", new U(r.vertices, 3)), r.colors.length > 0 && r.colors[0] !== void 0 && (h.setAttribute("color", new U(r.colors, 3)), l.vertexColors = !0);
355
+ const d = new Se(h, l);
356
356
  n.add(d);
357
357
  }
358
358
  return n;
359
359
  }
360
360
  }
361
- const Me = 16776960, xe = 16755200, _s = 2236962, ps = 2236962, ms = {
361
+ const be = 16776960, Me = 16755200, Wr = 2236962, Nr = 2236962, Ur = {
362
362
  /**
363
363
  * Плоскость (PlaneGeometry)
364
364
  * @returns Плоскость размером 1x1 с одной сегментацией
365
365
  */
366
- [L.Plane]: () => new l.PlaneGeometry(1, 1, 1, 1),
366
+ [E.Plane]: () => new a.PlaneGeometry(1, 1, 1, 1),
367
367
  /**
368
368
  * Куб (BoxGeometry)
369
369
  * @returns Куб размером 1x1x1 с одной сегментацией по каждой оси
370
370
  */
371
- [L.Cube]: () => new l.BoxGeometry(1, 1, 1, 1, 1, 1),
371
+ [E.Cube]: () => new a.BoxGeometry(1, 1, 1, 1, 1, 1),
372
372
  /**
373
373
  * Сфера (SphereGeometry)
374
374
  * @returns Сфера радиусом 0.5, 32 сегмента по ширине, 16 по высоте
375
375
  */
376
- [L.Sphere]: () => new l.SphereGeometry(0.5, 32, 16),
376
+ [E.Sphere]: () => new a.SphereGeometry(0.5, 32, 16),
377
377
  /**
378
378
  * UV-сфера (SphereGeometry) с гладкой поверхностью
379
379
  * @returns Сфера радиусом 0.5, 32 сегмента по ширине, 16 по высоте
380
380
  */
381
- [L.UVSphere]: () => new l.SphereGeometry(0.5, 32, 16),
381
+ [E.UVSphere]: () => new a.SphereGeometry(0.5, 32, 16),
382
382
  /**
383
383
  * Икосфера (IcosahedronGeometry) — сфера из треугольников
384
384
  * @returns Икосфера радиусом 0.5, уровень детализации 0
385
385
  */
386
- [L.Icosphere]: () => new l.IcosahedronGeometry(0.5, 0),
386
+ [E.Icosphere]: () => new a.IcosahedronGeometry(0.5, 0),
387
387
  /**
388
388
  * Цилиндр (CylinderGeometry)
389
389
  * @returns Цилиндр радиусом 0.5, высотой 1, 32 сегмента
390
390
  */
391
- [L.Cylinder]: () => new l.CylinderGeometry(0.5, 0.5, 1, 32, 1, !1),
391
+ [E.Cylinder]: () => new a.CylinderGeometry(0.5, 0.5, 1, 32, 1, !1),
392
392
  /**
393
393
  * Конус (ConeGeometry)
394
394
  * @returns Конус радиусом 0.5, высотой 1, 32 сегмента
395
395
  */
396
- [L.Cone]: () => new l.ConeGeometry(0.5, 1, 32, 1, !1),
396
+ [E.Cone]: () => new a.ConeGeometry(0.5, 1, 32, 1, !1),
397
397
  /**
398
398
  * Пирамида с квадратным основанием.
399
399
  * @returns Пирамида высотой 1 и радиусом основания 0.5
400
400
  */
401
- [L.Pyramid]: () => new l.ConeGeometry(0.5, 1, 4, 1, !1),
401
+ [E.Pyramid]: () => new a.ConeGeometry(0.5, 1, 4, 1, !1),
402
402
  /**
403
403
  * Тетраэдр (TetrahedronGeometry)
404
404
  * @returns Тетраэдр радиусом 0.5
405
405
  */
406
- [L.Tetrahedron]: () => new l.TetrahedronGeometry(0.5, 0),
406
+ [E.Tetrahedron]: () => new a.TetrahedronGeometry(0.5, 0),
407
407
  /**
408
408
  * Октаэдр (OctahedronGeometry)
409
409
  * @returns Октаэдр радиусом 0.5
410
410
  */
411
- [L.Octahedron]: () => new l.OctahedronGeometry(0.5, 0),
411
+ [E.Octahedron]: () => new a.OctahedronGeometry(0.5, 0),
412
412
  /**
413
413
  * Додекаэдр (DodecahedronGeometry)
414
414
  * @returns Додекаэдр радиусом 0.5
415
415
  */
416
- [L.Dodecahedron]: () => new l.DodecahedronGeometry(0.5, 0),
416
+ [E.Dodecahedron]: () => new a.DodecahedronGeometry(0.5, 0),
417
417
  /**
418
418
  * Тор (TorusGeometry)
419
419
  * @returns Тор радиусом 0.5, толщиной 0.2, 16 сегментов по радиусу, 64 по трубке
420
420
  */
421
- [L.Torus]: () => new l.TorusGeometry(0.5, 0.2, 16, 64),
421
+ [E.Torus]: () => new a.TorusGeometry(0.5, 0.2, 16, 64),
422
422
  /**
423
423
  * Тор-кнот (TorusKnotGeometry)
424
424
  * @returns Тор-кнот радиусом 0.4 и толщиной 0.12
425
425
  */
426
- [L.TorusKnot]: () => new l.TorusKnotGeometry(0.4, 0.12, 96, 16),
426
+ [E.TorusKnot]: () => new a.TorusKnotGeometry(0.4, 0.12, 96, 16),
427
427
  /**
428
428
  * Круг (CircleGeometry)
429
429
  * @returns Круг радиусом 0.5, 32 сегмента
430
430
  */
431
- [L.Circle]: () => new l.CircleGeometry(0.5, 32),
431
+ [E.Circle]: () => new a.CircleGeometry(0.5, 32),
432
432
  /**
433
433
  * Кольцо (RingGeometry)
434
434
  * @returns Кольцо с внутренним радиусом 0.25 и внешним радиусом 0.5
435
435
  */
436
- [L.Ring]: () => new l.RingGeometry(0.25, 0.5, 32),
436
+ [E.Ring]: () => new a.RingGeometry(0.25, 0.5, 32),
437
437
  /**
438
438
  * Капсула (CapsuleGeometry)
439
439
  * @returns Капсула радиусом 0.3 и длиной 0.8
440
440
  */
441
- [L.Capsule]: () => new l.CapsuleGeometry(0.3, 0.8, 8, 16),
441
+ [E.Capsule]: () => new a.CapsuleGeometry(0.3, 0.8, 8, 16),
442
442
  /**
443
443
  * Кастомная геометрия (не реализовано в фабрике)
444
444
  * @throws {Error} Всегда выбрасывает ошибку
445
445
  */
446
- [L.Custom]: function() {
446
+ [E.Custom]: function() {
447
447
  throw new Error("Custom geometry is not generated here.");
448
448
  }
449
- }, Ot = new l.MeshStandardMaterial({
449
+ }, Zt = new a.MeshStandardMaterial({
450
450
  color: 12566463,
451
451
  metalness: 0,
452
452
  roughness: 0.6
453
- }), gs = 8, z = 0, Ct = 1, It = 2, $ = 31, fs = 0.03, vs = 0.05, et = (e) => !!e && e.isMesh, Pt = (e) => {
453
+ }), Xr = 8, k = 0, Jt = 1, Qt = 2, $ = 31, Yr = 0.03, Kr = 0.05, Mt = 900, Vt = 300, Ht = 300, $t = 300, yt = (e) => !!e && e.isMesh, er = (e) => {
454
454
  let t = e;
455
455
  for (; t; ) {
456
456
  if (t.isMesh) return t;
457
457
  t = t.parent;
458
458
  }
459
459
  return null;
460
- }, Lt = (e) => {
461
- const t = new l.BufferGeometry();
460
+ }, tr = (e) => {
461
+ const t = new a.BufferGeometry();
462
462
  t.setAttribute("position", e.getAttribute("position")), t.computeBoundingSphere(), t.computeBoundingBox();
463
- const s = new l.PointsMaterial({
464
- color: ps,
463
+ const r = new a.PointsMaterial({
464
+ color: Nr,
465
465
  size: 6,
466
466
  sizeAttenuation: !1,
467
467
  depthTest: !1,
468
468
  depthWrite: !1,
469
469
  transparent: !0,
470
470
  opacity: 0.9
471
- }), r = new l.Points(t, s);
472
- return r.layers.set(It), r.renderOrder = 1e3, r.visible = !1, r;
473
- }, Et = (e) => {
474
- const t = new l.EdgesGeometry(e), s = new l.LineSegments(
471
+ }), s = new a.Points(t, r);
472
+ return s.layers.set(Qt), s.renderOrder = 1e3, s.visible = !1, s;
473
+ }, rr = (e) => {
474
+ const t = new a.EdgesGeometry(e), r = new a.LineSegments(
475
475
  t,
476
- new l.LineBasicMaterial({ color: _s, linewidth: 1 })
476
+ new a.LineBasicMaterial({ color: Wr, linewidth: 1 })
477
477
  );
478
- return s.layers.set(Ct), s;
479
- }, ys = (e) => {
480
- const t = { x: e.position.x, y: e.position.y, z: e.position.z }, s = { x: e.rotation.x, y: e.rotation.y, z: e.rotation.z }, r = { x: e.scale.x, y: e.scale.y, z: e.scale.z }, i = new l.Box3().setFromObject(e), n = new l.Vector3();
478
+ return r.layers.set(Jt), r;
479
+ }, qr = (e) => {
480
+ const t = { x: e.position.x, y: e.position.y, z: e.position.z }, r = { x: e.rotation.x, y: e.rotation.y, z: e.rotation.z }, s = { x: e.scale.x, y: e.scale.y, z: e.scale.z }, i = new a.Box3().setFromObject(e), n = new a.Vector3();
481
481
  i.getSize(n);
482
482
  const o = { x: n.x, y: n.y, z: n.z };
483
- return { position: t, rotation: s, scale: r, size: o };
484
- }, Tt = (e, t) => t ? {
483
+ return { position: t, rotation: r, scale: s, size: o };
484
+ }, Zr = (e, t) => t ? {
485
485
  background: {
486
486
  ...e.background,
487
487
  ...t.background
@@ -512,7 +512,7 @@ const Me = 16776960, xe = 16755200, _s = 2236962, ps = 2236962, ms = {
512
512
  }
513
513
  }
514
514
  }
515
- } : e, Y = (e) => (e.userData.isProxy = !0, e.userData.isExportable = !1, e), N = (e) => (e.userData.isExportable = !1, e), Vt = (e) => e.userData.isProxy === !0, bs = (e) => {
515
+ } : e, Y = (e) => (e.userData.isProxy = !0, e.userData.isExportable = !1, e), N = (e) => (e.userData.isExportable = !1, e), sr = (e) => e.userData.isProxy === !0, Jr = (e) => {
516
516
  let t = e;
517
517
  for (; t; ) {
518
518
  if (t.userData.isExportable === !1)
@@ -520,38 +520,38 @@ const Me = 16776960, xe = 16755200, _s = 2236962, ps = 2236962, ms = {
520
520
  t = t.parent;
521
521
  }
522
522
  return !1;
523
- }, Ms = (e) => !et(e) || !e.visible || Vt(e) || bs(e) ? !1 : e.userData.isExportable !== !1, xs = (e) => {
524
- const t = new l.Group();
525
- return t.name = "Planara_OBJ_Export", e.updateMatrixWorld(!0), e.traverse((s) => {
526
- if (!Ms(s))
523
+ }, Qr = (e) => !yt(e) || !e.visible || sr(e) || Jr(e) ? !1 : e.userData.isExportable !== !1, es = (e) => {
524
+ const t = new a.Group();
525
+ return t.name = "Planara_OBJ_Export", e.updateMatrixWorld(!0), e.traverse((r) => {
526
+ if (!Qr(r))
527
527
  return;
528
- const r = s.clone(!1);
529
- r.geometry = s.geometry.clone(), Array.isArray(s.material) ? r.material = s.material.map((i) => i.clone()) : r.material = s.material.clone(), r.matrix.copy(s.matrixWorld), r.matrixAutoUpdate = !1, t.add(r);
528
+ const s = r.clone(!1);
529
+ s.geometry = r.geometry.clone(), Array.isArray(r.material) ? s.material = r.material.map((i) => i.clone()) : s.material = r.material.clone(), s.matrix.copy(r.matrixWorld), s.matrixAutoUpdate = !1, t.add(s);
530
530
  }), t;
531
- }, Dt = (e) => {
532
- const s = new us().parse(e);
533
- s.updateMatrixWorld(!0);
534
- const r = [];
535
- return s.traverse((i) => {
536
- if (!et(i))
531
+ }, ir = (e) => {
532
+ const r = new zr().parse(e);
533
+ r.updateMatrixWorld(!0);
534
+ const s = [];
535
+ return r.traverse((i) => {
536
+ if (!yt(i))
537
537
  return;
538
538
  const n = i.geometry.clone();
539
539
  n.applyMatrix4(i.matrixWorld), n.computeBoundingBox();
540
540
  const o = n.boundingBox;
541
541
  if (!o)
542
542
  return;
543
- const c = new l.Vector3();
544
- o.getCenter(c), n.translate(-c.x, -c.y, -c.z), n.computeBoundingBox(), n.computeBoundingSphere(), n.computeVertexNormals();
545
- const u = n.getAttribute("position");
546
- u && u.setUsage && u.setUsage(l.DynamicDrawUsage);
547
- const d = new l.Mesh(n, Ot.clone());
548
- d.position.copy(c), d.layers.enable(z);
549
- const m = n.index ? n.toNonIndexed() : n, p = N(Et(m));
550
- p.layers.enable(z), d.add(p);
551
- const g = N(Lt(m));
552
- g.layers.enable(z), d.add(g), r.push(d);
553
- }), r;
554
- }, jt = {
543
+ const l = new a.Vector3();
544
+ o.getCenter(l), n.translate(-l.x, -l.y, -l.z), n.computeBoundingBox(), n.computeBoundingSphere(), n.computeVertexNormals();
545
+ const h = n.getAttribute("position");
546
+ h && h.setUsage && h.setUsage(a.DynamicDrawUsage);
547
+ const d = new a.Mesh(n, Zt.clone());
548
+ d.position.copy(l), d.layers.enable(k);
549
+ const p = n.index ? n.toNonIndexed() : n, u = N(rr(p));
550
+ u.layers.enable(k), d.add(u);
551
+ const m = N(tr(p));
552
+ m.layers.enable(k), d.add(m), s.push(d);
553
+ }), s;
554
+ }, ts = {
555
555
  background: {
556
556
  color: 1710618,
557
557
  transparent: !1
@@ -588,12 +588,12 @@ const Me = 16776960, xe = 16755200, _s = 2236962, ps = 2236962, ms = {
588
588
  }
589
589
  }
590
590
  };
591
- var Ss = Object.getOwnPropertyDescriptor, ws = (e, t, s, r) => {
592
- for (var i = r > 1 ? void 0 : r ? Ss(t, s) : t, n = e.length - 1, o; n >= 0; n--)
591
+ var rs = Object.getOwnPropertyDescriptor, ss = (e, t, r, s) => {
592
+ for (var i = s > 1 ? void 0 : s ? rs(t, r) : t, n = e.length - 1, o; n >= 0; n--)
593
593
  (o = e[n]) && (i = o(i) || i);
594
594
  return i;
595
- }, ut = (e, t) => (s, r) => t(s, r, e);
596
- let ae = class {
595
+ }, Rt = (e, t) => (r, s) => t(r, s, e);
596
+ let Le = class {
597
597
  /**
598
598
  * Конструктор рендерера.
599
599
  *
@@ -611,7 +611,7 @@ let ae = class {
611
611
  * @constructor
612
612
  */
613
613
  constructor(e, t) {
614
- if (this._config = t, this.canvas = e, this.scene = new l.Scene(), this._config.background.transparent ? this.scene.background = null : this.scene.background = new l.Color(this._config.background.color), this.camera = new l.PerspectiveCamera(
614
+ if (this._config = t, this.canvas = e, this.scene = new a.Scene(), this._config.background.transparent ? this.scene.background = null : this.scene.background = new a.Color(this._config.background.color), this.camera = new a.PerspectiveCamera(
615
615
  this._config.camera.fov,
616
616
  this.canvas.clientWidth / this.canvas.clientHeight,
617
617
  this._config.camera.near,
@@ -620,27 +620,27 @@ let ae = class {
620
620
  this._config.camera.position.x,
621
621
  this._config.camera.position.y,
622
622
  this._config.camera.position.z
623
- ), this.renderer = new l.WebGLRenderer({
623
+ ), this.renderer = new a.WebGLRenderer({
624
624
  canvas: this.canvas,
625
625
  antialias: this._config.renderer.antialias,
626
626
  alpha: this._config.background.transparent || this._config.renderer.alpha
627
627
  }), this.renderer.setSize(this.canvas.clientWidth, this.canvas.clientHeight), this._config.background.transparent ? this.renderer.setClearAlpha(0) : this.renderer.setClearColor(this._config.background.color, 1), this._config.lights.ambient.enabled) {
628
- const s = new l.AmbientLight(
628
+ const r = new a.AmbientLight(
629
629
  this._config.lights.ambient.color,
630
630
  this._config.lights.ambient.intensity
631
631
  );
632
- this.scene.add(N(s));
632
+ this.scene.add(N(r));
633
633
  }
634
634
  if (this._config.lights.directional.enabled) {
635
- const s = new l.DirectionalLight(
635
+ const r = new a.DirectionalLight(
636
636
  this._config.lights.directional.color,
637
637
  this._config.lights.directional.intensity
638
638
  );
639
- s.position.set(
639
+ r.position.set(
640
640
  this._config.lights.directional.position.x,
641
641
  this._config.lights.directional.position.y,
642
642
  this._config.lights.directional.position.z
643
- ), this.scene.add(N(s));
643
+ ), this.scene.add(N(r));
644
644
  }
645
645
  }
646
646
  /**
@@ -678,7 +678,7 @@ let ae = class {
678
678
  * Вызывается при изменении размеров canvas (например, при ресайзе окна браузера).
679
679
  *
680
680
  * @example
681
- * ```typescript
681
+ * ```ts
682
682
  * window.addEventListener('resize', () => renderer.resize());
683
683
  * ```
684
684
  *
@@ -722,7 +722,7 @@ let ae = class {
722
722
  * **Важно:** вызывать метод только один раз.
723
723
  *
724
724
  * @example
725
- * ```typescript
725
+ * ```ts
726
726
  * renderer.loop();
727
727
  * ```
728
728
  *
@@ -747,6 +747,15 @@ let ae = class {
747
747
  getScene() {
748
748
  return this.scene;
749
749
  }
750
+ getRendererInfo() {
751
+ const e = this.renderer.info;
752
+ return {
753
+ drawCalls: e.render.calls,
754
+ triangles: e.render.triangles,
755
+ geometries: e.memory.geometries,
756
+ textures: e.memory.textures
757
+ };
758
+ }
750
759
  /**
751
760
  * Освобождает ресурсы рендерера.
752
761
  *
@@ -761,12 +770,12 @@ let ae = class {
761
770
  this.scene = null, this.camera = null, this.renderer?.dispose(), this.canvas = null;
762
771
  }
763
772
  };
764
- ae = ws([
765
- w(),
766
- ut(0, _("Canvas")),
767
- ut(1, _("RendererConfig"))
768
- ], ae);
769
- class mi {
773
+ Le = ss([
774
+ v(),
775
+ Rt(0, c("Canvas")),
776
+ Rt(1, c("RendererConfig"))
777
+ ], Le);
778
+ class Yn {
770
779
  /** Позиции вершин */
771
780
  _positions = [];
772
781
  /** Нормали вершин */
@@ -782,9 +791,9 @@ class mi {
782
791
  * @param objContent - Строка содержимого .obj файла
783
792
  */
784
793
  load(t) {
785
- const s = t.split(`
794
+ const r = t.split(`
786
795
  `);
787
- for (const i of s) {
796
+ for (const i of r) {
788
797
  if (!i.trim() || i.startsWith("#")) continue;
789
798
  const n = i.trim().split(/\s+/);
790
799
  switch (n[0]) {
@@ -802,56 +811,57 @@ class mi {
802
811
  break;
803
812
  }
804
813
  }
805
- const r = {
806
- type: L.Custom,
814
+ const s = {
815
+ type: E.Custom,
807
816
  position: this._positions,
808
817
  ...this._normals.length > 0 && { normal: this._normals },
809
818
  ...this._uvs.length > 0 && { uv: this._uvs }
810
819
  };
811
- return new Qt(r);
820
+ return new Pr(s);
812
821
  }
813
822
  /**
814
823
  * Обрабатывает строку face (f) и разворачивает индексы в массивы для рендеринга
815
824
  */
816
825
  processFaceLine(t) {
817
- for (let s = 1; s < t.length; s++) {
818
- const r = t[s];
819
- if (!r) continue;
820
- const [i, n, o] = r.split("/"), c = i ? parseInt(i, 10) : void 0, u = n ? parseInt(n, 10) : void 0, d = o ? parseInt(o, 10) : void 0;
821
- if (c !== void 0) {
822
- const m = this._tmpPositions[c - 1];
823
- m && this._positions.push(...m);
826
+ for (let r = 1; r < t.length; r++) {
827
+ const s = t[r];
828
+ if (!s) continue;
829
+ const [i, n, o] = s.split("/"), l = i ? parseInt(i, 10) : void 0, h = n ? parseInt(n, 10) : void 0, d = o ? parseInt(o, 10) : void 0;
830
+ if (l !== void 0) {
831
+ const p = this._tmpPositions[l - 1];
832
+ p && this._positions.push(...p);
824
833
  }
825
- if (u !== void 0) {
826
- const m = this._tmpUVs[u - 1];
827
- m && this._uvs.push(...m);
834
+ if (h !== void 0) {
835
+ const p = this._tmpUVs[h - 1];
836
+ p && this._uvs.push(...p);
828
837
  }
829
838
  if (d !== void 0) {
830
- const m = this._tmpNormals[d - 1];
831
- m && this._normals.push(...m);
839
+ const p = this._tmpNormals[d - 1];
840
+ p && this._normals.push(...p);
832
841
  }
833
842
  }
834
843
  }
835
844
  }
836
- var As = Object.getOwnPropertyDescriptor, Os = (e, t, s, r) => {
837
- for (var i = r > 1 ? void 0 : r ? As(t, s) : t, n = e.length - 1, o; n >= 0; n--)
845
+ var is = Object.getOwnPropertyDescriptor, ns = (e, t, r, s) => {
846
+ for (var i = s > 1 ? void 0 : s ? is(t, r) : t, n = e.length - 1, o; n >= 0; n--)
838
847
  (o = e[n]) && (i = o(i) || i);
839
848
  return i;
840
- }, se = (e, t) => (s, r) => t(s, r, e);
841
- let le = class {
849
+ }, K = (e, t) => (r, s) => t(r, s, e);
850
+ let Te = class {
842
851
  /**
843
852
  * Конструктор контроллера.
844
853
  *
845
854
  * @param _updatable - модули, требующие обновления каждый кадр
846
855
  * @param _renderable - модули, требующие кастомного рендеринга
856
+ * @param _observers - модули, наблюдающие за приложением
847
857
  * @param _runtime - модули, требующие инициализации
848
858
  * @param _renderer - рендерер (должен реализовывать `IRenderable`)
849
859
  *
850
860
  * @internal
851
861
  * @constructor
852
862
  */
853
- constructor(e, t, s, r) {
854
- this._updatable = e, this._renderable = t, this._runtime = s, this._renderer = r;
863
+ constructor(e, t, r, s, i) {
864
+ this._updatable = e, this._renderable = t, this._observers = r, this._runtime = s, this._renderer = i;
855
865
  }
856
866
  /**
857
867
  * ID анимационного цикла (для остановки)
@@ -872,12 +882,13 @@ let le = class {
872
882
  * 1. Обновляет модули (`update()`)
873
883
  * 2. Рендерит сцену
874
884
  * 3. Рендерит дополнительные модули (`render()`)
885
+ * 4. Наблюдает за общим состоянием приложения, собирает метрики
875
886
  *
876
887
  * @private
877
888
  * @method
878
889
  */
879
890
  _loop() {
880
- this._updatable.forEach((e) => e.update()), this._renderer.render(), this._renderable.forEach((e) => e.render()), this._animationId = requestAnimationFrame(() => this._loop());
891
+ this._updatable.forEach((e) => e.update()), this._renderer.render(), this._renderable.forEach((e) => e.render()), this._observers.forEach((e) => e.observe()), this._animationId = requestAnimationFrame(() => this._loop());
881
892
  }
882
893
  stop() {
883
894
  this._animationId && (cancelAnimationFrame(this._animationId), this._animationId = null);
@@ -892,19 +903,20 @@ let le = class {
892
903
  this._animationId = null;
893
904
  }
894
905
  };
895
- le = Os([
896
- w(),
897
- se(0, B("IUpdatableModule", { isOptional: !0 })),
898
- se(1, B("IRenderableModule", { isOptional: !0 })),
899
- se(2, B("IRuntimeModule", { isOptional: !0 })),
900
- se(3, _("IRenderable"))
901
- ], le);
902
- var Cs = Object.getOwnPropertyDescriptor, Is = (e, t, s, r) => {
903
- for (var i = r > 1 ? void 0 : r ? Cs(t, s) : t, n = e.length - 1, o; n >= 0; n--)
906
+ Te = ns([
907
+ v(),
908
+ K(0, H("IUpdatableModule", { isOptional: !0 })),
909
+ K(1, H("IRenderableModule", { isOptional: !0 })),
910
+ K(2, H("IObserverModule", { isOptional: !0 })),
911
+ K(3, H("IRuntimeModule", { isOptional: !0 })),
912
+ K(4, c("IRenderable"))
913
+ ], Te);
914
+ var os = Object.getOwnPropertyDescriptor, as = (e, t, r, s) => {
915
+ for (var i = s > 1 ? void 0 : s ? os(t, r) : t, n = e.length - 1, o; n >= 0; n--)
904
916
  (o = e[n]) && (i = o(i) || i);
905
917
  return i;
906
- }, Ps = (e, t) => (s, r) => t(s, r, e);
907
- let Ee = class {
918
+ }, ls = (e, t) => (r, s) => t(r, s, e);
919
+ let De = class {
908
920
  /** @constructor */
909
921
  constructor(e) {
910
922
  this._controlsModule = e;
@@ -916,16 +928,16 @@ let Ee = class {
916
928
  return this._controlsModule.isTransformDragging();
917
929
  }
918
930
  };
919
- Ee = Is([
920
- w(),
921
- Ps(0, _("ControlsModule"))
922
- ], Ee);
923
- var Ls = Object.getOwnPropertyDescriptor, Es = (e, t, s, r) => {
924
- for (var i = r > 1 ? void 0 : r ? Ls(t, s) : t, n = e.length - 1, o; n >= 0; n--)
931
+ De = as([
932
+ v(),
933
+ ls(0, c("ControlsModule"))
934
+ ], De);
935
+ var cs = Object.getOwnPropertyDescriptor, hs = (e, t, r, s) => {
936
+ for (var i = s > 1 ? void 0 : s ? cs(t, r) : t, n = e.length - 1, o; n >= 0; n--)
925
937
  (o = e[n]) && (i = o(i) || i);
926
938
  return i;
927
- }, Ts = (e, t) => (s, r) => t(s, r, e);
928
- let ce = class {
939
+ }, ds = (e, t) => (r, s) => t(r, s, e);
940
+ let je = class {
929
941
  /** @constructor */
930
942
  constructor(e) {
931
943
  this._sceneModule = e;
@@ -946,16 +958,16 @@ let ce = class {
946
958
  return this._sceneModule.getMeshes();
947
959
  }
948
960
  };
949
- ce = Es([
950
- w(),
951
- Ts(0, _("SceneModule"))
952
- ], ce);
953
- var Vs = Object.getOwnPropertyDescriptor, Ds = (e, t, s, r) => {
954
- for (var i = r > 1 ? void 0 : r ? Vs(t, s) : t, n = e.length - 1, o; n >= 0; n--)
961
+ je = hs([
962
+ v(),
963
+ ds(0, c("SceneModule"))
964
+ ], je);
965
+ var _s = Object.getOwnPropertyDescriptor, us = (e, t, r, s) => {
966
+ for (var i = s > 1 ? void 0 : s ? _s(t, r) : t, n = e.length - 1, o; n >= 0; n--)
955
967
  (o = e[n]) && (i = o(i) || i);
956
968
  return i;
957
- }, js = (e, t) => (s, r) => t(s, r, e);
958
- let Te = class {
969
+ }, ps = (e, t) => (r, s) => t(r, s, e);
970
+ let Ve = class {
959
971
  /** @constructor */
960
972
  constructor(e) {
961
973
  this._raycastModule = e;
@@ -964,16 +976,16 @@ let Te = class {
964
976
  this._raycastModule.setRaycastMode(e);
965
977
  }
966
978
  };
967
- Te = Ds([
968
- w(),
969
- js(0, _("RaycastModule"))
970
- ], Te);
971
- var $s = Object.getOwnPropertyDescriptor, Rs = (e, t, s, r) => {
972
- for (var i = r > 1 ? void 0 : r ? $s(t, s) : t, n = e.length - 1, o; n >= 0; n--)
979
+ Ve = us([
980
+ v(),
981
+ ps(0, c("RaycastModule"))
982
+ ], Ve);
983
+ var ms = Object.getOwnPropertyDescriptor, fs = (e, t, r, s) => {
984
+ for (var i = s > 1 ? void 0 : s ? ms(t, r) : t, n = e.length - 1, o; n >= 0; n--)
973
985
  (o = e[n]) && (i = o(i) || i);
974
986
  return i;
975
- }, Fs = (e, t) => (s, r) => t(s, r, e);
976
- let Ve = class {
987
+ }, gs = (e, t) => (r, s) => t(r, s, e);
988
+ let He = class {
977
989
  /** @constructor */
978
990
  constructor(e) {
979
991
  this._controlsModule = e;
@@ -991,16 +1003,36 @@ let Ve = class {
991
1003
  return this._controlsModule.onTransformChange(e);
992
1004
  }
993
1005
  };
994
- Ve = Rs([
995
- w(),
996
- Fs(0, _("ControlsModule"))
997
- ], Ve);
998
- var Hs = Object.getOwnPropertyDescriptor, Bs = (e, t, s, r) => {
999
- for (var i = r > 1 ? void 0 : r ? Hs(t, s) : t, n = e.length - 1, o; n >= 0; n--)
1006
+ He = fs([
1007
+ v(),
1008
+ gs(0, c("ControlsModule"))
1009
+ ], He);
1010
+ var vs = Object.getOwnPropertyDescriptor, bs = (e, t, r, s) => {
1011
+ for (var i = s > 1 ? void 0 : s ? vs(t, r) : t, n = e.length - 1, o; n >= 0; n--)
1012
+ (o = e[n]) && (i = o(i) || i);
1013
+ return i;
1014
+ }, Ms = (e, t) => (r, s) => t(r, s, e);
1015
+ let $e = class {
1016
+ constructor(e) {
1017
+ this._interactive = e;
1018
+ }
1019
+ isInteractionEnabled() {
1020
+ return this._interactive.every((e) => e.isInteractionEnabled());
1021
+ }
1022
+ setInteractionEnabled(e) {
1023
+ this._interactive.forEach((t) => t.setInteractionEnabled(e));
1024
+ }
1025
+ };
1026
+ $e = bs([
1027
+ v(),
1028
+ Ms(0, H("IInteractiveModule"))
1029
+ ], $e);
1030
+ var ys = Object.getOwnPropertyDescriptor, ws = (e, t, r, s) => {
1031
+ for (var i = s > 1 ? void 0 : s ? ys(t, r) : t, n = e.length - 1, o; n >= 0; n--)
1000
1032
  (o = e[n]) && (i = o(i) || i);
1001
1033
  return i;
1002
- }, ks = (e, t) => (s, r) => t(s, r, e);
1003
- let he = class {
1034
+ }, Ss = (e, t) => (r, s) => t(r, s, e);
1035
+ let Re = class {
1004
1036
  constructor(e) {
1005
1037
  this._cameraAccessApi = e;
1006
1038
  }
@@ -1014,16 +1046,16 @@ let he = class {
1014
1046
  this._cameraAccessApi.getCamera().layers.disable(e);
1015
1047
  }
1016
1048
  };
1017
- he = Bs([
1018
- w(),
1019
- ks(0, _("IRendererCameraAccess"))
1020
- ], he);
1021
- var zs = Object.getOwnPropertyDescriptor, Gs = (e, t, s, r) => {
1022
- for (var i = r > 1 ? void 0 : r ? zs(t, s) : t, n = e.length - 1, o; n >= 0; n--)
1049
+ Re = ws([
1050
+ v(),
1051
+ Ss(0, c("IRendererCameraAccess"))
1052
+ ], Re);
1053
+ var xs = Object.getOwnPropertyDescriptor, As = (e, t, r, s) => {
1054
+ for (var i = s > 1 ? void 0 : s ? xs(t, r) : t, n = e.length - 1, o; n >= 0; n--)
1023
1055
  (o = e[n]) && (i = o(i) || i);
1024
1056
  return i;
1025
- }, Ws = (e, t) => (s, r) => t(s, r, e);
1026
- let de = class {
1057
+ }, Is = (e, t) => (r, s) => t(r, s, e);
1058
+ let Be = class {
1027
1059
  constructor(e) {
1028
1060
  this._domAccessApi = e;
1029
1061
  }
@@ -1034,16 +1066,16 @@ let de = class {
1034
1066
  return this._domAccessApi.getDomElement();
1035
1067
  }
1036
1068
  };
1037
- de = Gs([
1038
- w(),
1039
- Ws(0, _("IRendererDomAccess"))
1040
- ], de);
1041
- var Us = Object.getOwnPropertyDescriptor, Ns = (e, t, s, r) => {
1042
- for (var i = r > 1 ? void 0 : r ? Us(t, s) : t, n = e.length - 1, o; n >= 0; n--)
1069
+ Be = As([
1070
+ v(),
1071
+ Is(0, c("IRendererDomAccess"))
1072
+ ], Be);
1073
+ var Cs = Object.getOwnPropertyDescriptor, Os = (e, t, r, s) => {
1074
+ for (var i = s > 1 ? void 0 : s ? Cs(t, r) : t, n = e.length - 1, o; n >= 0; n--)
1043
1075
  (o = e[n]) && (i = o(i) || i);
1044
1076
  return i;
1045
- }, Xs = (e, t) => (s, r) => t(s, r, e);
1046
- let ue = class {
1077
+ }, Es = (e, t) => (r, s) => t(r, s, e);
1078
+ let Fe = class {
1047
1079
  constructor(e) {
1048
1080
  this._sceneAccessApi = e;
1049
1081
  }
@@ -1053,37 +1085,118 @@ let ue = class {
1053
1085
  addToScene(e) {
1054
1086
  this._sceneAccessApi.getScene().add(e);
1055
1087
  }
1056
- removeFromScene(e) {
1057
- this._sceneAccessApi.getScene().remove(e);
1088
+ removeFromScene(e, t) {
1089
+ this._sceneAccessApi.getScene().remove(e), t && this._disposeObject(e);
1058
1090
  }
1059
1091
  addObject(e, t) {
1060
- const s = this._sceneAccessApi.getScene();
1061
- s && (typeof t == "number" && e.layers.set(t), s.add(e));
1092
+ const r = this._sceneAccessApi.getScene();
1093
+ r && (typeof t == "number" && e.layers.set(t), r.add(e));
1094
+ }
1095
+ /**
1096
+ * Освобождает ресурсы объекта и его дочерних элементов.
1097
+ *
1098
+ * @param object - объект для очистки
1099
+ *
1100
+ * @private
1101
+ * @method
1102
+ */
1103
+ _disposeObject(e) {
1104
+ e.traverse((t) => {
1105
+ if (t instanceof a.Mesh) {
1106
+ if (t.geometry.dispose(), Array.isArray(t.material)) {
1107
+ t.material.forEach((r) => this._disposeMaterial(r));
1108
+ return;
1109
+ }
1110
+ this._disposeMaterial(t.material);
1111
+ }
1112
+ });
1113
+ }
1114
+ /**
1115
+ * Освобождает ресурсы материала.
1116
+ *
1117
+ * @param material - материал для очистки
1118
+ *
1119
+ * @private
1120
+ * @method
1121
+ */
1122
+ _disposeMaterial(e) {
1123
+ Object.values(e).forEach((t) => {
1124
+ t instanceof a.Texture && t.dispose();
1125
+ }), e.dispose();
1126
+ }
1127
+ };
1128
+ Fe = Os([
1129
+ v(),
1130
+ Es(0, c("IRendererSceneAccess"))
1131
+ ], Fe);
1132
+ var Ps = Object.getOwnPropertyDescriptor, Ls = (e, t, r, s) => {
1133
+ for (var i = s > 1 ? void 0 : s ? Ps(t, r) : t, n = e.length - 1, o; n >= 0; n--)
1134
+ (o = e[n]) && (i = o(i) || i);
1135
+ return i;
1136
+ }, Ts = (e, t) => (r, s) => t(r, s, e);
1137
+ let ke = class {
1138
+ /**
1139
+ * Конструктор API статистики рендерера.
1140
+ *
1141
+ * @param _rendererInfoAccess - внутренний доступ к информации о рендерере
1142
+ */
1143
+ constructor(e) {
1144
+ this._rendererInfoAccess = e;
1145
+ }
1146
+ /**
1147
+ * Возвращает текущую статистику рендерера.
1148
+ *
1149
+ * @returns Метрики WebGL-рендера за текущий кадр
1150
+ */
1151
+ getRendererInfo() {
1152
+ return this._rendererInfoAccess.getRendererInfo();
1062
1153
  }
1063
1154
  };
1064
- ue = Ns([
1065
- w(),
1066
- Xs(0, _("IRendererSceneAccess"))
1067
- ], ue);
1068
- var Ys = Object.getOwnPropertyDescriptor, qs = (e, t, s, r) => {
1069
- for (var i = r > 1 ? void 0 : r ? Ys(t, s) : t, n = e.length - 1, o; n >= 0; n--)
1155
+ ke = Ls([
1156
+ v(),
1157
+ Ts(0, c("IRendererInfoAccess"))
1158
+ ], ke);
1159
+ var Ds = Object.getOwnPropertyDescriptor, js = (e, t, r, s) => {
1160
+ for (var i = s > 1 ? void 0 : s ? Ds(t, r) : t, n = e.length - 1, o; n >= 0; n--)
1070
1161
  (o = e[n]) && (i = o(i) || i);
1071
1162
  return i;
1072
- }, Oe = (e, t) => (s, r) => t(s, r, e);
1073
- let _e = class {
1074
- constructor(e, t, s) {
1075
- this._cameraApi = e, this._domApi = t, this._sceneApi = s;
1163
+ }, Ae = (e, t) => (r, s) => t(r, s, e);
1164
+ let me = class {
1165
+ constructor(e, t, r) {
1166
+ this._cameraApi = e, this._domApi = t, this._sceneApi = r;
1076
1167
  }
1077
- /** Orbit-контроллер для управления камерой */
1168
+ /**
1169
+ * Orbit-контроллер для управления камерой
1170
+ *
1171
+ * @private
1172
+ * @member
1173
+ */
1078
1174
  _orbit = null;
1079
- /** Transform-контроллер для редактирования */
1175
+ /**
1176
+ * Transform-контроллер для редактирования
1177
+ *
1178
+ * @private
1179
+ * @member
1180
+ */
1080
1181
  _transform = null;
1081
1182
  _transformHelper = null;
1082
1183
  _transformListeners = /* @__PURE__ */ new Set();
1083
- /** Были ли инициализированы обработчики событий (hover/click) */
1184
+ /**
1185
+ * Были ли инициализированы обработчики событий (hover/click)
1186
+ *
1187
+ * @private
1188
+ * @member
1189
+ */
1084
1190
  _isEventListenersAdded = !1;
1191
+ /**
1192
+ * Доступно ли пользовательское взаимодействие с контроллерами
1193
+ *
1194
+ * @private
1195
+ * @member
1196
+ */
1197
+ _isInteractionEnabled = !0;
1085
1198
  init() {
1086
- this._orbit = new ts(this._cameraApi.getCamera(), this._domApi.getDomElement()), this._orbit.enableDamping = !0, this._orbit.dampingFactor = 0.05, this._transform = new ss(
1199
+ this._orbit = new Tr(this._cameraApi.getCamera(), this._domApi.getDomElement()), this._orbit.enableDamping = !0, this._orbit.dampingFactor = 0.05, this._transform = new Dr(
1087
1200
  this._cameraApi.getCamera(),
1088
1201
  this._domApi.getDomElement()
1089
1202
  ), this._transformHelper = this._transform.getHelper(), this._sceneApi.addToScene(N(this._transformHelper)), this._initMouseListeners();
@@ -1109,20 +1222,26 @@ let _e = class {
1109
1222
  isTransformDragging() {
1110
1223
  return !!this._transform?.dragging;
1111
1224
  }
1225
+ setInteractionEnabled(e) {
1226
+ this._isInteractionEnabled = e, this._orbit && (this._orbit.enabled = e), this._transform && (this._transform.enabled = e), e || this._transform?.detach();
1227
+ }
1228
+ isInteractionEnabled() {
1229
+ return this._isInteractionEnabled;
1230
+ }
1112
1231
  _handlePointerDown = (e) => {
1113
- this._transform?.pointerDown(e);
1232
+ this._isInteractionEnabled && this._transform?.pointerDown(e);
1114
1233
  };
1115
1234
  _handlePointerMove = (e) => {
1116
- this._transform?.pointerMove(e);
1235
+ this._isInteractionEnabled && this._transform?.pointerMove(e);
1117
1236
  };
1118
1237
  _handlePointerUp = (e) => {
1119
- this._transform?.pointerUp(e);
1238
+ this._isInteractionEnabled && this._transform?.pointerUp(e);
1120
1239
  };
1121
1240
  _handlePointerLeave = () => {
1122
- this._transform?.pointerHover(null);
1241
+ this._isInteractionEnabled && this._transform?.pointerHover(null);
1123
1242
  };
1124
1243
  _handleDraggingChanged = () => {
1125
- this._orbit && (this._orbit.enabled = !this._transform?.dragging);
1244
+ this._orbit && (this._orbit.enabled = this._isInteractionEnabled && !this._transform?.dragging);
1126
1245
  };
1127
1246
  _handleObjectChange = () => {
1128
1247
  for (const e of this._transformListeners)
@@ -1137,32 +1256,49 @@ let _e = class {
1137
1256
  dispose() {
1138
1257
  if (this._isEventListenersAdded) {
1139
1258
  const e = this._domApi.getCanvas();
1140
- if (!this._transform || !this._orbit) return;
1141
- e.removeEventListener("pointerdown", this._handlePointerDown), e.removeEventListener("pointermove", this._handlePointerMove), e.removeEventListener("pointerup", this._handlePointerUp), e.removeEventListener("pointerleave", this._handlePointerLeave), this._transform.removeEventListener("dragging-changed", this._handleDraggingChanged), this._transform.removeEventListener("objectChange", this._handleObjectChange), this._transformListeners.clear(), this._isEventListenersAdded = !1;
1259
+ this._transform && (this._transform.removeEventListener("dragging-changed", this._handleDraggingChanged), this._transform.removeEventListener("objectChange", this._handleObjectChange)), e.removeEventListener("pointerdown", this._handlePointerDown), e.removeEventListener("pointermove", this._handlePointerMove), e.removeEventListener("pointerup", this._handlePointerUp), e.removeEventListener("pointerleave", this._handlePointerLeave), this._transformListeners.clear(), this._isEventListenersAdded = !1, this._isInteractionEnabled = !0;
1142
1260
  }
1143
1261
  this._orbit?.dispose(), this._orbit = null, this._transform?.dispose(), this._transform = null, this._transformHelper?.parent && this._transformHelper.parent.remove(this._transformHelper);
1144
1262
  }
1145
1263
  };
1146
- _e = qs([
1147
- w(),
1148
- Oe(0, _("ICameraApi")),
1149
- Oe(1, _("IDomApi")),
1150
- Oe(2, _("ISceneApi"))
1151
- ], _e);
1152
- var Zs = Object.getOwnPropertyDescriptor, Ks = (e, t, s, r) => {
1153
- for (var i = r > 1 ? void 0 : r ? Zs(t, s) : t, n = e.length - 1, o; n >= 0; n--)
1264
+ me = js([
1265
+ v(),
1266
+ Ae(0, c("ICameraApi")),
1267
+ Ae(1, c("IDomApi")),
1268
+ Ae(2, c("ISceneApi"))
1269
+ ], me);
1270
+ var Vs = Object.getOwnPropertyDescriptor, Hs = (e, t, r, s) => {
1271
+ for (var i = s > 1 ? void 0 : s ? Vs(t, r) : t, n = e.length - 1, o; n >= 0; n--)
1154
1272
  (o = e[n]) && (i = o(i) || i);
1155
1273
  return i;
1156
- }, Ce = (e, t) => (s, r) => t(s, r, e);
1157
- let De = class {
1158
- constructor(e, t, s) {
1159
- this._cameraApi = e, this._domApi = t, this._rendererApi = s;
1274
+ }, Ie = (e, t) => (r, s) => t(r, s, e);
1275
+ let Ge = class {
1276
+ constructor(e, t, r) {
1277
+ this._cameraApi = e, this._domApi = t, this._rendererApi = r;
1160
1278
  }
1161
- /** Gizmo для управления отображением perspective camera */
1279
+ /**
1280
+ * Gizmo для управления отображением perspective camera
1281
+ *
1282
+ * @private
1283
+ * @member
1284
+ */
1162
1285
  _cameraGizmo = null;
1286
+ /**
1287
+ * Доступно ли пользовательское взаимодействие с контроллерами
1288
+ *
1289
+ * @private
1290
+ * @member
1291
+ */
1292
+ _isInteractionEnabled = !0;
1293
+ setInteractionEnabled(e) {
1294
+ this._isInteractionEnabled = e, this._cameraGizmo?.setVisible(e);
1295
+ }
1296
+ isInteractionEnabled() {
1297
+ return this._isInteractionEnabled;
1298
+ }
1163
1299
  init() {
1164
1300
  const e = this._cameraApi.getCamera(), t = this._rendererApi.getRenderer();
1165
- this._cameraGizmo = new rs(t, e, {
1301
+ this._cameraGizmo = new jr(t, e, {
1166
1302
  size: 96,
1167
1303
  // Размер квадрата
1168
1304
  margin: 36
@@ -1170,6 +1306,7 @@ let De = class {
1170
1306
  });
1171
1307
  }
1172
1308
  render() {
1309
+ if (!this._isInteractionEnabled) return;
1173
1310
  const e = this._domApi.getCanvas();
1174
1311
  this._cameraGizmo?.render(e.width, e.height);
1175
1312
  }
@@ -1178,18 +1315,18 @@ let De = class {
1178
1315
  this._cameraGizmo?.dispose(), this._cameraGizmo = null;
1179
1316
  }
1180
1317
  };
1181
- De = Ks([
1182
- w(),
1183
- Ce(0, _("ICameraApi")),
1184
- Ce(1, _("IDomApi")),
1185
- Ce(2, _("IRendererAccess"))
1186
- ], De);
1187
- var Js = Object.getOwnPropertyDescriptor, Qs = (e, t, s, r) => {
1188
- for (var i = r > 1 ? void 0 : r ? Js(t, s) : t, n = e.length - 1, o; n >= 0; n--)
1318
+ Ge = Hs([
1319
+ v(),
1320
+ Ie(0, c("ICameraApi")),
1321
+ Ie(1, c("IDomApi")),
1322
+ Ie(2, c("IRendererAccess"))
1323
+ ], Ge);
1324
+ var $s = Object.getOwnPropertyDescriptor, Rs = (e, t, r, s) => {
1325
+ for (var i = s > 1 ? void 0 : s ? $s(t, r) : t, n = e.length - 1, o; n >= 0; n--)
1189
1326
  (o = e[n]) && (i = o(i) || i);
1190
1327
  return i;
1191
1328
  };
1192
- let je = class {
1329
+ let ze = class {
1193
1330
  /**
1194
1331
  * Внутренний эмиттер событий Node.js.
1195
1332
  *
@@ -1199,7 +1336,7 @@ let je = class {
1199
1336
  _emitter;
1200
1337
  /** @constructor */
1201
1338
  constructor() {
1202
- this._emitter = new ns();
1339
+ this._emitter = new Hr();
1203
1340
  }
1204
1341
  /**
1205
1342
  * Публикует событие в шину.
@@ -1288,17 +1425,17 @@ let je = class {
1288
1425
  this._emitter.off(e, t);
1289
1426
  }
1290
1427
  };
1291
- je = Qs([
1292
- w()
1293
- ], je);
1294
- var k = /* @__PURE__ */ ((e) => (e.SelectHover = "select.hover", e.SelectClick = "select.click", e))(k || {}), er = Object.getOwnPropertyDescriptor, tr = (e, t, s, r) => {
1295
- for (var i = r > 1 ? void 0 : r ? er(t, s) : t, n = e.length - 1, o; n >= 0; n--)
1428
+ ze = Rs([
1429
+ v()
1430
+ ], ze);
1431
+ var B = /* @__PURE__ */ ((e) => (e.SelectHover = "select.hover", e.SelectClick = "select.click", e))(B || {}), Bs = Object.getOwnPropertyDescriptor, Fs = (e, t, r, s) => {
1432
+ for (var i = s > 1 ? void 0 : s ? Bs(t, r) : t, n = e.length - 1, o; n >= 0; n--)
1296
1433
  (o = e[n]) && (i = o(i) || i);
1297
1434
  return i;
1298
- }, q = (e, t) => (s, r) => t(s, r, e);
1299
- let $e = class {
1300
- constructor(e, t, s, r, i) {
1301
- this._domApi = e, this._cameraApi = t, this._meshApi = s, this._controlsState = r, this._bus = i;
1435
+ }, q = (e, t) => (r, s) => t(r, s, e);
1436
+ let We = class {
1437
+ constructor(e, t, r, s, i) {
1438
+ this._domApi = e, this._cameraApi = t, this._meshApi = r, this._controlsState = s, this._bus = i;
1302
1439
  }
1303
1440
  /**
1304
1441
  * Raycast для получения событий наведения/клика по модели
@@ -1328,7 +1465,7 @@ let $e = class {
1328
1465
  * @private
1329
1466
  * @member
1330
1467
  */
1331
- _currentRaycastMode = P.Mesh;
1468
+ _currentRaycastMode = O.Mesh;
1332
1469
  /**
1333
1470
  * Были ли инициализированы обработчики событий (hover/click)
1334
1471
  *
@@ -1336,100 +1473,126 @@ let $e = class {
1336
1473
  * @member
1337
1474
  */
1338
1475
  _isEventListenersAdded = !1;
1476
+ /**
1477
+ * Доступно ли пользовательское взаимодействие через raycast.
1478
+ *
1479
+ * @private
1480
+ * @member
1481
+ */
1482
+ _isInteractionEnabled = !0;
1339
1483
  init() {
1340
- this._raycaster = new l.Raycaster(), this._mouse = new l.Vector2(), this._applyRaycastParamsByMode(), this._isEventListenersAdded || (this._initMouseListeners(), this._isEventListenersAdded = !0);
1484
+ this._raycaster = new a.Raycaster(), this._mouse = new a.Vector2(), this._applyRaycastParamsByMode(), this._isEventListenersAdded || (this._initMouseListeners(), this._isEventListenersAdded = !0);
1341
1485
  }
1342
1486
  setRaycastMode(e) {
1343
1487
  if (this._currentRaycastMode === e) return;
1344
1488
  const t = this._raycaster;
1345
1489
  t.params.Line.threshold = 0, t.params.Points.threshold = 0, this._currentRaycastMode = e, this._lastHoverKey = null, this._applyRaycastParamsByMode();
1346
1490
  }
1491
+ setInteractionEnabled(e) {
1492
+ this._isInteractionEnabled = e, e || this._clearState();
1493
+ }
1494
+ isInteractionEnabled() {
1495
+ return this._isInteractionEnabled;
1496
+ }
1497
+ /**
1498
+ * Сбрасывает текущее состояние
1499
+ *
1500
+ * @private
1501
+ * @method
1502
+ */
1503
+ _clearState() {
1504
+ this._meshApi.getMeshes().forEach((t) => {
1505
+ t.userData.isHit = !1;
1506
+ }), this._lastHoverKey = null, this._bus.emit(B.SelectHover, null), this._bus.emit(B.SelectClick, null);
1507
+ }
1347
1508
  /** Применяет параметры raycaster в зависимости от текущего режима */
1348
1509
  _applyRaycastParamsByMode() {
1349
1510
  const e = this._raycaster;
1350
1511
  switch (e.params.Line.threshold = 0, e.params.Points.threshold = 0, this._currentRaycastMode) {
1351
- case P.Mesh:
1352
- case P.Face:
1353
- e.layers.set(z);
1512
+ case O.Mesh:
1513
+ case O.Face:
1514
+ e.layers.set(k);
1354
1515
  break;
1355
- case P.Edge:
1356
- e.layers.set(Ct), e.params.Line.threshold = fs;
1516
+ case O.Edge:
1517
+ e.layers.set(Jt), e.params.Line.threshold = Yr;
1357
1518
  break;
1358
- case P.Vertex:
1359
- e.layers.set(It), e.params.Points.threshold = vs;
1519
+ case O.Vertex:
1520
+ e.layers.set(Qt), e.params.Points.threshold = Kr;
1360
1521
  break;
1361
1522
  }
1362
1523
  }
1363
1524
  /** Возвращает ближайшее пересечение по текущему положению курсора */
1364
1525
  _getHitIntersection(e) {
1365
- const t = this._controlsState.isOrbitInteracting() || this._controlsState.isTransformDragging(), s = this._domApi.getCanvas(), r = this._cameraApi.getCamera(), i = this._meshApi.getMeshes();
1526
+ const t = this._controlsState.isOrbitInteracting() || this._controlsState.isTransformDragging(), r = this._domApi.getCanvas(), s = this._cameraApi.getCamera(), i = this._meshApi.getMeshes();
1366
1527
  if (t) return;
1367
- const n = s.getBoundingClientRect();
1368
- this._mouse.x = (e.clientX - n.left) / n.width * 2 - 1, this._mouse.y = -((e.clientY - n.top) / n.height) * 2 + 1, this._raycaster.setFromCamera(this._mouse, r);
1528
+ const n = r.getBoundingClientRect();
1529
+ this._mouse.x = (e.clientX - n.left) / n.width * 2 - 1, this._mouse.y = -((e.clientY - n.top) / n.height) * 2 + 1, this._raycaster.setFromCamera(this._mouse, s);
1369
1530
  const o = this._raycaster.intersectObjects(i, !0)[0] ?? null;
1370
- if (this._currentRaycastMode === P.Mesh || this._currentRaycastMode === P.Face)
1531
+ if (this._currentRaycastMode === O.Mesh || this._currentRaycastMode === O.Face)
1371
1532
  return o;
1372
- const c = this._raycaster.layers.mask;
1373
- this._raycaster.layers.set(z);
1374
- const u = this._raycaster.intersectObjects(i, !0)[0] ?? null;
1375
- return this._raycaster.layers.mask = c, this._getVisibleHit(o, u);
1533
+ const l = this._raycaster.layers.mask;
1534
+ this._raycaster.layers.set(k);
1535
+ const h = this._raycaster.intersectObjects(i, !0)[0] ?? null;
1536
+ return this._raycaster.layers.mask = l, this._getVisibleHit(o, h);
1376
1537
  }
1377
1538
  // Hover сравнивается не только по object, но и по режимному ключу попадания.
1378
1539
  // Это нужно для Face/Edge/Vertex режимов, где разные элементы могут принадлежать одному и тому же Object3D.
1379
1540
  /** Вспомогательный метод для получения модели, которую выбрали и отправки события в event bus */
1380
- _processRaycastEvent(e, t, s) {
1381
- const r = this._getHitIntersection(e), i = this._meshApi.getMeshes();
1382
- if (r === void 0) return;
1383
- const n = r?.object ?? null;
1384
- if (s) {
1385
- if (!r) {
1386
- i.forEach((c) => c.userData.isHit = !1), this._lastHoverKey = null, this._bus.emit(t, null);
1541
+ _processRaycastEvent(e, t, r) {
1542
+ const s = this._getHitIntersection(e), i = this._meshApi.getMeshes();
1543
+ if (s === void 0) return;
1544
+ const n = s?.object ?? null;
1545
+ if (r) {
1546
+ if (!s) {
1547
+ i.forEach((l) => l.userData.isHit = !1), this._lastHoverKey = null, this._bus.emit(t, null);
1387
1548
  return;
1388
1549
  }
1389
- const o = this._makeHoverKey(r);
1390
- o !== this._lastHoverKey && (i.forEach((c) => c.userData.isHit = !1), n && (n.userData.isHit = !0), this._lastHoverKey = o, this._bus.emit(t, { intersection: r }));
1550
+ const o = this._makeHoverKey(s);
1551
+ o !== this._lastHoverKey && (i.forEach((l) => l.userData.isHit = !1), n && (n.userData.isHit = !0), this._lastHoverKey = o, this._bus.emit(t, { intersection: s }));
1391
1552
  return;
1392
1553
  }
1393
- r && this._bus.emit(t, { intersection: r });
1554
+ s && this._bus.emit(t, { intersection: s });
1394
1555
  }
1395
- /** Поиск видимой части меша
1556
+ /**
1557
+ * Поиск видимой части меша
1396
1558
  * необходимо это для того, чтобы отправлять только видимые элементы модели, а не все попадания
1397
1559
  */
1398
- _getVisibleHit(e, t, s = 1e-4) {
1399
- return e ? t ? e.distance <= t.distance + s ? e : null : e : null;
1560
+ _getVisibleHit(e, t, r = 1e-4) {
1561
+ return e ? t ? e.distance <= t.distance + r ? e : null : e : null;
1400
1562
  }
1401
1563
  /** Строит ключ hover-пересечения с учетом текущего режима выборки */
1402
1564
  _makeHoverKey(e) {
1403
1565
  if (!e) return null;
1404
1566
  const t = e.object.uuid;
1405
1567
  switch (this._currentRaycastMode) {
1406
- case P.Face:
1568
+ case O.Face:
1407
1569
  return `${t}:face:${e.faceIndex ?? -1}`;
1408
- case P.Edge:
1570
+ case O.Edge:
1409
1571
  return `${t}:edge:${Math.floor((e.index ?? -1) / 2)}`;
1410
- case P.Vertex:
1572
+ case O.Vertex:
1411
1573
  return `${t}:vertex:${e.index ?? -1}`;
1412
- case P.Mesh:
1574
+ case O.Mesh:
1413
1575
  default:
1414
1576
  return `${t}:mesh`;
1415
1577
  }
1416
1578
  }
1417
1579
  /** Обработчик события для hover */
1418
1580
  _handleMouseMove = (e) => {
1419
- this._processRaycastEvent(e, k.SelectHover, !0);
1581
+ this._isInteractionEnabled && this._processRaycastEvent(e, B.SelectHover, !0);
1420
1582
  };
1421
1583
  /** Обработчик события на click */
1422
1584
  _handleMouseClick = (e) => {
1423
- this._processRaycastEvent(e, k.SelectClick, !1);
1585
+ this._isInteractionEnabled && this._processRaycastEvent(e, B.SelectClick, !1);
1424
1586
  };
1425
1587
  /** Обработчик двойного клика */
1426
1588
  _handleDoubleClick = (e) => {
1589
+ if (!this._isInteractionEnabled) return;
1427
1590
  const t = this._getHitIntersection(e);
1428
- t !== void 0 && (t || this._bus.emit(k.SelectClick, null));
1591
+ t !== void 0 && (t || this._bus.emit(B.SelectClick, null));
1429
1592
  };
1430
1593
  /** Обработчик ухода курсора с canvas */
1431
1594
  _handleMouseLeave = () => {
1432
- this._lastHoverKey = null, this._bus.emit(k.SelectHover, null);
1595
+ this._isInteractionEnabled && (this._lastHoverKey = null, this._bus.emit(B.SelectHover, null));
1433
1596
  };
1434
1597
  /** Инициализация обработчиков событий на hover/click */
1435
1598
  _initMouseListeners() {
@@ -1441,23 +1604,23 @@ let $e = class {
1441
1604
  e.removeEventListener("mousemove", this._handleMouseMove), e.removeEventListener("click", this._handleMouseClick), e.removeEventListener("dblclick", this._handleDoubleClick), e.removeEventListener("mouseleave", this._handleMouseLeave);
1442
1605
  }
1443
1606
  dispose() {
1444
- this._removeMouseListeners(), this._isEventListenersAdded = !1, this._lastHoverKey = null;
1607
+ this._removeMouseListeners(), this._isEventListenersAdded = !1, this._isInteractionEnabled = !0, this._lastHoverKey = null;
1445
1608
  }
1446
1609
  };
1447
- $e = tr([
1448
- w(),
1449
- q(0, _("IDomApi")),
1450
- q(1, _("ICameraApi")),
1451
- q(2, _("IMeshApi")),
1452
- q(3, _("IControlsStateApi")),
1453
- q(4, _("EventBus"))
1454
- ], $e);
1455
- var sr = Object.getOwnPropertyDescriptor, rr = (e, t, s, r) => {
1456
- for (var i = r > 1 ? void 0 : r ? sr(t, s) : t, n = e.length - 1, o; n >= 0; n--)
1610
+ We = Fs([
1611
+ v(),
1612
+ q(0, c("IDomApi")),
1613
+ q(1, c("ICameraApi")),
1614
+ q(2, c("IMeshApi")),
1615
+ q(3, c("IControlsStateApi")),
1616
+ q(4, c("EventBus"))
1617
+ ], We);
1618
+ var ks = Object.getOwnPropertyDescriptor, Gs = (e, t, r, s) => {
1619
+ for (var i = s > 1 ? void 0 : s ? ks(t, r) : t, n = e.length - 1, o; n >= 0; n--)
1457
1620
  (o = e[n]) && (i = o(i) || i);
1458
1621
  return i;
1459
- }, ir = (e, t) => (s, r) => t(s, r, e);
1460
- let Re = class {
1622
+ }, zs = (e, t) => (r, s) => t(r, s, e);
1623
+ let Ne = class {
1461
1624
  constructor(e) {
1462
1625
  this._api = e;
1463
1626
  }
@@ -1470,7 +1633,7 @@ let Re = class {
1470
1633
  /** Базовый свет сцены */
1471
1634
  _light = null;
1472
1635
  init() {
1473
- this._grid = new l.GridHelper(10, 10), this._grid.position.y = -1e-3, this._api.addToScene(this._grid), this._axes = new is(6), this._api.addToScene(this._axes), this._light = new l.HemisphereLight(16777215, 4473924, 0.6), this._api.addToScene(this._light);
1636
+ this._grid = new a.GridHelper(10, 10), this._grid.position.y = -1e-3, this._api.addToScene(this._grid), this._axes = new Vr(6), this._api.addToScene(this._axes), this._light = new a.HemisphereLight(16777215, 4473924, 0.6), this._api.addToScene(this._light);
1474
1637
  }
1475
1638
  getMeshes() {
1476
1639
  return this._meshes;
@@ -1497,16 +1660,16 @@ let Re = class {
1497
1660
  this._meshes.length = 0, this._grid && (this._api.removeFromScene(this._grid), this._grid.geometry.dispose(), this._grid.material.dispose(), this._grid = null), this._axes && (this._api.removeFromScene(this._axes), this._axes = null), this._light && (this._api.removeFromScene(this._light), this._light = null);
1498
1661
  }
1499
1662
  };
1500
- Re = rr([
1501
- w(),
1502
- ir(0, _("ISceneApi"))
1503
- ], Re);
1504
- var nr = Object.getOwnPropertyDescriptor, or = (e, t, s, r) => {
1505
- for (var i = r > 1 ? void 0 : r ? nr(t, s) : t, n = e.length - 1, o; n >= 0; n--)
1663
+ Ne = Gs([
1664
+ v(),
1665
+ zs(0, c("ISceneApi"))
1666
+ ], Ne);
1667
+ var Ws = Object.getOwnPropertyDescriptor, Ns = (e, t, r, s) => {
1668
+ for (var i = s > 1 ? void 0 : s ? Ws(t, r) : t, n = e.length - 1, o; n >= 0; n--)
1506
1669
  (o = e[n]) && (i = o(i) || i);
1507
1670
  return i;
1508
- }, ar = (e, t) => (s, r) => t(s, r, e);
1509
- let Fe = class {
1671
+ }, Us = (e, t) => (r, s) => t(r, s, e);
1672
+ let Ue = class {
1510
1673
  constructor(e) {
1511
1674
  this._api = e;
1512
1675
  }
@@ -1515,7 +1678,7 @@ let Fe = class {
1515
1678
  /** Базовый свет сцены */
1516
1679
  _light = null;
1517
1680
  init() {
1518
- this._light = new l.HemisphereLight(16777215, 4473924, 0.6), this._api.addToScene(this._light);
1681
+ this._light = new a.HemisphereLight(16777215, 4473924, 0.6), this._api.addToScene(this._light);
1519
1682
  }
1520
1683
  getMeshes() {
1521
1684
  return this._meshes;
@@ -1542,51 +1705,253 @@ let Fe = class {
1542
1705
  this._meshes.length = 0, this._light && (this._api.removeFromScene(this._light), this._light = null);
1543
1706
  }
1544
1707
  };
1545
- Fe = or([
1546
- w(),
1547
- ar(0, _("ISceneApi"))
1548
- ], Fe);
1549
- var E = /* @__PURE__ */ ((e) => (e[e.Display = 0] = "Display", e[e.Scene = 1] = "Scene", e[e.Select = 2] = "Select", e[e.Tool = 3] = "Tool", e))(E || {}), lr = Object.getOwnPropertyDescriptor, cr = (e, t, s, r) => {
1550
- for (var i = r > 1 ? void 0 : r ? lr(t, s) : t, n = e.length - 1, o; n >= 0; n--)
1708
+ Ue = Ns([
1709
+ v(),
1710
+ Us(0, c("ISceneApi"))
1711
+ ], Ue);
1712
+ var Xs = Object.getOwnPropertyDescriptor, Ys = (e, t, r, s) => {
1713
+ for (var i = s > 1 ? void 0 : s ? Xs(t, r) : t, n = e.length - 1, o; n >= 0; n--)
1551
1714
  (o = e[n]) && (i = o(i) || i);
1552
1715
  return i;
1553
- }, _t = (e, t) => (s, r) => t(s, r, e);
1554
- let He = class {
1716
+ }, Ks = (e, t) => (r, s) => t(r, s, e);
1717
+ let Xe = class {
1718
+ /**
1719
+ * Конструктор модуля метрик.
1720
+ *
1721
+ * @param _rendererInfoApi - доступ к информации рендерера за кадр
1722
+ *
1723
+ * @internal
1724
+ * @constructor
1725
+ */
1726
+ constructor(e) {
1727
+ this._rendererInfoApi = e;
1728
+ }
1729
+ /** Выполняется ли сбор метрик */
1730
+ _isRunning = !1;
1731
+ /** Время запуска сбора метрик */
1732
+ _startedAt = 0;
1733
+ /** Время остановки сбора метрик */
1734
+ _stoppedAt = 0;
1735
+ /** Время предыдущего кадра */
1736
+ _lastFrameAt = 0;
1737
+ /** Количество обработанных кадров */
1738
+ _frames = 0;
1739
+ /** Суммарное время кадров */
1740
+ _frameTimeSum = 0;
1741
+ /** Максимальное время кадра */
1742
+ _maxFrameTime = 0;
1743
+ /** Количество объектов в тестовой сцене */
1744
+ _objectsCount = 0;
1745
+ /** Максимальное количество draw calls за время измерения */
1746
+ _drawCalls = 0;
1747
+ /** Максимальное количество треугольников за время измерения */
1748
+ _triangles = 0;
1749
+ /** Максимальное количество геометрий в памяти рендерера */
1750
+ _geometries = 0;
1751
+ /** Максимальное количество текстур в памяти рендерера */
1752
+ _textures = 0;
1753
+ /** Используемый объем памяти в мегабайтах */
1754
+ _memoryUsedMb = void 0;
1755
+ /** Слушатели обновления метрик */
1756
+ _listeners = /* @__PURE__ */ new Set();
1757
+ /** Время последнего уведомления слушателей */
1758
+ _lastNotifyAt = 0;
1759
+ /** Минимальный интервал уведомлений слушателей */
1760
+ _notifyIntervalMs = 250;
1761
+ /**
1762
+ * Инициализирует модуль.
1763
+ *
1764
+ * @internal
1765
+ * @method
1766
+ */
1767
+ init() {
1768
+ this.reset();
1769
+ }
1770
+ /**
1771
+ * Запускает сбор метрик.
1772
+ *
1773
+ * @param objectsCount - количество объектов, участвующих в текущем тесте
1774
+ *
1775
+ * @internal
1776
+ * @method
1777
+ */
1778
+ start(e = 0) {
1779
+ this.reset();
1780
+ const t = performance.now();
1781
+ this._isRunning = !0, this._startedAt = t, this._lastFrameAt = t, this._objectsCount = e;
1782
+ }
1783
+ /**
1784
+ * Останавливает сбор метрик.
1785
+ *
1786
+ * @internal
1787
+ * @method
1788
+ */
1789
+ stop() {
1790
+ this._isRunning && (this._isRunning = !1, this._stoppedAt = performance.now(), this._captureRendererInfo(), this._captureMemoryInfo());
1791
+ }
1792
+ /**
1793
+ * Сбрасывает накопленные метрики.
1794
+ *
1795
+ * @internal
1796
+ * @method
1797
+ */
1798
+ reset() {
1799
+ this._isRunning = !1, this._startedAt = 0, this._stoppedAt = 0, this._lastFrameAt = 0, this._frames = 0, this._frameTimeSum = 0, this._maxFrameTime = 0, this._objectsCount = 0, this._drawCalls = 0, this._triangles = 0, this._geometries = 0, this._textures = 0, this._memoryUsedMb = void 0, this._lastNotifyAt = 0;
1800
+ }
1801
+ /**
1802
+ * Выполняет наблюдение за текущим состоянием runtime.
1803
+ *
1804
+ * @remarks
1805
+ * Метод вызывается каждый кадр в отдельной фазе render loop.
1806
+ *
1807
+ * @internal
1808
+ * @method
1809
+ */
1810
+ observe() {
1811
+ if (!this._isRunning) return;
1812
+ const e = performance.now(), t = e - this._lastFrameAt;
1813
+ this._lastFrameAt = e, !(t <= 0) && (this._frames += 1, this._frameTimeSum += t, this._maxFrameTime = Math.max(this._maxFrameTime, t), this._captureRendererInfo(), this._captureMemoryInfo(), this._notify());
1814
+ }
1815
+ /**
1816
+ * Возвращает текущие или последние собранные метрики.
1817
+ *
1818
+ * @returns Метрики производительности
1819
+ *
1820
+ * @internal
1821
+ * @method
1822
+ */
1823
+ getMetrics() {
1824
+ const e = this._getDurationMs(), t = this._frames > 0 ? this._frameTimeSum / this._frames : 0, r = {
1825
+ durationMs: e,
1826
+ frames: this._frames,
1827
+ averageFps: t > 0 ? 1e3 / t : 0,
1828
+ minFps: this._maxFrameTime > 0 ? 1e3 / this._maxFrameTime : 0,
1829
+ averageFrameTime: t,
1830
+ maxFrameTime: this._maxFrameTime,
1831
+ objectsCount: this._objectsCount,
1832
+ drawCalls: this._drawCalls,
1833
+ triangles: this._triangles,
1834
+ geometries: this._geometries,
1835
+ textures: this._textures
1836
+ };
1837
+ return this._memoryUsedMb !== void 0 && (r.memoryUsedMb = this._memoryUsedMb), r;
1838
+ }
1839
+ /**
1840
+ * Регистрирует слушатель изменения метрик.
1841
+ *
1842
+ * @param listener - обработчик обновления метрик
1843
+ *
1844
+ * @returns Функция отписки
1845
+ *
1846
+ * @internal
1847
+ */
1848
+ subscribe(e) {
1849
+ return this._listeners.add(e), () => {
1850
+ this._listeners.delete(e);
1851
+ };
1852
+ }
1853
+ /**
1854
+ * Освобождает ресурсы модуля.
1855
+ *
1856
+ * @internal
1857
+ * @method
1858
+ */
1859
+ dispose() {
1860
+ this.reset();
1861
+ }
1862
+ /**
1863
+ * Возвращает фактическую длительность сбора метрик.
1864
+ *
1865
+ * @returns Длительность измерения в миллисекундах
1866
+ *
1867
+ * @private
1868
+ * @method
1869
+ */
1870
+ _getDurationMs() {
1871
+ if (!this._startedAt) return 0;
1872
+ const e = this._isRunning ? performance.now() : this._stoppedAt;
1873
+ return Math.max(0, e - this._startedAt);
1874
+ }
1875
+ /**
1876
+ * Сохраняет статистику WebGL-рендерера.
1877
+ *
1878
+ * @private
1879
+ * @method
1880
+ */
1881
+ _captureRendererInfo() {
1882
+ const e = this._rendererInfoApi.getRendererInfo();
1883
+ this._drawCalls = Math.max(this._drawCalls, e.drawCalls), this._triangles = Math.max(this._triangles, e.triangles), this._geometries = Math.max(this._geometries, e.geometries), this._textures = Math.max(this._textures, e.textures);
1884
+ }
1885
+ /**
1886
+ * Сохраняет информацию об используемой памяти, если она доступна.
1887
+ *
1888
+ * @private
1889
+ * @method
1890
+ */
1891
+ _captureMemoryInfo() {
1892
+ const e = performance.memory;
1893
+ e && (this._memoryUsedMb = e.usedJSHeapSize / 1024 / 1024);
1894
+ }
1895
+ /**
1896
+ * Уведомляет слушателей об обновлении метрик.
1897
+ *
1898
+ * @private
1899
+ * @method
1900
+ */
1901
+ _notify() {
1902
+ if (this._listeners.size === 0) return;
1903
+ const e = performance.now();
1904
+ if (e - this._lastNotifyAt < this._notifyIntervalMs) return;
1905
+ this._lastNotifyAt = e;
1906
+ const t = this.getMetrics();
1907
+ this._listeners.forEach((r) => r(t));
1908
+ }
1909
+ };
1910
+ Xe = Ys([
1911
+ v(),
1912
+ Ks(0, c("IRendererInfoApi"))
1913
+ ], Xe);
1914
+ var P = /* @__PURE__ */ ((e) => (e[e.Display = 0] = "Display", e[e.Scene = 1] = "Scene", e[e.Select = 2] = "Select", e[e.Tool = 3] = "Tool", e[e.Benchmark = 4] = "Benchmark", e))(P || {}), qs = Object.getOwnPropertyDescriptor, Zs = (e, t, r, s) => {
1915
+ for (var i = s > 1 ? void 0 : s ? qs(t, r) : t, n = e.length - 1, o; n >= 0; n--)
1916
+ (o = e[n]) && (i = o(i) || i);
1917
+ return i;
1918
+ }, Bt = (e, t) => (r, s) => t(r, s, e);
1919
+ let Ye = class {
1555
1920
  constructor(e, t) {
1556
- this._store = t, this._handlers = new Map(e.map((s) => [s.mode, s]));
1921
+ this._store = t, this._handlers = new Map(e.map((r) => [r.mode, r]));
1557
1922
  }
1558
1923
  /** Текущий режим отображения */
1559
- _currentMode = K.Plane;
1924
+ _currentMode = J.Plane;
1560
1925
  /** Хендлеры, которые управляют отображением */
1561
1926
  _handlers;
1562
1927
  /** Тип фичи, за которую отвечает менеджер. */
1563
- type = E.Display;
1928
+ type = P.Display;
1564
1929
  /** Установка режима отображения */
1565
1930
  manage(e) {
1566
- e !== this._currentMode && (this._handlers.get(this._currentMode)?.rollback(), e !== K.Plane && this._handlers.get(e)?.handle(), this._currentMode = e, this._store.setDisplayMode(this._currentMode));
1931
+ e !== this._currentMode && (this._handlers.get(this._currentMode)?.rollback(), e !== J.Plane && this._handlers.get(e)?.handle(), this._currentMode = e, this._store.setDisplayMode(this._currentMode));
1567
1932
  }
1568
1933
  /** Освобождает ресурсы менеджера. */
1569
1934
  dispose() {
1570
- this._handlers && this._handlers.clear(), this._currentMode = K.Plane, this._store.setDisplayMode(this._currentMode);
1935
+ this._handlers && this._handlers.clear(), this._currentMode = J.Plane, this._store.setDisplayMode(this._currentMode);
1571
1936
  }
1572
1937
  };
1573
- He = cr([
1574
- w(),
1575
- _t(0, B("IDisplayHandler")),
1576
- _t(1, _("EditorStore"))
1577
- ], He);
1578
- var hr = Object.getOwnPropertyDescriptor, dr = (e, t, s, r) => {
1579
- for (var i = r > 1 ? void 0 : r ? hr(t, s) : t, n = e.length - 1, o; n >= 0; n--)
1938
+ Ye = Zs([
1939
+ v(),
1940
+ Bt(0, H("IDisplayHandler")),
1941
+ Bt(1, c("EditorStore"))
1942
+ ], Ye);
1943
+ var Js = Object.getOwnPropertyDescriptor, Qs = (e, t, r, s) => {
1944
+ for (var i = s > 1 ? void 0 : s ? Js(t, r) : t, n = e.length - 1, o; n >= 0; n--)
1580
1945
  (o = e[n]) && (i = o(i) || i);
1581
1946
  return i;
1582
- }, ur = (e, t) => (s, r) => t(s, r, e);
1583
- let pe = class {
1947
+ }, ei = (e, t) => (r, s) => t(r, s, e);
1948
+ let Ke = class {
1584
1949
  /** Текущий режим редактирования сцены */
1585
1950
  _currentMode = T.AddFigure;
1586
1951
  /** Хендлеры, которые управляют отображением */
1587
1952
  _handlers;
1588
1953
  /** Тип фичи, за которую отвечает менеджер. */
1589
- type = E.Scene;
1954
+ type = P.Scene;
1590
1955
  constructor(e) {
1591
1956
  this._handlers = new Map(e.map((t) => [t.mode, t]));
1592
1957
  }
@@ -1599,126 +1964,152 @@ let pe = class {
1599
1964
  this._handlers && this._handlers.clear(), this._currentMode = T.AddFigure;
1600
1965
  }
1601
1966
  };
1602
- pe = dr([
1603
- w(),
1604
- ur(0, B("ISceneHandler"))
1605
- ], pe);
1606
- var F = /* @__PURE__ */ ((e) => (e.Hover = "hover", e.Click = "click", e))(F || {}), _r = Object.getOwnPropertyDescriptor, pr = (e, t, s, r) => {
1607
- for (var i = r > 1 ? void 0 : r ? _r(t, s) : t, n = e.length - 1, o; n >= 0; n--)
1967
+ Ke = Qs([
1968
+ v(),
1969
+ ei(0, H("ISceneHandler"))
1970
+ ], Ke);
1971
+ var R = /* @__PURE__ */ ((e) => (e.Hover = "hover", e.Click = "click", e))(R || {}), ti = Object.getOwnPropertyDescriptor, ri = (e, t, r, s) => {
1972
+ for (var i = s > 1 ? void 0 : s ? ti(t, r) : t, n = e.length - 1, o; n >= 0; n--)
1608
1973
  (o = e[n]) && (i = o(i) || i);
1609
1974
  return i;
1610
- }, Ie = (e, t) => (s, r) => t(s, r, e);
1611
- let Be = class {
1612
- constructor(e, t, s) {
1613
- this._eventBus = e, this._store = s, this._handlers = new Map(t.map((r) => [r.mode, r])), this._eventBus.on(k.SelectHover, this._onHover), this._eventBus.on(k.SelectClick, this._onClick);
1975
+ }, Ce = (e, t) => (r, s) => t(r, s, e);
1976
+ let qe = class {
1977
+ constructor(e, t, r) {
1978
+ this._eventBus = e, this._store = r, this._handlers = new Map(t.map((s) => [s.mode, s])), this._eventBus.on(B.SelectHover, this._onHover), this._eventBus.on(B.SelectClick, this._onClick);
1614
1979
  }
1615
1980
  /** Текущий режим выборки */
1616
- _currentMode = P.Mesh;
1981
+ _currentMode = O.Mesh;
1617
1982
  /** Хендлеры, которые управляют выборкой */
1618
1983
  _handlers;
1619
1984
  /** Тип фичи, за которую отвечает менеджер. */
1620
- type = E.Select;
1985
+ type = P.Select;
1621
1986
  /** Переключает режим выбора */
1622
1987
  manage(e) {
1623
1988
  e !== this._currentMode && (this._handlers.get(this._currentMode)?.rollback(), this._currentMode = e, this._store.setSelectMode(this._currentMode));
1624
1989
  }
1625
1990
  /** Обработчик события наведения на модель */
1626
1991
  _onHover = (e) => {
1627
- this._handlers.get(this._currentMode)?.handle(e, F.Hover);
1992
+ this._handlers.get(this._currentMode)?.handle(e, R.Hover);
1628
1993
  };
1629
1994
  /** Обработчик события клика на модель */
1630
1995
  _onClick = (e) => {
1631
- this._handlers.get(this._currentMode)?.handle(e, F.Click);
1996
+ this._handlers.get(this._currentMode)?.handle(e, R.Click);
1632
1997
  };
1633
1998
  /** Освобождает ресурсы менеджера. */
1634
1999
  dispose() {
1635
- this._handlers && this._handlers.clear(), this._eventBus.off(k.SelectHover, this._onHover), this._currentMode = P.Mesh, this._store.setSelectMode(this._currentMode);
2000
+ this._handlers && this._handlers.clear(), this._eventBus.off(B.SelectHover, this._onHover), this._currentMode = O.Mesh, this._store.setSelectMode(this._currentMode);
1636
2001
  }
1637
2002
  };
1638
- Be = pr([
1639
- w(),
1640
- Ie(0, _("EventBus")),
1641
- Ie(1, B("ISelectHandler")),
1642
- Ie(2, _("EditorStore"))
1643
- ], Be);
1644
- const mr = (e) => (t, s, r) => {
1645
- const i = r.value;
2003
+ qe = ri([
2004
+ v(),
2005
+ Ce(0, c("EventBus")),
2006
+ Ce(1, H("ISelectHandler")),
2007
+ Ce(2, c("EditorStore"))
2008
+ ], qe);
2009
+ const si = (e) => (t, r, s) => {
2010
+ const i = s.value;
1646
2011
  if (!i)
1647
2012
  throw new Error("usePolicy can only be applied to method");
1648
- return r.value = function(...n) {
2013
+ return s.value = function(...n) {
1649
2014
  return e(this).check(...n), i.apply(this, n);
1650
- }, r;
1651
- }, $t = (e) => (t, s, r) => {
1652
- const i = r.value;
2015
+ }, s;
2016
+ }, nr = (e) => (t, r, s) => {
2017
+ const i = s.value;
1653
2018
  if (!i)
1654
2019
  throw new Error("useValidator can only be applied to method");
1655
- return r.value = function(...n) {
2020
+ return s.value = function(...n) {
1656
2021
  return e(this).validate(...n), i.apply(this, n);
1657
- }, r;
2022
+ }, s;
1658
2023
  };
1659
- var gr = Object.defineProperty, fr = Object.getOwnPropertyDescriptor, Rt = (e, t, s, r) => {
1660
- for (var i = r > 1 ? void 0 : r ? fr(t, s) : t, n = e.length - 1, o; n >= 0; n--)
1661
- (o = e[n]) && (i = (r ? o(t, s, i) : o(i)) || i);
1662
- return r && i && gr(t, s, i), i;
1663
- }, Pe = (e, t) => (s, r) => t(s, r, e);
1664
- let me = class {
1665
- constructor(e, t, s) {
1666
- this._store = t, this._policy = s, this._handlers = new Map(e.map((r) => [r.mode, r])), this._unsubSelected = this._store.onSelectedObjectChange(() => {
2024
+ var ii = Object.defineProperty, ni = Object.getOwnPropertyDescriptor, or = (e, t, r, s) => {
2025
+ for (var i = s > 1 ? void 0 : s ? ni(t, r) : t, n = e.length - 1, o; n >= 0; n--)
2026
+ (o = e[n]) && (i = (s ? o(t, r, i) : o(i)) || i);
2027
+ return s && i && ii(t, r, i), i;
2028
+ }, Oe = (e, t) => (r, s) => t(r, s, e);
2029
+ let fe = class {
2030
+ constructor(e, t, r) {
2031
+ this._store = t, this._policy = r, this._handlers = new Map(e.map((s) => [s.mode, s])), this._unsubSelected = this._store.onSelectedObjectChange(() => {
1667
2032
  this._handlers.get(this._currentTool)?.handle();
1668
2033
  });
1669
2034
  }
1670
2035
  /** Текущий выбранный инструмент */
1671
- _currentTool = U.Translate;
2036
+ _currentTool = W.Translate;
1672
2037
  /** Хендлеры, которые управляют инструментами */
1673
2038
  _handlers;
1674
2039
  /** Событие обновления выбора объекта */
1675
2040
  _unsubSelected;
1676
2041
  /** Тип фичи, за которую отвечает менеджер. */
1677
- type = E.Tool;
2042
+ type = P.Tool;
1678
2043
  manage(e) {
1679
2044
  this._currentTool !== e && (this._handlers.get(this._currentTool)?.rollback(), this._currentTool = e, this._store.setToolType(this._currentTool), this._handlers.get(this._currentTool)?.handle());
1680
2045
  }
1681
2046
  /** Освобождает ресурсы менеджера. */
1682
2047
  dispose() {
1683
- this._unsubSelected?.(), this._handlers && this._handlers.clear(), this._currentTool = U.Translate, this._store.setToolType(this._currentTool);
2048
+ this._unsubSelected?.(), this._handlers && this._handlers.clear(), this._currentTool = W.Translate, this._store.setToolType(this._currentTool);
1684
2049
  }
1685
2050
  };
1686
- Rt([
1687
- mr((e) => e._policy)
1688
- ], me.prototype, "manage", 1);
1689
- me = Rt([
1690
- w(),
1691
- Pe(0, B("IToolHandler")),
1692
- Pe(1, _("EditorStore")),
1693
- Pe(2, _("ToolPolicy"))
1694
- ], me);
1695
- var vr = Object.getOwnPropertyDescriptor, yr = (e, t, s, r) => {
1696
- for (var i = r > 1 ? void 0 : r ? vr(t, s) : t, n = e.length - 1, o; n >= 0; n--)
2051
+ or([
2052
+ si((e) => e._policy)
2053
+ ], fe.prototype, "manage", 1);
2054
+ fe = or([
2055
+ v(),
2056
+ Oe(0, H("IToolHandler")),
2057
+ Oe(1, c("EditorStore")),
2058
+ Oe(2, c("ToolPolicy"))
2059
+ ], fe);
2060
+ var oi = Object.getOwnPropertyDescriptor, ai = (e, t, r, s) => {
2061
+ for (var i = s > 1 ? void 0 : s ? oi(t, r) : t, n = e.length - 1, o; n >= 0; n--)
1697
2062
  (o = e[n]) && (i = o(i) || i);
1698
2063
  return i;
1699
- }, br = (e, t) => (s, r) => t(s, r, e);
1700
- let ke = class {
2064
+ }, li = (e, t) => (r, s) => t(r, s, e);
2065
+ let Ze = class {
2066
+ /** Тип фичи, за которую отвечает менеджер. */
2067
+ type = P.Benchmark;
2068
+ /** Текущий режим тестирования */
2069
+ _currentMode = X.Light;
2070
+ /** Хендлеры, которые управляют тестированием */
2071
+ _handlers;
1701
2072
  constructor(e) {
1702
- this._api = e;
2073
+ this._handlers = new Map(e.map((t) => [t.mode, t]));
1703
2074
  }
1704
- /** Режим отображения. */
1705
- mode = K.Wireframe;
1706
- /** Сохраняем предыдущие значения wireframe для отката. */
1707
- _prevWireframe = /* @__PURE__ */ new Map();
1708
- /** Сохраняем исходные цвета материалов для отката */
2075
+ manage(e, t) {
2076
+ this._handlers.get(this._currentMode)?.rollback(), this._currentMode = e, this._handlers.get(this._currentMode)?.handle(t);
2077
+ }
2078
+ dispose() {
2079
+ this._handlers && this._handlers.clear(), this._currentMode = X.Light;
2080
+ }
2081
+ };
2082
+ Ze = ai([
2083
+ v(),
2084
+ li(0, H("IBenchmarkHandler"))
2085
+ ], Ze);
2086
+ var ci = Object.getOwnPropertyDescriptor, hi = (e, t, r, s) => {
2087
+ for (var i = s > 1 ? void 0 : s ? ci(t, r) : t, n = e.length - 1, o; n >= 0; n--)
2088
+ (o = e[n]) && (i = o(i) || i);
2089
+ return i;
2090
+ }, di = (e, t) => (r, s) => t(r, s, e);
2091
+ let Je = class {
2092
+ constructor(e) {
2093
+ this._api = e;
2094
+ }
2095
+ /** Режим отображения. */
2096
+ mode = J.Wireframe;
2097
+ /** Сохраняем предыдущие значения wireframe для отката. */
2098
+ _prevWireframe = /* @__PURE__ */ new Map();
2099
+ /** Сохраняем исходные цвета материалов для отката */
1709
2100
  _prevColorMesh = /* @__PURE__ */ new Map();
1710
2101
  _prevColorLines = /* @__PURE__ */ new Map();
1711
2102
  /** Цвет ребер для wireframe-режима. */
1712
- _wireColor = new l.Color(65535);
2103
+ _wireColor = new a.Color(65535);
1713
2104
  /** Применяет wireframe-режим к сцене. */
1714
2105
  handle() {
1715
2106
  const e = this._api.getMeshes();
1716
2107
  for (const t of e) {
1717
- const s = Array.isArray(t.material) ? t.material : [t.material];
1718
- for (const r of s) this._enableWireframeOnMaterial(r);
1719
- t.traverse((r) => {
1720
- if (r.isLineSegments) {
1721
- const i = r;
2108
+ const r = Array.isArray(t.material) ? t.material : [t.material];
2109
+ for (const s of r) this._enableWireframeOnMaterial(s);
2110
+ t.traverse((s) => {
2111
+ if (s.isLineSegments) {
2112
+ const i = s;
1722
2113
  if (!this._prevColorLines.has(i.material)) {
1723
2114
  const o = i.material;
1724
2115
  this._prevColorLines.set(o, o.color.clone());
@@ -1735,8 +2126,8 @@ let ke = class {
1735
2126
  "wireframe" in e && (e.wireframe = t), e.needsUpdate = !0;
1736
2127
  this._prevWireframe.clear();
1737
2128
  for (const [e, t] of this._prevColorMesh) {
1738
- const s = e;
1739
- s.color?.isColor && s.color.copy(t);
2129
+ const r = e;
2130
+ r.color?.isColor && r.color.copy(t);
1740
2131
  }
1741
2132
  this._prevColorMesh.clear();
1742
2133
  for (const [e, t] of this._prevColorLines)
@@ -1753,21 +2144,21 @@ let ke = class {
1753
2144
  "wireframe" in t && !this._prevWireframe.has(e) && (this._prevWireframe.set(e, !!t.wireframe), t.wireframe = !0, e.needsUpdate = !0), t.color?.isColor && (this._prevColorMesh.has(e) || this._prevColorMesh.set(e, t.color.clone()), t.color.copy(this._wireColor));
1754
2145
  }
1755
2146
  };
1756
- ke = yr([
1757
- w(),
1758
- br(0, _("IMeshApi"))
1759
- ], ke);
1760
- var Mr = Object.getOwnPropertyDescriptor, xr = (e, t, s, r) => {
1761
- for (var i = r > 1 ? void 0 : r ? Mr(t, s) : t, n = e.length - 1, o; n >= 0; n--)
2147
+ Je = hi([
2148
+ v(),
2149
+ di(0, c("IMeshApi"))
2150
+ ], Je);
2151
+ var _i = Object.getOwnPropertyDescriptor, ui = (e, t, r, s) => {
2152
+ for (var i = s > 1 ? void 0 : s ? _i(t, r) : t, n = e.length - 1, o; n >= 0; n--)
1762
2153
  (o = e[n]) && (i = o(i) || i);
1763
2154
  return i;
1764
- }, re = (e, t) => (s, r) => t(s, r, e);
1765
- let ze = class {
1766
- constructor(e, t, s, r) {
1767
- this._sceneApi = e, this._cameraApi = t, this._raycastApi = s, this._store = r, this._cameraApi.enableCameraLayer($), this._hoverLine = Y(this._makeOverlayLine(this._hoverColor)), this._selectLine = Y(this._makeOverlayLine(this._selectColor)), this._sceneApi.addObject(this._hoverLine, $), this._sceneApi.addObject(this._selectLine, $);
2155
+ }, se = (e, t) => (r, s) => t(r, s, e);
2156
+ let Qe = class {
2157
+ constructor(e, t, r, s) {
2158
+ this._sceneApi = e, this._cameraApi = t, this._raycastApi = r, this._store = s, this._cameraApi.enableCameraLayer($), this._hoverLine = Y(this._makeOverlayLine(this._hoverColor)), this._selectLine = Y(this._makeOverlayLine(this._selectColor)), this._sceneApi.addObject(this._hoverLine, $), this._sceneApi.addObject(this._selectLine, $);
1768
2159
  }
1769
2160
  /** Режим, которым управляет хендлер, нужен только менеджеру */
1770
- mode = P.Edge;
2161
+ mode = O.Edge;
1771
2162
  /** Текущее наведённое ребро. */
1772
2163
  _hoverLine;
1773
2164
  /** Текущее выбранное ребро. */
@@ -1778,33 +2169,33 @@ let ze = class {
1778
2169
  _selected = null;
1779
2170
  // Цвета, необходимые для переключения
1780
2171
  /** Цвет ребра, на которое навелись */
1781
- _hoverColor = Me;
2172
+ _hoverColor = be;
1782
2173
  /** Цвет выделенного ребра */
1783
- _selectColor = xe;
2174
+ _selectColor = Me;
1784
2175
  /** Обработка текущего режима выборки. */
1785
2176
  handle(e, t) {
1786
- if (this._raycastApi.setRaycastMode(this.mode), t === F.Hover) {
2177
+ if (this._raycastApi.setRaycastMode(this.mode), t === R.Hover) {
1787
2178
  if (!e) {
1788
2179
  this._hoverLine.visible = !1, this._hovered = null;
1789
2180
  return;
1790
2181
  }
1791
- const s = e.intersection.object;
1792
- if (!s?.isLineSegments) return;
1793
- const r = s, i = Math.floor((e.intersection.index ?? -1) / 2);
2182
+ const r = e.intersection.object;
2183
+ if (!r?.isLineSegments) return;
2184
+ const s = r, i = Math.floor((e.intersection.index ?? -1) / 2);
1794
2185
  if (i < 0) return;
1795
- this._selected && this._same({ lines: r, seg: i }, this._selected) ? this._hoverLine.visible = !1 : (this._writeWorldSegment(this._hoverLine, r, i), this._hoverLine.visible = !0), this._hovered = { lines: r, seg: i };
2186
+ this._selected && this._same({ lines: s, seg: i }, this._selected) ? this._hoverLine.visible = !1 : (this._writeWorldSegment(this._hoverLine, s, i), this._hoverLine.visible = !0), this._hovered = { lines: s, seg: i };
1796
2187
  return;
1797
2188
  }
1798
- if (t === F.Click) {
2189
+ if (t === R.Click) {
1799
2190
  if (!e) {
1800
2191
  this._selectLine.visible = !1, this._selected = null, this._store.setSelectedObject(null);
1801
2192
  return;
1802
2193
  }
1803
- const s = e.intersection.object;
1804
- if (!s?.isLineSegments) return;
1805
- const r = s, i = Math.floor((e.intersection.index ?? -1) / 2);
2194
+ const r = e.intersection.object;
2195
+ if (!r?.isLineSegments) return;
2196
+ const s = r, i = Math.floor((e.intersection.index ?? -1) / 2);
1806
2197
  if (i < 0) return;
1807
- this._writeWorldSegment(this._selectLine, r, i), this._centerAndOrientLineOnSegment(this._selectLine, r, i), this._selectLine.visible = !0, this._prepareEdgeMetadata(r, i), this._store.setSelectedObject(this._selectLine), this._selected = { lines: r, seg: i }, this._hovered && this._same(this._hovered, this._selected) && (this._hoverLine.visible = !1);
2198
+ this._writeWorldSegment(this._selectLine, s, i), this._centerAndOrientLineOnSegment(this._selectLine, s, i), this._selectLine.visible = !0, this._prepareEdgeMetadata(s, i), this._store.setSelectedObject(this._selectLine), this._selected = { lines: s, seg: i }, this._hovered && this._same(this._hovered, this._selected) && (this._hoverLine.visible = !1);
1808
2199
  }
1809
2200
  }
1810
2201
  /** Откат текущего режима выборки */
@@ -1820,89 +2211,89 @@ let ze = class {
1820
2211
  * использоваться они будут только для обозначения геометрии ребер конкретной фигуры.
1821
2212
  */
1822
2213
  _makeOverlayLine(e) {
1823
- const t = new l.BufferGeometry();
1824
- t.setAttribute("position", new l.Float32BufferAttribute(6, 3));
1825
- const s = new l.LineBasicMaterial({
2214
+ const t = new a.BufferGeometry();
2215
+ t.setAttribute("position", new a.Float32BufferAttribute(6, 3));
2216
+ const r = new a.LineBasicMaterial({
1826
2217
  color: e,
1827
2218
  depthTest: !1,
1828
2219
  depthWrite: !1,
1829
2220
  transparent: !0,
1830
2221
  opacity: 1
1831
- }), r = new l.Line(t, s);
1832
- return r.renderOrder = 1e3, r.raycast = () => {
1833
- }, r.layers.set($), r.visible = !1, r;
2222
+ }), s = new a.Line(t, r);
2223
+ return s.renderOrder = 1e3, s.raycast = () => {
2224
+ }, s.layers.set($), s.visible = !1, s;
1834
2225
  }
1835
2226
  /** Локальные точки сегмента переводим в target (который висит на сцене) */
1836
- _writeWorldSegment(e, t, s) {
1837
- const r = t.geometry.getAttribute("position"), i = s * 2, n = i + 1, o = new l.Vector3(r.getX(i), r.getY(i), r.getZ(i)).applyMatrix4(
2227
+ _writeWorldSegment(e, t, r) {
2228
+ const s = t.geometry.getAttribute("position"), i = r * 2, n = i + 1, o = new a.Vector3(s.getX(i), s.getY(i), s.getZ(i)).applyMatrix4(
1838
2229
  t.matrixWorld
1839
- ), c = new l.Vector3(r.getX(n), r.getY(n), r.getZ(n)).applyMatrix4(
2230
+ ), l = new a.Vector3(s.getX(n), s.getY(n), s.getZ(n)).applyMatrix4(
1840
2231
  t.matrixWorld
1841
- ), u = e.geometry.getAttribute("position");
1842
- u.setXYZ(0, o.x, o.y, o.z), u.setXYZ(1, c.x, c.y, c.z), u.needsUpdate = !0;
2232
+ ), h = e.geometry.getAttribute("position");
2233
+ h.setXYZ(0, o.x, o.y, o.z), h.setXYZ(1, l.x, l.y, l.z), h.needsUpdate = !0;
1843
2234
  }
1844
2235
  _same(e, t) {
1845
2236
  return !!e && !!t && e.lines === t.lines && e.seg === t.seg;
1846
2237
  }
1847
2238
  /** Центрует `THREE.Line` на сегменте и ориентирует её вдоль ребра */
1848
- _centerAndOrientLineOnSegment(e, t, s) {
1849
- const r = t.geometry.getAttribute("position"), i = s * 2, n = i + 1, o = new l.Vector3(r.getX(i), r.getY(i), r.getZ(i)).applyMatrix4(
2239
+ _centerAndOrientLineOnSegment(e, t, r) {
2240
+ const s = t.geometry.getAttribute("position"), i = r * 2, n = i + 1, o = new a.Vector3(s.getX(i), s.getY(i), s.getZ(i)).applyMatrix4(
1850
2241
  t.matrixWorld
1851
- ), c = new l.Vector3(r.getX(n), r.getY(n), r.getZ(n)).applyMatrix4(
2242
+ ), l = new a.Vector3(s.getX(n), s.getY(n), s.getZ(n)).applyMatrix4(
1852
2243
  t.matrixWorld
1853
- ), u = new l.Vector3().subVectors(c, o), d = u.length();
2244
+ ), h = new a.Vector3().subVectors(l, o), d = h.length();
1854
2245
  if (!isFinite(d) || d === 0) return;
1855
- const m = new l.Vector3().addVectors(o, c).multiplyScalar(0.5);
1856
- e.position.copy(m);
1857
- const p = e.geometry;
1858
- let g = p.getAttribute("position");
1859
- (!g || g.count < 2) && (p.setAttribute("position", new l.BufferAttribute(new Float32Array(6), 3)), g = p.getAttribute("position")), g.setXYZ(0, -d / 2, 0, 0), g.setXYZ(1, d / 2, 0, 0), g.needsUpdate = !0, u.normalize();
1860
- const f = new l.Quaternion().setFromUnitVectors(new l.Vector3(1, 0, 0), u);
2246
+ const p = new a.Vector3().addVectors(o, l).multiplyScalar(0.5);
2247
+ e.position.copy(p);
2248
+ const u = e.geometry;
2249
+ let m = u.getAttribute("position");
2250
+ (!m || m.count < 2) && (u.setAttribute("position", new a.BufferAttribute(new Float32Array(6), 3)), m = u.getAttribute("position")), m.setXYZ(0, -d / 2, 0, 0), m.setXYZ(1, d / 2, 0, 0), m.needsUpdate = !0, h.normalize();
2251
+ const f = new a.Quaternion().setFromUnitVectors(new a.Vector3(1, 0, 0), h);
1861
2252
  e.quaternion.copy(f), e.updateMatrixWorld(!0);
1862
2253
  }
1863
2254
  /** Запись метаданных выбранного ребра для использования инструментов */
1864
2255
  _prepareEdgeMetadata(e, t) {
1865
- const s = Pt(e);
1866
- if (!s) return;
1867
- const r = e.geometry.getAttribute("position"), i = t * 2, n = i + 1, o = new l.Vector3(r.getX(i), r.getY(i), r.getZ(i)).applyMatrix4(
2256
+ const r = er(e);
2257
+ if (!r) return;
2258
+ const s = e.geometry.getAttribute("position"), i = t * 2, n = i + 1, o = new a.Vector3(s.getX(i), s.getY(i), s.getZ(i)).applyMatrix4(
1868
2259
  e.matrixWorld
1869
- ), c = new l.Vector3(r.getX(n), r.getY(n), r.getZ(n)).applyMatrix4(
2260
+ ), l = new a.Vector3(s.getX(n), s.getY(n), s.getZ(n)).applyMatrix4(
1870
2261
  e.matrixWorld
1871
- ), u = new l.Matrix4().copy(s.matrixWorld).invert(), d = o.clone().applyMatrix4(u), m = c.clone().applyMatrix4(u), g = s.geometry.getAttribute("position"), f = new l.Vector3(), h = 1e-6, v = [], y = [];
1872
- for (let O = 0; O < g.count; O++)
1873
- f.fromBufferAttribute(g, O), f.distanceToSquared(d) < h * h ? v.push(O) : f.distanceToSquared(m) < h * h && y.push(O);
1874
- const A = new l.Matrix4().copy(e.matrixWorld).invert(), S = o.clone().applyMatrix4(A), x = c.clone().applyMatrix4(A), b = e.geometry.getAttribute("position"), C = new l.Vector3(), M = [], I = [];
1875
- for (let O = 0; O < b.count; O++)
1876
- C.fromBufferAttribute(b, O), C.distanceToSquared(S) < h * h ? M.push(O) : C.distanceToSquared(x) < h * h && I.push(O);
2262
+ ), h = new a.Matrix4().copy(r.matrixWorld).invert(), d = o.clone().applyMatrix4(h), p = l.clone().applyMatrix4(h), m = r.geometry.getAttribute("position"), f = new a.Vector3(), _ = 1e-6, g = [], b = [];
2263
+ for (let A = 0; A < m.count; A++)
2264
+ f.fromBufferAttribute(m, A), f.distanceToSquared(d) < _ * _ ? g.push(A) : f.distanceToSquared(p) < _ * _ && b.push(A);
2265
+ const x = new a.Matrix4().copy(e.matrixWorld).invert(), S = o.clone().applyMatrix4(x), w = l.clone().applyMatrix4(x), M = e.geometry.getAttribute("position"), I = new a.Vector3(), y = [], C = [];
2266
+ for (let A = 0; A < M.count; A++)
2267
+ I.fromBufferAttribute(M, A), I.distanceToSquared(S) < _ * _ ? y.push(A) : I.distanceToSquared(w) < _ * _ && C.push(A);
1877
2268
  this._selectLine.userData.edgeInfo = {
1878
2269
  lines: e,
1879
2270
  seg: t,
1880
- mesh: s,
1881
- aIndices: v,
1882
- bIndices: y,
1883
- aEdgeIndices: M,
1884
- bEdgeIndices: I
2271
+ mesh: r,
2272
+ aIndices: g,
2273
+ bIndices: b,
2274
+ aEdgeIndices: y,
2275
+ bEdgeIndices: C
1885
2276
  };
1886
2277
  }
1887
2278
  };
1888
- ze = xr([
1889
- w(),
1890
- re(0, _("ISceneApi")),
1891
- re(1, _("ICameraApi")),
1892
- re(2, _("IRaycastApi")),
1893
- re(3, _("EditorStore"))
1894
- ], ze);
1895
- var Sr = Object.getOwnPropertyDescriptor, wr = (e, t, s, r) => {
1896
- for (var i = r > 1 ? void 0 : r ? Sr(t, s) : t, n = e.length - 1, o; n >= 0; n--)
2279
+ Qe = ui([
2280
+ v(),
2281
+ se(0, c("ISceneApi")),
2282
+ se(1, c("ICameraApi")),
2283
+ se(2, c("IRaycastApi")),
2284
+ se(3, c("EditorStore"))
2285
+ ], Qe);
2286
+ var pi = Object.getOwnPropertyDescriptor, mi = (e, t, r, s) => {
2287
+ for (var i = s > 1 ? void 0 : s ? pi(t, r) : t, n = e.length - 1, o; n >= 0; n--)
1897
2288
  (o = e[n]) && (i = o(i) || i);
1898
2289
  return i;
1899
- }, ie = (e, t) => (s, r) => t(s, r, e);
1900
- let Ge = class {
1901
- constructor(e, t, s, r) {
1902
- this._cameraApi = e, this._sceneApi = t, this._raycastApi = s, this._store = r, this._cameraApi.enableCameraLayer($), this._hoverFace = Y(this._makeOverlayFace(this._hoverColor)), this._selectFace = Y(this._makeOverlayFace(this._selectColor)), this._sceneApi.addObject(this._hoverFace, $), this._sceneApi.addObject(this._selectFace, $);
2290
+ }, ie = (e, t) => (r, s) => t(r, s, e);
2291
+ let et = class {
2292
+ constructor(e, t, r, s) {
2293
+ this._cameraApi = e, this._sceneApi = t, this._raycastApi = r, this._store = s, this._cameraApi.enableCameraLayer($), this._hoverFace = Y(this._makeOverlayFace(this._hoverColor)), this._selectFace = Y(this._makeOverlayFace(this._selectColor)), this._sceneApi.addObject(this._hoverFace, $), this._sceneApi.addObject(this._selectFace, $);
1903
2294
  }
1904
2295
  /** Режим, которым управляет хендлер, нужен только менеджеру */
1905
- mode = P.Face;
2296
+ mode = O.Face;
1906
2297
  /** Текущая наведённая грань */
1907
2298
  _hoverFace;
1908
2299
  /** Текущая выбранная грань */
@@ -1917,9 +2308,9 @@ let Ge = class {
1917
2308
  _selected = null;
1918
2309
  // Цвета, необходимые для переключения
1919
2310
  /** Цвет грани, на которую навелись */
1920
- _hoverColor = Me;
2311
+ _hoverColor = be;
1921
2312
  /** Цвет выделенной граней */
1922
- _selectColor = xe;
2313
+ _selectColor = Me;
1923
2314
  // Погрешности для поиска треугольников и сборки граней
1924
2315
  /** Погрешность на сравнение нормалей */
1925
2316
  _normalEps = 1e-4;
@@ -1927,30 +2318,30 @@ let Ge = class {
1927
2318
  _planeEps = 1e-4;
1928
2319
  /** Обработка текущего режима выборки. */
1929
2320
  handle(e, t) {
1930
- if (this._raycastApi.setRaycastMode(this.mode), t === F.Hover) {
2321
+ if (this._raycastApi.setRaycastMode(this.mode), t === R.Hover) {
1931
2322
  if (!e) {
1932
2323
  this._hoverFace.visible = !1, this._hovered = null;
1933
2324
  return;
1934
2325
  }
1935
- const s = e.intersection.object;
1936
- if (!s?.isMesh) return;
1937
- const r = s, i = e.intersection.faceIndex ?? -1;
2326
+ const r = e.intersection.object;
2327
+ if (!r?.isMesh) return;
2328
+ const s = r, i = e.intersection.faceIndex ?? -1;
1938
2329
  if (i < 0) return;
1939
- const n = this._collectFaceGroup(r, i);
2330
+ const n = this._collectFaceGroup(s, i);
1940
2331
  if (!n) return;
1941
2332
  this._selected && this._same(n, this._selected) ? this._hoverFace.visible = !1 : (this._writeWorldFaceGroup(this._hoverFace, n), this._hoverFace.visible = !0), this._hovered = n;
1942
2333
  return;
1943
2334
  }
1944
- if (t === F.Click) {
2335
+ if (t === R.Click) {
1945
2336
  if (!e) {
1946
2337
  this._selectFace.visible = !1, this._selected = null, this._store.setSelectedObject(null);
1947
2338
  return;
1948
2339
  }
1949
- const s = e.intersection.object;
1950
- if (!s?.isMesh) return;
1951
- const r = s, i = e.intersection.faceIndex ?? -1;
2340
+ const r = e.intersection.object;
2341
+ if (!r?.isMesh) return;
2342
+ const s = r, i = e.intersection.faceIndex ?? -1;
1952
2343
  if (i < 0) return;
1953
- const n = this._collectFaceGroup(r, i);
2344
+ const n = this._collectFaceGroup(s, i);
1954
2345
  if (!n) return;
1955
2346
  this._writeWorldFaceGroup(this._selectFace, n), this._centerFaceProxy(this._selectFace), this._selectFace.visible = !0, this._prepareFaceMetadata(n), this._store.setSelectedObject(this._selectFace), this._selected = n, this._hovered && this._same(this._hovered, this._selected) && (this._hoverFace.visible = !1);
1956
2347
  }
@@ -1969,95 +2360,95 @@ let Ge = class {
1969
2360
  * геометрия которых переписывается под текущую грань.
1970
2361
  */
1971
2362
  _makeOverlayFace(e) {
1972
- const t = new l.BufferGeometry(), s = new l.MeshBasicMaterial({
2363
+ const t = new a.BufferGeometry(), r = new a.MeshBasicMaterial({
1973
2364
  color: e,
1974
2365
  transparent: !0,
1975
2366
  opacity: 0.35,
1976
2367
  depthTest: !1,
1977
2368
  depthWrite: !1,
1978
- side: l.DoubleSide,
2369
+ side: a.DoubleSide,
1979
2370
  polygonOffset: !0,
1980
2371
  polygonOffsetFactor: -1,
1981
2372
  polygonOffsetUnits: -1
1982
- }), r = new l.Mesh(t, s);
1983
- return r.renderOrder = 1e3, r.layers.set($), r.visible = !1, r.raycast = () => {
1984
- }, r;
2373
+ }), s = new a.Mesh(t, r);
2374
+ return s.renderOrder = 1e3, s.layers.set($), s.visible = !1, s.raycast = () => {
2375
+ }, s;
1985
2376
  }
1986
2377
  /**
1987
2378
  * Сбор логической грани как связной группы компланарных треугольников.
1988
2379
  * Если geometry неиндексированная — пока возвращаем только стартовый triangle.
1989
2380
  */
1990
2381
  _collectFaceGroup(e, t) {
1991
- const s = e.geometry, r = s.getAttribute("position");
1992
- if (!r) return null;
1993
- const i = s.index;
2382
+ const r = e.geometry, s = r.getAttribute("position");
2383
+ if (!s) return null;
2384
+ const i = r.index;
1994
2385
  if (!i) {
1995
- const b = t * 3, C = t * 3 + 1, M = t * 3 + 2;
2386
+ const M = t * 3, I = t * 3 + 1, y = t * 3 + 2;
1996
2387
  return {
1997
2388
  mesh: e,
1998
2389
  faceIndex: t,
1999
2390
  triangleIndices: [t],
2000
- vertexIndices: [b, C, M],
2001
- proxyVertexMap: [b, C, M]
2391
+ vertexIndices: [M, I, y],
2392
+ proxyVertexMap: [M, I, y]
2002
2393
  };
2003
2394
  }
2004
2395
  const n = Math.floor(i.count / 3);
2005
2396
  if (t < 0 || t >= n) return null;
2006
- const o = this._buildTriangleAdjacency(i, r), [c, u, d] = this._getTriangleIndices(i, t), m = this._readVertex(r, c), p = this._readVertex(r, u), g = this._readVertex(r, d), f = new l.Vector3().subVectors(p, m).cross(new l.Vector3().subVectors(g, m)).normalize(), h = new l.Plane().setFromNormalAndCoplanarPoint(f, m), v = /* @__PURE__ */ new Set(), y = [], A = [t];
2007
- for (; A.length > 0; ) {
2008
- const b = A.pop();
2009
- if (v.has(b)) continue;
2010
- v.add(b);
2011
- const [C, M, I] = this._getTriangleIndices(i, b), O = this._readVertex(r, C), V = this._readVertex(r, M), D = this._readVertex(r, I), H = new l.Vector3().subVectors(V, O).cross(new l.Vector3().subVectors(D, O)).normalize(), Gt = Math.abs(H.dot(f)) >= 1 - this._normalEps, Wt = Math.abs(h.distanceToPoint(O)) < this._planeEps && Math.abs(h.distanceToPoint(V)) < this._planeEps && Math.abs(h.distanceToPoint(D)) < this._planeEps;
2012
- if (!Gt || !Wt) continue;
2013
- y.push(b);
2014
- const st = o.get(b);
2015
- if (st)
2016
- for (const rt of st)
2017
- v.has(rt) || A.push(rt);
2397
+ const o = this._buildTriangleAdjacency(i, s), [l, h, d] = this._getTriangleIndices(i, t), p = this._readVertex(s, l), u = this._readVertex(s, h), m = this._readVertex(s, d), f = new a.Vector3().subVectors(u, p).cross(new a.Vector3().subVectors(m, p)).normalize(), _ = new a.Plane().setFromNormalAndCoplanarPoint(f, p), g = /* @__PURE__ */ new Set(), b = [], x = [t];
2398
+ for (; x.length > 0; ) {
2399
+ const M = x.pop();
2400
+ if (g.has(M)) continue;
2401
+ g.add(M);
2402
+ const [I, y, C] = this._getTriangleIndices(i, M), A = this._readVertex(s, I), D = this._readVertex(s, y), j = this._readVertex(s, C), F = new a.Vector3().subVectors(D, A).cross(new a.Vector3().subVectors(j, A)).normalize(), Mr = Math.abs(F.dot(f)) >= 1 - this._normalEps, yr = Math.abs(_.distanceToPoint(A)) < this._planeEps && Math.abs(_.distanceToPoint(D)) < this._planeEps && Math.abs(_.distanceToPoint(j)) < this._planeEps;
2403
+ if (!Mr || !yr) continue;
2404
+ b.push(M);
2405
+ const At = o.get(M);
2406
+ if (At)
2407
+ for (const It of At)
2408
+ g.has(It) || x.push(It);
2018
2409
  }
2019
- y.sort((b, C) => b - C);
2020
- const S = /* @__PURE__ */ new Set(), x = [];
2021
- for (const b of y) {
2022
- const [C, M, I] = this._getTriangleIndices(i, b);
2023
- S.add(C), S.add(M), S.add(I), x.push(C, M, I);
2410
+ b.sort((M, I) => M - I);
2411
+ const S = /* @__PURE__ */ new Set(), w = [];
2412
+ for (const M of b) {
2413
+ const [I, y, C] = this._getTriangleIndices(i, M);
2414
+ S.add(I), S.add(y), S.add(C), w.push(I, y, C);
2024
2415
  }
2025
2416
  return {
2026
2417
  mesh: e,
2027
2418
  faceIndex: t,
2028
- triangleIndices: y,
2419
+ triangleIndices: b,
2029
2420
  vertexIndices: Array.from(S),
2030
- proxyVertexMap: x
2421
+ proxyVertexMap: w
2031
2422
  };
2032
2423
  }
2033
2424
  /** Перезаписывает overlay mesh world-space треугольниками выбранной грани */
2034
2425
  _writeWorldFaceGroup(e, t) {
2035
- const s = t.mesh.geometry, r = s.getAttribute("position"), i = s.index, n = new Float32Array(t.triangleIndices.length * 9);
2426
+ const r = t.mesh.geometry, s = r.getAttribute("position"), i = r.index, n = new Float32Array(t.triangleIndices.length * 9);
2036
2427
  let o = 0;
2037
- for (const u of t.triangleIndices) {
2038
- let d, m, p;
2039
- i ? [d, m, p] = this._getTriangleIndices(i, u) : (d = u * 3, m = u * 3 + 1, p = u * 3 + 2);
2040
- const g = this._readVertex(r, d).applyMatrix4(t.mesh.matrixWorld), f = this._readVertex(r, m).applyMatrix4(t.mesh.matrixWorld), h = this._readVertex(r, p).applyMatrix4(t.mesh.matrixWorld);
2041
- n[o++] = g.x, n[o++] = g.y, n[o++] = g.z, n[o++] = f.x, n[o++] = f.y, n[o++] = f.z, n[o++] = h.x, n[o++] = h.y, n[o++] = h.z;
2428
+ for (const h of t.triangleIndices) {
2429
+ let d, p, u;
2430
+ i ? [d, p, u] = this._getTriangleIndices(i, h) : (d = h * 3, p = h * 3 + 1, u = h * 3 + 2);
2431
+ const m = this._readVertex(s, d).applyMatrix4(t.mesh.matrixWorld), f = this._readVertex(s, p).applyMatrix4(t.mesh.matrixWorld), _ = this._readVertex(s, u).applyMatrix4(t.mesh.matrixWorld);
2432
+ n[o++] = m.x, n[o++] = m.y, n[o++] = m.z, n[o++] = f.x, n[o++] = f.y, n[o++] = f.z, n[o++] = _.x, n[o++] = _.y, n[o++] = _.z;
2042
2433
  }
2043
- const c = e.geometry;
2044
- c.setAttribute("position", new l.BufferAttribute(n, 3)), c.setIndex(null), c.computeVertexNormals(), c.computeBoundingBox(), c.computeBoundingSphere();
2434
+ const l = e.geometry;
2435
+ l.setAttribute("position", new a.BufferAttribute(n, 3)), l.setIndex(null), l.computeVertexNormals(), l.computeBoundingBox(), l.computeBoundingSphere();
2045
2436
  }
2046
2437
  /** Сравнение двух логических граней */
2047
2438
  _same(e, t) {
2048
- return !!e && !!t && e.mesh === t.mesh && e.triangleIndices.length === t.triangleIndices.length && e.triangleIndices.every((s, r) => s === t.triangleIndices[r]);
2439
+ return !!e && !!t && e.mesh === t.mesh && e.triangleIndices.length === t.triangleIndices.length && e.triangleIndices.every((r, s) => r === t.triangleIndices[s]);
2049
2440
  }
2050
2441
  /** Подготовка метаданных выбранной грани для инструментов */
2051
2442
  _prepareFaceMetadata(e) {
2052
- const { vertexIndexGroups: t, proxyVertexMap: s, lines: r, lineVertexIndexGroups: i } = this._buildFaceVertexGroups(e);
2443
+ const { vertexIndexGroups: t, proxyVertexMap: r, lines: s, lineVertexIndexGroups: i } = this._buildFaceVertexGroups(e);
2053
2444
  this._selectFace.userData.faceInfo = {
2054
2445
  mesh: e.mesh,
2055
2446
  faceIndex: e.faceIndex,
2056
2447
  triangleIndices: e.triangleIndices,
2057
2448
  vertexIndices: e.vertexIndices,
2058
2449
  vertexIndexGroups: t,
2059
- proxyVertexMap: s,
2060
- lines: r,
2450
+ proxyVertexMap: r,
2451
+ lines: s,
2061
2452
  lineVertexIndexGroups: i
2062
2453
  };
2063
2454
  }
@@ -2066,39 +2457,39 @@ let Ge = class {
2066
2457
  * После записи world-space вершин переносит геометрию в локальные координаты proxy mesh.
2067
2458
  */
2068
2459
  _centerFaceProxy(e) {
2069
- const t = e.geometry, s = t.getAttribute("position");
2070
- if (!s || s.count === 0) return;
2071
- const r = new l.Vector3();
2072
- for (let i = 0; i < s.count; i++)
2073
- r.x += s.getX(i), r.y += s.getY(i), r.z += s.getZ(i);
2074
- r.multiplyScalar(1 / s.count);
2075
- for (let i = 0; i < s.count; i++)
2076
- s.setXYZ(i, s.getX(i) - r.x, s.getY(i) - r.y, s.getZ(i) - r.z);
2077
- s.needsUpdate = !0, e.position.copy(r), e.quaternion.identity(), e.scale.set(1, 1, 1), e.updateMatrixWorld(!0), t.computeBoundingBox(), t.computeBoundingSphere();
2460
+ const t = e.geometry, r = t.getAttribute("position");
2461
+ if (!r || r.count === 0) return;
2462
+ const s = new a.Vector3();
2463
+ for (let i = 0; i < r.count; i++)
2464
+ s.x += r.getX(i), s.y += r.getY(i), s.z += r.getZ(i);
2465
+ s.multiplyScalar(1 / r.count);
2466
+ for (let i = 0; i < r.count; i++)
2467
+ r.setXYZ(i, r.getX(i) - s.x, r.getY(i) - s.y, r.getZ(i) - s.z);
2468
+ r.needsUpdate = !0, e.position.copy(s), e.quaternion.identity(), e.scale.set(1, 1, 1), e.updateMatrixWorld(!0), t.computeBoundingBox(), t.computeBoundingSphere();
2078
2469
  }
2079
2470
  /** Регистрирует ребро треугольника в edge map */
2080
- _pushEdge(e, t, s, r) {
2081
- const i = t < s ? `${t}_${s}` : `${s}_${t}`, n = e.get(i);
2082
- n ? n.push(r) : e.set(i, [r]);
2471
+ _pushEdge(e, t, r, s) {
2472
+ const i = t < r ? `${t}_${r}` : `${r}_${t}`, n = e.get(i);
2473
+ n ? n.push(s) : e.set(i, [s]);
2083
2474
  }
2084
2475
  /** Строит граф соседства треугольников по общим ребрам */
2085
2476
  _buildTriangleAdjacency(e, t) {
2086
- const s = Math.floor(e.count / 3), r = /* @__PURE__ */ new Map(), i = this._buildWeldMap(e, t);
2087
- for (let c = 0; c < s; c++) {
2088
- const [u, d, m] = this._getTriangleIndices(e, c), p = i.get(u), g = i.get(d), f = i.get(m);
2089
- this._pushEdge(r, p, g, c), this._pushEdge(r, g, f, c), this._pushEdge(r, f, p, c);
2477
+ const r = Math.floor(e.count / 3), s = /* @__PURE__ */ new Map(), i = this._buildWeldMap(e, t);
2478
+ for (let l = 0; l < r; l++) {
2479
+ const [h, d, p] = this._getTriangleIndices(e, l), u = i.get(h), m = i.get(d), f = i.get(p);
2480
+ this._pushEdge(s, u, m, l), this._pushEdge(s, m, f, l), this._pushEdge(s, f, u, l);
2090
2481
  }
2091
2482
  const n = /* @__PURE__ */ new Map();
2092
- for (let c = 0; c < s; c++)
2093
- n.set(c, /* @__PURE__ */ new Set());
2094
- for (const c of r.values())
2095
- if (!(c.length < 2))
2096
- for (let u = 0; u < c.length; u++)
2097
- for (let d = 0; d < c.length; d++)
2098
- u !== d && n.get(c[u])?.add(c[d]);
2483
+ for (let l = 0; l < r; l++)
2484
+ n.set(l, /* @__PURE__ */ new Set());
2485
+ for (const l of s.values())
2486
+ if (!(l.length < 2))
2487
+ for (let h = 0; h < l.length; h++)
2488
+ for (let d = 0; d < l.length; d++)
2489
+ h !== d && n.get(l[h])?.add(l[d]);
2099
2490
  const o = /* @__PURE__ */ new Map();
2100
- for (const [c, u] of n)
2101
- o.set(c, Array.from(u));
2491
+ for (const [l, h] of n)
2492
+ o.set(l, Array.from(h));
2102
2493
  return o;
2103
2494
  }
2104
2495
  /** Возвращает индексы трех вершин треугольника */
@@ -2107,12 +2498,12 @@ let Ge = class {
2107
2498
  }
2108
2499
  /** Читает вершину из position buffer в local space geometry */
2109
2500
  _readVertex(e, t) {
2110
- return new l.Vector3(e.getX(t), e.getY(t), e.getZ(t));
2501
+ return new a.Vector3(e.getX(t), e.getY(t), e.getZ(t));
2111
2502
  }
2112
2503
  /** Построение ключа вершины по позиции */
2113
- _vertexKey(e, t, s = 1e-6) {
2114
- const r = Math.round(e.getX(t) / s), i = Math.round(e.getY(t) / s), n = Math.round(e.getZ(t) / s);
2115
- return `${r}_${i}_${n}`;
2504
+ _vertexKey(e, t, r = 1e-6) {
2505
+ const s = Math.round(e.getX(t) / r), i = Math.round(e.getY(t) / r), n = Math.round(e.getZ(t) / r);
2506
+ return `${s}_${i}_${n}`;
2116
2507
  }
2117
2508
  /**
2118
2509
  * Строит отображение исходных индексов вершин в "сваренные" ids по координате.
@@ -2120,42 +2511,42 @@ let Ge = class {
2120
2511
  * но используют разные индексы вершин (например, цилиндрические крышки, UV seams и т.п.).
2121
2512
  */
2122
2513
  _buildWeldMap(e, t) {
2123
- const s = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
2514
+ const r = /* @__PURE__ */ new Map(), s = /* @__PURE__ */ new Map();
2124
2515
  let i = 0;
2125
2516
  for (let n = 0; n < e.count; n++) {
2126
2517
  const o = e.getX(n);
2127
- if (r.has(o)) continue;
2128
- const c = this._vertexKey(t, o);
2129
- let u = s.get(c);
2130
- u == null && (u = i++, s.set(c, u)), r.set(o, u);
2518
+ if (s.has(o)) continue;
2519
+ const l = this._vertexKey(t, o);
2520
+ let h = r.get(l);
2521
+ h == null && (h = i++, r.set(l, h)), s.set(o, h);
2131
2522
  }
2132
- return r;
2523
+ return s;
2133
2524
  }
2134
2525
  /** Сбрасывает transform proxy-граням */
2135
2526
  _resetFaceProxyTransform(e) {
2136
2527
  e.position.set(0, 0, 0), e.quaternion.identity(), e.scale.set(1, 1, 1), e.updateMatrixWorld(!0);
2137
2528
  }
2138
2529
  _buildFaceVertexGroups(e) {
2139
- const s = e.mesh.geometry.getAttribute("position"), r = 1e-6, i = new l.Vector3(), n = e.vertexIndices, o = [], c = /* @__PURE__ */ new Map();
2140
- for (const g of n) {
2141
- const f = this._readVertex(s, g), h = [];
2142
- for (let y = 0; y < s.count; y++)
2143
- i.fromBufferAttribute(s, y), i.distanceToSquared(f) < r * r && h.push(y);
2144
- const v = o.length;
2145
- o.push(h);
2146
- for (const y of h)
2147
- c.set(y, v);
2530
+ const r = e.mesh.geometry.getAttribute("position"), s = 1e-6, i = new a.Vector3(), n = e.vertexIndices, o = [], l = /* @__PURE__ */ new Map();
2531
+ for (const m of n) {
2532
+ const f = this._readVertex(r, m), _ = [];
2533
+ for (let b = 0; b < r.count; b++)
2534
+ i.fromBufferAttribute(r, b), i.distanceToSquared(f) < s * s && _.push(b);
2535
+ const g = o.length;
2536
+ o.push(_);
2537
+ for (const b of _)
2538
+ l.set(b, g);
2148
2539
  }
2149
- const u = [];
2150
- for (const g of e.proxyVertexMap) {
2151
- const f = c.get(g);
2152
- u.push(f ?? -1);
2540
+ const h = [];
2541
+ for (const m of e.proxyVertexMap) {
2542
+ const f = l.get(m);
2543
+ h.push(f ?? -1);
2153
2544
  }
2154
- const d = this._findChildLines(e.mesh), m = d ? this._buildLineVertexGroups(e, d) : void 0, p = {
2545
+ const d = this._findChildLines(e.mesh), p = d ? this._buildLineVertexGroups(e, d) : void 0, u = {
2155
2546
  vertexIndexGroups: o,
2156
- proxyVertexMap: u
2547
+ proxyVertexMap: h
2157
2548
  };
2158
- return d && (p.lines = d), m && (p.lineVertexIndexGroups = m), p;
2549
+ return d && (u.lines = d), p && (u.lineVertexIndexGroups = p), u;
2159
2550
  }
2160
2551
  _findChildLines(e) {
2161
2552
  for (const t of e.children)
@@ -2164,61 +2555,61 @@ let Ge = class {
2164
2555
  return null;
2165
2556
  }
2166
2557
  _buildLineVertexGroups(e, t) {
2167
- const r = t.geometry.getAttribute("position"), n = e.mesh.geometry.getAttribute("position"), o = 1e-6, c = new l.Vector3(), u = t.matrixWorld, d = e.mesh.matrixWorld, m = [];
2168
- for (const p of e.vertexIndices) {
2169
- const g = this._readVertex(n, p).applyMatrix4(d), f = [];
2170
- for (let h = 0; h < r.count; h++)
2171
- c.fromBufferAttribute(r, h).applyMatrix4(u), c.distanceToSquared(g) < o * o && f.push(h);
2172
- m.push(f);
2558
+ const s = t.geometry.getAttribute("position"), n = e.mesh.geometry.getAttribute("position"), o = 1e-6, l = new a.Vector3(), h = t.matrixWorld, d = e.mesh.matrixWorld, p = [];
2559
+ for (const u of e.vertexIndices) {
2560
+ const m = this._readVertex(n, u).applyMatrix4(d), f = [];
2561
+ for (let _ = 0; _ < s.count; _++)
2562
+ l.fromBufferAttribute(s, _).applyMatrix4(h), l.distanceToSquared(m) < o * o && f.push(_);
2563
+ p.push(f);
2173
2564
  }
2174
- return m;
2565
+ return p;
2175
2566
  }
2176
2567
  };
2177
- Ge = wr([
2178
- w(),
2179
- ie(0, _("ICameraApi")),
2180
- ie(1, _("ISceneApi")),
2181
- ie(2, _("IRaycastApi")),
2182
- ie(3, _("EditorStore"))
2183
- ], Ge);
2184
- var Ar = Object.getOwnPropertyDescriptor, Or = (e, t, s, r) => {
2185
- for (var i = r > 1 ? void 0 : r ? Ar(t, s) : t, n = e.length - 1, o; n >= 0; n--)
2568
+ et = mi([
2569
+ v(),
2570
+ ie(0, c("ICameraApi")),
2571
+ ie(1, c("ISceneApi")),
2572
+ ie(2, c("IRaycastApi")),
2573
+ ie(3, c("EditorStore"))
2574
+ ], et);
2575
+ var fi = Object.getOwnPropertyDescriptor, gi = (e, t, r, s) => {
2576
+ for (var i = s > 1 ? void 0 : s ? fi(t, r) : t, n = e.length - 1, o; n >= 0; n--)
2186
2577
  (o = e[n]) && (i = o(i) || i);
2187
2578
  return i;
2188
- }, pt = (e, t) => (s, r) => t(s, r, e);
2189
- let We = class {
2579
+ }, Ft = (e, t) => (r, s) => t(r, s, e);
2580
+ let tt = class {
2190
2581
  constructor(e, t) {
2191
2582
  this._api = e, this._store = t;
2192
2583
  }
2193
2584
  /** Режим, которым управляет хендлер, нужен только менеджеру */
2194
- mode = P.Mesh;
2585
+ mode = O.Mesh;
2195
2586
  /** Фигура, на которую навелись в данный момент */
2196
2587
  _hoveredMesh = null;
2197
2588
  /** Фигура, которую выбрали в данный момент */
2198
2589
  _selectedMesh = null;
2199
2590
  // Цвета, необходимые для переключения
2200
2591
  /** Цвет ребер для фигуры, на которую навелись */
2201
- _hoverColor = Me;
2592
+ _hoverColor = be;
2202
2593
  /** Цвет ребер для выделенной фигуры */
2203
- _selectColor = xe;
2594
+ _selectColor = Me;
2204
2595
  /** Исходные цвета материалов линий для отката */
2205
2596
  _origLineColors = /* @__PURE__ */ new WeakMap();
2206
2597
  handle(e, t) {
2207
- if (this._api.setRaycastMode(this.mode), t === F.Hover) {
2598
+ if (this._api.setRaycastMode(this.mode), t === R.Hover) {
2208
2599
  if (!e) {
2209
2600
  this._hoveredMesh && this._hoveredMesh !== this._selectedMesh && this._restoreEdgesColor(this._hoveredMesh), this._hoveredMesh = null;
2210
2601
  return;
2211
2602
  }
2212
- const s = e.intersection.object;
2213
- this._hoveredMesh !== s && (this._hoveredMesh && this._hoveredMesh !== this._selectedMesh && this._restoreEdgesColor(this._hoveredMesh), s !== this._selectedMesh && this._paintEdges(s, this._hoverColor), this._hoveredMesh = s);
2603
+ const r = e.intersection.object;
2604
+ this._hoveredMesh !== r && (this._hoveredMesh && this._hoveredMesh !== this._selectedMesh && this._restoreEdgesColor(this._hoveredMesh), r !== this._selectedMesh && this._paintEdges(r, this._hoverColor), this._hoveredMesh = r);
2214
2605
  }
2215
- if (t === F.Click) {
2606
+ if (t === R.Click) {
2216
2607
  if (!e) {
2217
2608
  this._selectedMesh && (this._restoreEdgesColor(this._selectedMesh), this._selectedMesh = null, this._store.setSelectedObject(null));
2218
2609
  return;
2219
2610
  }
2220
- const s = e.intersection.object;
2221
- this._selectedMesh && this._selectedMesh !== s && this._restoreEdgesColor(this._selectedMesh), this._paintEdges(s, this._selectColor), this._selectedMesh = s, this._store.setSelectedObject(s);
2611
+ const r = e.intersection.object;
2612
+ this._selectedMesh && this._selectedMesh !== r && this._restoreEdgesColor(this._selectedMesh), this._paintEdges(r, this._selectColor), this._selectedMesh = r, this._store.setSelectedObject(r);
2222
2613
  }
2223
2614
  }
2224
2615
  rollback() {
@@ -2232,11 +2623,11 @@ let We = class {
2232
2623
  * Перекрасить рёбра меша и запомнить оригинальный цвет (один раз на LineSegments).
2233
2624
  */
2234
2625
  _paintEdges(e, t) {
2235
- e.children.forEach((s) => {
2236
- const r = s;
2237
- if (r.isLineSegments && r.material) {
2238
- const i = r.material;
2239
- this._origLineColors.has(r) || this._origLineColors.set(r, i.color.clone()), i.color.setHex(t), i.needsUpdate = !0;
2626
+ e.children.forEach((r) => {
2627
+ const s = r;
2628
+ if (s.isLineSegments && s.material) {
2629
+ const i = s.material;
2630
+ this._origLineColors.has(s) || this._origLineColors.set(s, i.color.clone()), i.color.setHex(t), i.needsUpdate = !0;
2240
2631
  }
2241
2632
  });
2242
2633
  }
@@ -2246,33 +2637,33 @@ let We = class {
2246
2637
  */
2247
2638
  _restoreEdgesColor(e) {
2248
2639
  e.children.forEach((t) => {
2249
- const s = t;
2250
- if (s.isLineSegments && s.material) {
2251
- const r = this._origLineColors.get(s);
2252
- if (r) {
2253
- const i = s.material;
2254
- i.color.copy(r), i.needsUpdate = !0;
2640
+ const r = t;
2641
+ if (r.isLineSegments && r.material) {
2642
+ const s = this._origLineColors.get(r);
2643
+ if (s) {
2644
+ const i = r.material;
2645
+ i.color.copy(s), i.needsUpdate = !0;
2255
2646
  }
2256
2647
  }
2257
2648
  });
2258
2649
  }
2259
2650
  };
2260
- We = Or([
2261
- w(),
2262
- pt(0, _("IRaycastApi")),
2263
- pt(1, _("EditorStore"))
2264
- ], We);
2265
- var Cr = Object.getOwnPropertyDescriptor, Ir = (e, t, s, r) => {
2266
- for (var i = r > 1 ? void 0 : r ? Cr(t, s) : t, n = e.length - 1, o; n >= 0; n--)
2651
+ tt = gi([
2652
+ v(),
2653
+ Ft(0, c("IRaycastApi")),
2654
+ Ft(1, c("EditorStore"))
2655
+ ], tt);
2656
+ var vi = Object.getOwnPropertyDescriptor, bi = (e, t, r, s) => {
2657
+ for (var i = s > 1 ? void 0 : s ? vi(t, r) : t, n = e.length - 1, o; n >= 0; n--)
2267
2658
  (o = e[n]) && (i = o(i) || i);
2268
2659
  return i;
2269
- }, ne = (e, t) => (s, r) => t(s, r, e);
2270
- let Ue = class {
2271
- constructor(e, t, s, r) {
2272
- this._cameraApi = e, this._sceneApi = t, this._raycastApi = s, this._store = r, this._cameraApi.enableCameraLayer($), this._hoverVertex = Y(this._makeOverlayVertex(this._hoverColor)), this._selectVertex = Y(this._makeOverlayVertex(this._selectColor)), this._sceneApi.addObject(this._hoverVertex, $), this._sceneApi.addObject(this._selectVertex, $);
2660
+ }, ne = (e, t) => (r, s) => t(r, s, e);
2661
+ let rt = class {
2662
+ constructor(e, t, r, s) {
2663
+ this._cameraApi = e, this._sceneApi = t, this._raycastApi = r, this._store = s, this._cameraApi.enableCameraLayer($), this._hoverVertex = Y(this._makeOverlayVertex(this._hoverColor)), this._selectVertex = Y(this._makeOverlayVertex(this._selectColor)), this._sceneApi.addObject(this._hoverVertex, $), this._sceneApi.addObject(this._selectVertex, $);
2273
2664
  }
2274
2665
  /** Режим, которым управляет хендлер, нужен только менеджеру */
2275
- mode = P.Vertex;
2666
+ mode = O.Vertex;
2276
2667
  _hovered = null;
2277
2668
  _selected = null;
2278
2669
  /** Текущая наведённая вершина. */
@@ -2281,32 +2672,32 @@ let Ue = class {
2281
2672
  _selectVertex;
2282
2673
  // Цвета, необходимые для переключения
2283
2674
  /** Цвет ребра, на которое навелись */
2284
- _hoverColor = Me;
2675
+ _hoverColor = be;
2285
2676
  /** Цвет выделенного ребра */
2286
- _selectColor = xe;
2677
+ _selectColor = Me;
2287
2678
  handle(e, t) {
2288
- if (this._raycastApi.setRaycastMode(this.mode), t === F.Hover) {
2679
+ if (this._raycastApi.setRaycastMode(this.mode), t === R.Hover) {
2289
2680
  if (!e) {
2290
2681
  this._hoverVertex.visible = !1, this._hovered = null;
2291
2682
  return;
2292
2683
  }
2293
- const s = e.intersection.object;
2294
- if (!s?.isPoints) return;
2295
- const r = s, i = e.intersection.index ?? -1;
2684
+ const r = e.intersection.object;
2685
+ if (!r?.isPoints) return;
2686
+ const s = r, i = e.intersection.index ?? -1;
2296
2687
  if (i < 0) return;
2297
- this._selected && this._same({ points: r, index: i }, this._selected) ? this._hoverVertex.visible = !1 : (this._writeWorldVertex(this._hoverVertex, r, i), this._hoverVertex.visible = !0);
2688
+ this._selected && this._same({ points: s, index: i }, this._selected) ? this._hoverVertex.visible = !1 : (this._writeWorldVertex(this._hoverVertex, s, i), this._hoverVertex.visible = !0);
2298
2689
  return;
2299
2690
  }
2300
- if (t === F.Click) {
2691
+ if (t === R.Click) {
2301
2692
  if (!e) {
2302
2693
  this._selectVertex.visible = !1, this._selected = null, this._store.setSelectedObject(null);
2303
2694
  return;
2304
2695
  }
2305
- const s = e.intersection.object;
2306
- if (!s?.isPoints) return;
2307
- const r = s, i = e.intersection.index ?? -1;
2696
+ const r = e.intersection.object;
2697
+ if (!r?.isPoints) return;
2698
+ const s = r, i = e.intersection.index ?? -1;
2308
2699
  if (i < 0) return;
2309
- this._writeWorldVertex(this._selectVertex, r, i), this._centerVertexOnPoint(this._selectVertex, r, i), this._selectVertex.visible = !0, this._prepareVertexMetadata(r, i), this._store.setSelectedObject(this._selectVertex), this._selected = { points: r, index: i }, this._hovered && this._same(this._hovered, this._selected) && (this._hoverVertex.visible = !1);
2700
+ this._writeWorldVertex(this._selectVertex, s, i), this._centerVertexOnPoint(this._selectVertex, s, i), this._selectVertex.visible = !0, this._prepareVertexMetadata(s, i), this._store.setSelectedObject(this._selectVertex), this._selected = { points: s, index: i }, this._hovered && this._same(this._hovered, this._selected) && (this._hoverVertex.visible = !1);
2310
2701
  return;
2311
2702
  }
2312
2703
  }
@@ -2316,10 +2707,10 @@ let Ue = class {
2316
2707
  dispose() {
2317
2708
  this.rollback(), this._sceneApi.removeFromScene(this._hoverVertex), this._sceneApi.removeFromScene(this._selectVertex), this._hoverVertex.geometry.dispose(), this._hoverVertex.material.dispose(), this._selectVertex.geometry.dispose(), this._selectVertex.material.dispose();
2318
2709
  }
2319
- _makeOverlayVertex(e, t = gs) {
2320
- const s = new l.BufferGeometry();
2321
- s.setAttribute("position", new l.Float32BufferAttribute([0, 0, 0], 3));
2322
- const r = new l.PointsMaterial({
2710
+ _makeOverlayVertex(e, t = Xr) {
2711
+ const r = new a.BufferGeometry();
2712
+ r.setAttribute("position", new a.Float32BufferAttribute([0, 0, 0], 3));
2713
+ const s = new a.PointsMaterial({
2323
2714
  color: e,
2324
2715
  size: t,
2325
2716
  sizeAttenuation: !1,
@@ -2327,16 +2718,16 @@ let Ue = class {
2327
2718
  depthWrite: !1,
2328
2719
  transparent: !0,
2329
2720
  opacity: 1
2330
- }), i = new l.Points(s, r);
2721
+ }), i = new a.Points(r, s);
2331
2722
  return i.renderOrder = 1e3, i.raycast = () => {
2332
2723
  }, i.layers.set($), i.visible = !1, i;
2333
2724
  }
2334
2725
  /** Локальную вершину points переводим в world и пишем в target (прокси-точку) */
2335
- _writeWorldVertex(e, t, s) {
2336
- const r = t.geometry.getAttribute("position"), i = new l.Vector3(
2337
- r.getX(s),
2338
- r.getY(s),
2339
- r.getZ(s)
2726
+ _writeWorldVertex(e, t, r) {
2727
+ const s = t.geometry.getAttribute("position"), i = new a.Vector3(
2728
+ s.getX(r),
2729
+ s.getY(r),
2730
+ s.getZ(r)
2340
2731
  ).applyMatrix4(t.matrixWorld), n = e.geometry.getAttribute("position");
2341
2732
  n.setXYZ(0, i.x, i.y, i.z), n.needsUpdate = !0;
2342
2733
  }
@@ -2345,54 +2736,54 @@ let Ue = class {
2345
2736
  }
2346
2737
  /** Готовит метаданные для выбранной вершины и пишет их в _selectVertex.userData */
2347
2738
  _prepareVertexMetadata(e, t) {
2348
- const s = Pt(e);
2349
- if (!s) return;
2350
- const r = e.geometry.getAttribute("position"), i = new l.Vector3(
2351
- r.getX(t),
2352
- r.getY(t),
2353
- r.getZ(t)
2354
- ).applyMatrix4(e.matrixWorld), n = new l.Matrix4().copy(s.matrixWorld).invert(), o = i.clone().applyMatrix4(n), u = s.geometry.getAttribute("position"), d = 1e-6, m = d * d, p = new l.Vector3(), g = [];
2355
- for (let v = 0; v < u.count; v++)
2356
- p.fromBufferAttribute(u, v), p.distanceToSquared(o) < m && g.push(v);
2357
- const f = s.children.find((v) => v?.isLineSegments);
2358
- let h = [];
2739
+ const r = er(e);
2740
+ if (!r) return;
2741
+ const s = e.geometry.getAttribute("position"), i = new a.Vector3(
2742
+ s.getX(t),
2743
+ s.getY(t),
2744
+ s.getZ(t)
2745
+ ).applyMatrix4(e.matrixWorld), n = new a.Matrix4().copy(r.matrixWorld).invert(), o = i.clone().applyMatrix4(n), h = r.geometry.getAttribute("position"), d = 1e-6, p = d * d, u = new a.Vector3(), m = [];
2746
+ for (let g = 0; g < h.count; g++)
2747
+ u.fromBufferAttribute(h, g), u.distanceToSquared(o) < p && m.push(g);
2748
+ const f = r.children.find((g) => g?.isLineSegments);
2749
+ let _ = [];
2359
2750
  if (f) {
2360
- const v = new l.Matrix4().copy(f.matrixWorld).invert(), y = i.clone().applyMatrix4(v), A = f.geometry.getAttribute("position"), S = new l.Vector3();
2361
- for (let x = 0; x < A.count; x++)
2362
- S.fromBufferAttribute(A, x), S.distanceToSquared(y) < m && h.push(x);
2751
+ const g = new a.Matrix4().copy(f.matrixWorld).invert(), b = i.clone().applyMatrix4(g), x = f.geometry.getAttribute("position"), S = new a.Vector3();
2752
+ for (let w = 0; w < x.count; w++)
2753
+ S.fromBufferAttribute(x, w), S.distanceToSquared(b) < p && _.push(w);
2363
2754
  }
2364
2755
  this._selectVertex.userData.vertexInfo = {
2365
2756
  points: e,
2366
2757
  index: t,
2367
- mesh: s,
2368
- vertexIndices: g,
2758
+ mesh: r,
2759
+ vertexIndices: m,
2369
2760
  lines: f ?? null,
2370
- edgeVertexIndices: h
2761
+ edgeVertexIndices: _
2371
2762
  };
2372
2763
  }
2373
2764
  /** Центрует прокси-вершину на выбранной точке */
2374
- _centerVertexOnPoint(e, t, s) {
2375
- const r = t.geometry.getAttribute("position"), i = new l.Vector3(
2376
- r.getX(s),
2377
- r.getY(s),
2378
- r.getZ(s)
2765
+ _centerVertexOnPoint(e, t, r) {
2766
+ const s = t.geometry.getAttribute("position"), i = new a.Vector3(
2767
+ s.getX(r),
2768
+ s.getY(r),
2769
+ s.getZ(r)
2379
2770
  ).applyMatrix4(t.matrixWorld);
2380
2771
  e.position.copy(i);
2381
2772
  const n = e.geometry;
2382
2773
  let o = n.getAttribute("position");
2383
- (!o || o.count < 1) && (n.setAttribute("position", new l.BufferAttribute(new Float32Array(3), 3)), o = n.getAttribute("position")), o.setXYZ(0, 0, 0, 0), o.needsUpdate = !0, e.quaternion.identity(), e.scale.set(1, 1, 1), e.updateMatrixWorld(!0);
2774
+ (!o || o.count < 1) && (n.setAttribute("position", new a.BufferAttribute(new Float32Array(3), 3)), o = n.getAttribute("position")), o.setXYZ(0, 0, 0, 0), o.needsUpdate = !0, e.quaternion.identity(), e.scale.set(1, 1, 1), e.updateMatrixWorld(!0);
2384
2775
  }
2385
2776
  };
2386
- Ue = Ir([
2387
- w(),
2388
- ne(0, _("ICameraApi")),
2389
- ne(1, _("ISceneApi")),
2390
- ne(2, _("IRaycastApi")),
2391
- ne(3, _("EditorStore"))
2392
- ], Ue);
2393
- class tt {
2394
- constructor(t, s) {
2395
- this.api = t, this.store = s, this._unsubscribeTransform = this.api.onTransformChange(() => {
2777
+ rt = bi([
2778
+ v(),
2779
+ ne(0, c("ICameraApi")),
2780
+ ne(1, c("ISceneApi")),
2781
+ ne(2, c("IRaycastApi")),
2782
+ ne(3, c("EditorStore"))
2783
+ ], rt);
2784
+ class wt {
2785
+ constructor(t, r) {
2786
+ this.api = t, this.store = r, this._unsubscribeTransform = this.api.onTransformChange(() => {
2396
2787
  this.store.getSelectedObject() && this.store.notifySelectedTransformChange?.();
2397
2788
  });
2398
2789
  }
@@ -2417,62 +2808,62 @@ class tt {
2417
2808
  this.rollback(), this._unsubscribeTransform && this._unsubscribeTransform();
2418
2809
  }
2419
2810
  }
2420
- var Pr = Object.getOwnPropertyDescriptor, Lr = (e, t, s, r) => {
2421
- for (var i = r > 1 ? void 0 : r ? Pr(t, s) : t, n = e.length - 1, o; n >= 0; n--)
2811
+ var Mi = Object.getOwnPropertyDescriptor, yi = (e, t, r, s) => {
2812
+ for (var i = s > 1 ? void 0 : s ? Mi(t, r) : t, n = e.length - 1, o; n >= 0; n--)
2422
2813
  (o = e[n]) && (i = o(i) || i);
2423
2814
  return i;
2424
- }, mt = (e, t) => (s, r) => t(s, r, e);
2425
- let Ne = class extends tt {
2815
+ }, kt = (e, t) => (r, s) => t(r, s, e);
2816
+ let st = class extends wt {
2426
2817
  /** Инструмент, которым управляет хендлер, нужен только менеджеру */
2427
- mode = U.Rotate;
2818
+ mode = W.Rotate;
2428
2819
  constructor(e, t) {
2429
2820
  super(e, t);
2430
2821
  }
2431
2822
  };
2432
- Ne = Lr([
2433
- w(),
2434
- mt(0, _("ITransformApi")),
2435
- mt(1, _("EditorStore"))
2436
- ], Ne);
2437
- var Er = Object.getOwnPropertyDescriptor, Tr = (e, t, s, r) => {
2438
- for (var i = r > 1 ? void 0 : r ? Er(t, s) : t, n = e.length - 1, o; n >= 0; n--)
2823
+ st = yi([
2824
+ v(),
2825
+ kt(0, c("ITransformApi")),
2826
+ kt(1, c("EditorStore"))
2827
+ ], st);
2828
+ var wi = Object.getOwnPropertyDescriptor, Si = (e, t, r, s) => {
2829
+ for (var i = s > 1 ? void 0 : s ? wi(t, r) : t, n = e.length - 1, o; n >= 0; n--)
2439
2830
  (o = e[n]) && (i = o(i) || i);
2440
2831
  return i;
2441
- }, gt = (e, t) => (s, r) => t(s, r, e);
2442
- let Xe = class extends tt {
2832
+ }, Gt = (e, t) => (r, s) => t(r, s, e);
2833
+ let it = class extends wt {
2443
2834
  /** Инструмент, которым управляет хендлер, нужен только менеджеру */
2444
- mode = U.Scale;
2835
+ mode = W.Scale;
2445
2836
  constructor(e, t) {
2446
2837
  super(e, t);
2447
2838
  }
2448
2839
  };
2449
- Xe = Tr([
2450
- w(),
2451
- gt(0, _("ITransformApi")),
2452
- gt(1, _("EditorStore"))
2453
- ], Xe);
2454
- var Vr = Object.getOwnPropertyDescriptor, Dr = (e, t, s, r) => {
2455
- for (var i = r > 1 ? void 0 : r ? Vr(t, s) : t, n = e.length - 1, o; n >= 0; n--)
2840
+ it = Si([
2841
+ v(),
2842
+ Gt(0, c("ITransformApi")),
2843
+ Gt(1, c("EditorStore"))
2844
+ ], it);
2845
+ var xi = Object.getOwnPropertyDescriptor, Ai = (e, t, r, s) => {
2846
+ for (var i = s > 1 ? void 0 : s ? xi(t, r) : t, n = e.length - 1, o; n >= 0; n--)
2456
2847
  (o = e[n]) && (i = o(i) || i);
2457
2848
  return i;
2458
- }, ft = (e, t) => (s, r) => t(s, r, e);
2459
- let Ye = class extends tt {
2849
+ }, zt = (e, t) => (r, s) => t(r, s, e);
2850
+ let nt = class extends wt {
2460
2851
  /** Инструмент, которым управляет хендлер, нужен только менеджеру */
2461
- mode = U.Translate;
2852
+ mode = W.Translate;
2462
2853
  constructor(e, t) {
2463
2854
  super(e, t);
2464
2855
  }
2465
2856
  };
2466
- Ye = Dr([
2467
- w(),
2468
- ft(0, _("ITransformApi")),
2469
- ft(1, _("EditorStore"))
2470
- ], Ye);
2471
- var jr = Object.getOwnPropertyDescriptor, $r = (e, t, s, r) => {
2472
- for (var i = r > 1 ? void 0 : r ? jr(t, s) : t, n = e.length - 1, o; n >= 0; n--)
2857
+ nt = Ai([
2858
+ v(),
2859
+ zt(0, c("ITransformApi")),
2860
+ zt(1, c("EditorStore"))
2861
+ ], nt);
2862
+ var Ii = Object.getOwnPropertyDescriptor, Ci = (e, t, r, s) => {
2863
+ for (var i = s > 1 ? void 0 : s ? Ii(t, r) : t, n = e.length - 1, o; n >= 0; n--)
2473
2864
  (o = e[n]) && (i = o(i) || i);
2474
2865
  return i;
2475
- }, Rr = (e, t) => (s, r) => t(s, r, e);
2866
+ }, Oi = (e, t) => (r, s) => t(r, s, e);
2476
2867
  let ge = class {
2477
2868
  constructor(e) {
2478
2869
  this._api = e;
@@ -2483,14 +2874,14 @@ let ge = class {
2483
2874
  _lastAddedMesh = null;
2484
2875
  /** Добавление базовых фигур на сцену, которые приписаны в `FigureType`. */
2485
2876
  handle(e) {
2486
- const t = ms[e](), s = t.getAttribute("position");
2487
- s && s.setUsage && s.setUsage(l.DynamicDrawUsage);
2488
- const r = new l.Mesh(t, Ot.clone());
2489
- r.layers.enable(z);
2490
- const i = t.index ? t.toNonIndexed() : t, n = N(Et(i));
2491
- n.layers.enable(z), r.add(n);
2492
- const o = N(Lt(i));
2493
- o.layers.enable(z), r.add(o), this._api.addMesh(r), this._lastAddedMesh = r;
2877
+ const t = Ur[e](), r = t.getAttribute("position");
2878
+ r && r.setUsage && r.setUsage(a.DynamicDrawUsage);
2879
+ const s = new a.Mesh(t, Zt.clone());
2880
+ s.layers.enable(k);
2881
+ const i = t.index ? t.toNonIndexed() : t, n = N(rr(i));
2882
+ n.layers.enable(k), s.add(n);
2883
+ const o = N(tr(i));
2884
+ o.layers.enable(k), s.add(o), this._api.addMesh(s), this._lastAddedMesh = s;
2494
2885
  }
2495
2886
  /** Срабатывает только на `ctrl + z`. */
2496
2887
  rollback() {
@@ -2501,16 +2892,16 @@ let ge = class {
2501
2892
  this._lastAddedMesh = null;
2502
2893
  }
2503
2894
  };
2504
- ge = $r([
2505
- w(),
2506
- Rr(0, _("IMeshApi"))
2895
+ ge = Ci([
2896
+ v(),
2897
+ Oi(0, c("IMeshApi"))
2507
2898
  ], ge);
2508
- var Fr = Object.getOwnPropertyDescriptor, Hr = (e, t, s, r) => {
2509
- for (var i = r > 1 ? void 0 : r ? Fr(t, s) : t, n = e.length - 1, o; n >= 0; n--)
2899
+ var Ei = Object.getOwnPropertyDescriptor, Pi = (e, t, r, s) => {
2900
+ for (var i = s > 1 ? void 0 : s ? Ei(t, r) : t, n = e.length - 1, o; n >= 0; n--)
2510
2901
  (o = e[n]) && (i = o(i) || i);
2511
2902
  return i;
2512
- }, vt = (e, t) => (s, r) => t(s, r, e);
2513
- let qe = class {
2903
+ }, Wt = (e, t) => (r, s) => t(r, s, e);
2904
+ let ot = class {
2514
2905
  constructor(e, t) {
2515
2906
  this._api = e, this._store = t;
2516
2907
  }
@@ -2520,7 +2911,7 @@ let qe = class {
2520
2911
  _lastDeletedMesh = null;
2521
2912
  handle() {
2522
2913
  const e = this._store.getSelectedObject();
2523
- et(e) && !Vt(e) && (this._api.removeMesh(e), this._store.setSelectedObject(null), this._lastDeletedMesh = e);
2914
+ yt(e) && !sr(e) && (this._api.removeMesh(e), this._store.setSelectedObject(null), this._lastDeletedMesh = e);
2524
2915
  }
2525
2916
  /** Срабатывает только на `ctrl + z`. */
2526
2917
  rollback() {
@@ -2531,12 +2922,12 @@ let qe = class {
2531
2922
  this._lastDeletedMesh = null;
2532
2923
  }
2533
2924
  };
2534
- qe = Hr([
2535
- w(),
2536
- vt(0, _("IMeshApi")),
2537
- vt(1, _("EditorStore"))
2538
- ], qe);
2539
- class Br {
2925
+ ot = Pi([
2926
+ v(),
2927
+ Wt(0, c("IMeshApi")),
2928
+ Wt(1, c("EditorStore"))
2929
+ ], ot);
2930
+ class Li {
2540
2931
  /**
2541
2932
  * Parses the given 3D object and generates the OBJ output.
2542
2933
  *
@@ -2546,95 +2937,95 @@ class Br {
2546
2937
  * @return {string} The exported OBJ.
2547
2938
  */
2548
2939
  parse(t) {
2549
- let s = "", r = 0, i = 0, n = 0;
2550
- const o = new W(), c = new St(), u = new W(), d = new qt(), m = [];
2551
- function p(h) {
2552
- let v = 0, y = 0, A = 0;
2553
- const S = h.geometry, x = new Zt(), b = S.getAttribute("position"), C = S.getAttribute("normal"), M = S.getAttribute("uv"), I = S.getIndex();
2554
- if (s += "o " + h.name + `
2555
- `, h.material && h.material.name && (s += "usemtl " + h.material.name + `
2556
- `), b !== void 0)
2557
- for (let O = 0, V = b.count; O < V; O++, v++)
2558
- o.fromBufferAttribute(b, O), o.applyMatrix4(h.matrixWorld), s += "v " + o.x + " " + o.y + " " + o.z + `
2940
+ let r = "", s = 0, i = 0, n = 0;
2941
+ const o = new z(), l = new Kt(), h = new z(), d = new Ir(), p = [];
2942
+ function u(_) {
2943
+ let g = 0, b = 0, x = 0;
2944
+ const S = _.geometry, w = new Cr(), M = S.getAttribute("position"), I = S.getAttribute("normal"), y = S.getAttribute("uv"), C = S.getIndex();
2945
+ if (r += "o " + _.name + `
2946
+ `, _.material && _.material.name && (r += "usemtl " + _.material.name + `
2947
+ `), M !== void 0)
2948
+ for (let A = 0, D = M.count; A < D; A++, g++)
2949
+ o.fromBufferAttribute(M, A), o.applyMatrix4(_.matrixWorld), r += "v " + o.x + " " + o.y + " " + o.z + `
2559
2950
  `;
2560
- if (M !== void 0)
2561
- for (let O = 0, V = M.count; O < V; O++, A++)
2562
- d.fromBufferAttribute(M, O), s += "vt " + d.x + " " + d.y + `
2951
+ if (y !== void 0)
2952
+ for (let A = 0, D = y.count; A < D; A++, x++)
2953
+ d.fromBufferAttribute(y, A), r += "vt " + d.x + " " + d.y + `
2563
2954
  `;
2564
- if (C !== void 0) {
2565
- x.getNormalMatrix(h.matrixWorld);
2566
- for (let O = 0, V = C.count; O < V; O++, y++)
2567
- u.fromBufferAttribute(C, O), u.applyMatrix3(x).normalize(), s += "vn " + u.x + " " + u.y + " " + u.z + `
2955
+ if (I !== void 0) {
2956
+ w.getNormalMatrix(_.matrixWorld);
2957
+ for (let A = 0, D = I.count; A < D; A++, b++)
2958
+ h.fromBufferAttribute(I, A), h.applyMatrix3(w).normalize(), r += "vn " + h.x + " " + h.y + " " + h.z + `
2568
2959
  `;
2569
2960
  }
2570
- if (I !== null)
2571
- for (let O = 0, V = I.count; O < V; O += 3) {
2572
- for (let D = 0; D < 3; D++) {
2573
- const H = I.getX(O + D) + 1;
2574
- m[D] = r + H + (C || M ? "/" + (M ? i + H : "") + (C ? "/" + (n + H) : "") : "");
2961
+ if (C !== null)
2962
+ for (let A = 0, D = C.count; A < D; A += 3) {
2963
+ for (let j = 0; j < 3; j++) {
2964
+ const F = C.getX(A + j) + 1;
2965
+ p[j] = s + F + (I || y ? "/" + (y ? i + F : "") + (I ? "/" + (n + F) : "") : "");
2575
2966
  }
2576
- s += "f " + m.join(" ") + `
2967
+ r += "f " + p.join(" ") + `
2577
2968
  `;
2578
2969
  }
2579
2970
  else
2580
- for (let O = 0, V = b.count; O < V; O += 3) {
2581
- for (let D = 0; D < 3; D++) {
2582
- const H = O + D + 1;
2583
- m[D] = r + H + (C || M ? "/" + (M ? i + H : "") + (C ? "/" + (n + H) : "") : "");
2971
+ for (let A = 0, D = M.count; A < D; A += 3) {
2972
+ for (let j = 0; j < 3; j++) {
2973
+ const F = A + j + 1;
2974
+ p[j] = s + F + (I || y ? "/" + (y ? i + F : "") + (I ? "/" + (n + F) : "") : "");
2584
2975
  }
2585
- s += "f " + m.join(" ") + `
2976
+ r += "f " + p.join(" ") + `
2586
2977
  `;
2587
2978
  }
2588
- r += v, i += A, n += y;
2979
+ s += g, i += x, n += b;
2589
2980
  }
2590
- function g(h) {
2591
- let v = 0;
2592
- const y = h.geometry, A = h.type, S = y.getAttribute("position");
2593
- if (s += "o " + h.name + `
2981
+ function m(_) {
2982
+ let g = 0;
2983
+ const b = _.geometry, x = _.type, S = b.getAttribute("position");
2984
+ if (r += "o " + _.name + `
2594
2985
  `, S !== void 0)
2595
- for (let x = 0, b = S.count; x < b; x++, v++)
2596
- o.fromBufferAttribute(S, x), o.applyMatrix4(h.matrixWorld), s += "v " + o.x + " " + o.y + " " + o.z + `
2986
+ for (let w = 0, M = S.count; w < M; w++, g++)
2987
+ o.fromBufferAttribute(S, w), o.applyMatrix4(_.matrixWorld), r += "v " + o.x + " " + o.y + " " + o.z + `
2597
2988
  `;
2598
- if (A === "Line") {
2599
- s += "l ";
2600
- for (let x = 1, b = S.count; x <= b; x++)
2601
- s += r + x + " ";
2602
- s += `
2989
+ if (x === "Line") {
2990
+ r += "l ";
2991
+ for (let w = 1, M = S.count; w <= M; w++)
2992
+ r += s + w + " ";
2993
+ r += `
2603
2994
  `;
2604
2995
  }
2605
- if (A === "LineSegments")
2606
- for (let x = 1, b = x + 1, C = S.count; x < C; x += 2, b = x + 1)
2607
- s += "l " + (r + x) + " " + (r + b) + `
2996
+ if (x === "LineSegments")
2997
+ for (let w = 1, M = w + 1, I = S.count; w < I; w += 2, M = w + 1)
2998
+ r += "l " + (s + w) + " " + (s + M) + `
2608
2999
  `;
2609
- r += v;
3000
+ s += g;
2610
3001
  }
2611
- function f(h) {
2612
- let v = 0;
2613
- const y = h.geometry, A = y.getAttribute("position"), S = y.getAttribute("color");
2614
- if (s += "o " + h.name + `
2615
- `, A !== void 0) {
2616
- for (let x = 0, b = A.count; x < b; x++, v++)
2617
- o.fromBufferAttribute(A, x), o.applyMatrix4(h.matrixWorld), s += "v " + o.x + " " + o.y + " " + o.z, S !== void 0 && (c.fromBufferAttribute(S, x), Kt.workingToColorSpace(c, wt), s += " " + c.r + " " + c.g + " " + c.b), s += `
3002
+ function f(_) {
3003
+ let g = 0;
3004
+ const b = _.geometry, x = b.getAttribute("position"), S = b.getAttribute("color");
3005
+ if (r += "o " + _.name + `
3006
+ `, x !== void 0) {
3007
+ for (let w = 0, M = x.count; w < M; w++, g++)
3008
+ o.fromBufferAttribute(x, w), o.applyMatrix4(_.matrixWorld), r += "v " + o.x + " " + o.y + " " + o.z, S !== void 0 && (l.fromBufferAttribute(S, w), Or.workingToColorSpace(l, qt), r += " " + l.r + " " + l.g + " " + l.b), r += `
2618
3009
  `;
2619
- s += "p ";
2620
- for (let x = 1, b = A.count; x <= b; x++)
2621
- s += r + x + " ";
2622
- s += `
3010
+ r += "p ";
3011
+ for (let w = 1, M = x.count; w <= M; w++)
3012
+ r += s + w + " ";
3013
+ r += `
2623
3014
  `;
2624
3015
  }
2625
- r += v;
3016
+ s += g;
2626
3017
  }
2627
- return t.traverse(function(h) {
2628
- h.isMesh === !0 && p(h), h.isLine === !0 && g(h), h.isPoints === !0 && f(h);
2629
- }), s;
3018
+ return t.traverse(function(_) {
3019
+ _.isMesh === !0 && u(_), _.isLine === !0 && m(_), _.isPoints === !0 && f(_);
3020
+ }), r;
2630
3021
  }
2631
3022
  }
2632
- var kr = Object.getOwnPropertyDescriptor, zr = (e, t, s, r) => {
2633
- for (var i = r > 1 ? void 0 : r ? kr(t, s) : t, n = e.length - 1, o; n >= 0; n--)
3023
+ var Ti = Object.getOwnPropertyDescriptor, Di = (e, t, r, s) => {
3024
+ for (var i = s > 1 ? void 0 : s ? Ti(t, r) : t, n = e.length - 1, o; n >= 0; n--)
2634
3025
  (o = e[n]) && (i = o(i) || i);
2635
3026
  return i;
2636
- }, yt = (e, t) => (s, r) => t(s, r, e);
2637
- let fe = class {
3027
+ }, Nt = (e, t) => (r, s) => t(r, s, e);
3028
+ let ve = class {
2638
3029
  constructor(e, t) {
2639
3030
  this._api = e, this._exportStore = t;
2640
3031
  }
@@ -2642,12 +3033,12 @@ let fe = class {
2642
3033
  mode = T.Export;
2643
3034
  /** Экспорт всей сцены в ExportStore для последующей загрузки в виде файла. */
2644
3035
  handle() {
2645
- const e = this._api.getScene(), t = xs(e), r = new Br().parse(t), i = Date.now();
3036
+ const e = this._api.getScene(), t = es(e), s = new Li().parse(t), i = Date.now();
2646
3037
  this._exportStore.setResult({
2647
3038
  format: "obj",
2648
3039
  filename: `scene-${i}.obj`,
2649
3040
  mimeType: "text/plain;charset=utf-8",
2650
- content: r,
3041
+ content: s,
2651
3042
  createdAt: i
2652
3043
  });
2653
3044
  }
@@ -2658,17 +3049,17 @@ let fe = class {
2658
3049
  this._exportStore.clearResult();
2659
3050
  }
2660
3051
  };
2661
- fe = zr([
2662
- w(),
2663
- yt(0, _("ISceneApi")),
2664
- yt(1, _("ExportStore"))
2665
- ], fe);
2666
- var Gr = Object.defineProperty, Wr = Object.getOwnPropertyDescriptor, Ft = (e, t, s, r) => {
2667
- for (var i = r > 1 ? void 0 : r ? Wr(t, s) : t, n = e.length - 1, o; n >= 0; n--)
2668
- (o = e[n]) && (i = (r ? o(t, s, i) : o(i)) || i);
2669
- return r && i && Gr(t, s, i), i;
2670
- }, bt = (e, t) => (s, r) => t(s, r, e);
2671
- let J = class {
3052
+ ve = Di([
3053
+ v(),
3054
+ Nt(0, c("ISceneApi")),
3055
+ Nt(1, c("ExportStore"))
3056
+ ], ve);
3057
+ var ji = Object.defineProperty, Vi = Object.getOwnPropertyDescriptor, ar = (e, t, r, s) => {
3058
+ for (var i = s > 1 ? void 0 : s ? Vi(t, r) : t, n = e.length - 1, o; n >= 0; n--)
3059
+ (o = e[n]) && (i = (s ? o(t, r, i) : o(i)) || i);
3060
+ return s && i && ji(t, r, i), i;
3061
+ }, Ut = (e, t) => (r, s) => t(r, s, e);
3062
+ let Q = class {
2672
3063
  constructor(e, t) {
2673
3064
  this._api = e, this._validator = t;
2674
3065
  }
@@ -2677,8 +3068,8 @@ let J = class {
2677
3068
  handle(e) {
2678
3069
  const t = [...this._api.getMeshes()];
2679
3070
  this._api.removeMeshes(t);
2680
- const s = Dt(e);
2681
- this._api.addMeshes(s);
3071
+ const r = ir(e);
3072
+ this._api.addMeshes(r);
2682
3073
  }
2683
3074
  rollback() {
2684
3075
  }
@@ -2686,27 +3077,27 @@ let J = class {
2686
3077
  dispose() {
2687
3078
  }
2688
3079
  };
2689
- Ft([
2690
- $t((e) => e._validator)
2691
- ], J.prototype, "handle", 1);
2692
- J = Ft([
2693
- w(),
2694
- bt(0, _("IMeshApi")),
2695
- bt(1, _("ObjValidator"))
2696
- ], J);
2697
- var Ur = Object.defineProperty, Nr = Object.getOwnPropertyDescriptor, Ht = (e, t, s, r) => {
2698
- for (var i = r > 1 ? void 0 : r ? Nr(t, s) : t, n = e.length - 1, o; n >= 0; n--)
2699
- (o = e[n]) && (i = (r ? o(t, s, i) : o(i)) || i);
2700
- return r && i && Ur(t, s, i), i;
2701
- }, Mt = (e, t) => (s, r) => t(s, r, e);
2702
- let Q = class {
3080
+ ar([
3081
+ nr((e) => e._validator)
3082
+ ], Q.prototype, "handle", 1);
3083
+ Q = ar([
3084
+ v(),
3085
+ Ut(0, c("IMeshApi")),
3086
+ Ut(1, c("ObjValidator"))
3087
+ ], Q);
3088
+ var Hi = Object.defineProperty, $i = Object.getOwnPropertyDescriptor, lr = (e, t, r, s) => {
3089
+ for (var i = s > 1 ? void 0 : s ? $i(t, r) : t, n = e.length - 1, o; n >= 0; n--)
3090
+ (o = e[n]) && (i = (s ? o(t, r, i) : o(i)) || i);
3091
+ return s && i && Hi(t, r, i), i;
3092
+ }, Xt = (e, t) => (r, s) => t(r, s, e);
3093
+ let ee = class {
2703
3094
  constructor(e, t) {
2704
3095
  this._api = e, this._validator = t;
2705
3096
  }
2706
3097
  /** Режим редактирования сцены */
2707
3098
  mode = T.LoadFigure;
2708
3099
  handle(e) {
2709
- const t = Dt(e);
3100
+ const t = ir(e);
2710
3101
  this._api.addMeshes(t);
2711
3102
  }
2712
3103
  rollback() {
@@ -2715,69 +3106,306 @@ let Q = class {
2715
3106
  dispose() {
2716
3107
  }
2717
3108
  };
2718
- Ht([
2719
- $t((e) => e._validator)
2720
- ], Q.prototype, "handle", 1);
2721
- Q = Ht([
2722
- w(),
2723
- Mt(0, _("IMeshApi")),
2724
- Mt(1, _("ObjValidator"))
2725
- ], Q);
2726
- var Xr = Object.getOwnPropertyDescriptor, Yr = (e, t, s, r) => {
2727
- for (var i = r > 1 ? void 0 : r ? Xr(t, s) : t, n = e.length - 1, o; n >= 0; n--)
3109
+ lr([
3110
+ nr((e) => e._validator)
3111
+ ], ee.prototype, "handle", 1);
3112
+ ee = lr([
3113
+ v(),
3114
+ Xt(0, c("IMeshApi")),
3115
+ Xt(1, c("ObjValidator"))
3116
+ ], ee);
3117
+ class ye {
3118
+ constructor(t, r, s, i) {
3119
+ this._sceneApi = t, this._interactionApi = r, this._metricsApi = s, this._store = i;
3120
+ }
3121
+ /** Группа объектов текущего benchmark-теста. */
3122
+ _group = null;
3123
+ _liveTimerId = null;
3124
+ /**
3125
+ * Выполняет benchmark-тест.
3126
+ *
3127
+ * @param durationMs - длительность выполнения теста в миллисекундах
3128
+ *
3129
+ * @internal
3130
+ * @method
3131
+ */
3132
+ async handle(t) {
3133
+ this._interactionApi.setInteractionEnabled(!1), this._prepareScene(), this._metricsApi.start(this.objectsCount), this._startLiveMetrics(), await this._wait(t), this._stopLiveMetrics(), this._metricsApi.stop();
3134
+ const r = this._metricsApi.getMetrics();
3135
+ this._store.setCurrentMetrics(r), this._store.addMetrics(this.mode, r), this._interactionApi.setInteractionEnabled(!0);
3136
+ }
3137
+ /**
3138
+ * Выполняет откат действий хендлера.
3139
+ *
3140
+ * @internal
3141
+ * @method
3142
+ */
3143
+ rollback() {
3144
+ this._interactionApi.setInteractionEnabled(!0), this._stopLiveMetrics(), this._metricsApi.stop(), this._metricsApi.reset(), this._store.setCurrentMetrics(null), this._group && (this._sceneApi.removeFromScene(this._group, !0), this._group.clear(), this._group = null);
3145
+ }
3146
+ /** Освобождает ресурсы хендлера. */
3147
+ dispose() {
3148
+ this.rollback();
3149
+ }
3150
+ /**
3151
+ * Подготавливает тестовую сцену.
3152
+ *
3153
+ * @private
3154
+ * @method
3155
+ */
3156
+ _prepareScene() {
3157
+ const t = new a.Group();
3158
+ t.name = this.groupName, this.fillGroup(t), this._group = t, this._sceneApi.addToScene(t);
3159
+ }
3160
+ /**
3161
+ * Ожидает указанное количество миллисекунд.
3162
+ *
3163
+ * @param ms - длительность ожидания
3164
+ *
3165
+ * @returns Promise, завершающийся после указанного времени
3166
+ *
3167
+ * @private
3168
+ * @method
3169
+ */
3170
+ _wait(t) {
3171
+ return new Promise((r) => {
3172
+ window.setTimeout(r, t);
3173
+ });
3174
+ }
3175
+ _startLiveMetrics() {
3176
+ this._stopLiveMetrics(), this._liveTimerId = window.setInterval(() => {
3177
+ this._store.setCurrentMetrics(this._metricsApi.getMetrics());
3178
+ }, 250);
3179
+ }
3180
+ _stopLiveMetrics() {
3181
+ this._liveTimerId !== null && (window.clearInterval(this._liveTimerId), this._liveTimerId = null);
3182
+ }
3183
+ }
3184
+ var Ri = Object.getOwnPropertyDescriptor, Bi = (e, t, r, s) => {
3185
+ for (var i = s > 1 ? void 0 : s ? Ri(t, r) : t, n = e.length - 1, o; n >= 0; n--)
2728
3186
  (o = e[n]) && (i = o(i) || i);
2729
3187
  return i;
2730
- }, Z = (e, t) => (s, r) => t(s, r, e);
2731
- let Ze = class {
2732
- constructor(e, t, s, r, i) {
2733
- this._renderer = e, this._mediator = t, this._store = s, this._exportStore = r, this._controller = i, this.setSelectMode(P.Mesh), this.setToolMode(U.Translate);
3188
+ }, oe = (e, t) => (r, s) => t(r, s, e);
3189
+ let at = class extends ye {
3190
+ /** Тип benchmark-теста. */
3191
+ mode = X.Light;
3192
+ /** Название группы тестовых объектов. */
3193
+ groupName = "__LIGHT_BENCHMARK__";
3194
+ /** Количество объектов в тестовой сцене. */
3195
+ objectsCount = Mt;
3196
+ constructor(e, t, r, s) {
3197
+ super(e, t, r, s);
3198
+ }
3199
+ /**
3200
+ * Заполняет группу объектами легкого benchmark-теста.
3201
+ *
3202
+ * @param group - группа benchmark-теста
3203
+ *
3204
+ * @internal
3205
+ * @method
3206
+ */
3207
+ fillGroup(e) {
3208
+ const t = Math.ceil(Math.sqrt(this.objectsCount)), r = t / 2;
3209
+ for (let s = 0; s < this.objectsCount; s += 1) {
3210
+ const i = s % t, n = Math.floor(s / t), o = new a.BoxGeometry(0.4, 0.4, 0.4), l = new a.MeshStandardMaterial(), h = new a.Mesh(o, l);
3211
+ h.position.set(i - r, 0.2, n - r), e.add(h);
3212
+ }
3213
+ }
3214
+ };
3215
+ at = Bi([
3216
+ v(),
3217
+ oe(0, c("ISceneApi")),
3218
+ oe(1, c("IInteractionApi")),
3219
+ oe(2, c("IMetricsApi")),
3220
+ oe(3, c("MetricsStore"))
3221
+ ], at);
3222
+ var Fi = Object.getOwnPropertyDescriptor, ki = (e, t, r, s) => {
3223
+ for (var i = s > 1 ? void 0 : s ? Fi(t, r) : t, n = e.length - 1, o; n >= 0; n--)
3224
+ (o = e[n]) && (i = o(i) || i);
3225
+ return i;
3226
+ }, ae = (e, t) => (r, s) => t(r, s, e);
3227
+ let lt = class extends ye {
3228
+ /** Тип benchmark-теста. */
3229
+ mode = X.Medium;
3230
+ /** Название группы тестовых объектов. */
3231
+ groupName = "__MEDIUM_BENCHMARK__";
3232
+ /** Количество объектов в тестовой сцене. */
3233
+ objectsCount = Mt;
3234
+ constructor(e, t, r, s) {
3235
+ super(e, t, r, s);
3236
+ }
3237
+ /**
3238
+ * Заполняет группу объектами среднего benchmark-теста.
3239
+ *
3240
+ * @param group - группа benchmark-теста
3241
+ *
3242
+ * @internal
3243
+ * @method
3244
+ */
3245
+ fillGroup(e) {
3246
+ const t = Math.ceil(Math.sqrt(this.objectsCount)), r = t / 2;
3247
+ for (let s = 0; s < this.objectsCount; s += 1) {
3248
+ const i = s % t, n = Math.floor(s / t), o = new a.CylinderGeometry(0.18, 0.18, 0.45, 24), l = new a.MeshStandardMaterial(), h = new a.Mesh(o, l);
3249
+ h.position.set((i - r) * 0.6, 0.225, (n - r) * 0.6), e.add(h);
3250
+ }
3251
+ }
3252
+ };
3253
+ lt = ki([
3254
+ v(),
3255
+ ae(0, c("ISceneApi")),
3256
+ ae(1, c("IInteractionApi")),
3257
+ ae(2, c("IMetricsApi")),
3258
+ ae(3, c("MetricsStore"))
3259
+ ], lt);
3260
+ var Gi = Object.getOwnPropertyDescriptor, zi = (e, t, r, s) => {
3261
+ for (var i = s > 1 ? void 0 : s ? Gi(t, r) : t, n = e.length - 1, o; n >= 0; n--)
3262
+ (o = e[n]) && (i = o(i) || i);
3263
+ return i;
3264
+ }, le = (e, t) => (r, s) => t(r, s, e);
3265
+ let ct = class extends ye {
3266
+ /** Тип benchmark-теста. */
3267
+ mode = X.Heavy;
3268
+ /** Название группы тестовых объектов. */
3269
+ groupName = "__HEAVY_BENCHMARK__";
3270
+ /** Количество объектов в тестовой сцене. */
3271
+ objectsCount = Mt;
3272
+ constructor(e, t, r, s) {
3273
+ super(e, t, r, s);
3274
+ }
3275
+ /**
3276
+ * Заполняет группу объектами тяжелого benchmark-теста.
3277
+ *
3278
+ * @param group - группа benchmark-теста
3279
+ *
3280
+ * @internal
3281
+ * @method
3282
+ */
3283
+ fillGroup(e) {
3284
+ const t = Math.ceil(Math.sqrt(this.objectsCount)), r = t / 2;
3285
+ for (let s = 0; s < this.objectsCount; s += 1) {
3286
+ const i = s % t, n = Math.floor(s / t), o = new a.TorusKnotGeometry(0.16, 0.05, 64, 12), l = new a.MeshStandardMaterial(), h = new a.Mesh(o, l);
3287
+ h.position.set((i - r) * 0.7, 0.25, (n - r) * 0.7), e.add(h);
3288
+ }
3289
+ }
3290
+ };
3291
+ ct = zi([
3292
+ v(),
3293
+ le(0, c("ISceneApi")),
3294
+ le(1, c("IInteractionApi")),
3295
+ le(2, c("IMetricsApi")),
3296
+ le(3, c("MetricsStore"))
3297
+ ], ct);
3298
+ var Wi = Object.getOwnPropertyDescriptor, Ni = (e, t, r, s) => {
3299
+ for (var i = s > 1 ? void 0 : s ? Wi(t, r) : t, n = e.length - 1, o; n >= 0; n--)
3300
+ (o = e[n]) && (i = o(i) || i);
3301
+ return i;
3302
+ }, ce = (e, t) => (r, s) => t(r, s, e);
3303
+ let ht = class extends ye {
3304
+ /** Тип benchmark-теста. */
3305
+ mode = X.Mixed;
3306
+ /** Название группы тестовых объектов. */
3307
+ groupName = "__MIXED_BENCHMARK__";
3308
+ /** Количество объектов в тестовой сцене. */
3309
+ objectsCount = Vt + Ht + $t;
3310
+ constructor(e, t, r, s) {
3311
+ super(e, t, r, s);
3312
+ }
3313
+ /**
3314
+ * Заполняет группу объектами смешанного benchmark-теста.
3315
+ *
3316
+ * @param group - группа benchmark-теста
3317
+ *
3318
+ * @internal
3319
+ * @method
3320
+ */
3321
+ fillGroup(e) {
3322
+ this._addLightObjects(e, -10), this._addMediumObjects(e, 0), this._addHardObjects(e, 10);
3323
+ }
3324
+ _addLightObjects(e, t) {
3325
+ this._addGrid(e, Vt, t, () => new a.Mesh(new a.BoxGeometry(0.3, 0.3, 0.3), new a.MeshStandardMaterial()));
3326
+ }
3327
+ _addMediumObjects(e, t) {
3328
+ this._addGrid(e, Ht, t, () => new a.Mesh(
3329
+ new a.CylinderGeometry(0.18, 0.18, 0.45, 24),
3330
+ new a.MeshStandardMaterial()
3331
+ ));
3332
+ }
3333
+ _addHardObjects(e, t) {
3334
+ this._addGrid(e, $t, t, () => new a.Mesh(
3335
+ new a.TorusKnotGeometry(0.16, 0.05, 64, 12),
3336
+ new a.MeshStandardMaterial()
3337
+ ));
3338
+ }
3339
+ _addGrid(e, t, r, s) {
3340
+ const i = Math.ceil(Math.sqrt(t)), n = i / 2;
3341
+ for (let o = 0; o < t; o += 1) {
3342
+ const l = o % i, h = Math.floor(o / i), d = s(o);
3343
+ d.position.set(r + (l - n) * 0.65, 0.25, (h - n) * 0.65), e.add(d);
3344
+ }
3345
+ }
3346
+ };
3347
+ ht = Ni([
3348
+ v(),
3349
+ ce(0, c("ISceneApi")),
3350
+ ce(1, c("IInteractionApi")),
3351
+ ce(2, c("IMetricsApi")),
3352
+ ce(3, c("MetricsStore"))
3353
+ ], ht);
3354
+ var Ui = Object.getOwnPropertyDescriptor, Xi = (e, t, r, s) => {
3355
+ for (var i = s > 1 ? void 0 : s ? Ui(t, r) : t, n = e.length - 1, o; n >= 0; n--)
3356
+ (o = e[n]) && (i = o(i) || i);
3357
+ return i;
3358
+ }, Z = (e, t) => (r, s) => t(r, s, e);
3359
+ let dt = class {
3360
+ constructor(e, t, r, s, i) {
3361
+ this._renderer = e, this._mediator = t, this._store = r, this._exportStore = s, this._worker = i, this.setSelectMode(O.Mesh), this.setToolMode(W.Translate);
2734
3362
  }
2735
3363
  setDisplayMode(e) {
2736
3364
  return this._mediator.send({
2737
- type: E.Display,
3365
+ type: P.Display,
2738
3366
  payload: [e]
2739
3367
  });
2740
3368
  }
2741
3369
  setSelectMode(e) {
2742
3370
  return this._mediator.send({
2743
- type: E.Select,
3371
+ type: P.Select,
2744
3372
  payload: [e]
2745
3373
  });
2746
3374
  }
2747
3375
  setToolMode(e) {
2748
3376
  return this._mediator.send({
2749
- type: E.Tool,
3377
+ type: P.Tool,
2750
3378
  payload: [e]
2751
3379
  });
2752
3380
  }
2753
3381
  addFigure(e) {
2754
3382
  return this._mediator.send({
2755
- type: E.Scene,
3383
+ type: P.Scene,
2756
3384
  payload: [T.AddFigure, e]
2757
3385
  });
2758
3386
  }
2759
3387
  deleteFigure() {
2760
3388
  return this._mediator.send({
2761
- type: E.Scene,
3389
+ type: P.Scene,
2762
3390
  payload: [T.DeleteFigure]
2763
3391
  });
2764
3392
  }
2765
3393
  loadFigure(e) {
2766
3394
  return this._mediator.send({
2767
- type: E.Scene,
3395
+ type: P.Scene,
2768
3396
  payload: [T.LoadFigure, e]
2769
3397
  });
2770
3398
  }
2771
3399
  loadScene(e) {
2772
3400
  return this._mediator.send({
2773
- type: E.Scene,
3401
+ type: P.Scene,
2774
3402
  payload: [T.Load, e]
2775
3403
  });
2776
3404
  }
2777
3405
  exportScene() {
2778
3406
  return this._exportStore.clearResult(), {
2779
3407
  response: this._mediator.send({
2780
- type: E.Scene,
3408
+ type: P.Scene,
2781
3409
  payload: [T.Export]
2782
3410
  }),
2783
3411
  result: this._exportStore.getResult()
@@ -2791,13 +3419,13 @@ let Ze = class {
2791
3419
  * Вызывается после создания хаба.
2792
3420
  */
2793
3421
  start() {
2794
- this._controller.start();
3422
+ this._worker.start();
2795
3423
  }
2796
3424
  /**
2797
3425
  * Останавливает редактор.
2798
3426
  */
2799
3427
  stop() {
2800
- this._controller.stop();
3428
+ this._worker.stop();
2801
3429
  }
2802
3430
  getSelectionStats() {
2803
3431
  return this._store.getSelectionStats();
@@ -2805,37 +3433,172 @@ let Ze = class {
2805
3433
  onSelectionStatsChange(e) {
2806
3434
  const t = this._store.onSelectedObjectChange(() => {
2807
3435
  e();
2808
- }), s = this._store.onSelectedTransformChange(() => {
3436
+ }), r = this._store.onSelectedTransformChange(() => {
2809
3437
  e();
2810
3438
  });
2811
3439
  return () => {
2812
- t(), s();
3440
+ t(), r();
2813
3441
  };
2814
3442
  }
2815
3443
  dispose() {
2816
3444
  this._mediator.dispose();
2817
3445
  }
2818
3446
  };
2819
- Ze = Yr([
2820
- w(),
2821
- Z(0, _("Renderer")),
2822
- Z(1, _("IMediator")),
2823
- Z(2, _("EditorStore")),
2824
- Z(3, _("ExportStore")),
2825
- Z(4, _("IController"))
2826
- ], Ze);
2827
- var qr = Object.getOwnPropertyDescriptor, Zr = (e, t, s, r) => {
2828
- for (var i = r > 1 ? void 0 : r ? qr(t, s) : t, n = e.length - 1, o; n >= 0; n--)
3447
+ dt = Xi([
3448
+ v(),
3449
+ Z(0, c("Renderer")),
3450
+ Z(1, c("IMediator")),
3451
+ Z(2, c("EditorStore")),
3452
+ Z(3, c("ExportStore")),
3453
+ Z(4, c("IWorker"))
3454
+ ], dt);
3455
+ var Yi = Object.getOwnPropertyDescriptor, Ki = (e, t, r, s) => {
3456
+ for (var i = s > 1 ? void 0 : s ? Yi(t, r) : t, n = e.length - 1, o; n >= 0; n--)
2829
3457
  (o = e[n]) && (i = o(i) || i);
2830
3458
  return i;
3459
+ }, Ee = (e, t) => (r, s) => t(r, s, e);
3460
+ let _t = class {
3461
+ constructor(e, t, r) {
3462
+ this._renderer = e, this._mediator = t, this._worker = r;
3463
+ }
3464
+ addFigure(e) {
3465
+ return this._mediator.send({
3466
+ type: P.Scene,
3467
+ payload: [T.AddFigure, e]
3468
+ });
3469
+ }
3470
+ loadFigure(e) {
3471
+ return this._mediator.send({
3472
+ type: P.Scene,
3473
+ payload: [T.LoadFigure, e]
3474
+ });
3475
+ }
3476
+ loadScene(e) {
3477
+ return this._mediator.send({
3478
+ type: P.Scene,
3479
+ payload: [T.Load, e]
3480
+ });
3481
+ }
3482
+ resizeRenderer() {
3483
+ this._renderer.resize();
3484
+ }
3485
+ /**
3486
+ * Запускает вьювер.
3487
+ * Вызывается после создания хаба.
3488
+ */
3489
+ start() {
3490
+ this._worker.start();
3491
+ }
3492
+ /**
3493
+ * Останавливает вьювер.
3494
+ */
3495
+ stop() {
3496
+ this._worker.stop();
3497
+ }
3498
+ dispose() {
3499
+ this._mediator.dispose();
3500
+ }
2831
3501
  };
2832
- let Ke = class {
3502
+ _t = Ki([
3503
+ v(),
3504
+ Ee(0, c("Renderer")),
3505
+ Ee(1, c("IMediator")),
3506
+ Ee(2, c("IWorker"))
3507
+ ], _t);
3508
+ var qi = Object.getOwnPropertyDescriptor, Zi = (e, t, r, s) => {
3509
+ for (var i = s > 1 ? void 0 : s ? qi(t, r) : t, n = e.length - 1, o; n >= 0; n--)
3510
+ (o = e[n]) && (i = o(i) || i);
3511
+ return i;
3512
+ }, he = (e, t) => (r, s) => t(r, s, e);
3513
+ let ut = class {
3514
+ constructor(e, t, r, s) {
3515
+ this._renderer = e, this._mediator = t, this._store = r, this._worker = s;
3516
+ }
3517
+ /**
3518
+ * Запускает benchmark-тестирование.
3519
+ *
3520
+ * @param config - конфигурация benchmark-тестирования
3521
+ *
3522
+ * @returns Краткий результат выполнения запрошенных тестов
3523
+ *
3524
+ * @public
3525
+ * @method
3526
+ */
3527
+ run(e) {
3528
+ this._store.clear();
3529
+ const t = [];
3530
+ for (const r of e.tests) {
3531
+ const s = this._mediator.send({
3532
+ type: P.Benchmark,
3533
+ payload: [r, e.durationMs]
3534
+ });
3535
+ t.push({
3536
+ type: r,
3537
+ status: s === null ? Pe.Success : Pe.Failed
3538
+ });
3539
+ }
3540
+ return { tests: t };
3541
+ }
3542
+ /**
3543
+ * Возвращает отчет по успешно выполненным benchmark-тестам.
3544
+ *
3545
+ * @returns Отчет benchmark-тестирования
3546
+ *
3547
+ * @public
3548
+ * @method
3549
+ */
3550
+ getReport() {
3551
+ return this._store.getReport();
3552
+ }
3553
+ /**
3554
+ * Регистрирует слушатель обновления live-метрик.
3555
+ *
3556
+ * @param listener - обработчик обновления метрик
3557
+ *
3558
+ * @returns Функция отписки от обновлений
3559
+ *
3560
+ * @public
3561
+ * @method
3562
+ */
3563
+ subscribeMetrics(e) {
3564
+ return this._store.subscribe(e);
3565
+ }
3566
+ resizeRenderer() {
3567
+ this._renderer.resize();
3568
+ }
3569
+ /**
3570
+ * Запускает редактор.
3571
+ * Вызывается после создания хаба.
3572
+ */
3573
+ start() {
3574
+ this._worker.start();
3575
+ }
3576
+ /**
3577
+ * Останавливает редактор.
3578
+ */
3579
+ stop() {
3580
+ this._worker.stop();
3581
+ }
3582
+ };
3583
+ ut = Zi([
3584
+ v(),
3585
+ he(0, c("Renderer")),
3586
+ he(1, c("IMediator")),
3587
+ he(2, c("MetricsStore")),
3588
+ he(3, c("IWorker"))
3589
+ ], ut);
3590
+ var Ji = Object.getOwnPropertyDescriptor, Qi = (e, t, r, s) => {
3591
+ for (var i = s > 1 ? void 0 : s ? Ji(t, r) : t, n = e.length - 1, o; n >= 0; n--)
3592
+ (o = e[n]) && (i = o(i) || i);
3593
+ return i;
3594
+ };
3595
+ let pt = class {
2833
3596
  /** Текущий режим выборки. */
2834
- _selectMode = P.Mesh;
3597
+ _selectMode = O.Mesh;
2835
3598
  /** Текущий выбранный инструмент. */
2836
- _toolType = U.Translate;
3599
+ _toolType = W.Translate;
2837
3600
  /** Выбранный режим отображения. */
2838
- _displayMode = K.Plane;
3601
+ _displayMode = J.Plane;
2839
3602
  /** Выбранный объект на сцене. */
2840
3603
  _selectedObject = null;
2841
3604
  /** Слушатели событий по изменению выбранного объекта. */
@@ -2843,7 +3606,7 @@ let Ke = class {
2843
3606
  /** Слушатели событий трансформации выбранного объекта. */
2844
3607
  _transformListeners = /* @__PURE__ */ new Set();
2845
3608
  constructor() {
2846
- At(this, {}, { autoBind: !0 });
3609
+ bt(this, {}, { autoBind: !0 });
2847
3610
  }
2848
3611
  getSelectMode() {
2849
3612
  return this._selectMode;
@@ -2868,7 +3631,7 @@ let Ke = class {
2868
3631
  }
2869
3632
  getSelectionStats() {
2870
3633
  const e = this._selectedObject;
2871
- return e ? ys(e) : null;
3634
+ return e ? qr(e) : null;
2872
3635
  }
2873
3636
  setSelectedObject(e) {
2874
3637
  if (this._selectedObject !== e) {
@@ -2886,16 +3649,16 @@ let Ke = class {
2886
3649
  for (const e of this._transformListeners) e();
2887
3650
  }
2888
3651
  };
2889
- Ke = Zr([
2890
- w()
2891
- ], Ke);
2892
- class Bt {
3652
+ pt = Qi([
3653
+ v()
3654
+ ], pt);
3655
+ class cr {
2893
3656
  _result = null;
2894
3657
  constructor() {
2895
- At(
3658
+ bt(
2896
3659
  this,
2897
3660
  {
2898
- _result: os.ref
3661
+ _result: $r.ref
2899
3662
  },
2900
3663
  {
2901
3664
  autoBind: !0
@@ -2918,82 +3681,133 @@ class Bt {
2918
3681
  this._result = null;
2919
3682
  }
2920
3683
  }
2921
- class kt extends Error {
2922
- constructor(t, s, r, i) {
2923
- super(s), this.type = t, this.code = r, this.meta = i, this.name = this._name;
3684
+ var en = Object.getOwnPropertyDescriptor, tn = (e, t, r, s) => {
3685
+ for (var i = s > 1 ? void 0 : s ? en(t, r) : t, n = e.length - 1, o; n >= 0; n--)
3686
+ (o = e[n]) && (i = o(i) || i);
3687
+ return i;
3688
+ };
3689
+ let mt = class {
3690
+ /** Дата создания текущего отчета. */
3691
+ _createdAt = (/* @__PURE__ */ new Date()).toISOString();
3692
+ /** Метрики успешно выполненных тестов. */
3693
+ _metrics = /* @__PURE__ */ new Map();
3694
+ /** Текущие live-метрики. */
3695
+ _currentMetrics = null;
3696
+ /** Слушатели обновления live-метрик. */
3697
+ _listeners = /* @__PURE__ */ new Set();
3698
+ constructor() {
3699
+ bt(this, {}, { autoBind: !0 });
3700
+ }
3701
+ clear() {
3702
+ this._createdAt = (/* @__PURE__ */ new Date()).toISOString(), this._metrics.clear(), this.setCurrentMetrics(null);
3703
+ }
3704
+ addMetrics(e, t) {
3705
+ this._metrics.set(e, t);
3706
+ }
3707
+ setCurrentMetrics(e) {
3708
+ this._currentMetrics = e;
3709
+ for (const t of this._listeners)
3710
+ t(this._currentMetrics);
3711
+ }
3712
+ getCurrentMetrics() {
3713
+ return this._currentMetrics;
3714
+ }
3715
+ subscribe(e) {
3716
+ return this._listeners.add(e), () => {
3717
+ this._listeners.delete(e);
3718
+ };
3719
+ }
3720
+ getReport() {
3721
+ const e = [...this._metrics.entries()].map(([t, r]) => ({
3722
+ type: t,
3723
+ status: Pe.Success,
3724
+ metrics: r
3725
+ }));
3726
+ return {
3727
+ createdAt: this._createdAt,
3728
+ tests: e
3729
+ };
3730
+ }
3731
+ };
3732
+ mt = tn([
3733
+ v()
3734
+ ], mt);
3735
+ class hr extends Error {
3736
+ constructor(t, r, s, i) {
3737
+ super(r), this.type = t, this.code = s, this.meta = i, this.name = this._name;
2924
3738
  }
2925
3739
  _name = "PolicyException";
2926
3740
  }
2927
- class oe extends Error {
2928
- constructor(t, s, r, i) {
2929
- super(s), this.type = t, this.code = r, this.meta = i, this.name = this._name;
3741
+ class pe extends Error {
3742
+ constructor(t, r, s, i) {
3743
+ super(r), this.type = t, this.code = s, this.meta = i, this.name = this._name;
2930
3744
  }
2931
3745
  _name = "ValidationException";
2932
3746
  }
2933
- var Kr = Object.getOwnPropertyDescriptor, Jr = (e, t, s, r) => {
2934
- for (var i = r > 1 ? void 0 : r ? Kr(t, s) : t, n = e.length - 1, o; n >= 0; n--)
3747
+ var rn = Object.getOwnPropertyDescriptor, sn = (e, t, r, s) => {
3748
+ for (var i = s > 1 ? void 0 : s ? rn(t, r) : t, n = e.length - 1, o; n >= 0; n--)
2935
3749
  (o = e[n]) && (i = o(i) || i);
2936
3750
  return i;
2937
- }, Qr = (e, t) => (s, r) => t(s, r, e);
2938
- let Je = class {
3751
+ }, nn = (e, t) => (r, s) => t(r, s, e);
3752
+ let ft = class {
2939
3753
  constructor(e) {
2940
3754
  this._store = e;
2941
3755
  }
2942
3756
  check(e) {
2943
3757
  const t = this._store.getSelectMode();
2944
- if (!es[t].includes(e))
2945
- throw new kt(
3758
+ if (!Lr[t].includes(e))
3759
+ throw new hr(
2946
3760
  G.NotAllowed,
2947
3761
  `Tool ${e} is not allowed`,
2948
3762
  "TOOL_NOT_ALLOWED"
2949
3763
  );
2950
3764
  }
2951
3765
  };
2952
- Je = Jr([
2953
- w(),
2954
- Qr(0, _("EditorStore"))
2955
- ], Je);
2956
- class zt {
3766
+ ft = sn([
3767
+ v(),
3768
+ nn(0, c("EditorStore"))
3769
+ ], ft);
3770
+ class on {
2957
3771
  constructor() {
2958
3772
  }
2959
3773
  validate(t) {
2960
- const s = t.trim();
2961
- if (!s)
2962
- throw new oe(
3774
+ const r = t.trim();
3775
+ if (!r)
3776
+ throw new pe(
2963
3777
  G.ValidationError,
2964
3778
  "File content is empty.",
2965
3779
  "FILE_CONTENT_EMPTY"
2966
3780
  );
2967
- if (!/^v\s+[-+.\deE]+\s+[-+.\deE]+\s+[-+.\deE]+/m.test(s))
2968
- throw new oe(
3781
+ if (!/^v\s+[-+.\deE]+\s+[-+.\deE]+\s+[-+.\deE]+/m.test(r))
3782
+ throw new pe(
2969
3783
  G.ValidationError,
2970
3784
  "OBJ content does not contain vertices.",
2971
3785
  "WRONG_FILE_CONTENT"
2972
3786
  );
2973
- if (!/^f\s+/m.test(s))
2974
- throw new oe(
3787
+ if (!/^f\s+/m.test(r))
3788
+ throw new pe(
2975
3789
  G.ValidationError,
2976
3790
  "OBJ content does not contain faces.",
2977
3791
  "WRONG_FILE_CONTENT"
2978
3792
  );
2979
3793
  }
2980
3794
  }
2981
- var ei = Object.getOwnPropertyDescriptor, ti = (e, t, s, r) => {
2982
- for (var i = r > 1 ? void 0 : r ? ei(t, s) : t, n = e.length - 1, o; n >= 0; n--)
3795
+ var an = Object.getOwnPropertyDescriptor, ln = (e, t, r, s) => {
3796
+ for (var i = s > 1 ? void 0 : s ? an(t, r) : t, n = e.length - 1, o; n >= 0; n--)
2983
3797
  (o = e[n]) && (i = o(i) || i);
2984
3798
  return i;
2985
3799
  };
2986
- let ve = class {
3800
+ let gt = class {
2987
3801
  handle(e) {
2988
3802
  try {
2989
3803
  return e();
2990
3804
  } catch (t) {
2991
- return t instanceof kt ? {
3805
+ return t instanceof hr ? {
2992
3806
  type: t.type,
2993
3807
  message: t.message,
2994
3808
  code: t.code,
2995
3809
  blocked: !0
2996
- } : t instanceof oe ? {
3810
+ } : t instanceof pe ? {
2997
3811
  type: t.type,
2998
3812
  message: t.message,
2999
3813
  code: t.code,
@@ -3012,17 +3826,17 @@ let ve = class {
3012
3826
  }
3013
3827
  }
3014
3828
  };
3015
- ve = ti([
3016
- w()
3017
- ], ve);
3018
- var si = Object.getOwnPropertyDescriptor, ri = (e, t, s, r) => {
3019
- for (var i = r > 1 ? void 0 : r ? si(t, s) : t, n = e.length - 1, o; n >= 0; n--)
3829
+ gt = ln([
3830
+ v()
3831
+ ], gt);
3832
+ var cn = Object.getOwnPropertyDescriptor, hn = (e, t, r, s) => {
3833
+ for (var i = s > 1 ? void 0 : s ? cn(t, r) : t, n = e.length - 1, o; n >= 0; n--)
3020
3834
  (o = e[n]) && (i = o(i) || i);
3021
3835
  return i;
3022
- }, xt = (e, t) => (s, r) => t(s, r, e);
3023
- let ye = class {
3836
+ }, Yt = (e, t) => (r, s) => t(r, s, e);
3837
+ let vt = class {
3024
3838
  constructor(e, t) {
3025
- this._middlewares = t, this._managers = new Map(e.map((s) => [s.type, s]));
3839
+ this._middlewares = t, this._managers = new Map(e.map((r) => [r.type, r]));
3026
3840
  }
3027
3841
  _managers;
3028
3842
  send(e) {
@@ -3034,105 +3848,172 @@ let ye = class {
3034
3848
  code: "MANAGER_NOT_FOUND",
3035
3849
  blocked: !0
3036
3850
  };
3037
- const s = () => (t.manage(...e.payload), null);
3038
- return this._middlewares.reduceRight((i, n) => () => n.handle(i), s)();
3851
+ const r = () => (t.manage(...e.payload), null);
3852
+ return this._middlewares.reduceRight((i, n) => () => n.handle(i), r)();
3039
3853
  }
3040
3854
  dispose() {
3041
3855
  this._managers && this._managers.clear();
3042
3856
  }
3043
3857
  };
3044
- ye = ri([
3045
- w(),
3046
- xt(0, B("IManager")),
3047
- xt(1, B("IMiddleware"))
3048
- ], ye);
3049
- var ii = Object.getOwnPropertyDescriptor, ni = (e, t, s, r) => {
3050
- for (var i = r > 1 ? void 0 : r ? ii(t, s) : t, n = e.length - 1, o; n >= 0; n--)
3051
- (o = e[n]) && (i = o(i) || i);
3052
- return i;
3053
- }, Le = (e, t) => (s, r) => t(s, r, e);
3054
- let Qe = class {
3055
- constructor(e, t, s) {
3056
- this._renderer = e, this._mediator = t, this._controller = s;
3057
- }
3058
- addFigure(e) {
3059
- return this._mediator.send({
3060
- type: E.Scene,
3061
- payload: [T.AddFigure, e]
3062
- });
3063
- }
3064
- loadFigure(e) {
3065
- return this._mediator.send({
3066
- type: E.Scene,
3067
- payload: [T.LoadFigure, e]
3068
- });
3069
- }
3070
- loadScene(e) {
3071
- return this._mediator.send({
3072
- type: E.Scene,
3073
- payload: [T.Load, e]
3074
- });
3075
- }
3076
- resizeRenderer() {
3077
- this._renderer.resize();
3078
- }
3079
- /**
3080
- * Запускает вьювер.
3081
- * Вызывается после создания хаба.
3082
- */
3083
- start() {
3084
- this._controller.start();
3085
- }
3086
- /**
3087
- * Останавливает вьювер.
3088
- */
3089
- stop() {
3090
- this._controller.stop();
3091
- }
3092
- dispose() {
3093
- this._mediator.dispose();
3094
- }
3095
- };
3096
- Qe = ni([
3097
- w(),
3098
- Le(0, _("Renderer")),
3099
- Le(1, _("IMediator")),
3100
- Le(2, _("IController"))
3101
- ], Qe);
3102
- let be = !1;
3103
- const a = Jt.createChildContainer();
3104
- function oi(e, t) {
3105
- return be || (a.registerInstance("Canvas", e), a.registerInstance(
3106
- "RendererConfig",
3107
- Tt(jt, t)
3108
- ), a.registerSingleton("EventBus", je), a.registerSingleton("IController", le), a.registerSingleton("Renderer", ae), a.register("IRenderable", { useToken: "Renderer" }), a.register("IRendererAccess", { useToken: "Renderer" }), a.register("IRendererCameraAccess", { useToken: "Renderer" }), a.register("IRendererDomAccess", { useToken: "Renderer" }), a.register("IRendererSceneAccess", { useToken: "Renderer" }), a.registerSingleton("ToolPolicy", Je), a.registerSingleton("ObjValidator", zt), a.registerSingleton("IMeshApi", ce), a.registerSingleton("IControlsStateApi", Ee), a.registerSingleton("IRaycastApi", Te), a.registerSingleton("ITransformApi", Ve), a.registerSingleton("ICameraApi", he), a.registerSingleton("IDomApi", de), a.registerSingleton("ISceneApi", ue), a.registerSingleton("ControlsModule", _e), a.registerSingleton("GizmoModule", De), a.registerSingleton("RaycastModule", $e), a.registerSingleton("SceneModule", Re), a.register("IUpdatableModule", { useToken: "ControlsModule" }), a.register("IRenderableModule", { useToken: "GizmoModule" }), a.register("IRuntimeModule", { useToken: "RaycastModule" }), a.register("IRuntimeModule", { useToken: "SceneModule" }), a.registerSingleton("IDisplayHandler", ke), a.registerSingleton("ISelectHandler", We), a.registerSingleton("ISelectHandler", Ge), a.registerSingleton("ISelectHandler", ze), a.registerSingleton("ISelectHandler", Ue), a.registerSingleton("IToolHandler", Ye), a.registerSingleton("IToolHandler", Xe), a.registerSingleton("IToolHandler", Ne), a.registerSingleton("ISceneHandler", ge), a.registerSingleton("ISceneHandler", qe), a.registerSingleton("ISceneHandler", fe), a.registerSingleton("ISceneHandler", Q), a.registerSingleton("ISceneHandler", J), a.registerSingleton("DisplayManager", He), a.register("IDisplayManager", { useToken: "DisplayManager" }), a.register("IManager", { useToken: "DisplayManager" }), a.registerSingleton("SelectManager", Be), a.register("ISelectManager", { useToken: "SelectManager" }), a.register("IManager", { useToken: "SelectManager" }), a.registerSingleton("ToolManager", me), a.register("IToolManager", { useToken: "ToolManager" }), a.register("IManager", { useToken: "ToolManager" }), a.registerSingleton("SceneManager", pe), a.register("ISceneManager", { useToken: "SceneManager" }), a.register("IManager", { useToken: "SceneManager" }), a.registerSingleton("IMiddleware", ve), a.registerSingleton("IMediator", ye), a.registerSingleton("EditorHub", Ze), a.registerSingleton("EditorStore", Ke), a.registerSingleton("ExportStore", Bt), be = !0), a;
3858
+ vt = hn([
3859
+ v(),
3860
+ Yt(0, H("IManager")),
3861
+ Yt(1, H("IMiddleware"))
3862
+ ], vt);
3863
+ let de = null, _e = null, ue = null;
3864
+ function St() {
3865
+ return Er.createChildContainer();
3866
+ }
3867
+ function dr(e, t) {
3868
+ e.registerInstance("Canvas", t);
3109
3869
  }
3110
- function ai(e, t) {
3111
- return be || (a.registerInstance("Canvas", e), a.registerInstance(
3870
+ function _r(e, t) {
3871
+ e.registerInstance(
3112
3872
  "RendererConfig",
3113
- Tt(jt, t)
3114
- ), a.registerSingleton("IController", le), a.registerSingleton("Renderer", ae), a.register("IRenderable", { useToken: "Renderer" }), a.register("IRendererAccess", { useToken: "Renderer" }), a.register("IRendererCameraAccess", { useToken: "Renderer" }), a.register("IRendererDomAccess", { useToken: "Renderer" }), a.register("IRendererSceneAccess", { useToken: "Renderer" }), a.registerSingleton("ObjValidator", zt), a.registerSingleton("IMeshApi", ce), a.registerSingleton("ICameraApi", he), a.registerSingleton("IDomApi", de), a.registerSingleton("ISceneApi", ue), a.registerSingleton("ControlsModule", _e), a.registerSingleton("SceneModule", Fe), a.register("IUpdatableModule", { useToken: "ControlsModule" }), a.register("IRuntimeModule", { useToken: "SceneModule" }), a.registerSingleton("ISceneHandler", ge), a.registerSingleton("ISceneHandler", fe), a.registerSingleton("ISceneHandler", Q), a.registerSingleton("ISceneHandler", J), a.registerSingleton("SceneManager", pe), a.register("ISceneManager", { useToken: "SceneManager" }), a.register("IManager", { useToken: "SceneManager" }), a.registerSingleton("IMiddleware", ve), a.registerSingleton("IMediator", ye), a.registerSingleton("ViewerHub", Qe), a.registerSingleton("ExportStore", Bt), be = !0), a;
3873
+ Zr(ts, t)
3874
+ );
3875
+ }
3876
+ function xt(e) {
3877
+ e.registerSingleton("IWorker", Te), e.registerSingleton("Renderer", Le), e.register("IRenderable", { useToken: "Renderer" }), e.register("IRendererAccess", { useToken: "Renderer" }), e.register("IRendererCameraAccess", { useToken: "Renderer" }), e.register("IRendererDomAccess", { useToken: "Renderer" }), e.register("IRendererSceneAccess", { useToken: "Renderer" });
3878
+ }
3879
+ function dn(e) {
3880
+ xt(e), e.register("IRendererInfoAccess", { useToken: "Renderer" });
3881
+ }
3882
+ function _n(e) {
3883
+ e.registerSingleton("EventBus", ze);
3884
+ }
3885
+ function un(e) {
3886
+ e.registerSingleton("ToolPolicy", ft);
3887
+ }
3888
+ function ur(e) {
3889
+ e.registerSingleton("ObjValidator", on);
3890
+ }
3891
+ function pr(e) {
3892
+ e.registerSingleton("IMeshApi", je), e.registerSingleton("ICameraApi", Re), e.registerSingleton("IDomApi", Be), e.registerSingleton("ISceneApi", Fe);
3893
+ }
3894
+ function mr(e) {
3895
+ pr(e), e.registerSingleton("IControlsStateApi", De), e.registerSingleton("IRaycastApi", Ve), e.registerSingleton("ITransformApi", He), e.registerSingleton("IInteractionApi", $e);
3896
+ }
3897
+ function pn(e) {
3898
+ pr(e);
3899
+ }
3900
+ function mn(e) {
3901
+ mr(e), e.registerSingleton("IRendererInfoApi", ke);
3902
+ }
3903
+ function fr(e) {
3904
+ e.registerSingleton("ControlsModule", me), e.registerSingleton("GizmoModule", Ge), e.registerSingleton("RaycastModule", We), e.registerSingleton("SceneModule", Ne), e.register("IUpdatableModule", { useToken: "ControlsModule" }), e.register("IRenderableModule", { useToken: "GizmoModule" }), e.register("IRuntimeModule", { useToken: "RaycastModule" }), e.register("IRuntimeModule", { useToken: "SceneModule" }), e.register("IInteractiveModule", { useToken: "ControlsModule" }), e.register("IInteractiveModule", { useToken: "RaycastModule" }), e.register("IInteractiveModule", { useToken: "GizmoModule" });
3905
+ }
3906
+ function fn(e) {
3907
+ e.registerSingleton("ControlsModule", me), e.registerSingleton("SceneModule", Ue), e.register("IUpdatableModule", { useToken: "ControlsModule" }), e.register("IRuntimeModule", { useToken: "SceneModule" }), e.register("IInteractiveModule", { useToken: "ControlsModule" });
3908
+ }
3909
+ function gn(e) {
3910
+ fr(e), e.registerSingleton("MetricsModule", Xe), e.register("IObserverModule", { useToken: "MetricsModule" }), e.register("IMetricsApi", { useToken: "MetricsModule" });
3911
+ }
3912
+ function vn(e) {
3913
+ e.registerSingleton("IDisplayHandler", Je);
3914
+ }
3915
+ function bn(e) {
3916
+ e.registerSingleton("ISelectHandler", tt), e.registerSingleton("ISelectHandler", et), e.registerSingleton("ISelectHandler", Qe), e.registerSingleton("ISelectHandler", rt);
3917
+ }
3918
+ function Mn(e) {
3919
+ e.registerSingleton("IToolHandler", nt), e.registerSingleton("IToolHandler", it), e.registerSingleton("IToolHandler", st);
3920
+ }
3921
+ function yn(e) {
3922
+ e.registerSingleton("ISceneHandler", ge), e.registerSingleton("ISceneHandler", ot), e.registerSingleton("ISceneHandler", ve), e.registerSingleton("ISceneHandler", ee), e.registerSingleton("ISceneHandler", Q);
3923
+ }
3924
+ function wn(e) {
3925
+ e.registerSingleton("ISceneHandler", ge), e.registerSingleton("ISceneHandler", ve), e.registerSingleton("ISceneHandler", ee), e.registerSingleton("ISceneHandler", Q);
3926
+ }
3927
+ function Sn(e) {
3928
+ e.registerSingleton("IBenchmarkHandler", at), e.registerSingleton("IBenchmarkHandler", lt), e.registerSingleton("IBenchmarkHandler", ct), e.registerSingleton("IBenchmarkHandler", ht);
3929
+ }
3930
+ function xn(e) {
3931
+ e.registerSingleton("DisplayManager", Ye), e.register("IDisplayManager", { useToken: "DisplayManager" }), e.register("IManager", { useToken: "DisplayManager" });
3932
+ }
3933
+ function An(e) {
3934
+ e.registerSingleton("SelectManager", qe), e.register("ISelectManager", { useToken: "SelectManager" }), e.register("IManager", { useToken: "SelectManager" });
3935
+ }
3936
+ function In(e) {
3937
+ e.registerSingleton("ToolManager", fe), e.register("IToolManager", { useToken: "ToolManager" }), e.register("IManager", { useToken: "ToolManager" });
3938
+ }
3939
+ function gr(e) {
3940
+ e.registerSingleton("SceneManager", Ke), e.register("ISceneManager", { useToken: "SceneManager" }), e.register("IManager", { useToken: "SceneManager" });
3941
+ }
3942
+ function Cn(e) {
3943
+ e.registerSingleton("BenchmarkManager", Ze), e.register("IBenchmarkManager", { useToken: "BenchmarkManager" }), e.register("IManager", { useToken: "BenchmarkManager" });
3944
+ }
3945
+ function On(e) {
3946
+ xn(e), An(e), In(e), gr(e);
3947
+ }
3948
+ function En(e) {
3949
+ gr(e);
3950
+ }
3951
+ function vr(e) {
3952
+ e.registerSingleton("IMiddleware", gt), e.registerSingleton("IMediator", vt);
3953
+ }
3954
+ function Pn(e) {
3955
+ e.registerSingleton("EditorStore", pt), e.registerSingleton("ExportStore", cr);
3956
+ }
3957
+ function Ln(e) {
3958
+ e.registerSingleton("ExportStore", cr);
3959
+ }
3960
+ function Tn(e) {
3961
+ e.registerSingleton("MetricsStore", mt);
3962
+ }
3963
+ function Dn(e) {
3964
+ e.registerSingleton("EditorHub", dt);
3965
+ }
3966
+ function jn(e) {
3967
+ e.registerSingleton("ViewerHub", _t);
3968
+ }
3969
+ function Vn(e) {
3970
+ e.registerSingleton("BenchmarkHub", ut);
3971
+ }
3972
+ function br(e, t, r) {
3973
+ return dr(e, t), _r(e, r), _n(e), xt(e), un(e), ur(e), mr(e), fr(e), vn(e), bn(e), Mn(e), yn(e), On(e), vr(e), Dn(e), Pn(e), e;
3974
+ }
3975
+ function Hn(e, t, r) {
3976
+ return br(e, t, r), dn(e), gn(e), mn(e), Sn(e), Cn(e), Tn(e), Vn(e), e;
3977
+ }
3978
+ function $n(e, t, r) {
3979
+ return dr(e, t), _r(e, r), xt(e), ur(e), pn(e), fn(e), wn(e), En(e), vr(e), jn(e), Ln(e), e;
3980
+ }
3981
+ function Rn(e, t) {
3982
+ return de || (de = br(St(), e, t), de);
3983
+ }
3984
+ function Bn(e, t) {
3985
+ return _e || (_e = $n(St(), e, t), _e);
3986
+ }
3987
+ function Fn(e, t) {
3988
+ return ue || (ue = Hn(St(), e, t), ue);
3115
3989
  }
3116
- let R = null;
3117
- const gi = (e, t) => (R || (R = oi(e, t)), R.resolve("EditorHub")), fi = () => {
3118
- if (!R)
3990
+ let L = null;
3991
+ const Kn = (e, t) => (L || (L = Rn(e, t)), L.resolve("EditorHub")), qn = () => {
3992
+ if (!L)
3119
3993
  throw new Error("EditorHub is not initialized. Call createEditorHub(canvas) first.");
3120
- return R.resolve("EditorHub");
3121
- }, vi = (e, t) => (R || (R = ai(e, t)), R.resolve("ViewerHub")), yi = () => {
3122
- if (!R)
3994
+ return L.resolve("EditorHub");
3995
+ }, Zn = (e, t) => (L || (L = Bn(e, t)), L.resolve("ViewerHub")), Jn = () => {
3996
+ if (!L)
3123
3997
  throw new Error("ViewerHub is not initialized. Call createViewerHub(canvas) first.");
3124
- return R.resolve("ViewerHub");
3998
+ return L.resolve("ViewerHub");
3999
+ }, Qn = (e, t) => (L || (L = Fn(e, t)), L.resolve("BenchmarkHub")), eo = () => {
4000
+ if (!L)
4001
+ throw new Error("ViewerHub is not initialized. Call createBenchmarkHub(canvas) first.");
4002
+ return L.resolve("BenchmarkHub");
3125
4003
  };
3126
4004
  export {
3127
- Ze as EditorHub,
3128
- je as EventBus,
3129
- k as EventTopics,
3130
- E as FeatureType,
3131
- mi as ObjLoader,
3132
- ae as Renderer,
3133
- Qe as ViewerHub,
3134
- gi as createEditorHub,
3135
- vi as createViewerHub,
3136
- fi as getEditorHub,
3137
- yi as getViewerHub
4005
+ ut as BenchmarkHub,
4006
+ dt as EditorHub,
4007
+ ze as EventBus,
4008
+ B as EventTopics,
4009
+ P as FeatureType,
4010
+ Yn as ObjLoader,
4011
+ Le as Renderer,
4012
+ _t as ViewerHub,
4013
+ Qn as createBenchmarkHub,
4014
+ Kn as createEditorHub,
4015
+ Zn as createViewerHub,
4016
+ eo as getBenchmarkHub,
4017
+ qn as getEditorHub,
4018
+ Jn as getViewerHub
3138
4019
  };