@planara/core 3.0.0 → 3.1.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 (208) hide show
  1. package/dist/api/modules/controls-state-api.d.ts +1 -1
  2. package/dist/api/modules/controls-state-api.d.ts.map +1 -1
  3. package/dist/api/modules/index.d.ts +5 -0
  4. package/dist/api/modules/index.d.ts.map +1 -0
  5. package/dist/api/modules/mesh-api.d.ts +1 -1
  6. package/dist/api/modules/mesh-api.d.ts.map +1 -1
  7. package/dist/api/modules/raycast-api.d.ts +1 -1
  8. package/dist/api/modules/raycast-api.d.ts.map +1 -1
  9. package/dist/api/modules/transform-api.d.ts +2 -2
  10. package/dist/api/modules/transform-api.d.ts.map +1 -1
  11. package/dist/api/renderer/camera-api.d.ts +2 -2
  12. package/dist/api/renderer/camera-api.d.ts.map +1 -1
  13. package/dist/api/renderer/dom-api.d.ts +2 -2
  14. package/dist/api/renderer/dom-api.d.ts.map +1 -1
  15. package/dist/api/renderer/index.d.ts +4 -0
  16. package/dist/api/renderer/index.d.ts.map +1 -0
  17. package/dist/api/renderer/scene-api.d.ts +2 -2
  18. package/dist/api/renderer/scene-api.d.ts.map +1 -1
  19. package/dist/constants/figure-geometries.d.ts.map +1 -1
  20. package/dist/constants/index.d.ts +6 -0
  21. package/dist/constants/index.d.ts.map +1 -0
  22. package/dist/controllers/index.d.ts +2 -0
  23. package/dist/controllers/index.d.ts.map +1 -0
  24. package/dist/controllers/renderer-controller.d.ts +7 -9
  25. package/dist/controllers/renderer-controller.d.ts.map +1 -1
  26. package/dist/core/index.d.ts +2 -0
  27. package/dist/core/index.d.ts.map +1 -0
  28. package/dist/core/renderer.d.ts +10 -15
  29. package/dist/core/renderer.d.ts.map +1 -1
  30. package/dist/decorators/index.d.ts +3 -0
  31. package/dist/decorators/index.d.ts.map +1 -0
  32. package/dist/decorators/use-policy.d.ts.map +1 -1
  33. package/dist/decorators/use-validator.d.ts +5 -0
  34. package/dist/decorators/use-validator.d.ts.map +1 -0
  35. package/dist/errors/index.d.ts +3 -0
  36. package/dist/errors/index.d.ts.map +1 -0
  37. package/dist/errors/policy-error.d.ts +1 -1
  38. package/dist/errors/policy-error.d.ts.map +1 -1
  39. package/dist/errors/validation-error.d.ts +9 -0
  40. package/dist/errors/validation-error.d.ts.map +1 -0
  41. package/dist/events/editor-events.d.ts +1 -1
  42. package/dist/events/editor-events.d.ts.map +1 -1
  43. package/dist/events/event-bus.d.ts +1 -1
  44. package/dist/events/event-bus.d.ts.map +1 -1
  45. package/dist/events/index.d.ts +4 -0
  46. package/dist/events/index.d.ts.map +1 -0
  47. package/dist/handlers/display/index.d.ts +2 -0
  48. package/dist/handlers/display/index.d.ts.map +1 -0
  49. package/dist/handlers/display/wireframe-handler.d.ts +2 -2
  50. package/dist/handlers/display/wireframe-handler.d.ts.map +1 -1
  51. package/dist/handlers/scene/add-figure-scene-handler.d.ts +2 -2
  52. package/dist/handlers/scene/add-figure-scene-handler.d.ts.map +1 -1
  53. package/dist/handlers/scene/delete-figure-scene-handler.d.ts +3 -3
  54. package/dist/handlers/scene/delete-figure-scene-handler.d.ts.map +1 -1
  55. package/dist/handlers/scene/export-scene-handler.d.ts +23 -0
  56. package/dist/handlers/scene/export-scene-handler.d.ts.map +1 -0
  57. package/dist/handlers/scene/index.d.ts +6 -0
  58. package/dist/handlers/scene/index.d.ts.map +1 -0
  59. package/dist/handlers/scene/load-figure-scene-handler.d.ts +23 -0
  60. package/dist/handlers/scene/load-figure-scene-handler.d.ts.map +1 -0
  61. package/dist/handlers/scene/load-scene-handler.d.ts +23 -0
  62. package/dist/handlers/scene/load-scene-handler.d.ts.map +1 -0
  63. package/dist/handlers/select/edge-select-handler.d.ts +5 -8
  64. package/dist/handlers/select/edge-select-handler.d.ts.map +1 -1
  65. package/dist/handlers/select/face-select-handler.d.ts +5 -8
  66. package/dist/handlers/select/face-select-handler.d.ts.map +1 -1
  67. package/dist/handlers/select/index.d.ts +5 -0
  68. package/dist/handlers/select/index.d.ts.map +1 -0
  69. package/dist/handlers/select/mesh-select-handler.d.ts +5 -6
  70. package/dist/handlers/select/mesh-select-handler.d.ts.map +1 -1
  71. package/dist/handlers/select/vertex-select-handler.d.ts +5 -8
  72. package/dist/handlers/select/vertex-select-handler.d.ts.map +1 -1
  73. package/dist/handlers/tool/base-tool-handler.d.ts +3 -3
  74. package/dist/handlers/tool/base-tool-handler.d.ts.map +1 -1
  75. package/dist/handlers/tool/index.d.ts +4 -0
  76. package/dist/handlers/tool/index.d.ts.map +1 -0
  77. package/dist/handlers/tool/rotate-tool-handler.d.ts +2 -2
  78. package/dist/handlers/tool/rotate-tool-handler.d.ts.map +1 -1
  79. package/dist/handlers/tool/scale-tool-handler.d.ts +2 -2
  80. package/dist/handlers/tool/scale-tool-handler.d.ts.map +1 -1
  81. package/dist/handlers/tool/translate-tool-handler.d.ts +2 -2
  82. package/dist/handlers/tool/translate-tool-handler.d.ts.map +1 -1
  83. package/dist/hub/editor-hub.d.ts +11 -8
  84. package/dist/hub/editor-hub.d.ts.map +1 -1
  85. package/dist/hub/index.d.ts +26 -0
  86. package/dist/hub/index.d.ts.map +1 -0
  87. package/dist/hub/viewer-hub.d.ts +30 -0
  88. package/dist/hub/viewer-hub.d.ts.map +1 -0
  89. package/dist/index.cjs.js +20 -2
  90. package/dist/index.d.ts +4 -4
  91. package/dist/index.d.ts.map +1 -1
  92. package/dist/index.es.js +2063 -1147
  93. package/dist/index.full.d.ts +67 -57
  94. package/dist/index.public.d.ts +67 -57
  95. package/dist/index.umd.js +20 -2
  96. package/dist/interfaces/api/index.d.ts +9 -0
  97. package/dist/interfaces/api/index.d.ts.map +1 -0
  98. package/dist/interfaces/api/renderer/index.d.ts +6 -0
  99. package/dist/interfaces/api/renderer/index.d.ts.map +1 -0
  100. package/dist/interfaces/api/transform-api.d.ts +1 -1
  101. package/dist/interfaces/api/transform-api.d.ts.map +1 -1
  102. package/dist/interfaces/command/index.d.ts +1 -1
  103. package/dist/interfaces/command/index.d.ts.map +1 -1
  104. package/dist/interfaces/controller/{controller.d.ts → index.d.ts} +1 -1
  105. package/dist/interfaces/controller/index.d.ts.map +1 -0
  106. package/dist/interfaces/handler/index.d.ts +6 -0
  107. package/dist/interfaces/handler/index.d.ts.map +1 -0
  108. package/dist/interfaces/manager/display-manager.d.ts.map +1 -1
  109. package/dist/interfaces/manager/index.d.ts +6 -0
  110. package/dist/interfaces/manager/index.d.ts.map +1 -0
  111. package/dist/interfaces/manager/manager.d.ts +1 -1
  112. package/dist/interfaces/manager/manager.d.ts.map +1 -1
  113. package/dist/interfaces/manager/select-manager.d.ts.map +1 -1
  114. package/dist/interfaces/manager/tool-manager.d.ts.map +1 -1
  115. package/dist/interfaces/mediator/index.d.ts +1 -1
  116. package/dist/interfaces/mediator/index.d.ts.map +1 -1
  117. package/dist/interfaces/middleware/index.d.ts +1 -1
  118. package/dist/interfaces/middleware/index.d.ts.map +1 -1
  119. package/dist/interfaces/module/index.d.ts +4 -0
  120. package/dist/interfaces/module/index.d.ts.map +1 -0
  121. package/dist/interfaces/module/renderable-module.d.ts +1 -1
  122. package/dist/interfaces/module/renderable-module.d.ts.map +1 -1
  123. package/dist/interfaces/store/export-store.d.ts +8 -0
  124. package/dist/interfaces/store/export-store.d.ts.map +1 -0
  125. package/dist/interfaces/store/index.d.ts +6 -0
  126. package/dist/interfaces/store/index.d.ts.map +1 -0
  127. package/dist/interfaces/store/select-store.d.ts +1 -1
  128. package/dist/interfaces/store/select-store.d.ts.map +1 -1
  129. package/dist/interfaces/store/tool-store.d.ts +1 -1
  130. package/dist/interfaces/store/tool-store.d.ts.map +1 -1
  131. package/dist/interfaces/validator/index.d.ts +21 -0
  132. package/dist/interfaces/validator/index.d.ts.map +1 -0
  133. package/dist/ioc/container.d.ts +3 -1
  134. package/dist/ioc/container.d.ts.map +1 -1
  135. package/dist/managers/display/display-manager.d.ts +4 -4
  136. package/dist/managers/display/display-manager.d.ts.map +1 -1
  137. package/dist/managers/display/index.d.ts +2 -0
  138. package/dist/managers/display/index.d.ts.map +1 -0
  139. package/dist/managers/index.d.ts +5 -0
  140. package/dist/managers/index.d.ts.map +1 -0
  141. package/dist/managers/scene/index.d.ts +2 -0
  142. package/dist/managers/scene/index.d.ts.map +1 -0
  143. package/dist/managers/scene/scene-manager.d.ts +5 -5
  144. package/dist/managers/scene/scene-manager.d.ts.map +1 -1
  145. package/dist/managers/select/index.d.ts +2 -0
  146. package/dist/managers/select/index.d.ts.map +1 -0
  147. package/dist/managers/select/select-manager.d.ts +5 -5
  148. package/dist/managers/select/select-manager.d.ts.map +1 -1
  149. package/dist/managers/tool/index.d.ts +2 -0
  150. package/dist/managers/tool/index.d.ts.map +1 -0
  151. package/dist/managers/tool/tool-manager.d.ts +4 -4
  152. package/dist/managers/tool/tool-manager.d.ts.map +1 -1
  153. package/dist/mediator/index.d.ts +2 -2
  154. package/dist/mediator/index.d.ts.map +1 -1
  155. package/dist/middlewares/exception-middleware.d.ts +7 -2
  156. package/dist/middlewares/exception-middleware.d.ts.map +1 -1
  157. package/dist/middlewares/index.d.ts +2 -0
  158. package/dist/middlewares/index.d.ts.map +1 -0
  159. package/dist/modules/controls-module.d.ts +11 -9
  160. package/dist/modules/controls-module.d.ts.map +1 -1
  161. package/dist/modules/gizmo-module.d.ts +2 -4
  162. package/dist/modules/gizmo-module.d.ts.map +1 -1
  163. package/dist/modules/index.d.ts +6 -0
  164. package/dist/modules/index.d.ts.map +1 -0
  165. package/dist/modules/raycast-module.d.ts +4 -8
  166. package/dist/modules/raycast-module.d.ts.map +1 -1
  167. package/dist/modules/scene-module.d.ts +2 -3
  168. package/dist/modules/scene-module.d.ts.map +1 -1
  169. package/dist/modules/scene-preview-module.d.ts +26 -0
  170. package/dist/modules/scene-preview-module.d.ts.map +1 -0
  171. package/dist/policy/index.d.ts +2 -0
  172. package/dist/policy/index.d.ts.map +1 -0
  173. package/dist/policy/tool-policy.d.ts +1 -1
  174. package/dist/policy/tool-policy.d.ts.map +1 -1
  175. package/dist/store/editor-store.d.ts +33 -0
  176. package/dist/store/editor-store.d.ts.map +1 -0
  177. package/dist/store/export-store.d.ts +12 -0
  178. package/dist/store/export-store.d.ts.map +1 -0
  179. package/dist/store/index.d.ts +2 -35
  180. package/dist/store/index.d.ts.map +1 -1
  181. package/dist/types/camera/index.d.ts +2 -0
  182. package/dist/types/camera/index.d.ts.map +1 -0
  183. package/dist/types/event/index.d.ts +2 -0
  184. package/dist/types/event/index.d.ts.map +1 -0
  185. package/dist/types/feature/index.d.ts +2 -0
  186. package/dist/types/feature/index.d.ts.map +1 -0
  187. package/dist/types/listener/index.d.ts +3 -0
  188. package/dist/types/listener/index.d.ts.map +1 -0
  189. package/dist/types/select/index.d.ts +2 -0
  190. package/dist/types/select/index.d.ts.map +1 -0
  191. package/dist/utils/default-renderer-config.d.ts +9 -0
  192. package/dist/utils/default-renderer-config.d.ts.map +1 -0
  193. package/dist/utils/helpers.d.ts +14 -1
  194. package/dist/utils/helpers.d.ts.map +1 -1
  195. package/dist/utils/index.d.ts +3 -0
  196. package/dist/utils/index.d.ts.map +1 -0
  197. package/dist/validators/index.d.ts +2 -0
  198. package/dist/validators/index.d.ts.map +1 -0
  199. package/dist/validators/obj-validator.d.ts +12 -0
  200. package/dist/validators/obj-validator.d.ts.map +1 -0
  201. package/package.json +2 -2
  202. package/dist/hub/app-hub.d.ts +0 -13
  203. package/dist/hub/app-hub.d.ts.map +0 -1
  204. package/dist/interfaces/controller/controller.d.ts.map +0 -1
  205. package/dist/interfaces/response/index.d.ts +0 -22
  206. package/dist/interfaces/response/index.d.ts.map +0 -1
  207. package/dist/types/response/response-type.d.ts +0 -19
  208. package/dist/types/response/response-type.d.ts.map +0 -1
package/dist/index.es.js CHANGED
@@ -1,16 +1,648 @@
1
1
  import "reflect-metadata";
2
- import * as a from "three";
3
- import { injectable as d, inject as l, injectAll as D, container as et } from "tsyringe";
4
- import { FigureType as O, Figure as tt, SelectMode as M, DisplayMode as F, ToolType as j, SceneMode as W, DEFAULT_TOOL_RULES as st } from "@planara/types";
5
- import { OrbitWithState as rt, ModelingTransformControls as it, CameraAxesGizmo as ot, SymmetricAxesHelper as nt } from "@planara/three";
6
- import { EventEmitter as at } from "events";
7
- import { makeAutoObservable as ct } from "mobx";
8
- var lt = Object.getOwnPropertyDescriptor, ht = (e, t, r, s) => {
9
- for (var i = s > 1 ? void 0 : s ? lt(t, r) : t, o = e.length - 1, n; o >= 0; o--)
10
- (n = e[o]) && (i = n(i) || i);
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() {
11
+ const e = {
12
+ objects: [],
13
+ object: {},
14
+ vertices: [],
15
+ normals: [],
16
+ colors: [],
17
+ uvs: [],
18
+ materials: {},
19
+ materialLibraries: [],
20
+ startObject: function(t, s) {
21
+ if (this.object && this.object.fromDeclaration === !1) {
22
+ this.object.name = t, this.object.fromDeclaration = s !== !1;
23
+ return;
24
+ }
25
+ const r = this.object && typeof this.object.currentMaterial == "function" ? this.object.currentMaterial() : void 0;
26
+ if (this.object && typeof this.object._finalize == "function" && this.object._finalize(!0), this.object = {
27
+ name: t || "",
28
+ fromDeclaration: s !== !1,
29
+ geometry: {
30
+ vertices: [],
31
+ normals: [],
32
+ colors: [],
33
+ uvs: [],
34
+ hasUVIndices: !1
35
+ },
36
+ materials: [],
37
+ smooth: !0,
38
+ startMaterial: function(i, n) {
39
+ const o = this._finalize(!1);
40
+ o && (o.inherited || o.groupCount <= 0) && this.materials.splice(o.index, 1);
41
+ const c = {
42
+ index: this.materials.length,
43
+ name: i || "",
44
+ mtllib: Array.isArray(n) && n.length > 0 ? n[n.length - 1] : "",
45
+ smooth: o !== void 0 ? o.smooth : this.smooth,
46
+ groupStart: o !== void 0 ? o.groupEnd : 0,
47
+ groupEnd: -1,
48
+ groupCount: -1,
49
+ inherited: !1,
50
+ clone: function(u) {
51
+ const d = {
52
+ index: typeof u == "number" ? u : this.index,
53
+ name: this.name,
54
+ mtllib: this.mtllib,
55
+ smooth: this.smooth,
56
+ groupStart: 0,
57
+ groupEnd: -1,
58
+ groupCount: -1,
59
+ inherited: !1
60
+ };
61
+ return d.clone = this.clone.bind(d), d;
62
+ }
63
+ };
64
+ return this.materials.push(c), c;
65
+ },
66
+ currentMaterial: function() {
67
+ if (this.materials.length > 0)
68
+ return this.materials[this.materials.length - 1];
69
+ },
70
+ _finalize: function(i) {
71
+ const n = this.currentMaterial();
72
+ if (n && n.groupEnd === -1 && (n.groupEnd = this.geometry.vertices.length / 3, n.groupCount = n.groupEnd - n.groupStart, n.inherited = !1), i && this.materials.length > 1)
73
+ for (let o = this.materials.length - 1; o >= 0; o--)
74
+ this.materials[o].groupCount <= 0 && this.materials.splice(o, 1);
75
+ return i && this.materials.length === 0 && this.materials.push({
76
+ name: "",
77
+ smooth: this.smooth
78
+ }), n;
79
+ }
80
+ }, r && r.name && typeof r.clone == "function") {
81
+ const i = r.clone(0);
82
+ i.inherited = !0, this.object.materials.push(i);
83
+ }
84
+ this.objects.push(this.object);
85
+ },
86
+ finalize: function() {
87
+ this.object && typeof this.object._finalize == "function" && this.object._finalize(!0);
88
+ },
89
+ parseVertexIndex: function(t, s) {
90
+ const r = parseInt(t, 10);
91
+ return (r >= 0 ? r - 1 : r + s / 3) * 3;
92
+ },
93
+ parseNormalIndex: function(t, s) {
94
+ const r = parseInt(t, 10);
95
+ return (r >= 0 ? r - 1 : r + s / 3) * 3;
96
+ },
97
+ parseUVIndex: function(t, s) {
98
+ const r = parseInt(t, 10);
99
+ return (r >= 0 ? r - 1 : r + s / 2) * 2;
100
+ },
101
+ addVertex: function(t, s, r) {
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]);
104
+ },
105
+ addVertexPoint: function(t) {
106
+ const s = this.vertices;
107
+ this.object.geometry.vertices.push(s[t + 0], s[t + 1], s[t + 2]);
108
+ },
109
+ addVertexLine: function(t) {
110
+ const s = this.vertices;
111
+ this.object.geometry.vertices.push(s[t + 0], s[t + 1], s[t + 2]);
112
+ },
113
+ addNormal: function(t, s, r) {
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]);
116
+ },
117
+ addFaceNormal: function(t, s, r) {
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);
120
+ },
121
+ addColor: function(t, s, r) {
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]);
124
+ },
125
+ addUV: function(t, s, r) {
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]);
128
+ },
129
+ addDefaultUV: function() {
130
+ const t = this.object.geometry.uvs;
131
+ t.push(0, 0), t.push(0, 0), t.push(0, 0);
132
+ },
133
+ addUVLine: function(t) {
134
+ const s = this.uvs;
135
+ this.object.geometry.uvs.push(s[t + 0], s[t + 1]);
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);
143
+ } else
144
+ this.addFaceNormal(p, g, f);
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;
148
+ } else
149
+ this.addDefaultUV();
150
+ },
151
+ addPointGeometry: function(t) {
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);
156
+ this.addVertexPoint(n), this.addColor(n);
157
+ }
158
+ },
159
+ addLineGeometry: function(t, s) {
160
+ this.object.geometry.type = "Line";
161
+ const r = this.vertices.length, i = this.uvs.length;
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));
166
+ }
167
+ };
168
+ return e.startObject("", !1), e;
169
+ }
170
+ class us extends Ut {
171
+ /**
172
+ * Constructs a new OBJ loader.
173
+ *
174
+ * @param {LoadingManager} [manager] - The loading manager.
175
+ */
176
+ constructor(t) {
177
+ super(t), this.materials = null;
178
+ }
179
+ /**
180
+ * Starts loading from the given URL and passes the loaded OBJ asset
181
+ * to the `onLoad()` callback.
182
+ *
183
+ * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.
184
+ * @param {function(Group)} onLoad - Executed when the loading process has been finished.
185
+ * @param {onProgressCallback} onProgress - Executed while the loading is in progress.
186
+ * @param {onErrorCallback} onError - Executed when errors occur.
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) {
191
+ try {
192
+ s(n.parse(c));
193
+ } catch (u) {
194
+ i ? i(u) : console.error(u), n.manager.itemError(t);
195
+ }
196
+ }, r, i);
197
+ }
198
+ /**
199
+ * Sets the material creator for this OBJ. This object is loaded via {@link MTLLoader}.
200
+ *
201
+ * @param {MaterialCreator} materials - An object that creates the materials for this OBJ.
202
+ * @return {OBJLoader} A reference to this loader.
203
+ */
204
+ setMaterials(t) {
205
+ return this.materials = t, this;
206
+ }
207
+ /**
208
+ * Parses the given OBJ data and returns the resulting group.
209
+ *
210
+ * @param {string} text - The raw OBJ data as a string.
211
+ * @return {Group} The parsed OBJ.
212
+ */
213
+ parse(t) {
214
+ const s = new ds();
215
+ t.indexOf(`\r
216
+ `) !== -1 && (t = t.replace(/\r\n/g, `
217
+ `)), t.indexOf(`\\
218
+ `) !== -1 && (t = t.replace(/\\\n/g, ""));
219
+ const r = t.split(`
220
+ `);
221
+ let i = [];
222
+ for (let c = 0, u = r.length; c < u; c++) {
223
+ const d = r[c].trimStart();
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]) {
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);
241
+ break;
242
+ case "vn":
243
+ s.normals.push(
244
+ parseFloat(p[1]),
245
+ parseFloat(p[2]),
246
+ parseFloat(p[3])
247
+ );
248
+ break;
249
+ case "vt":
250
+ s.uvs.push(
251
+ parseFloat(p[1]),
252
+ parseFloat(p[2])
253
+ );
254
+ break;
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("/");
262
+ f.push(S);
263
+ }
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],
271
+ S[0],
272
+ h[1],
273
+ A[1],
274
+ S[1],
275
+ h[2],
276
+ A[2],
277
+ S[2]
278
+ );
279
+ }
280
+ } else if (m === "l") {
281
+ const p = d.substring(1).trim().split(" ");
282
+ let g = [];
283
+ const f = [];
284
+ if (d.indexOf("/") === -1)
285
+ g = p;
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]);
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))
303
+ console.warn('THREE.OBJLoader: Rendering identifier "usemap" not supported. Textures must be defined in MTL files.');
304
+ else if (m === "s") {
305
+ if (i = d.split(" "), i.length > 1) {
306
+ const g = i[1].trim().toLowerCase();
307
+ s.object.smooth = g !== "0" && g !== "off";
308
+ } else
309
+ s.object.smooth = !0;
310
+ const p = s.object.currentMaterial();
311
+ p && (p.smooth = s.object.smooth);
312
+ } else {
313
+ if (d === "\0") continue;
314
+ console.warn('THREE.OBJLoader: Unexpected line: "' + d + '"');
315
+ }
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];
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;
337
+ }
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);
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);
346
+ }
347
+ g ? A = new ot(v, y) : f ? A = new we(v, y) : A = new at(v, y);
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);
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);
356
+ n.add(d);
357
+ }
358
+ return n;
359
+ }
360
+ }
361
+ const Me = 16776960, xe = 16755200, _s = 2236962, ps = 2236962, ms = {
362
+ /**
363
+ * Плоскость (PlaneGeometry)
364
+ * @returns Плоскость размером 1x1 с одной сегментацией
365
+ */
366
+ [L.Plane]: () => new l.PlaneGeometry(1, 1, 1, 1),
367
+ /**
368
+ * Куб (BoxGeometry)
369
+ * @returns Куб размером 1x1x1 с одной сегментацией по каждой оси
370
+ */
371
+ [L.Cube]: () => new l.BoxGeometry(1, 1, 1, 1, 1, 1),
372
+ /**
373
+ * Сфера (SphereGeometry)
374
+ * @returns Сфера радиусом 0.5, 32 сегмента по ширине, 16 по высоте
375
+ */
376
+ [L.Sphere]: () => new l.SphereGeometry(0.5, 32, 16),
377
+ /**
378
+ * UV-сфера (SphereGeometry) с гладкой поверхностью
379
+ * @returns Сфера радиусом 0.5, 32 сегмента по ширине, 16 по высоте
380
+ */
381
+ [L.UVSphere]: () => new l.SphereGeometry(0.5, 32, 16),
382
+ /**
383
+ * Икосфера (IcosahedronGeometry) — сфера из треугольников
384
+ * @returns Икосфера радиусом 0.5, уровень детализации 0
385
+ */
386
+ [L.Icosphere]: () => new l.IcosahedronGeometry(0.5, 0),
387
+ /**
388
+ * Цилиндр (CylinderGeometry)
389
+ * @returns Цилиндр радиусом 0.5, высотой 1, 32 сегмента
390
+ */
391
+ [L.Cylinder]: () => new l.CylinderGeometry(0.5, 0.5, 1, 32, 1, !1),
392
+ /**
393
+ * Конус (ConeGeometry)
394
+ * @returns Конус радиусом 0.5, высотой 1, 32 сегмента
395
+ */
396
+ [L.Cone]: () => new l.ConeGeometry(0.5, 1, 32, 1, !1),
397
+ /**
398
+ * Пирамида с квадратным основанием.
399
+ * @returns Пирамида высотой 1 и радиусом основания 0.5
400
+ */
401
+ [L.Pyramid]: () => new l.ConeGeometry(0.5, 1, 4, 1, !1),
402
+ /**
403
+ * Тетраэдр (TetrahedronGeometry)
404
+ * @returns Тетраэдр радиусом 0.5
405
+ */
406
+ [L.Tetrahedron]: () => new l.TetrahedronGeometry(0.5, 0),
407
+ /**
408
+ * Октаэдр (OctahedronGeometry)
409
+ * @returns Октаэдр радиусом 0.5
410
+ */
411
+ [L.Octahedron]: () => new l.OctahedronGeometry(0.5, 0),
412
+ /**
413
+ * Додекаэдр (DodecahedronGeometry)
414
+ * @returns Додекаэдр радиусом 0.5
415
+ */
416
+ [L.Dodecahedron]: () => new l.DodecahedronGeometry(0.5, 0),
417
+ /**
418
+ * Тор (TorusGeometry)
419
+ * @returns Тор радиусом 0.5, толщиной 0.2, 16 сегментов по радиусу, 64 по трубке
420
+ */
421
+ [L.Torus]: () => new l.TorusGeometry(0.5, 0.2, 16, 64),
422
+ /**
423
+ * Тор-кнот (TorusKnotGeometry)
424
+ * @returns Тор-кнот радиусом 0.4 и толщиной 0.12
425
+ */
426
+ [L.TorusKnot]: () => new l.TorusKnotGeometry(0.4, 0.12, 96, 16),
427
+ /**
428
+ * Круг (CircleGeometry)
429
+ * @returns Круг радиусом 0.5, 32 сегмента
430
+ */
431
+ [L.Circle]: () => new l.CircleGeometry(0.5, 32),
432
+ /**
433
+ * Кольцо (RingGeometry)
434
+ * @returns Кольцо с внутренним радиусом 0.25 и внешним радиусом 0.5
435
+ */
436
+ [L.Ring]: () => new l.RingGeometry(0.25, 0.5, 32),
437
+ /**
438
+ * Капсула (CapsuleGeometry)
439
+ * @returns Капсула радиусом 0.3 и длиной 0.8
440
+ */
441
+ [L.Capsule]: () => new l.CapsuleGeometry(0.3, 0.8, 8, 16),
442
+ /**
443
+ * Кастомная геометрия (не реализовано в фабрике)
444
+ * @throws {Error} Всегда выбрасывает ошибку
445
+ */
446
+ [L.Custom]: function() {
447
+ throw new Error("Custom geometry is not generated here.");
448
+ }
449
+ }, Ot = new l.MeshStandardMaterial({
450
+ color: 12566463,
451
+ metalness: 0,
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) => {
454
+ let t = e;
455
+ for (; t; ) {
456
+ if (t.isMesh) return t;
457
+ t = t.parent;
458
+ }
459
+ return null;
460
+ }, Lt = (e) => {
461
+ const t = new l.BufferGeometry();
462
+ t.setAttribute("position", e.getAttribute("position")), t.computeBoundingSphere(), t.computeBoundingBox();
463
+ const s = new l.PointsMaterial({
464
+ color: ps,
465
+ size: 6,
466
+ sizeAttenuation: !1,
467
+ depthTest: !1,
468
+ depthWrite: !1,
469
+ transparent: !0,
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(
475
+ t,
476
+ new l.LineBasicMaterial({ color: _s, linewidth: 1 })
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();
481
+ i.getSize(n);
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 ? {
485
+ background: {
486
+ ...e.background,
487
+ ...t.background
488
+ },
489
+ camera: {
490
+ ...e.camera,
491
+ ...t.camera,
492
+ position: {
493
+ ...e.camera.position,
494
+ ...t.camera?.position
495
+ }
496
+ },
497
+ renderer: {
498
+ ...e.renderer,
499
+ ...t.renderer
500
+ },
501
+ lights: {
502
+ ambient: {
503
+ ...e.lights.ambient,
504
+ ...t.lights?.ambient
505
+ },
506
+ directional: {
507
+ ...e.lights.directional,
508
+ ...t.lights?.directional,
509
+ position: {
510
+ ...e.lights.directional.position,
511
+ ...t.lights?.directional?.position
512
+ }
513
+ }
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) => {
516
+ let t = e;
517
+ for (; t; ) {
518
+ if (t.userData.isExportable === !1)
519
+ return !0;
520
+ t = t.parent;
521
+ }
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))
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);
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))
537
+ return;
538
+ const n = i.geometry.clone();
539
+ n.applyMatrix4(i.matrixWorld), n.computeBoundingBox();
540
+ const o = n.boundingBox;
541
+ if (!o)
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 = {
555
+ background: {
556
+ color: 1710618,
557
+ transparent: !1
558
+ },
559
+ camera: {
560
+ fov: 45,
561
+ near: 0.1,
562
+ far: 1e3,
563
+ position: {
564
+ x: 1,
565
+ y: 1,
566
+ z: 7
567
+ }
568
+ },
569
+ renderer: {
570
+ antialias: !0,
571
+ alpha: !1
572
+ },
573
+ lights: {
574
+ ambient: {
575
+ enabled: !0,
576
+ color: 16777215,
577
+ intensity: 0.5
578
+ },
579
+ directional: {
580
+ enabled: !0,
581
+ color: 16777215,
582
+ intensity: 1,
583
+ position: {
584
+ x: 5,
585
+ y: 10,
586
+ z: 7
587
+ }
588
+ }
589
+ }
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--)
593
+ (o = e[n]) && (i = o(i) || i);
11
594
  return i;
12
- }, _t = (e, t) => (r, s) => t(r, s, e);
13
- let te = class {
595
+ }, ut = (e, t) => (s, r) => t(s, r, e);
596
+ let ae = class {
597
+ /**
598
+ * Конструктор рендерера.
599
+ *
600
+ * @param _canvas - HTMLCanvasElement для рендеринга
601
+ * @param _config - Конфиг для настройки рендерера
602
+ *
603
+ * @remarks
604
+ * Инициализирует сцену, камеру, WebGLRenderer и базовое освещение
605
+ * на основе переданного `RendererConfig`.
606
+ *
607
+ * По умолчанию используется тёмный фон, перспективная камера
608
+ * и два источника света: AmbientLight и DirectionalLight.
609
+ *
610
+ * @public
611
+ * @constructor
612
+ */
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(
615
+ this._config.camera.fov,
616
+ this.canvas.clientWidth / this.canvas.clientHeight,
617
+ this._config.camera.near,
618
+ this._config.camera.far
619
+ ), this.camera.position.set(
620
+ this._config.camera.position.x,
621
+ this._config.camera.position.y,
622
+ this._config.camera.position.z
623
+ ), this.renderer = new l.WebGLRenderer({
624
+ canvas: this.canvas,
625
+ antialias: this._config.renderer.antialias,
626
+ alpha: this._config.background.transparent || this._config.renderer.alpha
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(
629
+ this._config.lights.ambient.color,
630
+ this._config.lights.ambient.intensity
631
+ );
632
+ this.scene.add(N(s));
633
+ }
634
+ if (this._config.lights.directional.enabled) {
635
+ const s = new l.DirectionalLight(
636
+ this._config.lights.directional.color,
637
+ this._config.lights.directional.intensity
638
+ );
639
+ s.position.set(
640
+ this._config.lights.directional.position.x,
641
+ this._config.lights.directional.position.y,
642
+ this._config.lights.directional.position.z
643
+ ), this.scene.add(N(s));
644
+ }
645
+ }
14
646
  /**
15
647
  * Корневой объект сцены Three.js.
16
648
  *
@@ -39,37 +671,6 @@ let te = class {
39
671
  * @member
40
672
  */
41
673
  canvas;
42
- /**
43
- * Конструктор рендерера.
44
- *
45
- * @param _canvas - HTMLCanvasElement для рендеринга
46
- *
47
- * @remarks
48
- * Инициализирует сцену с тёмным фоном, перспективную камеру
49
- * (45° FOV, near 0.1, far 1000) и базовое освещение:
50
- * - `AmbientLight` (0xffffff, 0.5) — общий свет
51
- * - `DirectionalLight` (0xffffff, 1) — направленный свет
52
- *
53
- * @example
54
- * ```typescript
55
- * const renderer = new Renderer(canvas);
56
- * ```
57
- *
58
- * @public
59
- * @constructor
60
- */
61
- constructor(e) {
62
- this.canvas = e, this.scene = new a.Scene(), this.scene.background = new a.Color(1710618), this.camera = new a.PerspectiveCamera(
63
- 45,
64
- this.canvas.clientWidth / this.canvas.clientHeight,
65
- 0.1,
66
- 1e3
67
- ), this.camera.position.set(1, 1, 7), this.renderer = new a.WebGLRenderer({ canvas: this.canvas, antialias: !0 }), this.renderer.setSize(this.canvas.clientWidth, this.canvas.clientHeight);
68
- const t = new a.AmbientLight(16777215, 0.5);
69
- this.scene.add(t);
70
- const r = new a.DirectionalLight(16777215, 1);
71
- r.position.set(5, 10, 7), this.scene.add(r);
72
- }
73
674
  /**
74
675
  * Обновляет размер рендерера и пропорции камеры.
75
676
  *
@@ -81,7 +682,7 @@ let te = class {
81
682
  * window.addEventListener('resize', () => renderer.resize());
82
683
  * ```
83
684
  *
84
- * @oublic
685
+ * @public
85
686
  * @method
86
687
  */
87
688
  resize() {
@@ -160,11 +761,12 @@ let te = class {
160
761
  this.scene = null, this.camera = null, this.renderer?.dispose(), this.canvas = null;
161
762
  }
162
763
  };
163
- te = ht([
164
- d(),
165
- _t(0, l("Canvas"))
166
- ], te);
167
- class Js {
764
+ ae = ws([
765
+ w(),
766
+ ut(0, _("Canvas")),
767
+ ut(1, _("RendererConfig"))
768
+ ], ae);
769
+ class mi {
168
770
  /** Позиции вершин */
169
771
  _positions = [];
170
772
  /** Нормали вершин */
@@ -180,63 +782,63 @@ class Js {
180
782
  * @param objContent - Строка содержимого .obj файла
181
783
  */
182
784
  load(t) {
183
- const r = t.split(`
785
+ const s = t.split(`
184
786
  `);
185
- for (const i of r) {
787
+ for (const i of s) {
186
788
  if (!i.trim() || i.startsWith("#")) continue;
187
- const o = i.trim().split(/\s+/);
188
- switch (o[0]) {
789
+ const n = i.trim().split(/\s+/);
790
+ switch (n[0]) {
189
791
  case "v":
190
- this._tmpPositions.push(o.slice(1).map(Number));
792
+ this._tmpPositions.push(n.slice(1).map(Number));
191
793
  break;
192
794
  case "vn":
193
- this._tmpNormals.push(o.slice(1).map(Number));
795
+ this._tmpNormals.push(n.slice(1).map(Number));
194
796
  break;
195
797
  case "vt":
196
- this._tmpUVs.push(o.slice(1).map(Number));
798
+ this._tmpUVs.push(n.slice(1).map(Number));
197
799
  break;
198
800
  case "f":
199
- this.processFaceLine(o);
801
+ this.processFaceLine(n);
200
802
  break;
201
803
  }
202
804
  }
203
- const s = {
204
- type: O.Custom,
805
+ const r = {
806
+ type: L.Custom,
205
807
  position: this._positions,
206
808
  ...this._normals.length > 0 && { normal: this._normals },
207
809
  ...this._uvs.length > 0 && { uv: this._uvs }
208
810
  };
209
- return new tt(s);
811
+ return new Qt(r);
210
812
  }
211
813
  /**
212
814
  * Обрабатывает строку face (f) и разворачивает индексы в массивы для рендеринга
213
815
  */
214
816
  processFaceLine(t) {
215
- for (let r = 1; r < t.length; r++) {
216
- const s = t[r];
217
- if (!s) continue;
218
- const [i, o, n] = s.split("/"), c = i ? parseInt(i, 10) : void 0, _ = o ? parseInt(o, 10) : void 0, u = n ? parseInt(n, 10) : void 0;
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;
219
821
  if (c !== void 0) {
220
- const p = this._tmpPositions[c - 1];
221
- p && this._positions.push(...p);
222
- }
223
- if (_ !== void 0) {
224
- const p = this._tmpUVs[_ - 1];
225
- p && this._uvs.push(...p);
822
+ const m = this._tmpPositions[c - 1];
823
+ m && this._positions.push(...m);
226
824
  }
227
825
  if (u !== void 0) {
228
- const p = this._tmpNormals[u - 1];
229
- p && this._normals.push(...p);
826
+ const m = this._tmpUVs[u - 1];
827
+ m && this._uvs.push(...m);
828
+ }
829
+ if (d !== void 0) {
830
+ const m = this._tmpNormals[d - 1];
831
+ m && this._normals.push(...m);
230
832
  }
231
833
  }
232
834
  }
233
835
  }
234
- var dt = Object.getOwnPropertyDescriptor, ut = (e, t, r, s) => {
235
- for (var i = s > 1 ? void 0 : s ? dt(t, r) : t, o = e.length - 1, n; o >= 0; o--)
236
- (n = e[o]) && (i = n(i) || i);
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--)
838
+ (o = e[n]) && (i = o(i) || i);
237
839
  return i;
238
- }, B = (e, t) => (r, s) => t(r, s, e);
239
- let se = class {
840
+ }, se = (e, t) => (s, r) => t(s, r, e);
841
+ let le = class {
240
842
  /**
241
843
  * Конструктор контроллера.
242
844
  *
@@ -248,8 +850,8 @@ let se = class {
248
850
  * @internal
249
851
  * @constructor
250
852
  */
251
- constructor(e, t, r, s) {
252
- this._updatable = e, this._renderable = t, this._runtime = r, this._renderer = s;
853
+ constructor(e, t, s, r) {
854
+ this._updatable = e, this._renderable = t, this._runtime = s, this._renderer = r;
253
855
  }
254
856
  /**
255
857
  * ID анимационного цикла (для остановки)
@@ -290,19 +892,40 @@ let se = class {
290
892
  this._animationId = null;
291
893
  }
292
894
  };
293
- se = ut([
294
- d(),
295
- B(0, D("IUpdatableModule")),
296
- B(1, D("IRenderableModule")),
297
- B(2, D("IRuntimeModule")),
298
- B(3, l("IRenderable"))
299
- ], se);
300
- var pt = Object.getOwnPropertyDescriptor, mt = (e, t, r, s) => {
301
- for (var i = s > 1 ? void 0 : s ? pt(t, r) : t, o = e.length - 1, n; o >= 0; o--)
302
- (n = e[o]) && (i = n(i) || i);
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--)
904
+ (o = e[n]) && (i = o(i) || i);
905
+ return i;
906
+ }, Ps = (e, t) => (s, r) => t(s, r, e);
907
+ let Ee = class {
908
+ /** @constructor */
909
+ constructor(e) {
910
+ this._controlsModule = e;
911
+ }
912
+ isOrbitInteracting() {
913
+ return this._controlsModule.isOrbitInteracting();
914
+ }
915
+ isTransformDragging() {
916
+ return this._controlsModule.isTransformDragging();
917
+ }
918
+ };
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--)
925
+ (o = e[n]) && (i = o(i) || i);
303
926
  return i;
304
- }, gt = (e, t) => (r, s) => t(r, s, e);
305
- let re = class {
927
+ }, Ts = (e, t) => (s, r) => t(s, r, e);
928
+ let ce = class {
306
929
  /** @constructor */
307
930
  constructor(e) {
308
931
  this._sceneModule = e;
@@ -323,16 +946,16 @@ let re = class {
323
946
  return this._sceneModule.getMeshes();
324
947
  }
325
948
  };
326
- re = mt([
327
- d(),
328
- gt(0, l("SceneModule"))
329
- ], re);
330
- var vt = Object.getOwnPropertyDescriptor, ft = (e, t, r, s) => {
331
- for (var i = s > 1 ? void 0 : s ? vt(t, r) : t, o = e.length - 1, n; o >= 0; o--)
332
- (n = e[o]) && (i = n(i) || i);
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--)
955
+ (o = e[n]) && (i = o(i) || i);
333
956
  return i;
334
- }, Mt = (e, t) => (r, s) => t(r, s, e);
335
- let ie = class {
957
+ }, js = (e, t) => (s, r) => t(s, r, e);
958
+ let Te = class {
336
959
  /** @constructor */
337
960
  constructor(e) {
338
961
  this._raycastModule = e;
@@ -341,16 +964,16 @@ let ie = class {
341
964
  this._raycastModule.setRaycastMode(e);
342
965
  }
343
966
  };
344
- ie = ft([
345
- d(),
346
- Mt(0, l("RaycastModule"))
347
- ], ie);
348
- var yt = Object.getOwnPropertyDescriptor, bt = (e, t, r, s) => {
349
- for (var i = s > 1 ? void 0 : s ? yt(t, r) : t, o = e.length - 1, n; o >= 0; o--)
350
- (n = e[o]) && (i = n(i) || i);
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--)
973
+ (o = e[n]) && (i = o(i) || i);
351
974
  return i;
352
- }, St = (e, t) => (r, s) => t(r, s, e);
353
- let oe = class {
975
+ }, Fs = (e, t) => (s, r) => t(s, r, e);
976
+ let Ve = class {
354
977
  /** @constructor */
355
978
  constructor(e) {
356
979
  this._controlsModule = e;
@@ -368,16 +991,16 @@ let oe = class {
368
991
  return this._controlsModule.onTransformChange(e);
369
992
  }
370
993
  };
371
- oe = bt([
372
- d(),
373
- St(0, l("ControlsModule"))
374
- ], oe);
375
- var At = Object.getOwnPropertyDescriptor, wt = (e, t, r, s) => {
376
- for (var i = s > 1 ? void 0 : s ? At(t, r) : t, o = e.length - 1, n; o >= 0; o--)
377
- (n = e[o]) && (i = n(i) || i);
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--)
1000
+ (o = e[n]) && (i = o(i) || i);
378
1001
  return i;
379
- }, xt = (e, t) => (r, s) => t(r, s, e);
380
- let ne = class {
1002
+ }, ks = (e, t) => (s, r) => t(s, r, e);
1003
+ let he = class {
381
1004
  constructor(e) {
382
1005
  this._cameraAccessApi = e;
383
1006
  }
@@ -391,16 +1014,16 @@ let ne = class {
391
1014
  this._cameraAccessApi.getCamera().layers.disable(e);
392
1015
  }
393
1016
  };
394
- ne = wt([
395
- d(),
396
- xt(0, l("IRendererCameraAccess"))
397
- ], ne);
398
- var Ot = Object.getOwnPropertyDescriptor, Ct = (e, t, r, s) => {
399
- for (var i = s > 1 ? void 0 : s ? Ot(t, r) : t, o = e.length - 1, n; o >= 0; o--)
400
- (n = e[o]) && (i = n(i) || i);
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--)
1023
+ (o = e[n]) && (i = o(i) || i);
401
1024
  return i;
402
- }, It = (e, t) => (r, s) => t(r, s, e);
403
- let ae = class {
1025
+ }, Ws = (e, t) => (s, r) => t(s, r, e);
1026
+ let de = class {
404
1027
  constructor(e) {
405
1028
  this._domAccessApi = e;
406
1029
  }
@@ -411,16 +1034,16 @@ let ae = class {
411
1034
  return this._domAccessApi.getDomElement();
412
1035
  }
413
1036
  };
414
- ae = Ct([
415
- d(),
416
- It(0, l("IRendererDomAccess"))
417
- ], ae);
418
- var Pt = Object.getOwnPropertyDescriptor, Lt = (e, t, r, s) => {
419
- for (var i = s > 1 ? void 0 : s ? Pt(t, r) : t, o = e.length - 1, n; o >= 0; o--)
420
- (n = e[o]) && (i = n(i) || i);
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--)
1043
+ (o = e[n]) && (i = o(i) || i);
421
1044
  return i;
422
- }, Et = (e, t) => (r, s) => t(r, s, e);
423
- let ce = class {
1045
+ }, Xs = (e, t) => (s, r) => t(s, r, e);
1046
+ let ue = class {
424
1047
  constructor(e) {
425
1048
  this._sceneAccessApi = e;
426
1049
  }
@@ -434,43 +1057,22 @@ let ce = class {
434
1057
  this._sceneAccessApi.getScene().remove(e);
435
1058
  }
436
1059
  addObject(e, t) {
437
- const r = this._sceneAccessApi.getScene();
438
- r && (typeof t == "number" && e.layers.set(t), r.add(e));
439
- }
440
- };
441
- ce = Lt([
442
- d(),
443
- Et(0, l("IRendererSceneAccess"))
444
- ], ce);
445
- var Tt = Object.getOwnPropertyDescriptor, Dt = (e, t, r, s) => {
446
- for (var i = s > 1 ? void 0 : s ? Tt(t, r) : t, o = e.length - 1, n; o >= 0; o--)
447
- (n = e[o]) && (i = n(i) || i);
448
- return i;
449
- }, Vt = (e, t) => (r, s) => t(r, s, e);
450
- let le = class {
451
- /** @constructor */
452
- constructor(e) {
453
- this._controlsModule = e;
454
- }
455
- isOrbitInteracting() {
456
- return this._controlsModule.isOrbitInteracting();
457
- }
458
- isTransformDragging() {
459
- return this._controlsModule.isTransformDragging();
1060
+ const s = this._sceneAccessApi.getScene();
1061
+ s && (typeof t == "number" && e.layers.set(t), s.add(e));
460
1062
  }
461
1063
  };
462
- le = Dt([
463
- d(),
464
- Vt(0, l("ControlsModule"))
465
- ], le);
466
- var $t = Object.getOwnPropertyDescriptor, jt = (e, t, r, s) => {
467
- for (var i = s > 1 ? void 0 : s ? $t(t, r) : t, o = e.length - 1, n; o >= 0; o--)
468
- (n = e[o]) && (i = n(i) || i);
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--)
1070
+ (o = e[n]) && (i = o(i) || i);
469
1071
  return i;
470
- }, K = (e, t) => (r, s) => t(r, s, e);
471
- let he = class {
472
- constructor(e, t, r) {
473
- this._cameraApi = e, this._domApi = t, this._sceneApi = r;
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;
474
1076
  }
475
1077
  /** Orbit-контроллер для управления камерой */
476
1078
  _orbit = null;
@@ -481,10 +1083,10 @@ let he = class {
481
1083
  /** Были ли инициализированы обработчики событий (hover/click) */
482
1084
  _isEventListenersAdded = !1;
483
1085
  init() {
484
- this._orbit = new rt(this._cameraApi.getCamera(), this._domApi.getDomElement()), this._orbit.enableDamping = !0, this._orbit.dampingFactor = 0.05, this._transform = new it(
1086
+ this._orbit = new ts(this._cameraApi.getCamera(), this._domApi.getDomElement()), this._orbit.enableDamping = !0, this._orbit.dampingFactor = 0.05, this._transform = new ss(
485
1087
  this._cameraApi.getCamera(),
486
1088
  this._domApi.getDomElement()
487
- ), this._transformHelper = this._transform.getHelper(), this._sceneApi.addToScene(this._transformHelper), this._initMouseListeners();
1089
+ ), this._transformHelper = this._transform.getHelper(), this._sceneApi.addToScene(N(this._transformHelper)), this._initMouseListeners();
488
1090
  }
489
1091
  attachTransform(e) {
490
1092
  this._transform?.attach(e);
@@ -507,47 +1109,60 @@ let he = class {
507
1109
  isTransformDragging() {
508
1110
  return !!this._transform?.dragging;
509
1111
  }
1112
+ _handlePointerDown = (e) => {
1113
+ this._transform?.pointerDown(e);
1114
+ };
1115
+ _handlePointerMove = (e) => {
1116
+ this._transform?.pointerMove(e);
1117
+ };
1118
+ _handlePointerUp = (e) => {
1119
+ this._transform?.pointerUp(e);
1120
+ };
1121
+ _handlePointerLeave = () => {
1122
+ this._transform?.pointerHover(null);
1123
+ };
1124
+ _handleDraggingChanged = () => {
1125
+ this._orbit && (this._orbit.enabled = !this._transform?.dragging);
1126
+ };
1127
+ _handleObjectChange = () => {
1128
+ for (const e of this._transformListeners)
1129
+ e();
1130
+ };
1131
+ /** Инициализация обработчиков событий на hover/click */
1132
+ _initMouseListeners() {
1133
+ const e = this._domApi.getCanvas();
1134
+ !this._transform || !this._orbit || (e.addEventListener("pointerdown", this._handlePointerDown), e.addEventListener("pointermove", this._handlePointerMove), e.addEventListener("pointerup", this._handlePointerUp), e.addEventListener("pointerleave", this._handlePointerLeave), this._transform.addEventListener("dragging-changed", this._handleDraggingChanged), this._transform.addEventListener("objectChange", this._handleObjectChange), this._isEventListenersAdded = !0);
1135
+ }
510
1136
  /** Освобождает ресурсы модуля */
511
1137
  dispose() {
512
1138
  if (this._isEventListenersAdded) {
513
1139
  const e = this._domApi.getCanvas();
514
1140
  if (!this._transform || !this._orbit) return;
515
- e.removeEventListener("pointerdown", (t) => this._transform?.pointerDown(t)), e.removeEventListener("pointermove", (t) => this._transform?.pointerMove(t)), e.removeEventListener("pointerup", (t) => this._transform?.pointerUp(t)), e.removeEventListener("pointerleave", () => this._transform?.pointerHover(null)), this._transform.removeEventListener("dragging-changed", () => {
516
- this._orbit.enabled = !this._transform?.dragging;
517
- }), this._transformListeners.clear(), this._isEventListenersAdded = !1;
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;
518
1142
  }
519
1143
  this._orbit?.dispose(), this._orbit = null, this._transform?.dispose(), this._transform = null, this._transformHelper?.parent && this._transformHelper.parent.remove(this._transformHelper);
520
1144
  }
521
- /** Инициализация обработчиков событий на hover/click */
522
- _initMouseListeners() {
523
- const e = this._domApi.getCanvas();
524
- !this._transform || !this._orbit || (e.addEventListener("pointerdown", (t) => this._transform?.pointerDown(t)), e.addEventListener("pointermove", (t) => this._transform?.pointerMove(t)), e.addEventListener("pointerup", (t) => this._transform?.pointerUp(t)), e.addEventListener("pointerleave", () => this._transform?.pointerHover(null)), this._transform.addEventListener("dragging-changed", () => {
525
- this._orbit.enabled = !this._transform?.dragging;
526
- }), this._transform.addEventListener("objectChange", () => {
527
- for (const t of this._transformListeners) t();
528
- }), this._isEventListenersAdded = !0);
529
- }
530
1145
  };
531
- he = jt([
532
- d(),
533
- K(0, l("ICameraApi")),
534
- K(1, l("IDomApi")),
535
- K(2, l("ISceneApi"))
536
- ], he);
537
- var Ht = Object.getOwnPropertyDescriptor, Rt = (e, t, r, s) => {
538
- for (var i = s > 1 ? void 0 : s ? Ht(t, r) : t, o = e.length - 1, n; o >= 0; o--)
539
- (n = e[o]) && (i = n(i) || i);
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--)
1154
+ (o = e[n]) && (i = o(i) || i);
540
1155
  return i;
541
- }, Q = (e, t) => (r, s) => t(r, s, e);
542
- let _e = class {
543
- constructor(e, t, r) {
544
- this._cameraApi = e, this._domApi = t, this._rendererApi = r;
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;
545
1160
  }
546
1161
  /** Gizmo для управления отображением perspective camera */
547
1162
  _cameraGizmo = null;
548
1163
  init() {
549
1164
  const e = this._cameraApi.getCamera(), t = this._rendererApi.getRenderer();
550
- this._cameraGizmo = new ot(t, e, {
1165
+ this._cameraGizmo = new rs(t, e, {
551
1166
  size: 96,
552
1167
  // Размер квадрата
553
1168
  margin: 36
@@ -563,52 +1178,157 @@ let _e = class {
563
1178
  this._cameraGizmo?.dispose(), this._cameraGizmo = null;
564
1179
  }
565
1180
  };
566
- _e = Rt([
567
- d(),
568
- Q(0, l("ICameraApi")),
569
- Q(1, l("IDomApi")),
570
- Q(2, l("IRendererAccess"))
571
- ], _e);
572
- var V = /* @__PURE__ */ ((e) => (e.SelectHover = "select.hover", e.SelectClick = "select.click", e))(V || {});
573
- const Ft = 0.03, Wt = 0.05, k = 0, Ue = 1, Xe = 2, x = 31;
574
- var kt = Object.getOwnPropertyDescriptor, Gt = (e, t, r, s) => {
575
- for (var i = s > 1 ? void 0 : s ? kt(t, r) : t, o = e.length - 1, n; o >= 0; o--)
576
- (n = e[o]) && (i = n(i) || i);
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--)
1189
+ (o = e[n]) && (i = o(i) || i);
577
1190
  return i;
578
- }, R = (e, t) => (r, s) => t(r, s, e);
579
- let de = class {
580
- constructor(e, t, r, s, i) {
581
- this._domApi = e, this._cameraApi = t, this._meshApi = r, this._controlsState = s, this._bus = i;
582
- }
1191
+ };
1192
+ let je = class {
583
1193
  /**
584
- * Raycast для получения событий наведения/клика по модели
1194
+ * Внутренний эмиттер событий Node.js.
585
1195
  *
586
1196
  * @private
587
1197
  * @member
588
1198
  */
589
- _raycaster;
1199
+ _emitter;
1200
+ /** @constructor */
1201
+ constructor() {
1202
+ this._emitter = new ns();
1203
+ }
590
1204
  /**
591
- * Курсор мыши
1205
+ * Публикует событие в шину.
592
1206
  *
593
- * @private
594
- * @member
595
- */
596
- _mouse;
597
- /**
598
- * Ключ последней модели, на которую наводились,
599
- * необходим для отправки только уникальных событий в event bus
1207
+ * @param event - название события (из `EventTopics`)
1208
+ * @param payload - данные события (тип зависит от события)
600
1209
  *
601
- * @private
602
- * @member
1210
+ * @typeParam K - ключ события из `EditorEvents`
1211
+ *
1212
+ * @remarks
1213
+ * Все подписчики, зарегистрированные на это событие, получат payload.
1214
+ *
1215
+ * @example
1216
+ * ```typescript
1217
+ * // Публикация события клика
1218
+ * eventBus.emit(EventTopics.SelectClick, { intersection: hit });
1219
+ *
1220
+ * // Публикация события сброса выделения
1221
+ * eventBus.emit(EventTopics.SelectClick, null);
1222
+ * ```
1223
+ *
1224
+ * @public
1225
+ * @method
1226
+ */
1227
+ emit(e, t) {
1228
+ this._emitter.emit(e, t);
1229
+ }
1230
+ /**
1231
+ * Подписывается на событие.
1232
+ *
1233
+ * @param event - название события (из `EventTopics`)
1234
+ * @param listener - функция-обработчик, получающая payload
1235
+ *
1236
+ * @typeParam K - ключ события из `EditorEvents`
1237
+ *
1238
+ * @remarks
1239
+ * **Важно:** для предотвращения утечек памяти необходимо отписываться от событий
1240
+ * в `dispose()` методах компонентов.
1241
+ *
1242
+ * @example
1243
+ * ```typescript
1244
+ * // Подписка на событие hover
1245
+ * this._eventBus.on(EventTopics.SelectHover, (payload) => {
1246
+ * if (payload) {
1247
+ * this._handleHover(payload.intersection);
1248
+ * } else {
1249
+ * this._clearHover();
1250
+ * }
1251
+ * });
1252
+ * ```
1253
+ *
1254
+ * @public
1255
+ * @method
1256
+ */
1257
+ on(e, t) {
1258
+ this._emitter.on(e, t);
1259
+ }
1260
+ /**
1261
+ * Отписывается от события.
1262
+ *
1263
+ * @param event - название события (из `EventTopics`)
1264
+ * @param listener - функция-обработчик, которую нужно отписать
1265
+ *
1266
+ * @typeParam K - ключ события из `EditorEvents`
1267
+ *
1268
+ * @remarks
1269
+ * Для корректной отписки необходимо передать ту же самую функцию,
1270
+ * которая использовалась при подписке.
1271
+ *
1272
+ * @example
1273
+ * ```typescript
1274
+ * // Сохранение ссылки на обработчик
1275
+ * private _handleClick = (payload) => { ... };
1276
+ *
1277
+ * // Подписка
1278
+ * eventBus.on(EventTopics.SelectClick, this._handleClick);
1279
+ *
1280
+ * // Отписка (в dispose)
1281
+ * eventBus.off(EventTopics.SelectClick, this._handleClick);
1282
+ * ```
1283
+ *
1284
+ * @public
1285
+ * @method
1286
+ */
1287
+ off(e, t) {
1288
+ this._emitter.off(e, t);
1289
+ }
1290
+ };
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--)
1296
+ (o = e[n]) && (i = o(i) || i);
1297
+ 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;
1302
+ }
1303
+ /**
1304
+ * Raycast для получения событий наведения/клика по модели
1305
+ *
1306
+ * @private
1307
+ * @member
1308
+ */
1309
+ _raycaster;
1310
+ /**
1311
+ * Курсор мыши
1312
+ *
1313
+ * @private
1314
+ * @member
1315
+ */
1316
+ _mouse;
1317
+ /**
1318
+ * Ключ последней модели, на которую наводились,
1319
+ * необходим для отправки только уникальных событий в event bus
1320
+ *
1321
+ * @private
1322
+ * @member
603
1323
  */
604
1324
  _lastHoverKey = null;
605
1325
  /**
606
- * Текуший режим для raycaster
1326
+ * Текущий режим для raycaster
607
1327
  *
608
1328
  * @private
609
1329
  * @member
610
1330
  */
611
- _currentRaycastMode = M.Mesh;
1331
+ _currentRaycastMode = P.Mesh;
612
1332
  /**
613
1333
  * Были ли инициализированы обработчики событий (hover/click)
614
1334
  *
@@ -617,7 +1337,7 @@ let de = class {
617
1337
  */
618
1338
  _isEventListenersAdded = !1;
619
1339
  init() {
620
- this._raycaster = new a.Raycaster(), this._mouse = new a.Vector2(), this._applyRaycastParamsByMode(), this._isEventListenersAdded || (this._initMouseListeners(), this._isEventListenersAdded = !0);
1340
+ this._raycaster = new l.Raycaster(), this._mouse = new l.Vector2(), this._applyRaycastParamsByMode(), this._isEventListenersAdded || (this._initMouseListeners(), this._isEventListenersAdded = !0);
621
1341
  }
622
1342
  setRaycastMode(e) {
623
1343
  if (this._currentRaycastMode === e) return;
@@ -628,88 +1348,88 @@ let de = class {
628
1348
  _applyRaycastParamsByMode() {
629
1349
  const e = this._raycaster;
630
1350
  switch (e.params.Line.threshold = 0, e.params.Points.threshold = 0, this._currentRaycastMode) {
631
- case M.Mesh:
632
- case M.Face:
633
- e.layers.set(k);
1351
+ case P.Mesh:
1352
+ case P.Face:
1353
+ e.layers.set(z);
634
1354
  break;
635
- case M.Edge:
636
- e.layers.set(Ue), e.params.Line.threshold = Ft;
1355
+ case P.Edge:
1356
+ e.layers.set(Ct), e.params.Line.threshold = fs;
637
1357
  break;
638
- case M.Vertex:
639
- e.layers.set(Xe), e.params.Points.threshold = Wt;
1358
+ case P.Vertex:
1359
+ e.layers.set(It), e.params.Points.threshold = vs;
640
1360
  break;
641
1361
  }
642
1362
  }
643
1363
  /** Возвращает ближайшее пересечение по текущему положению курсора */
644
1364
  _getHitIntersection(e) {
645
- const t = this._controlsState.isOrbitInteracting() || this._controlsState.isTransformDragging(), r = this._domApi.getCanvas(), s = this._cameraApi.getCamera(), i = this._meshApi.getMeshes();
1365
+ const t = this._controlsState.isOrbitInteracting() || this._controlsState.isTransformDragging(), s = this._domApi.getCanvas(), r = this._cameraApi.getCamera(), i = this._meshApi.getMeshes();
646
1366
  if (t) return;
647
- const o = r.getBoundingClientRect();
648
- this._mouse.x = (e.clientX - o.left) / o.width * 2 - 1, this._mouse.y = -((e.clientY - o.top) / o.height) * 2 + 1, this._raycaster.setFromCamera(this._mouse, s);
649
- const n = this._raycaster.intersectObjects(i, !0)[0] ?? null;
650
- if (this._currentRaycastMode === M.Mesh || this._currentRaycastMode === M.Face)
651
- return n;
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);
1369
+ const o = this._raycaster.intersectObjects(i, !0)[0] ?? null;
1370
+ if (this._currentRaycastMode === P.Mesh || this._currentRaycastMode === P.Face)
1371
+ return o;
652
1372
  const c = this._raycaster.layers.mask;
653
- this._raycaster.layers.set(k);
654
- const _ = this._raycaster.intersectObjects(i, !0)[0] ?? null;
655
- return this._raycaster.layers.mask = c, this._getVisibleHit(n, _);
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);
656
1376
  }
657
1377
  // Hover сравнивается не только по object, но и по режимному ключу попадания.
658
1378
  // Это нужно для Face/Edge/Vertex режимов, где разные элементы могут принадлежать одному и тому же Object3D.
659
1379
  /** Вспомогательный метод для получения модели, которую выбрали и отправки события в event bus */
660
- _processRaycastEvent(e, t, r) {
661
- const s = this._getHitIntersection(e), i = this._meshApi.getMeshes();
662
- if (s === void 0) return;
663
- const o = s?.object ?? null;
664
- if (r) {
665
- if (!s) {
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) {
666
1386
  i.forEach((c) => c.userData.isHit = !1), this._lastHoverKey = null, this._bus.emit(t, null);
667
1387
  return;
668
1388
  }
669
- const n = this._makeHoverKey(s);
670
- n !== this._lastHoverKey && (i.forEach((c) => c.userData.isHit = !1), o && (o.userData.isHit = !0), this._lastHoverKey = n, this._bus.emit(t, { intersection: s }));
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 }));
671
1391
  return;
672
1392
  }
673
- s && this._bus.emit(t, { intersection: s });
1393
+ r && this._bus.emit(t, { intersection: r });
674
1394
  }
675
1395
  /** Поиск видимой части меша
676
1396
  * необходимо это для того, чтобы отправлять только видимые элементы модели, а не все попадания
677
1397
  */
678
- _getVisibleHit(e, t, r = 1e-4) {
679
- return e ? t ? e.distance <= t.distance + r ? e : null : e : null;
1398
+ _getVisibleHit(e, t, s = 1e-4) {
1399
+ return e ? t ? e.distance <= t.distance + s ? e : null : e : null;
680
1400
  }
681
1401
  /** Строит ключ hover-пересечения с учетом текущего режима выборки */
682
1402
  _makeHoverKey(e) {
683
1403
  if (!e) return null;
684
1404
  const t = e.object.uuid;
685
1405
  switch (this._currentRaycastMode) {
686
- case M.Face:
1406
+ case P.Face:
687
1407
  return `${t}:face:${e.faceIndex ?? -1}`;
688
- case M.Edge:
1408
+ case P.Edge:
689
1409
  return `${t}:edge:${Math.floor((e.index ?? -1) / 2)}`;
690
- case M.Vertex:
1410
+ case P.Vertex:
691
1411
  return `${t}:vertex:${e.index ?? -1}`;
692
- case M.Mesh:
1412
+ case P.Mesh:
693
1413
  default:
694
1414
  return `${t}:mesh`;
695
1415
  }
696
1416
  }
697
1417
  /** Обработчик события для hover */
698
1418
  _handleMouseMove = (e) => {
699
- this._processRaycastEvent(e, V.SelectHover, !0);
1419
+ this._processRaycastEvent(e, k.SelectHover, !0);
700
1420
  };
701
1421
  /** Обработчик события на click */
702
1422
  _handleMouseClick = (e) => {
703
- this._processRaycastEvent(e, V.SelectClick, !1);
1423
+ this._processRaycastEvent(e, k.SelectClick, !1);
704
1424
  };
705
1425
  /** Обработчик двойного клика */
706
1426
  _handleDoubleClick = (e) => {
707
1427
  const t = this._getHitIntersection(e);
708
- t !== void 0 && (t || this._bus.emit(V.SelectClick, null));
1428
+ t !== void 0 && (t || this._bus.emit(k.SelectClick, null));
709
1429
  };
710
1430
  /** Обработчик ухода курсора с canvas */
711
1431
  _handleMouseLeave = () => {
712
- this._lastHoverKey = null, this._bus.emit(V.SelectHover, null);
1432
+ this._lastHoverKey = null, this._bus.emit(k.SelectHover, null);
713
1433
  };
714
1434
  /** Инициализация обработчиков событий на hover/click */
715
1435
  _initMouseListeners() {
@@ -724,20 +1444,20 @@ let de = class {
724
1444
  this._removeMouseListeners(), this._isEventListenersAdded = !1, this._lastHoverKey = null;
725
1445
  }
726
1446
  };
727
- de = Gt([
728
- d(),
729
- R(0, l("IDomApi")),
730
- R(1, l("ICameraApi")),
731
- R(2, l("IMeshApi")),
732
- R(3, l("IControlsStateApi")),
733
- R(4, l("EventBus"))
734
- ], de);
735
- var Bt = Object.getOwnPropertyDescriptor, zt = (e, t, r, s) => {
736
- for (var i = s > 1 ? void 0 : s ? Bt(t, r) : t, o = e.length - 1, n; o >= 0; o--)
737
- (n = e[o]) && (i = n(i) || i);
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--)
1457
+ (o = e[n]) && (i = o(i) || i);
738
1458
  return i;
739
- }, Nt = (e, t) => (r, s) => t(r, s, e);
740
- let ue = class {
1459
+ }, ir = (e, t) => (s, r) => t(s, r, e);
1460
+ let Re = class {
741
1461
  constructor(e) {
742
1462
  this._api = e;
743
1463
  }
@@ -750,7 +1470,7 @@ let ue = class {
750
1470
  /** Базовый свет сцены */
751
1471
  _light = null;
752
1472
  init() {
753
- this._grid = new a.GridHelper(10, 10), this._grid.position.y = -1e-3, this._api.addToScene(this._grid), this._axes = new nt(6), this._api.addToScene(this._axes), this._light = new a.HemisphereLight(16777215, 4473924, 0.6), this._api.addToScene(this._light);
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);
754
1474
  }
755
1475
  getMeshes() {
756
1476
  return this._meshes;
@@ -777,182 +1497,234 @@ let ue = class {
777
1497
  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);
778
1498
  }
779
1499
  };
780
- ue = zt([
781
- d(),
782
- Nt(0, l("ISceneApi"))
783
- ], ue);
784
- 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))(P || {}), Ut = Object.getOwnPropertyDescriptor, Xt = (e, t, r, s) => {
785
- for (var i = s > 1 ? void 0 : s ? Ut(t, r) : t, o = e.length - 1, n; o >= 0; o--)
786
- (n = e[o]) && (i = n(i) || i);
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--)
1506
+ (o = e[n]) && (i = o(i) || i);
787
1507
  return i;
788
- }, Re = (e, t) => (r, s) => t(r, s, e);
789
- let pe = class {
1508
+ }, ar = (e, t) => (s, r) => t(s, r, e);
1509
+ let Fe = class {
1510
+ constructor(e) {
1511
+ this._api = e;
1512
+ }
1513
+ /** Объекты вьювера */
1514
+ _meshes = [];
1515
+ /** Базовый свет сцены */
1516
+ _light = null;
1517
+ init() {
1518
+ this._light = new l.HemisphereLight(16777215, 4473924, 0.6), this._api.addToScene(this._light);
1519
+ }
1520
+ getMeshes() {
1521
+ return this._meshes;
1522
+ }
1523
+ addMesh(e) {
1524
+ this._meshes.includes(e) || (this._meshes.push(e), this._api.addToScene(e));
1525
+ }
1526
+ removeMesh(e) {
1527
+ const t = this._meshes.indexOf(e);
1528
+ t >= 0 && this._meshes.splice(t, 1), this._api.removeFromScene(e);
1529
+ }
1530
+ addMeshes(e) {
1531
+ for (const t of e)
1532
+ this.addMesh(t);
1533
+ }
1534
+ removeMeshes(e) {
1535
+ for (const t of e)
1536
+ this.removeMesh(t);
1537
+ }
1538
+ /** Освобождает ресурсы модуля */
1539
+ dispose() {
1540
+ for (const e of this._meshes)
1541
+ this._api.removeFromScene(e);
1542
+ this._meshes.length = 0, this._light && (this._api.removeFromScene(this._light), this._light = null);
1543
+ }
1544
+ };
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--)
1551
+ (o = e[n]) && (i = o(i) || i);
1552
+ return i;
1553
+ }, _t = (e, t) => (s, r) => t(s, r, e);
1554
+ let He = class {
790
1555
  constructor(e, t) {
791
- this._store = t, this._handlers = new Map(e.map((r) => [r.mode, r]));
1556
+ this._store = t, this._handlers = new Map(e.map((s) => [s.mode, s]));
792
1557
  }
793
1558
  /** Текущий режим отображения */
794
- _currentMode = F.Plane;
1559
+ _currentMode = K.Plane;
795
1560
  /** Хендлеры, которые управляют отображением */
796
1561
  _handlers;
797
1562
  /** Тип фичи, за которую отвечает менеджер. */
798
- type = P.Display;
1563
+ type = E.Display;
799
1564
  /** Установка режима отображения */
800
1565
  manage(e) {
801
- e !== this._currentMode && (this._handlers.get(this._currentMode)?.rollback(), e !== F.Plane && this._handlers.get(e)?.handle(), this._currentMode = e, this._store.setDisplayMode(this._currentMode));
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));
1567
+ }
1568
+ /** Освобождает ресурсы менеджера. */
1569
+ dispose() {
1570
+ this._handlers && this._handlers.clear(), this._currentMode = K.Plane, this._store.setDisplayMode(this._currentMode);
1571
+ }
1572
+ };
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--)
1580
+ (o = e[n]) && (i = o(i) || i);
1581
+ return i;
1582
+ }, ur = (e, t) => (s, r) => t(s, r, e);
1583
+ let pe = class {
1584
+ /** Текущий режим редактирования сцены */
1585
+ _currentMode = T.AddFigure;
1586
+ /** Хендлеры, которые управляют отображением */
1587
+ _handlers;
1588
+ /** Тип фичи, за которую отвечает менеджер. */
1589
+ type = E.Scene;
1590
+ constructor(e) {
1591
+ this._handlers = new Map(e.map((t) => [t.mode, t]));
1592
+ }
1593
+ /** Установка режима редактирования сцены */
1594
+ manage(e, t) {
1595
+ this._handlers.get(e)?.handle(t), this._currentMode = e;
802
1596
  }
803
1597
  /** Освобождает ресурсы менеджера. */
804
1598
  dispose() {
805
- this._handlers && this._handlers.clear(), this._currentMode = F.Plane, this._store.setDisplayMode(this._currentMode);
1599
+ this._handlers && this._handlers.clear(), this._currentMode = T.AddFigure;
806
1600
  }
807
1601
  };
808
- pe = Xt([
809
- d(),
810
- Re(0, D("IDisplayHandler")),
811
- Re(1, l("EditorStore"))
1602
+ pe = dr([
1603
+ w(),
1604
+ ur(0, B("ISceneHandler"))
812
1605
  ], pe);
813
- var C = /* @__PURE__ */ ((e) => (e.Hover = "hover", e.Click = "click", e))(C || {}), Yt = Object.getOwnPropertyDescriptor, Zt = (e, t, r, s) => {
814
- for (var i = s > 1 ? void 0 : s ? Yt(t, r) : t, o = e.length - 1, n; o >= 0; o--)
815
- (n = e[o]) && (i = n(i) || i);
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--)
1608
+ (o = e[n]) && (i = o(i) || i);
816
1609
  return i;
817
- }, J = (e, t) => (r, s) => t(r, s, e);
818
- let me = class {
819
- constructor(e, t, r) {
820
- this._eventBus = e, this._store = r, this._handlers = new Map(t.map((s) => [s.mode, s])), this._eventBus.on(V.SelectHover, this._onHover), this._eventBus.on(V.SelectClick, this._onClick);
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);
821
1614
  }
822
1615
  /** Текущий режим выборки */
823
- _currentMode = M.Mesh;
1616
+ _currentMode = P.Mesh;
824
1617
  /** Хендлеры, которые управляют выборкой */
825
1618
  _handlers;
826
1619
  /** Тип фичи, за которую отвечает менеджер. */
827
- type = P.Select;
1620
+ type = E.Select;
828
1621
  /** Переключает режим выбора */
829
1622
  manage(e) {
830
1623
  e !== this._currentMode && (this._handlers.get(this._currentMode)?.rollback(), this._currentMode = e, this._store.setSelectMode(this._currentMode));
831
1624
  }
832
1625
  /** Обработчик события наведения на модель */
833
1626
  _onHover = (e) => {
834
- this._handlers.get(this._currentMode)?.handle(e, C.Hover);
1627
+ this._handlers.get(this._currentMode)?.handle(e, F.Hover);
835
1628
  };
836
1629
  /** Обработчик события клика на модель */
837
1630
  _onClick = (e) => {
838
- this._handlers.get(this._currentMode)?.handle(e, C.Click);
1631
+ this._handlers.get(this._currentMode)?.handle(e, F.Click);
839
1632
  };
840
1633
  /** Освобождает ресурсы менеджера. */
841
1634
  dispose() {
842
- this._handlers && this._handlers.clear(), this._eventBus.off(V.SelectHover, this._onHover), this._currentMode = M.Mesh, this._store.setSelectMode(this._currentMode);
1635
+ this._handlers && this._handlers.clear(), this._eventBus.off(k.SelectHover, this._onHover), this._currentMode = P.Mesh, this._store.setSelectMode(this._currentMode);
843
1636
  }
844
1637
  };
845
- me = Zt([
846
- d(),
847
- J(0, l("EventBus")),
848
- J(1, D("ISelectHandler")),
849
- J(2, l("EditorStore"))
850
- ], me);
851
- const qt = (e) => (t, r, s) => {
852
- const i = s.value;
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;
853
1646
  if (!i)
854
1647
  throw new Error("usePolicy can only be applied to method");
855
- return s.value = function(...o) {
856
- return e(this).check(...o), i.apply(this, o);
857
- }, s;
1648
+ return r.value = function(...n) {
1649
+ return e(this).check(...n), i.apply(this, n);
1650
+ }, r;
1651
+ }, $t = (e) => (t, s, r) => {
1652
+ const i = r.value;
1653
+ if (!i)
1654
+ throw new Error("useValidator can only be applied to method");
1655
+ return r.value = function(...n) {
1656
+ return e(this).validate(...n), i.apply(this, n);
1657
+ }, r;
858
1658
  };
859
- var Kt = Object.defineProperty, Qt = Object.getOwnPropertyDescriptor, Ye = (e, t, r, s) => {
860
- for (var i = s > 1 ? void 0 : s ? Qt(t, r) : t, o = e.length - 1, n; o >= 0; o--)
861
- (n = e[o]) && (i = (s ? n(t, r, i) : n(i)) || i);
862
- return s && i && Kt(t, r, i), i;
863
- }, ee = (e, t) => (r, s) => t(r, s, e);
864
- let Y = class {
865
- constructor(e, t, r) {
866
- this._store = t, this._policy = r, this._handlers = new Map(e.map((s) => [s.mode, s])), this._unsubSelected = this._store.onSelectedObjectChange(() => {
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(() => {
867
1667
  this._handlers.get(this._currentTool)?.handle();
868
1668
  });
869
1669
  }
870
1670
  /** Текущий выбранный инструмент */
871
- _currentTool = j.Translate;
1671
+ _currentTool = U.Translate;
872
1672
  /** Хендлеры, которые управляют инструментами */
873
1673
  _handlers;
874
1674
  /** Событие обновления выбора объекта */
875
1675
  _unsubSelected;
876
1676
  /** Тип фичи, за которую отвечает менеджер. */
877
- type = P.Tool;
1677
+ type = E.Tool;
878
1678
  manage(e) {
879
1679
  this._currentTool !== e && (this._handlers.get(this._currentTool)?.rollback(), this._currentTool = e, this._store.setToolType(this._currentTool), this._handlers.get(this._currentTool)?.handle());
880
1680
  }
881
1681
  /** Освобождает ресурсы менеджера. */
882
1682
  dispose() {
883
- this._unsubSelected?.(), this._handlers && this._handlers.clear(), this._currentTool = j.Translate, this._store.setToolType(this._currentTool);
1683
+ this._unsubSelected?.(), this._handlers && this._handlers.clear(), this._currentTool = U.Translate, this._store.setToolType(this._currentTool);
884
1684
  }
885
1685
  };
886
- Ye([
887
- qt((e) => e._policy)
888
- ], Y.prototype, "manage", 1);
889
- Y = Ye([
890
- d(),
891
- ee(0, D("IToolHandler")),
892
- ee(1, l("EditorStore")),
893
- ee(2, l("ToolPolicy"))
894
- ], Y);
895
- var Jt = Object.getOwnPropertyDescriptor, es = (e, t, r, s) => {
896
- for (var i = s > 1 ? void 0 : s ? Jt(t, r) : t, o = e.length - 1, n; o >= 0; o--)
897
- (n = e[o]) && (i = n(i) || i);
898
- return i;
899
- }, ts = (e, t) => (r, s) => t(r, s, e);
900
- let ge = class {
901
- /** Текущий режим редактирования сцены */
902
- _currentMode = W.AddFigure;
903
- /** Хендлеры, которые управляют отображением */
904
- _handlers;
905
- /** Тип фичи, за которую отвечает менеджер. */
906
- type = P.Scene;
907
- constructor(e) {
908
- this._handlers = new Map(e.map((t) => [t.mode, t]));
909
- }
910
- /** Установка режима редактирования сцены */
911
- manage(e, t) {
912
- e === W.AddFigure ? this._handlers.get(e)?.handle(t) : this._handlers.get(e)?.handle(), this._currentMode = e;
913
- }
914
- /** Освобождает ресурсы менеджера. */
915
- dispose() {
916
- this._handlers && this._handlers.clear(), this._currentMode = W.AddFigure;
917
- }
918
- };
919
- ge = es([
920
- d(),
921
- ts(0, D("ISceneHandler"))
922
- ], ge);
923
- var ss = Object.getOwnPropertyDescriptor, rs = (e, t, r, s) => {
924
- for (var i = s > 1 ? void 0 : s ? ss(t, r) : t, o = e.length - 1, n; o >= 0; o--)
925
- (n = e[o]) && (i = n(i) || i);
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--)
1697
+ (o = e[n]) && (i = o(i) || i);
926
1698
  return i;
927
- }, is = (e, t) => (r, s) => t(r, s, e);
928
- let ve = class {
1699
+ }, br = (e, t) => (s, r) => t(s, r, e);
1700
+ let ke = class {
929
1701
  constructor(e) {
930
1702
  this._api = e;
931
1703
  }
932
1704
  /** Режим отображения. */
933
- mode = F.Wireframe;
1705
+ mode = K.Wireframe;
934
1706
  /** Сохраняем предыдущие значения wireframe для отката. */
935
1707
  _prevWireframe = /* @__PURE__ */ new Map();
936
1708
  /** Сохраняем исходные цвета материалов для отката */
937
1709
  _prevColorMesh = /* @__PURE__ */ new Map();
938
1710
  _prevColorLines = /* @__PURE__ */ new Map();
939
1711
  /** Цвет ребер для wireframe-режима. */
940
- _wireColor = new a.Color(65535);
1712
+ _wireColor = new l.Color(65535);
941
1713
  /** Применяет wireframe-режим к сцене. */
942
1714
  handle() {
943
1715
  const e = this._api.getMeshes();
944
1716
  for (const t of e) {
945
- const r = Array.isArray(t.material) ? t.material : [t.material];
946
- for (const s of r) this._enableWireframeOnMaterial(s);
947
- t.traverse((s) => {
948
- if (s.isLineSegments) {
949
- const i = s;
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;
950
1722
  if (!this._prevColorLines.has(i.material)) {
951
- const n = i.material;
952
- this._prevColorLines.set(n, n.color.clone());
1723
+ const o = i.material;
1724
+ this._prevColorLines.set(o, o.color.clone());
953
1725
  }
954
- const o = i.material;
955
- o.color.copy(this._wireColor), o.needsUpdate = !0;
1726
+ const n = i.material;
1727
+ n.color.copy(this._wireColor), n.needsUpdate = !0;
956
1728
  }
957
1729
  });
958
1730
  }
@@ -963,8 +1735,8 @@ let ve = class {
963
1735
  "wireframe" in e && (e.wireframe = t), e.needsUpdate = !0;
964
1736
  this._prevWireframe.clear();
965
1737
  for (const [e, t] of this._prevColorMesh) {
966
- const r = e;
967
- r.color?.isColor && r.color.copy(t);
1738
+ const s = e;
1739
+ s.color?.isColor && s.color.copy(t);
968
1740
  }
969
1741
  this._prevColorMesh.clear();
970
1742
  for (const [e, t] of this._prevColorLines)
@@ -981,120 +1753,173 @@ let ve = class {
981
1753
  "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));
982
1754
  }
983
1755
  };
984
- ve = rs([
985
- d(),
986
- is(0, l("IMeshApi"))
987
- ], ve);
988
- const Z = 16776960, q = 16755200, os = 2236962, ns = 2236962;
989
- var as = Object.getOwnPropertyDescriptor, cs = (e, t, r, s) => {
990
- for (var i = s > 1 ? void 0 : s ? as(t, r) : t, o = e.length - 1, n; o >= 0; o--)
991
- (n = e[o]) && (i = n(i) || i);
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--)
1762
+ (o = e[n]) && (i = o(i) || i);
992
1763
  return i;
993
- }, Fe = (e, t) => (r, s) => t(r, s, e);
994
- let fe = class {
995
- constructor(e, t) {
996
- this._api = e, this._store = t;
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, $);
997
1768
  }
998
1769
  /** Режим, которым управляет хендлер, нужен только менеджеру */
999
- mode = M.Mesh;
1000
- /** Фигура, на которую навелись в данный момент */
1001
- _hoveredMesh = null;
1002
- /** Фигура, которую выбрали в данный момент */
1003
- _selectedMesh = null;
1770
+ mode = P.Edge;
1771
+ /** Текущее наведённое ребро. */
1772
+ _hoverLine;
1773
+ /** Текущее выбранное ребро. */
1774
+ _selectLine;
1775
+ /** Текущее наведённое ребро из массива `LineSegments` модели. */
1776
+ _hovered = null;
1777
+ /** Текущее выбранное ребро из массива `LineSegments` модели. */
1778
+ _selected = null;
1004
1779
  // Цвета, необходимые для переключения
1005
- /** Цвет ребер для фигуры, на которую навелись */
1006
- _hoverColor = Z;
1007
- /** Цвет ребер для выделенной фигуры */
1008
- _selectColor = q;
1009
- /** Исходные цвета материалов линий для отката */
1010
- _origLineColors = /* @__PURE__ */ new WeakMap();
1780
+ /** Цвет ребра, на которое навелись */
1781
+ _hoverColor = Me;
1782
+ /** Цвет выделенного ребра */
1783
+ _selectColor = xe;
1784
+ /** Обработка текущего режима выборки. */
1011
1785
  handle(e, t) {
1012
- if (this._api.setRaycastMode(this.mode), t === C.Hover) {
1786
+ if (this._raycastApi.setRaycastMode(this.mode), t === F.Hover) {
1013
1787
  if (!e) {
1014
- this._hoveredMesh && this._hoveredMesh !== this._selectedMesh && this._restoreEdgesColor(this._hoveredMesh), this._hoveredMesh = null;
1788
+ this._hoverLine.visible = !1, this._hovered = null;
1015
1789
  return;
1016
1790
  }
1017
- const r = e.intersection.object;
1018
- this._hoveredMesh !== r && (this._hoveredMesh && this._hoveredMesh !== this._selectedMesh && this._restoreEdgesColor(this._hoveredMesh), r !== this._selectedMesh && this._paintEdges(r, this._hoverColor), this._hoveredMesh = r);
1791
+ const s = e.intersection.object;
1792
+ if (!s?.isLineSegments) return;
1793
+ const r = s, i = Math.floor((e.intersection.index ?? -1) / 2);
1794
+ 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 };
1796
+ return;
1019
1797
  }
1020
- if (t === C.Click) {
1798
+ if (t === F.Click) {
1021
1799
  if (!e) {
1022
- this._selectedMesh && (this._restoreEdgesColor(this._selectedMesh), this._selectedMesh = null, this._store.setSelectedObject(null));
1800
+ this._selectLine.visible = !1, this._selected = null, this._store.setSelectedObject(null);
1023
1801
  return;
1024
1802
  }
1025
- const r = e.intersection.object;
1026
- this._selectedMesh && this._selectedMesh !== r && this._restoreEdgesColor(this._selectedMesh), this._paintEdges(r, this._selectColor), this._selectedMesh = r, this._store.setSelectedObject(r);
1803
+ const s = e.intersection.object;
1804
+ if (!s?.isLineSegments) return;
1805
+ const r = s, i = Math.floor((e.intersection.index ?? -1) / 2);
1806
+ 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);
1027
1808
  }
1028
1809
  }
1810
+ /** Откат текущего режима выборки */
1029
1811
  rollback() {
1030
- this._hoveredMesh && this._restoreEdgesColor(this._hoveredMesh), this._selectedMesh && this._restoreEdgesColor(this._selectedMesh), this._hoveredMesh = this._selectedMesh = null, this._store.setSelectedObject(null);
1812
+ this._hoverLine.visible = !1, this._selectLine.visible = !1, this._hovered = this._selected = null, this._store.setSelectedObject(null);
1031
1813
  }
1032
1814
  /** Освобождает ресурсы хендлера, удаляет слушатели и очищает внутренние данные. */
1033
1815
  dispose() {
1034
- this.rollback();
1816
+ this.rollback(), this._sceneApi.removeFromScene(this._hoverLine), this._sceneApi.removeFromScene(this._selectLine), this._hoverLine.geometry.dispose(), this._hoverLine.material.dispose(), this._selectLine.geometry.dispose(), this._selectLine.material.dispose();
1035
1817
  }
1036
- /**
1037
- * Перекрасить рёбра меша и запомнить оригинальный цвет (один раз на LineSegments).
1818
+ /** Инициализация буферных линий для режима (hover и click).
1819
+ * На весь режим будет использовано 2 глобальных линии на сцене,
1820
+ * использоваться они будут только для обозначения геометрии ребер конкретной фигуры.
1038
1821
  */
1039
- _paintEdges(e, t) {
1040
- e.children.forEach((r) => {
1041
- const s = r;
1042
- if (s.isLineSegments && s.material) {
1043
- const i = s.material;
1044
- this._origLineColors.has(s) || this._origLineColors.set(s, i.color.clone()), i.color.setHex(t), i.needsUpdate = !0;
1045
- }
1046
- });
1822
+ _makeOverlayLine(e) {
1823
+ const t = new l.BufferGeometry();
1824
+ t.setAttribute("position", new l.Float32BufferAttribute(6, 3));
1825
+ const s = new l.LineBasicMaterial({
1826
+ color: e,
1827
+ depthTest: !1,
1828
+ depthWrite: !1,
1829
+ transparent: !0,
1830
+ opacity: 1
1831
+ }), r = new l.Line(t, s);
1832
+ return r.renderOrder = 1e3, r.raycast = () => {
1833
+ }, r.layers.set($), r.visible = !1, r;
1047
1834
  }
1048
- /**
1049
- * Восстановить исходный цвет рёбер меша из WeakMap.
1050
- * Если исходный цвет не сохранён (на всякий случай) ничего не меняем.
1051
- */
1052
- _restoreEdgesColor(e) {
1053
- e.children.forEach((t) => {
1054
- const r = t;
1055
- if (r.isLineSegments && r.material) {
1056
- const s = this._origLineColors.get(r);
1057
- if (s) {
1058
- const i = r.material;
1059
- i.color.copy(s), i.needsUpdate = !0;
1060
- }
1061
- }
1062
- });
1835
+ /** Локальные точки сегмента переводим в 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(
1838
+ t.matrixWorld
1839
+ ), c = new l.Vector3(r.getX(n), r.getY(n), r.getZ(n)).applyMatrix4(
1840
+ 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;
1063
1843
  }
1064
- };
1065
- fe = cs([
1066
- d(),
1067
- Fe(0, l("IRaycastApi")),
1068
- Fe(1, l("EditorStore"))
1069
- ], fe);
1070
- var ls = Object.getOwnPropertyDescriptor, hs = (e, t, r, s) => {
1071
- for (var i = s > 1 ? void 0 : s ? ls(t, r) : t, o = e.length - 1, n; o >= 0; o--)
1072
- (n = e[o]) && (i = n(i) || i);
1073
- return i;
1074
- }, z = (e, t) => (r, s) => t(r, s, e);
1075
- let Me = class {
1076
- constructor(e, t, r, s) {
1077
- this._cameraApi = e, this._sceneApi = t, this._raycastApi = r, this._store = s, this._cameraApi.enableCameraLayer(x), this._hoverFace = this._makeOverlayFace(this._hoverColor), this._selectFace = this._makeOverlayFace(this._selectColor), this._sceneApi.addObject(this._hoverFace, x), this._sceneApi.addObject(this._selectFace, x);
1844
+ _same(e, t) {
1845
+ return !!e && !!t && e.lines === t.lines && e.seg === t.seg;
1078
1846
  }
1079
- /** Режим, которым управляет хендлер, нужен только менеджеру */
1080
- mode = M.Face;
1081
- /** Текущая наведённая грань */
1082
- _hoverFace;
1083
- /** Текущая выбранная грань */
1084
- _selectFace;
1085
- // Группы треугольников, которые образуют грань
1086
- //
1087
- // !!NB:
1088
- // Все грани фигур состоят из треугольников, их объединение даст необходимую грань
1847
+ /** Центрует `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(
1850
+ t.matrixWorld
1851
+ ), c = new l.Vector3(r.getX(n), r.getY(n), r.getZ(n)).applyMatrix4(
1852
+ t.matrixWorld
1853
+ ), u = new l.Vector3().subVectors(c, o), d = u.length();
1854
+ 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);
1861
+ e.quaternion.copy(f), e.updateMatrixWorld(!0);
1862
+ }
1863
+ /** Запись метаданных выбранного ребра для использования инструментов */
1864
+ _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(
1868
+ e.matrixWorld
1869
+ ), c = new l.Vector3(r.getX(n), r.getY(n), r.getZ(n)).applyMatrix4(
1870
+ 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);
1877
+ this._selectLine.userData.edgeInfo = {
1878
+ lines: e,
1879
+ seg: t,
1880
+ mesh: s,
1881
+ aIndices: v,
1882
+ bIndices: y,
1883
+ aEdgeIndices: M,
1884
+ bEdgeIndices: I
1885
+ };
1886
+ }
1887
+ };
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--)
1897
+ (o = e[n]) && (i = o(i) || i);
1898
+ 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, $);
1903
+ }
1904
+ /** Режим, которым управляет хендлер, нужен только менеджеру */
1905
+ mode = P.Face;
1906
+ /** Текущая наведённая грань */
1907
+ _hoverFace;
1908
+ /** Текущая выбранная грань */
1909
+ _selectFace;
1910
+ // Группы треугольников, которые образуют грань
1911
+ //
1912
+ // !!NB:
1913
+ // Все грани фигур состоят из треугольников, их объединение даст необходимую грань
1089
1914
  /** Текущая группа треугольников для наведённой грани */
1090
1915
  _hovered = null;
1091
1916
  /** Текущая группа треугольников для выбранной грани */
1092
1917
  _selected = null;
1093
1918
  // Цвета, необходимые для переключения
1094
1919
  /** Цвет грани, на которую навелись */
1095
- _hoverColor = Z;
1920
+ _hoverColor = Me;
1096
1921
  /** Цвет выделенной граней */
1097
- _selectColor = q;
1922
+ _selectColor = xe;
1098
1923
  // Погрешности для поиска треугольников и сборки граней
1099
1924
  /** Погрешность на сравнение нормалей */
1100
1925
  _normalEps = 1e-4;
@@ -1102,32 +1927,32 @@ let Me = class {
1102
1927
  _planeEps = 1e-4;
1103
1928
  /** Обработка текущего режима выборки. */
1104
1929
  handle(e, t) {
1105
- if (this._raycastApi.setRaycastMode(this.mode), t === C.Hover) {
1930
+ if (this._raycastApi.setRaycastMode(this.mode), t === F.Hover) {
1106
1931
  if (!e) {
1107
1932
  this._hoverFace.visible = !1, this._hovered = null;
1108
1933
  return;
1109
1934
  }
1110
- const r = e.intersection.object;
1111
- if (!r?.isMesh) return;
1112
- const s = r, i = e.intersection.faceIndex ?? -1;
1935
+ const s = e.intersection.object;
1936
+ if (!s?.isMesh) return;
1937
+ const r = s, i = e.intersection.faceIndex ?? -1;
1113
1938
  if (i < 0) return;
1114
- const o = this._collectFaceGroup(s, i);
1115
- if (!o) return;
1116
- this._selected && this._same(o, this._selected) ? this._hoverFace.visible = !1 : (this._writeWorldFaceGroup(this._hoverFace, o), this._hoverFace.visible = !0), this._hovered = o;
1939
+ const n = this._collectFaceGroup(r, i);
1940
+ if (!n) return;
1941
+ this._selected && this._same(n, this._selected) ? this._hoverFace.visible = !1 : (this._writeWorldFaceGroup(this._hoverFace, n), this._hoverFace.visible = !0), this._hovered = n;
1117
1942
  return;
1118
1943
  }
1119
- if (t === C.Click) {
1944
+ if (t === F.Click) {
1120
1945
  if (!e) {
1121
1946
  this._selectFace.visible = !1, this._selected = null, this._store.setSelectedObject(null);
1122
1947
  return;
1123
1948
  }
1124
- const r = e.intersection.object;
1125
- if (!r?.isMesh) return;
1126
- const s = r, i = e.intersection.faceIndex ?? -1;
1949
+ const s = e.intersection.object;
1950
+ if (!s?.isMesh) return;
1951
+ const r = s, i = e.intersection.faceIndex ?? -1;
1127
1952
  if (i < 0) return;
1128
- const o = this._collectFaceGroup(s, i);
1129
- if (!o) return;
1130
- this._writeWorldFaceGroup(this._selectFace, o), this._centerFaceProxy(this._selectFace), this._selectFace.visible = !0, this._prepareFaceMetadata(o), this._store.setSelectedObject(this._selectFace), this._selected = o, this._hovered && this._same(this._hovered, this._selected) && (this._hoverFace.visible = !1);
1953
+ const n = this._collectFaceGroup(r, i);
1954
+ if (!n) return;
1955
+ 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);
1131
1956
  }
1132
1957
  }
1133
1958
  /** Откат текущего режима выборки */
@@ -1144,95 +1969,95 @@ let Me = class {
1144
1969
  * геометрия которых переписывается под текущую грань.
1145
1970
  */
1146
1971
  _makeOverlayFace(e) {
1147
- const t = new a.BufferGeometry(), r = new a.MeshBasicMaterial({
1972
+ const t = new l.BufferGeometry(), s = new l.MeshBasicMaterial({
1148
1973
  color: e,
1149
1974
  transparent: !0,
1150
1975
  opacity: 0.35,
1151
1976
  depthTest: !1,
1152
1977
  depthWrite: !1,
1153
- side: a.DoubleSide,
1978
+ side: l.DoubleSide,
1154
1979
  polygonOffset: !0,
1155
1980
  polygonOffsetFactor: -1,
1156
1981
  polygonOffsetUnits: -1
1157
- }), s = new a.Mesh(t, r);
1158
- return s.renderOrder = 1e3, s.layers.set(x), s.visible = !1, s.raycast = () => {
1159
- }, s;
1982
+ }), r = new l.Mesh(t, s);
1983
+ return r.renderOrder = 1e3, r.layers.set($), r.visible = !1, r.raycast = () => {
1984
+ }, r;
1160
1985
  }
1161
1986
  /**
1162
1987
  * Сбор логической грани как связной группы компланарных треугольников.
1163
1988
  * Если geometry неиндексированная — пока возвращаем только стартовый triangle.
1164
1989
  */
1165
1990
  _collectFaceGroup(e, t) {
1166
- const r = e.geometry, s = r.getAttribute("position");
1167
- if (!s) return null;
1168
- const i = r.index;
1991
+ const s = e.geometry, r = s.getAttribute("position");
1992
+ if (!r) return null;
1993
+ const i = s.index;
1169
1994
  if (!i) {
1170
- const S = t * 3, w = t * 3 + 1, I = t * 3 + 2;
1995
+ const b = t * 3, C = t * 3 + 1, M = t * 3 + 2;
1171
1996
  return {
1172
1997
  mesh: e,
1173
1998
  faceIndex: t,
1174
1999
  triangleIndices: [t],
1175
- vertexIndices: [S, w, I],
1176
- proxyVertexMap: [S, w, I]
2000
+ vertexIndices: [b, C, M],
2001
+ proxyVertexMap: [b, C, M]
1177
2002
  };
1178
2003
  }
1179
- const o = Math.floor(i.count / 3);
1180
- if (t < 0 || t >= o) return null;
1181
- const n = this._buildTriangleAdjacency(i, s), [c, _, u] = this._getTriangleIndices(i, t), p = this._readVertex(s, c), f = this._readVertex(s, _), g = this._readVertex(s, u), v = new a.Vector3().subVectors(f, p).cross(new a.Vector3().subVectors(g, p)).normalize(), m = new a.Plane().setFromNormalAndCoplanarPoint(v, p), y = /* @__PURE__ */ new Set(), b = [], L = [t];
1182
- for (; L.length > 0; ) {
1183
- const S = L.pop();
1184
- if (y.has(S)) continue;
1185
- y.add(S);
1186
- const [w, I, $] = this._getTriangleIndices(i, S), A = this._readVertex(s, w), Ve = this._readVertex(s, I), $e = this._readVertex(s, $), Ke = new a.Vector3().subVectors(Ve, A).cross(new a.Vector3().subVectors($e, A)).normalize(), Qe = Math.abs(Ke.dot(v)) >= 1 - this._normalEps, Je = Math.abs(m.distanceToPoint(A)) < this._planeEps && Math.abs(m.distanceToPoint(Ve)) < this._planeEps && Math.abs(m.distanceToPoint($e)) < this._planeEps;
1187
- if (!Qe || !Je) continue;
1188
- b.push(S);
1189
- const je = n.get(S);
1190
- if (je)
1191
- for (const He of je)
1192
- y.has(He) || L.push(He);
2004
+ const n = Math.floor(i.count / 3);
2005
+ 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);
1193
2018
  }
1194
- b.sort((S, w) => S - w);
1195
- const E = /* @__PURE__ */ new Set(), T = [];
1196
- for (const S of b) {
1197
- const [w, I, $] = this._getTriangleIndices(i, S);
1198
- E.add(w), E.add(I), E.add($), T.push(w, I, $);
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);
1199
2024
  }
1200
2025
  return {
1201
2026
  mesh: e,
1202
2027
  faceIndex: t,
1203
- triangleIndices: b,
1204
- vertexIndices: Array.from(E),
1205
- proxyVertexMap: T
2028
+ triangleIndices: y,
2029
+ vertexIndices: Array.from(S),
2030
+ proxyVertexMap: x
1206
2031
  };
1207
2032
  }
1208
2033
  /** Перезаписывает overlay mesh world-space треугольниками выбранной грани */
1209
2034
  _writeWorldFaceGroup(e, t) {
1210
- const r = t.mesh.geometry, s = r.getAttribute("position"), i = r.index, o = new Float32Array(t.triangleIndices.length * 9);
1211
- let n = 0;
1212
- for (const _ of t.triangleIndices) {
1213
- let u, p, f;
1214
- i ? [u, p, f] = this._getTriangleIndices(i, _) : (u = _ * 3, p = _ * 3 + 1, f = _ * 3 + 2);
1215
- const g = this._readVertex(s, u).applyMatrix4(t.mesh.matrixWorld), v = this._readVertex(s, p).applyMatrix4(t.mesh.matrixWorld), m = this._readVertex(s, f).applyMatrix4(t.mesh.matrixWorld);
1216
- o[n++] = g.x, o[n++] = g.y, o[n++] = g.z, o[n++] = v.x, o[n++] = v.y, o[n++] = v.z, o[n++] = m.x, o[n++] = m.y, o[n++] = m.z;
2035
+ const s = t.mesh.geometry, r = s.getAttribute("position"), i = s.index, n = new Float32Array(t.triangleIndices.length * 9);
2036
+ 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;
1217
2042
  }
1218
2043
  const c = e.geometry;
1219
- c.setAttribute("position", new a.BufferAttribute(o, 3)), c.setIndex(null), c.computeVertexNormals(), c.computeBoundingBox(), c.computeBoundingSphere();
2044
+ c.setAttribute("position", new l.BufferAttribute(n, 3)), c.setIndex(null), c.computeVertexNormals(), c.computeBoundingBox(), c.computeBoundingSphere();
1220
2045
  }
1221
2046
  /** Сравнение двух логических граней */
1222
2047
  _same(e, t) {
1223
- return !!e && !!t && e.mesh === t.mesh && e.triangleIndices.length === t.triangleIndices.length && e.triangleIndices.every((r, s) => r === t.triangleIndices[s]);
2048
+ return !!e && !!t && e.mesh === t.mesh && e.triangleIndices.length === t.triangleIndices.length && e.triangleIndices.every((s, r) => s === t.triangleIndices[r]);
1224
2049
  }
1225
2050
  /** Подготовка метаданных выбранной грани для инструментов */
1226
2051
  _prepareFaceMetadata(e) {
1227
- const { vertexIndexGroups: t, proxyVertexMap: r, lines: s, lineVertexIndexGroups: i } = this._buildFaceVertexGroups(e);
2052
+ const { vertexIndexGroups: t, proxyVertexMap: s, lines: r, lineVertexIndexGroups: i } = this._buildFaceVertexGroups(e);
1228
2053
  this._selectFace.userData.faceInfo = {
1229
2054
  mesh: e.mesh,
1230
2055
  faceIndex: e.faceIndex,
1231
2056
  triangleIndices: e.triangleIndices,
1232
2057
  vertexIndices: e.vertexIndices,
1233
2058
  vertexIndexGroups: t,
1234
- proxyVertexMap: r,
1235
- lines: s,
2059
+ proxyVertexMap: s,
2060
+ lines: r,
1236
2061
  lineVertexIndexGroups: i
1237
2062
  };
1238
2063
  }
@@ -1241,40 +2066,40 @@ let Me = class {
1241
2066
  * После записи world-space вершин переносит геометрию в локальные координаты proxy mesh.
1242
2067
  */
1243
2068
  _centerFaceProxy(e) {
1244
- const t = e.geometry, r = t.getAttribute("position");
1245
- if (!r || r.count === 0) return;
1246
- const s = new a.Vector3();
1247
- for (let i = 0; i < r.count; i++)
1248
- s.x += r.getX(i), s.y += r.getY(i), s.z += r.getZ(i);
1249
- s.multiplyScalar(1 / r.count);
1250
- for (let i = 0; i < r.count; i++)
1251
- r.setXYZ(i, r.getX(i) - s.x, r.getY(i) - s.y, r.getZ(i) - s.z);
1252
- r.needsUpdate = !0, e.position.copy(s), e.quaternion.identity(), e.scale.set(1, 1, 1), e.updateMatrixWorld(!0), t.computeBoundingBox(), t.computeBoundingSphere();
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();
1253
2078
  }
1254
2079
  /** Регистрирует ребро треугольника в edge map */
1255
- _pushEdge(e, t, r, s) {
1256
- const i = t < r ? `${t}_${r}` : `${r}_${t}`, o = e.get(i);
1257
- o ? o.push(s) : e.set(i, [s]);
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]);
1258
2083
  }
1259
2084
  /** Строит граф соседства треугольников по общим ребрам */
1260
2085
  _buildTriangleAdjacency(e, t) {
1261
- const r = Math.floor(e.count / 3), s = /* @__PURE__ */ new Map(), i = this._buildWeldMap(e, t);
1262
- for (let c = 0; c < r; c++) {
1263
- const [_, u, p] = this._getTriangleIndices(e, c), f = i.get(_), g = i.get(u), v = i.get(p);
1264
- this._pushEdge(s, f, g, c), this._pushEdge(s, g, v, c), this._pushEdge(s, v, f, c);
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);
1265
2090
  }
1266
- const o = /* @__PURE__ */ new Map();
1267
- for (let c = 0; c < r; c++)
1268
- o.set(c, /* @__PURE__ */ new Set());
1269
- for (const c of s.values())
1270
- if (!(c.length < 2))
1271
- for (let _ = 0; _ < c.length; _++)
1272
- for (let u = 0; u < c.length; u++)
1273
- _ !== u && o.get(c[_])?.add(c[u]);
1274
2091
  const n = /* @__PURE__ */ new Map();
1275
- for (const [c, _] of o)
1276
- n.set(c, Array.from(_));
1277
- return n;
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]);
2099
+ const o = /* @__PURE__ */ new Map();
2100
+ for (const [c, u] of n)
2101
+ o.set(c, Array.from(u));
2102
+ return o;
1278
2103
  }
1279
2104
  /** Возвращает индексы трех вершин треугольника */
1280
2105
  _getTriangleIndices(e, t) {
@@ -1282,12 +2107,12 @@ let Me = class {
1282
2107
  }
1283
2108
  /** Читает вершину из position buffer в local space geometry */
1284
2109
  _readVertex(e, t) {
1285
- return new a.Vector3(e.getX(t), e.getY(t), e.getZ(t));
2110
+ return new l.Vector3(e.getX(t), e.getY(t), e.getZ(t));
1286
2111
  }
1287
2112
  /** Построение ключа вершины по позиции */
1288
- _vertexKey(e, t, r = 1e-6) {
1289
- const s = Math.round(e.getX(t) / r), i = Math.round(e.getY(t) / r), o = Math.round(e.getZ(t) / r);
1290
- return `${s}_${i}_${o}`;
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}`;
1291
2116
  }
1292
2117
  /**
1293
2118
  * Строит отображение исходных индексов вершин в "сваренные" ids по координате.
@@ -1295,42 +2120,42 @@ let Me = class {
1295
2120
  * но используют разные индексы вершин (например, цилиндрические крышки, UV seams и т.п.).
1296
2121
  */
1297
2122
  _buildWeldMap(e, t) {
1298
- const r = /* @__PURE__ */ new Map(), s = /* @__PURE__ */ new Map();
2123
+ const s = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
1299
2124
  let i = 0;
1300
- for (let o = 0; o < e.count; o++) {
1301
- const n = e.getX(o);
1302
- if (s.has(n)) continue;
1303
- const c = this._vertexKey(t, n);
1304
- let _ = r.get(c);
1305
- _ == null && (_ = i++, r.set(c, _)), s.set(n, _);
2125
+ for (let n = 0; n < e.count; n++) {
2126
+ 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);
1306
2131
  }
1307
- return s;
2132
+ return r;
1308
2133
  }
1309
2134
  /** Сбрасывает transform proxy-граням */
1310
2135
  _resetFaceProxyTransform(e) {
1311
2136
  e.position.set(0, 0, 0), e.quaternion.identity(), e.scale.set(1, 1, 1), e.updateMatrixWorld(!0);
1312
2137
  }
1313
2138
  _buildFaceVertexGroups(e) {
1314
- const r = e.mesh.geometry.getAttribute("position"), s = 1e-6, i = new a.Vector3(), o = e.vertexIndices, n = [], c = /* @__PURE__ */ new Map();
1315
- for (const g of o) {
1316
- const v = this._readVertex(r, g), m = [];
1317
- for (let b = 0; b < r.count; b++)
1318
- i.fromBufferAttribute(r, b), i.distanceToSquared(v) < s * s && m.push(b);
1319
- const y = n.length;
1320
- n.push(m);
1321
- for (const b of m)
1322
- c.set(b, y);
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);
1323
2148
  }
1324
- const _ = [];
2149
+ const u = [];
1325
2150
  for (const g of e.proxyVertexMap) {
1326
- const v = c.get(g);
1327
- _.push(v ?? -1);
2151
+ const f = c.get(g);
2152
+ u.push(f ?? -1);
1328
2153
  }
1329
- const u = this._findChildLines(e.mesh), p = u ? this._buildLineVertexGroups(e, u) : void 0, f = {
1330
- vertexIndexGroups: n,
1331
- proxyVertexMap: _
2154
+ const d = this._findChildLines(e.mesh), m = d ? this._buildLineVertexGroups(e, d) : void 0, p = {
2155
+ vertexIndexGroups: o,
2156
+ proxyVertexMap: u
1332
2157
  };
1333
- return u && (f.lines = u), p && (f.lineVertexIndexGroups = p), f;
2158
+ return d && (p.lines = d), m && (p.lineVertexIndexGroups = m), p;
1334
2159
  }
1335
2160
  _findChildLines(e) {
1336
2161
  for (const t of e.children)
@@ -1339,123 +2164,115 @@ let Me = class {
1339
2164
  return null;
1340
2165
  }
1341
2166
  _buildLineVertexGroups(e, t) {
1342
- const s = t.geometry.getAttribute("position"), o = e.mesh.geometry.getAttribute("position"), n = 1e-6, c = new a.Vector3(), _ = t.matrixWorld, u = e.mesh.matrixWorld, p = [];
1343
- for (const f of e.vertexIndices) {
1344
- const g = this._readVertex(o, f).applyMatrix4(u), v = [];
1345
- for (let m = 0; m < s.count; m++)
1346
- c.fromBufferAttribute(s, m).applyMatrix4(_), c.distanceToSquared(g) < n * n && v.push(m);
1347
- p.push(v);
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);
1348
2173
  }
1349
- return p;
2174
+ return m;
1350
2175
  }
1351
2176
  };
1352
- Me = hs([
1353
- d(),
1354
- z(0, l("ICameraApi")),
1355
- z(1, l("ISceneApi")),
1356
- z(2, l("IRaycastApi")),
1357
- z(3, l("EditorStore"))
1358
- ], Me);
1359
- const _s = {
1360
- /**
1361
- * Плоскость (PlaneGeometry)
1362
- * @returns Плоскость размером 1x1 с одной сегментацией
1363
- */
1364
- [O.Plane]: () => new a.PlaneGeometry(1, 1, 1, 1),
1365
- /**
1366
- * Куб (BoxGeometry)
1367
- * @returns Куб размером 1x1x1 с одной сегментацией по каждой оси
1368
- */
1369
- [O.Cube]: () => new a.BoxGeometry(1, 1, 1, 1, 1, 1),
1370
- /**
1371
- * Ультра-сфера (SphereGeometry) с гладкой поверхностью
1372
- * @returns Сфера радиусом 0.5, 32 сегмента по ширине, 16 по высоте
1373
- */
1374
- [O.UVSphere]: () => new a.SphereGeometry(0.5, 32, 16),
1375
- /**
1376
- * Икосфера (IcosahedronGeometry) — сфера из треугольников
1377
- * @returns Икосфера радиусом 0.5, уровень детализации 0
1378
- */
1379
- [O.Icosphere]: () => new a.IcosahedronGeometry(0.5, 0),
1380
- /**
1381
- * Цилиндр (CylinderGeometry)
1382
- * @returns Цилиндр радиусом 0.5, высотой 1, 32 сегмента
1383
- */
1384
- [O.Cylinder]: () => new a.CylinderGeometry(0.5, 0.5, 1, 32, 1, !1),
1385
- /**
1386
- * Конус (ConeGeometry)
1387
- * @returns Конус радиусом 0.5, высотой 1, 32 сегмента
1388
- */
1389
- [O.Cone]: () => new a.ConeGeometry(0.5, 1, 32, 1, !1),
1390
- /**
1391
- * Тор (TorusGeometry)
1392
- * @returns Тор радиусом 0.5, толщиной 0.2, 16 сегментов по радиусу, 64 по трубке
1393
- */
1394
- [O.Torus]: () => new a.TorusGeometry(0.5, 0.2, 16, 64),
1395
- /**
1396
- * Круг (CircleGeometry)
1397
- * @returns Круг радиусом 0.5, 32 сегмента
1398
- */
1399
- [O.Circle]: () => new a.CircleGeometry(0.5, 32),
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--)
2186
+ (o = e[n]) && (i = o(i) || i);
2187
+ return i;
2188
+ }, pt = (e, t) => (s, r) => t(s, r, e);
2189
+ let We = class {
2190
+ constructor(e, t) {
2191
+ this._api = e, this._store = t;
2192
+ }
2193
+ /** Режим, которым управляет хендлер, нужен только менеджеру */
2194
+ mode = P.Mesh;
2195
+ /** Фигура, на которую навелись в данный момент */
2196
+ _hoveredMesh = null;
2197
+ /** Фигура, которую выбрали в данный момент */
2198
+ _selectedMesh = null;
2199
+ // Цвета, необходимые для переключения
2200
+ /** Цвет ребер для фигуры, на которую навелись */
2201
+ _hoverColor = Me;
2202
+ /** Цвет ребер для выделенной фигуры */
2203
+ _selectColor = xe;
2204
+ /** Исходные цвета материалов линий для отката */
2205
+ _origLineColors = /* @__PURE__ */ new WeakMap();
2206
+ handle(e, t) {
2207
+ if (this._api.setRaycastMode(this.mode), t === F.Hover) {
2208
+ if (!e) {
2209
+ this._hoveredMesh && this._hoveredMesh !== this._selectedMesh && this._restoreEdgesColor(this._hoveredMesh), this._hoveredMesh = null;
2210
+ return;
2211
+ }
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);
2214
+ }
2215
+ if (t === F.Click) {
2216
+ if (!e) {
2217
+ this._selectedMesh && (this._restoreEdgesColor(this._selectedMesh), this._selectedMesh = null, this._store.setSelectedObject(null));
2218
+ return;
2219
+ }
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);
2222
+ }
2223
+ }
2224
+ rollback() {
2225
+ this._hoveredMesh && this._restoreEdgesColor(this._hoveredMesh), this._selectedMesh && this._restoreEdgesColor(this._selectedMesh), this._hoveredMesh = this._selectedMesh = null, this._store.setSelectedObject(null);
2226
+ }
2227
+ /** Освобождает ресурсы хендлера, удаляет слушатели и очищает внутренние данные. */
2228
+ dispose() {
2229
+ this.rollback();
2230
+ }
1400
2231
  /**
1401
- * Сфера (SphereGeometry) алиас для UVSphere
1402
- * @returns Сфера радиусом 0.5, 32 сегмента по ширине, 16 по высоте
2232
+ * Перекрасить рёбра меша и запомнить оригинальный цвет (один раз на LineSegments).
1403
2233
  */
1404
- [O.Sphere]: () => new a.SphereGeometry(0.5, 32, 16),
2234
+ _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;
2240
+ }
2241
+ });
2242
+ }
1405
2243
  /**
1406
- * Кастомная геометрия (не реализовано в фабрике)
1407
- * @throws {Error} Всегда выбрасывает ошибку
2244
+ * Восстановить исходный цвет рёбер меша из WeakMap.
2245
+ * Если исходный цвет не сохранён (на всякий случай) — ничего не меняем.
1408
2246
  */
1409
- [O.Custom]: function() {
1410
- throw new Error("Custom geometry is not generated here.");
1411
- }
1412
- }, ds = new a.MeshStandardMaterial({
1413
- color: 12566463,
1414
- metalness: 0,
1415
- roughness: 0.6
1416
- }), us = 8, ps = (e) => !!e && e.isMesh, Ze = (e) => {
1417
- let t = e;
1418
- for (; t; ) {
1419
- if (t.isMesh) return t;
1420
- t = t.parent;
2247
+ _restoreEdgesColor(e) {
2248
+ 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;
2255
+ }
2256
+ }
2257
+ });
1421
2258
  }
1422
- return null;
1423
- }, ms = (e) => {
1424
- const t = new a.BufferGeometry();
1425
- t.setAttribute("position", e.getAttribute("position")), t.computeBoundingSphere(), t.computeBoundingBox();
1426
- const r = new a.PointsMaterial({
1427
- color: ns,
1428
- size: 6,
1429
- sizeAttenuation: !1,
1430
- depthTest: !1,
1431
- depthWrite: !1,
1432
- transparent: !0,
1433
- opacity: 0.9
1434
- }), s = new a.Points(t, r);
1435
- return s.layers.set(Xe), s.renderOrder = 1e3, s.visible = !1, s;
1436
- }, gs = (e) => {
1437
- const t = new a.EdgesGeometry(e), r = new a.LineSegments(
1438
- t,
1439
- new a.LineBasicMaterial({ color: os, linewidth: 1 })
1440
- );
1441
- return r.layers.set(Ue), r;
1442
- }, vs = (e) => {
1443
- 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), o = new a.Vector3();
1444
- i.getSize(o);
1445
- const n = { x: o.x, y: o.y, z: o.z };
1446
- return { position: t, rotation: r, scale: s, size: n };
1447
2259
  };
1448
- var fs = Object.getOwnPropertyDescriptor, Ms = (e, t, r, s) => {
1449
- for (var i = s > 1 ? void 0 : s ? fs(t, r) : t, o = e.length - 1, n; o >= 0; o--)
1450
- (n = e[o]) && (i = n(i) || i);
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--)
2267
+ (o = e[n]) && (i = o(i) || i);
1451
2268
  return i;
1452
- }, N = (e, t) => (r, s) => t(r, s, e);
1453
- let ye = class {
1454
- constructor(e, t, r, s) {
1455
- this._cameraApi = e, this._sceneApi = t, this._raycastApi = r, this._store = s, this._cameraApi.enableCameraLayer(x), this._hoverVertex = this._makeOverlayVertex(this._hoverColor), this._selectVertex = this._makeOverlayVertex(this._selectColor), this._sceneApi.addObject(this._hoverVertex, x), this._sceneApi.addObject(this._selectVertex, x);
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, $);
1456
2273
  }
1457
2274
  /** Режим, которым управляет хендлер, нужен только менеджеру */
1458
- mode = M.Vertex;
2275
+ mode = P.Vertex;
1459
2276
  _hovered = null;
1460
2277
  _selected = null;
1461
2278
  /** Текущая наведённая вершина. */
@@ -1464,32 +2281,32 @@ let ye = class {
1464
2281
  _selectVertex;
1465
2282
  // Цвета, необходимые для переключения
1466
2283
  /** Цвет ребра, на которое навелись */
1467
- _hoverColor = Z;
2284
+ _hoverColor = Me;
1468
2285
  /** Цвет выделенного ребра */
1469
- _selectColor = q;
2286
+ _selectColor = xe;
1470
2287
  handle(e, t) {
1471
- if (this._raycastApi.setRaycastMode(this.mode), t === C.Hover) {
2288
+ if (this._raycastApi.setRaycastMode(this.mode), t === F.Hover) {
1472
2289
  if (!e) {
1473
2290
  this._hoverVertex.visible = !1, this._hovered = null;
1474
2291
  return;
1475
2292
  }
1476
- const r = e.intersection.object;
1477
- if (!r?.isPoints) return;
1478
- const s = r, i = e.intersection.index ?? -1;
2293
+ const s = e.intersection.object;
2294
+ if (!s?.isPoints) return;
2295
+ const r = s, i = e.intersection.index ?? -1;
1479
2296
  if (i < 0) return;
1480
- this._selected && this._same({ points: s, index: i }, this._selected) ? this._hoverVertex.visible = !1 : (this._writeWorldVertex(this._hoverVertex, s, i), this._hoverVertex.visible = !0);
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);
1481
2298
  return;
1482
2299
  }
1483
- if (t === C.Click) {
2300
+ if (t === F.Click) {
1484
2301
  if (!e) {
1485
2302
  this._selectVertex.visible = !1, this._selected = null, this._store.setSelectedObject(null);
1486
2303
  return;
1487
2304
  }
1488
- const r = e.intersection.object;
1489
- if (!r?.isPoints) return;
1490
- const s = r, i = e.intersection.index ?? -1;
2305
+ const s = e.intersection.object;
2306
+ if (!s?.isPoints) return;
2307
+ const r = s, i = e.intersection.index ?? -1;
1491
2308
  if (i < 0) return;
1492
- 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);
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);
1493
2310
  return;
1494
2311
  }
1495
2312
  }
@@ -1499,10 +2316,10 @@ let ye = class {
1499
2316
  dispose() {
1500
2317
  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();
1501
2318
  }
1502
- _makeOverlayVertex(e, t = us) {
1503
- const r = new a.BufferGeometry();
1504
- r.setAttribute("position", new a.Float32BufferAttribute([0, 0, 0], 3));
1505
- const s = new a.PointsMaterial({
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({
1506
2323
  color: e,
1507
2324
  size: t,
1508
2325
  sizeAttenuation: !1,
@@ -1510,72 +2327,72 @@ let ye = class {
1510
2327
  depthWrite: !1,
1511
2328
  transparent: !0,
1512
2329
  opacity: 1
1513
- }), i = new a.Points(r, s);
2330
+ }), i = new l.Points(s, r);
1514
2331
  return i.renderOrder = 1e3, i.raycast = () => {
1515
- }, i.layers.set(x), i.visible = !1, i;
2332
+ }, i.layers.set($), i.visible = !1, i;
1516
2333
  }
1517
2334
  /** Локальную вершину points переводим в world и пишем в target (прокси-точку) */
1518
- _writeWorldVertex(e, t, r) {
1519
- const s = t.geometry.getAttribute("position"), i = new a.Vector3(
1520
- s.getX(r),
1521
- s.getY(r),
1522
- s.getZ(r)
1523
- ).applyMatrix4(t.matrixWorld), o = e.geometry.getAttribute("position");
1524
- o.setXYZ(0, i.x, i.y, i.z), o.needsUpdate = !0;
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)
2340
+ ).applyMatrix4(t.matrixWorld), n = e.geometry.getAttribute("position");
2341
+ n.setXYZ(0, i.x, i.y, i.z), n.needsUpdate = !0;
1525
2342
  }
1526
2343
  _same(e, t) {
1527
2344
  return !!e && !!t && e.points === t.points && e.index === t.index;
1528
2345
  }
1529
2346
  /** Готовит метаданные для выбранной вершины и пишет их в _selectVertex.userData */
1530
2347
  _prepareVertexMetadata(e, t) {
1531
- const r = Ze(e);
1532
- if (!r) return;
1533
- const s = e.geometry.getAttribute("position"), i = new a.Vector3(
1534
- s.getX(t),
1535
- s.getY(t),
1536
- s.getZ(t)
1537
- ).applyMatrix4(e.matrixWorld), o = new a.Matrix4().copy(r.matrixWorld).invert(), n = i.clone().applyMatrix4(o), _ = r.geometry.getAttribute("position"), u = 1e-6, p = u * u, f = new a.Vector3(), g = [];
1538
- for (let y = 0; y < _.count; y++)
1539
- f.fromBufferAttribute(_, y), f.distanceToSquared(n) < p && g.push(y);
1540
- const v = r.children.find((y) => y?.isLineSegments);
1541
- let m = [];
1542
- if (v) {
1543
- const y = new a.Matrix4().copy(v.matrixWorld).invert(), b = i.clone().applyMatrix4(y), L = v.geometry.getAttribute("position"), E = new a.Vector3();
1544
- for (let T = 0; T < L.count; T++)
1545
- E.fromBufferAttribute(L, T), E.distanceToSquared(b) < p && m.push(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 = [];
2359
+ 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);
1546
2363
  }
1547
2364
  this._selectVertex.userData.vertexInfo = {
1548
2365
  points: e,
1549
2366
  index: t,
1550
- mesh: r,
2367
+ mesh: s,
1551
2368
  vertexIndices: g,
1552
- lines: v ?? null,
1553
- edgeVertexIndices: m
2369
+ lines: f ?? null,
2370
+ edgeVertexIndices: h
1554
2371
  };
1555
2372
  }
1556
2373
  /** Центрует прокси-вершину на выбранной точке */
1557
- _centerVertexOnPoint(e, t, r) {
1558
- const s = t.geometry.getAttribute("position"), i = new a.Vector3(
1559
- s.getX(r),
1560
- s.getY(r),
1561
- s.getZ(r)
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)
1562
2379
  ).applyMatrix4(t.matrixWorld);
1563
2380
  e.position.copy(i);
1564
- const o = e.geometry;
1565
- let n = o.getAttribute("position");
1566
- (!n || n.count < 1) && (o.setAttribute("position", new a.BufferAttribute(new Float32Array(3), 3)), n = o.getAttribute("position")), n.setXYZ(0, 0, 0, 0), n.needsUpdate = !0, e.quaternion.identity(), e.scale.set(1, 1, 1), e.updateMatrixWorld(!0);
2381
+ const n = e.geometry;
2382
+ 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);
1567
2384
  }
1568
2385
  };
1569
- ye = Ms([
1570
- d(),
1571
- N(0, l("ICameraApi")),
1572
- N(1, l("ISceneApi")),
1573
- N(2, l("IRaycastApi")),
1574
- N(3, l("EditorStore"))
1575
- ], ye);
1576
- class De {
1577
- constructor(t, r) {
1578
- this.api = t, this.store = r, this._unsubscribeTransform = this.api.onTransformChange(() => {
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(() => {
1579
2396
  this.store.getSelectedObject() && this.store.notifySelectedTransformChange?.();
1580
2397
  });
1581
2398
  }
@@ -1600,215 +2417,80 @@ class De {
1600
2417
  this.rollback(), this._unsubscribeTransform && this._unsubscribeTransform();
1601
2418
  }
1602
2419
  }
1603
- var ys = Object.getOwnPropertyDescriptor, bs = (e, t, r, s) => {
1604
- for (var i = s > 1 ? void 0 : s ? ys(t, r) : t, o = e.length - 1, n; o >= 0; o--)
1605
- (n = e[o]) && (i = n(i) || i);
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--)
2422
+ (o = e[n]) && (i = o(i) || i);
1606
2423
  return i;
1607
- }, We = (e, t) => (r, s) => t(r, s, e);
1608
- let be = class extends De {
2424
+ }, mt = (e, t) => (s, r) => t(s, r, e);
2425
+ let Ne = class extends tt {
1609
2426
  /** Инструмент, которым управляет хендлер, нужен только менеджеру */
1610
- mode = j.Translate;
2427
+ mode = U.Rotate;
1611
2428
  constructor(e, t) {
1612
2429
  super(e, t);
1613
2430
  }
1614
2431
  };
1615
- be = bs([
1616
- d(),
1617
- We(0, l("ITransformApi")),
1618
- We(1, l("EditorStore"))
1619
- ], be);
1620
- var Ss = Object.getOwnPropertyDescriptor, As = (e, t, r, s) => {
1621
- for (var i = s > 1 ? void 0 : s ? Ss(t, r) : t, o = e.length - 1, n; o >= 0; o--)
1622
- (n = e[o]) && (i = n(i) || i);
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--)
2439
+ (o = e[n]) && (i = o(i) || i);
1623
2440
  return i;
1624
- }, ke = (e, t) => (r, s) => t(r, s, e);
1625
- let Se = class extends De {
2441
+ }, gt = (e, t) => (s, r) => t(s, r, e);
2442
+ let Xe = class extends tt {
1626
2443
  /** Инструмент, которым управляет хендлер, нужен только менеджеру */
1627
- mode = j.Scale;
2444
+ mode = U.Scale;
1628
2445
  constructor(e, t) {
1629
2446
  super(e, t);
1630
2447
  }
1631
2448
  };
1632
- Se = As([
1633
- d(),
1634
- ke(0, l("ITransformApi")),
1635
- ke(1, l("EditorStore"))
1636
- ], Se);
1637
- var ws = Object.getOwnPropertyDescriptor, xs = (e, t, r, s) => {
1638
- for (var i = s > 1 ? void 0 : s ? ws(t, r) : t, o = e.length - 1, n; o >= 0; o--)
1639
- (n = e[o]) && (i = n(i) || i);
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--)
2456
+ (o = e[n]) && (i = o(i) || i);
1640
2457
  return i;
1641
- }, Ge = (e, t) => (r, s) => t(r, s, e);
1642
- let Ae = class extends De {
2458
+ }, ft = (e, t) => (s, r) => t(s, r, e);
2459
+ let Ye = class extends tt {
1643
2460
  /** Инструмент, которым управляет хендлер, нужен только менеджеру */
1644
- mode = j.Rotate;
2461
+ mode = U.Translate;
1645
2462
  constructor(e, t) {
1646
2463
  super(e, t);
1647
2464
  }
1648
2465
  };
1649
- Ae = xs([
1650
- d(),
1651
- Ge(0, l("ITransformApi")),
1652
- Ge(1, l("EditorStore"))
1653
- ], Ae);
1654
- var Os = Object.getOwnPropertyDescriptor, Cs = (e, t, r, s) => {
1655
- for (var i = s > 1 ? void 0 : s ? Os(t, r) : t, o = e.length - 1, n; o >= 0; o--)
1656
- (n = e[o]) && (i = n(i) || i);
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--)
2473
+ (o = e[n]) && (i = o(i) || i);
1657
2474
  return i;
1658
- }, U = (e, t) => (r, s) => t(r, s, e);
1659
- let we = class {
1660
- constructor(e, t, r, s) {
1661
- this._sceneApi = e, this._cameraApi = t, this._raycastApi = r, this._store = s, this._cameraApi.enableCameraLayer(x), this._hoverLine = this._makeOverlayLine(this._hoverColor), this._selectLine = this._makeOverlayLine(this._selectColor), this._sceneApi.addObject(this._hoverLine, x), this._sceneApi.addObject(this._selectLine, x);
1662
- }
1663
- /** Режим, которым управляет хендлер, нужен только менеджеру */
1664
- mode = M.Edge;
1665
- /** Текущее наведённое ребро. */
1666
- _hoverLine;
1667
- /** Текущее выбранное ребро. */
1668
- _selectLine;
1669
- /** Текущее наведённое ребро из массива `LineSegments` модели. */
1670
- _hovered = null;
1671
- /** Текущее выбранное ребро из массива `LineSegments` модели. */
1672
- _selected = null;
1673
- // Цвета, необходимые для переключения
1674
- /** Цвет ребра, на которое навелись */
1675
- _hoverColor = Z;
1676
- /** Цвет выделенного ребра */
1677
- _selectColor = q;
1678
- /** Обработка текущего режима выборки. */
1679
- handle(e, t) {
1680
- if (this._raycastApi.setRaycastMode(this.mode), t === C.Hover) {
1681
- if (!e) {
1682
- this._hoverLine.visible = !1, this._hovered = null;
1683
- return;
1684
- }
1685
- const r = e.intersection.object;
1686
- if (!r?.isLineSegments) return;
1687
- const s = r, i = Math.floor((e.intersection.index ?? -1) / 2);
1688
- if (i < 0) return;
1689
- 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 };
1690
- return;
1691
- }
1692
- if (t === C.Click) {
1693
- if (!e) {
1694
- this._selectLine.visible = !1, this._selected = null, this._store.setSelectedObject(null);
1695
- return;
1696
- }
1697
- const r = e.intersection.object;
1698
- if (!r?.isLineSegments) return;
1699
- const s = r, i = Math.floor((e.intersection.index ?? -1) / 2);
1700
- if (i < 0) return;
1701
- 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);
1702
- }
1703
- }
1704
- /** Откат текущего режима выборки */
1705
- rollback() {
1706
- this._hoverLine.visible = !1, this._selectLine.visible = !1, this._hovered = this._selected = null, this._store.setSelectedObject(null);
1707
- }
1708
- /** Освобождает ресурсы хендлера, удаляет слушатели и очищает внутренние данные. */
1709
- dispose() {
1710
- this.rollback(), this._sceneApi.removeFromScene(this._hoverLine), this._sceneApi.removeFromScene(this._selectLine), this._hoverLine.geometry.dispose(), this._hoverLine.material.dispose(), this._selectLine.geometry.dispose(), this._selectLine.material.dispose();
1711
- }
1712
- /** Инициализация буферных линий для режима (hover и click).
1713
- * На весь режим будет использовано 2 глобальных линии на сцене,
1714
- * использоваться они будут только для обозначения геометрии ребер конкретной фигуры.
1715
- */
1716
- _makeOverlayLine(e) {
1717
- const t = new a.BufferGeometry();
1718
- t.setAttribute("position", new a.Float32BufferAttribute(6, 3));
1719
- const r = new a.LineBasicMaterial({
1720
- color: e,
1721
- depthTest: !1,
1722
- depthWrite: !1,
1723
- transparent: !0,
1724
- opacity: 1
1725
- }), s = new a.Line(t, r);
1726
- return s.renderOrder = 1e3, s.raycast = () => {
1727
- }, s.layers.set(x), s.visible = !1, s;
1728
- }
1729
- /** Локальные точки сегмента переводим в target (который висит на сцене) */
1730
- _writeWorldSegment(e, t, r) {
1731
- const s = t.geometry.getAttribute("position"), i = r * 2, o = i + 1, n = new a.Vector3(s.getX(i), s.getY(i), s.getZ(i)).applyMatrix4(
1732
- t.matrixWorld
1733
- ), c = new a.Vector3(s.getX(o), s.getY(o), s.getZ(o)).applyMatrix4(
1734
- t.matrixWorld
1735
- ), _ = e.geometry.getAttribute("position");
1736
- _.setXYZ(0, n.x, n.y, n.z), _.setXYZ(1, c.x, c.y, c.z), _.needsUpdate = !0;
1737
- }
1738
- _same(e, t) {
1739
- return !!e && !!t && e.lines === t.lines && e.seg === t.seg;
1740
- }
1741
- /** Центрует `THREE.Line` на сегменте и ориентирует её вдоль ребра */
1742
- _centerAndOrientLineOnSegment(e, t, r) {
1743
- const s = t.geometry.getAttribute("position"), i = r * 2, o = i + 1, n = new a.Vector3(s.getX(i), s.getY(i), s.getZ(i)).applyMatrix4(
1744
- t.matrixWorld
1745
- ), c = new a.Vector3(s.getX(o), s.getY(o), s.getZ(o)).applyMatrix4(
1746
- t.matrixWorld
1747
- ), _ = new a.Vector3().subVectors(c, n), u = _.length();
1748
- if (!isFinite(u) || u === 0) return;
1749
- const p = new a.Vector3().addVectors(n, c).multiplyScalar(0.5);
1750
- e.position.copy(p);
1751
- const f = e.geometry;
1752
- let g = f.getAttribute("position");
1753
- (!g || g.count < 2) && (f.setAttribute("position", new a.BufferAttribute(new Float32Array(6), 3)), g = f.getAttribute("position")), g.setXYZ(0, -u / 2, 0, 0), g.setXYZ(1, u / 2, 0, 0), g.needsUpdate = !0, _.normalize();
1754
- const v = new a.Quaternion().setFromUnitVectors(new a.Vector3(1, 0, 0), _);
1755
- e.quaternion.copy(v), e.updateMatrixWorld(!0);
1756
- }
1757
- /** Запись метаданных выбранного ребра для использования инструментов */
1758
- _prepareEdgeMetadata(e, t) {
1759
- const r = Ze(e);
1760
- if (!r) return;
1761
- const s = e.geometry.getAttribute("position"), i = t * 2, o = i + 1, n = new a.Vector3(s.getX(i), s.getY(i), s.getZ(i)).applyMatrix4(
1762
- e.matrixWorld
1763
- ), c = new a.Vector3(s.getX(o), s.getY(o), s.getZ(o)).applyMatrix4(
1764
- e.matrixWorld
1765
- ), _ = new a.Matrix4().copy(r.matrixWorld).invert(), u = n.clone().applyMatrix4(_), p = c.clone().applyMatrix4(_), g = r.geometry.getAttribute("position"), v = new a.Vector3(), m = 1e-6, y = [], b = [];
1766
- for (let A = 0; A < g.count; A++)
1767
- v.fromBufferAttribute(g, A), v.distanceToSquared(u) < m * m ? y.push(A) : v.distanceToSquared(p) < m * m && b.push(A);
1768
- const L = new a.Matrix4().copy(e.matrixWorld).invert(), E = n.clone().applyMatrix4(L), T = c.clone().applyMatrix4(L), S = e.geometry.getAttribute("position"), w = new a.Vector3(), I = [], $ = [];
1769
- for (let A = 0; A < S.count; A++)
1770
- w.fromBufferAttribute(S, A), w.distanceToSquared(E) < m * m ? I.push(A) : w.distanceToSquared(T) < m * m && $.push(A);
1771
- this._selectLine.userData.edgeInfo = {
1772
- lines: e,
1773
- seg: t,
1774
- mesh: r,
1775
- aIndices: y,
1776
- bIndices: b,
1777
- aEdgeIndices: I,
1778
- bEdgeIndices: $
1779
- };
1780
- }
1781
- };
1782
- we = Cs([
1783
- d(),
1784
- U(0, l("ISceneApi")),
1785
- U(1, l("ICameraApi")),
1786
- U(2, l("IRaycastApi")),
1787
- U(3, l("EditorStore"))
1788
- ], we);
1789
- var Is = Object.getOwnPropertyDescriptor, Ps = (e, t, r, s) => {
1790
- for (var i = s > 1 ? void 0 : s ? Is(t, r) : t, o = e.length - 1, n; o >= 0; o--)
1791
- (n = e[o]) && (i = n(i) || i);
1792
- return i;
1793
- }, Ls = (e, t) => (r, s) => t(r, s, e);
1794
- let xe = class {
2475
+ }, Rr = (e, t) => (s, r) => t(s, r, e);
2476
+ let ge = class {
1795
2477
  constructor(e) {
1796
2478
  this._api = e;
1797
2479
  }
1798
2480
  /** Режим редактирования сцены */
1799
- mode = W.AddFigure;
2481
+ mode = T.AddFigure;
1800
2482
  /** Последняя добавленная фигура, нужно для отката через `ctrl + z`. */
1801
2483
  _lastAddedMesh = null;
1802
2484
  /** Добавление базовых фигур на сцену, которые приписаны в `FigureType`. */
1803
2485
  handle(e) {
1804
- const t = _s[e](), r = t.getAttribute("position");
1805
- r && r.setUsage && r.setUsage(a.DynamicDrawUsage);
1806
- const s = new a.Mesh(t, ds);
1807
- s.layers.enable(k);
1808
- const i = t.index ? t.toNonIndexed() : t, o = gs(i);
1809
- o.layers.enable(k), s.add(o);
1810
- const n = ms(i);
1811
- n.layers.enable(k), s.add(n), this._api.addMesh(s), this._lastAddedMesh = s;
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;
1812
2494
  }
1813
2495
  /** Срабатывает только на `ctrl + z`. */
1814
2496
  rollback() {
@@ -1819,26 +2501,26 @@ let xe = class {
1819
2501
  this._lastAddedMesh = null;
1820
2502
  }
1821
2503
  };
1822
- xe = Ps([
1823
- d(),
1824
- Ls(0, l("IMeshApi"))
1825
- ], xe);
1826
- var Es = Object.getOwnPropertyDescriptor, Ts = (e, t, r, s) => {
1827
- for (var i = s > 1 ? void 0 : s ? Es(t, r) : t, o = e.length - 1, n; o >= 0; o--)
1828
- (n = e[o]) && (i = n(i) || i);
2504
+ ge = $r([
2505
+ w(),
2506
+ Rr(0, _("IMeshApi"))
2507
+ ], 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--)
2510
+ (o = e[n]) && (i = o(i) || i);
1829
2511
  return i;
1830
- }, Be = (e, t) => (r, s) => t(r, s, e);
1831
- let Oe = class {
2512
+ }, vt = (e, t) => (s, r) => t(s, r, e);
2513
+ let qe = class {
1832
2514
  constructor(e, t) {
1833
2515
  this._api = e, this._store = t;
1834
2516
  }
1835
2517
  /** Режим редактирования сцены */
1836
- mode = W.DeleteFigure;
2518
+ mode = T.DeleteFigure;
1837
2519
  /** Последняя удаленная фигура, сохраняем для отката через `ctrl + z` */
1838
2520
  _lastDeletedMesh = null;
1839
2521
  handle() {
1840
2522
  const e = this._store.getSelectedObject();
1841
- ps(e) && (this._api.removeMesh(e), this._store.setSelectedObject(null), this._lastDeletedMesh = e);
2523
+ et(e) && !Vt(e) && (this._api.removeMesh(e), this._store.setSelectedObject(null), this._lastDeletedMesh = e);
1842
2524
  }
1843
2525
  /** Срабатывает только на `ctrl + z`. */
1844
2526
  rollback() {
@@ -1849,50 +2531,258 @@ let Oe = class {
1849
2531
  this._lastDeletedMesh = null;
1850
2532
  }
1851
2533
  };
1852
- Oe = Ts([
1853
- d(),
1854
- Be(0, l("IMeshApi")),
1855
- Be(1, l("EditorStore"))
1856
- ], Oe);
1857
- var Ds = Object.getOwnPropertyDescriptor, Vs = (e, t, r, s) => {
1858
- for (var i = s > 1 ? void 0 : s ? Ds(t, r) : t, o = e.length - 1, n; o >= 0; o--)
1859
- (n = e[o]) && (i = n(i) || i);
2534
+ qe = Hr([
2535
+ w(),
2536
+ vt(0, _("IMeshApi")),
2537
+ vt(1, _("EditorStore"))
2538
+ ], qe);
2539
+ class Br {
2540
+ /**
2541
+ * Parses the given 3D object and generates the OBJ output.
2542
+ *
2543
+ * If the 3D object is composed of multiple children and geometry, they are merged into a single mesh in the file.
2544
+ *
2545
+ * @param {Object3D} object - The 3D object to export.
2546
+ * @return {string} The exported OBJ.
2547
+ */
2548
+ 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 + `
2559
+ `;
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 + `
2563
+ `;
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 + `
2568
+ `;
2569
+ }
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) : "") : "");
2575
+ }
2576
+ s += "f " + m.join(" ") + `
2577
+ `;
2578
+ }
2579
+ 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) : "") : "");
2584
+ }
2585
+ s += "f " + m.join(" ") + `
2586
+ `;
2587
+ }
2588
+ r += v, i += A, n += y;
2589
+ }
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 + `
2594
+ `, 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 + `
2597
+ `;
2598
+ if (A === "Line") {
2599
+ s += "l ";
2600
+ for (let x = 1, b = S.count; x <= b; x++)
2601
+ s += r + x + " ";
2602
+ s += `
2603
+ `;
2604
+ }
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) + `
2608
+ `;
2609
+ r += v;
2610
+ }
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 += `
2618
+ `;
2619
+ s += "p ";
2620
+ for (let x = 1, b = A.count; x <= b; x++)
2621
+ s += r + x + " ";
2622
+ s += `
2623
+ `;
2624
+ }
2625
+ r += v;
2626
+ }
2627
+ return t.traverse(function(h) {
2628
+ h.isMesh === !0 && p(h), h.isLine === !0 && g(h), h.isPoints === !0 && f(h);
2629
+ }), s;
2630
+ }
2631
+ }
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--)
2634
+ (o = e[n]) && (i = o(i) || i);
1860
2635
  return i;
1861
- }, X = (e, t) => (r, s) => t(r, s, e);
1862
- let Ce = class {
1863
- constructor(e, t, r, s) {
1864
- this._renderer = e, this._mediator = t, this._store = r, this._controller = s, this.setSelectMode(M.Mesh), this.setToolMode(j.Translate);
2636
+ }, yt = (e, t) => (s, r) => t(s, r, e);
2637
+ let fe = class {
2638
+ constructor(e, t) {
2639
+ this._api = e, this._exportStore = t;
1865
2640
  }
1866
- setDisplayMode(e) {
1867
- return this._mediator.send({
1868
- type: P.Display,
1869
- payload: [e]
2641
+ /** Режим редактирования сцены */
2642
+ mode = T.Export;
2643
+ /** Экспорт всей сцены в ExportStore для последующей загрузки в виде файла. */
2644
+ handle() {
2645
+ const e = this._api.getScene(), t = xs(e), r = new Br().parse(t), i = Date.now();
2646
+ this._exportStore.setResult({
2647
+ format: "obj",
2648
+ filename: `scene-${i}.obj`,
2649
+ mimeType: "text/plain;charset=utf-8",
2650
+ content: r,
2651
+ createdAt: i
1870
2652
  });
1871
2653
  }
1872
- setSceneMode(e) {
2654
+ rollback() {
2655
+ }
2656
+ /** Освобождает ресурсы хендлера. */
2657
+ dispose() {
2658
+ this._exportStore.clearResult();
2659
+ }
2660
+ };
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 {
2672
+ constructor(e, t) {
2673
+ this._api = e, this._validator = t;
2674
+ }
2675
+ /** Режим редактирования сцены */
2676
+ mode = T.Load;
2677
+ handle(e) {
2678
+ const t = [...this._api.getMeshes()];
2679
+ this._api.removeMeshes(t);
2680
+ const s = Dt(e);
2681
+ this._api.addMeshes(s);
2682
+ }
2683
+ rollback() {
2684
+ }
2685
+ /** Освобождает ресурсы хендлера. */
2686
+ dispose() {
2687
+ }
2688
+ };
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 {
2703
+ constructor(e, t) {
2704
+ this._api = e, this._validator = t;
2705
+ }
2706
+ /** Режим редактирования сцены */
2707
+ mode = T.LoadFigure;
2708
+ handle(e) {
2709
+ const t = Dt(e);
2710
+ this._api.addMeshes(t);
2711
+ }
2712
+ rollback() {
2713
+ }
2714
+ /** Освобождает ресурсы хендлера. */
2715
+ dispose() {
2716
+ }
2717
+ };
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--)
2728
+ (o = e[n]) && (i = o(i) || i);
2729
+ 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);
2734
+ }
2735
+ setDisplayMode(e) {
1873
2736
  return this._mediator.send({
1874
- type: P.Scene,
2737
+ type: E.Display,
1875
2738
  payload: [e]
1876
2739
  });
1877
2740
  }
1878
2741
  setSelectMode(e) {
1879
2742
  return this._mediator.send({
1880
- type: P.Select,
2743
+ type: E.Select,
1881
2744
  payload: [e]
1882
2745
  });
1883
2746
  }
1884
2747
  setToolMode(e) {
1885
2748
  return this._mediator.send({
1886
- type: P.Tool,
2749
+ type: E.Tool,
1887
2750
  payload: [e]
1888
2751
  });
1889
2752
  }
1890
- addFigure(e, t) {
2753
+ addFigure(e) {
1891
2754
  return this._mediator.send({
1892
- type: P.Scene,
1893
- payload: [e, t]
2755
+ type: E.Scene,
2756
+ payload: [T.AddFigure, e]
1894
2757
  });
1895
2758
  }
2759
+ deleteFigure() {
2760
+ return this._mediator.send({
2761
+ type: E.Scene,
2762
+ payload: [T.DeleteFigure]
2763
+ });
2764
+ }
2765
+ loadFigure(e) {
2766
+ return this._mediator.send({
2767
+ type: E.Scene,
2768
+ payload: [T.LoadFigure, e]
2769
+ });
2770
+ }
2771
+ loadScene(e) {
2772
+ return this._mediator.send({
2773
+ type: E.Scene,
2774
+ payload: [T.Load, e]
2775
+ });
2776
+ }
2777
+ exportScene() {
2778
+ return this._exportStore.clearResult(), {
2779
+ response: this._mediator.send({
2780
+ type: E.Scene,
2781
+ payload: [T.Export]
2782
+ }),
2783
+ result: this._exportStore.getResult()
2784
+ };
2785
+ }
1896
2786
  resizeRenderer() {
1897
2787
  this._renderer.resize();
1898
2788
  }
@@ -1915,143 +2805,37 @@ let Ce = class {
1915
2805
  onSelectionStatsChange(e) {
1916
2806
  const t = this._store.onSelectedObjectChange(() => {
1917
2807
  e();
1918
- }), r = this._store.onSelectedTransformChange(() => {
2808
+ }), s = this._store.onSelectedTransformChange(() => {
1919
2809
  e();
1920
2810
  });
1921
2811
  return () => {
1922
- t(), r();
2812
+ t(), s();
1923
2813
  };
1924
2814
  }
1925
2815
  dispose() {
1926
2816
  this._mediator.dispose();
1927
2817
  }
1928
2818
  };
1929
- Ce = Vs([
1930
- d(),
1931
- X(0, l("Renderer")),
1932
- X(1, l("IMediator")),
1933
- X(2, l("EditorStore")),
1934
- X(3, l("IController"))
1935
- ], Ce);
1936
- var $s = Object.getOwnPropertyDescriptor, js = (e, t, r, s) => {
1937
- for (var i = s > 1 ? void 0 : s ? $s(t, r) : t, o = e.length - 1, n; o >= 0; o--)
1938
- (n = e[o]) && (i = n(i) || i);
1939
- return i;
1940
- };
1941
- let Ie = class {
1942
- /**
1943
- * Внутренний эмиттер событий Node.js.
1944
- *
1945
- * @private
1946
- * @member
1947
- */
1948
- _emitter;
1949
- /** @constructor */
1950
- constructor() {
1951
- this._emitter = new at();
1952
- }
1953
- /**
1954
- * Публикует событие в шину.
1955
- *
1956
- * @param event - название события (из `EventTopics`)
1957
- * @param payload - данные события (тип зависит от события)
1958
- *
1959
- * @typeParam K - ключ события из `EditorEvents`
1960
- *
1961
- * @remarks
1962
- * Все подписчики, зарегистрированные на это событие, получат payload.
1963
- *
1964
- * @example
1965
- * ```typescript
1966
- * // Публикация события клика
1967
- * eventBus.emit(EventTopics.SelectClick, { intersection: hit });
1968
- *
1969
- * // Публикация события сброса выделения
1970
- * eventBus.emit(EventTopics.SelectClick, null);
1971
- * ```
1972
- *
1973
- * @public
1974
- * @method
1975
- */
1976
- emit(e, t) {
1977
- this._emitter.emit(e, t);
1978
- }
1979
- /**
1980
- * Подписывается на событие.
1981
- *
1982
- * @param event - название события (из `EventTopics`)
1983
- * @param listener - функция-обработчик, получающая payload
1984
- *
1985
- * @typeParam K - ключ события из `EditorEvents`
1986
- *
1987
- * @remarks
1988
- * **Важно:** для предотвращения утечек памяти необходимо отписываться от событий
1989
- * в `dispose()` методах компонентов.
1990
- *
1991
- * @example
1992
- * ```typescript
1993
- * // Подписка на событие hover
1994
- * this._eventBus.on(EventTopics.SelectHover, (payload) => {
1995
- * if (payload) {
1996
- * this._handleHover(payload.intersection);
1997
- * } else {
1998
- * this._clearHover();
1999
- * }
2000
- * });
2001
- * ```
2002
- *
2003
- * @public
2004
- * @method
2005
- */
2006
- on(e, t) {
2007
- this._emitter.on(e, t);
2008
- }
2009
- /**
2010
- * Отписывается от события.
2011
- *
2012
- * @param event - название события (из `EventTopics`)
2013
- * @param listener - функция-обработчик, которую нужно отписать
2014
- *
2015
- * @typeParam K - ключ события из `EditorEvents`
2016
- *
2017
- * @remarks
2018
- * Для корректной отписки необходимо передать ту же самую функцию,
2019
- * которая использовалась при подписке.
2020
- *
2021
- * @example
2022
- * ```typescript
2023
- * // Сохранение ссылки на обработчик
2024
- * private _handleClick = (payload) => { ... };
2025
- *
2026
- * // Подписка
2027
- * eventBus.on(EventTopics.SelectClick, this._handleClick);
2028
- *
2029
- * // Отписка (в dispose)
2030
- * eventBus.off(EventTopics.SelectClick, this._handleClick);
2031
- * ```
2032
- *
2033
- * @public
2034
- * @method
2035
- */
2036
- off(e, t) {
2037
- this._emitter.off(e, t);
2038
- }
2039
- };
2040
- Ie = js([
2041
- d()
2042
- ], Ie);
2043
- var Hs = Object.getOwnPropertyDescriptor, Rs = (e, t, r, s) => {
2044
- for (var i = s > 1 ? void 0 : s ? Hs(t, r) : t, o = e.length - 1, n; o >= 0; o--)
2045
- (n = e[o]) && (i = n(i) || i);
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--)
2829
+ (o = e[n]) && (i = o(i) || i);
2046
2830
  return i;
2047
2831
  };
2048
- let Pe = class {
2832
+ let Ke = class {
2049
2833
  /** Текущий режим выборки. */
2050
- _selectMode = M.Mesh;
2834
+ _selectMode = P.Mesh;
2051
2835
  /** Текущий выбранный инструмент. */
2052
- _toolType = j.Translate;
2836
+ _toolType = U.Translate;
2053
2837
  /** Выбранный режим отображения. */
2054
- _displayMode = F.Plane;
2838
+ _displayMode = K.Plane;
2055
2839
  /** Выбранный объект на сцене. */
2056
2840
  _selectedObject = null;
2057
2841
  /** Слушатели событий по изменению выбранного объекта. */
@@ -2059,7 +2843,7 @@ let Pe = class {
2059
2843
  /** Слушатели событий трансформации выбранного объекта. */
2060
2844
  _transformListeners = /* @__PURE__ */ new Set();
2061
2845
  constructor() {
2062
- ct(this, {}, { autoBind: !0 });
2846
+ At(this, {}, { autoBind: !0 });
2063
2847
  }
2064
2848
  getSelectMode() {
2065
2849
  return this._selectMode;
@@ -2084,7 +2868,7 @@ let Pe = class {
2084
2868
  }
2085
2869
  getSelectionStats() {
2086
2870
  const e = this._selectedObject;
2087
- return e ? vs(e) : null;
2871
+ return e ? ys(e) : null;
2088
2872
  }
2089
2873
  setSelectedObject(e) {
2090
2874
  if (this._selectedObject !== e) {
@@ -2102,50 +2886,114 @@ let Pe = class {
2102
2886
  for (const e of this._transformListeners) e();
2103
2887
  }
2104
2888
  };
2105
- Pe = Rs([
2106
- d()
2107
- ], Pe);
2108
- var G = /* @__PURE__ */ ((e) => (e.ToolNotAllowed = "TOOL_NOT_ALLOWED", e.Success = "SUCCESS", e.NoChange = "NO_CHANGE", e.Error = "ERROR", e))(G || {});
2109
- class qe extends Error {
2110
- constructor(t, r, s, i) {
2111
- super(r), this.type = t, this.code = s, this.meta = i, this.name = this._name;
2889
+ Ke = Zr([
2890
+ w()
2891
+ ], Ke);
2892
+ class Bt {
2893
+ _result = null;
2894
+ constructor() {
2895
+ At(
2896
+ this,
2897
+ {
2898
+ _result: os.ref
2899
+ },
2900
+ {
2901
+ autoBind: !0
2902
+ }
2903
+ );
2904
+ }
2905
+ get result() {
2906
+ return this._result;
2907
+ }
2908
+ get hasResult() {
2909
+ return this._result !== null;
2910
+ }
2911
+ setResult(t) {
2912
+ this._result = t;
2913
+ }
2914
+ getResult() {
2915
+ return this._result;
2916
+ }
2917
+ clearResult() {
2918
+ this._result = null;
2919
+ }
2920
+ }
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;
2112
2924
  }
2113
2925
  _name = "PolicyException";
2114
2926
  }
2115
- var Fs = Object.getOwnPropertyDescriptor, Ws = (e, t, r, s) => {
2116
- for (var i = s > 1 ? void 0 : s ? Fs(t, r) : t, o = e.length - 1, n; o >= 0; o--)
2117
- (n = e[o]) && (i = n(i) || i);
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;
2930
+ }
2931
+ _name = "ValidationException";
2932
+ }
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--)
2935
+ (o = e[n]) && (i = o(i) || i);
2118
2936
  return i;
2119
- }, ks = (e, t) => (r, s) => t(r, s, e);
2120
- let Le = class {
2937
+ }, Qr = (e, t) => (s, r) => t(s, r, e);
2938
+ let Je = class {
2121
2939
  constructor(e) {
2122
2940
  this._store = e;
2123
2941
  }
2124
2942
  check(e) {
2125
2943
  const t = this._store.getSelectMode();
2126
- if (!st[t].includes(e))
2127
- throw new qe(
2128
- G.ToolNotAllowed,
2944
+ if (!es[t].includes(e))
2945
+ throw new kt(
2946
+ G.NotAllowed,
2129
2947
  `Tool ${e} is not allowed`,
2130
2948
  "TOOL_NOT_ALLOWED"
2131
2949
  );
2132
2950
  }
2133
2951
  };
2134
- Le = Ws([
2135
- d(),
2136
- ks(0, l("EditorStore"))
2137
- ], Le);
2138
- var Gs = Object.getOwnPropertyDescriptor, Bs = (e, t, r, s) => {
2139
- for (var i = s > 1 ? void 0 : s ? Gs(t, r) : t, o = e.length - 1, n; o >= 0; o--)
2140
- (n = e[o]) && (i = n(i) || i);
2952
+ Je = Jr([
2953
+ w(),
2954
+ Qr(0, _("EditorStore"))
2955
+ ], Je);
2956
+ class zt {
2957
+ constructor() {
2958
+ }
2959
+ validate(t) {
2960
+ const s = t.trim();
2961
+ if (!s)
2962
+ throw new oe(
2963
+ G.ValidationError,
2964
+ "File content is empty.",
2965
+ "FILE_CONTENT_EMPTY"
2966
+ );
2967
+ if (!/^v\s+[-+.\deE]+\s+[-+.\deE]+\s+[-+.\deE]+/m.test(s))
2968
+ throw new oe(
2969
+ G.ValidationError,
2970
+ "OBJ content does not contain vertices.",
2971
+ "WRONG_FILE_CONTENT"
2972
+ );
2973
+ if (!/^f\s+/m.test(s))
2974
+ throw new oe(
2975
+ G.ValidationError,
2976
+ "OBJ content does not contain faces.",
2977
+ "WRONG_FILE_CONTENT"
2978
+ );
2979
+ }
2980
+ }
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--)
2983
+ (o = e[n]) && (i = o(i) || i);
2141
2984
  return i;
2142
2985
  };
2143
- let Ee = class {
2986
+ let ve = class {
2144
2987
  handle(e) {
2145
2988
  try {
2146
2989
  return e();
2147
2990
  } catch (t) {
2148
- return t instanceof qe ? {
2991
+ return t instanceof kt ? {
2992
+ type: t.type,
2993
+ message: t.message,
2994
+ code: t.code,
2995
+ blocked: !0
2996
+ } : t instanceof oe ? {
2149
2997
  type: t.type,
2150
2998
  message: t.message,
2151
2999
  code: t.code,
@@ -2164,17 +3012,17 @@ let Ee = class {
2164
3012
  }
2165
3013
  }
2166
3014
  };
2167
- Ee = Bs([
2168
- d()
2169
- ], Ee);
2170
- var zs = Object.getOwnPropertyDescriptor, Ns = (e, t, r, s) => {
2171
- for (var i = s > 1 ? void 0 : s ? zs(t, r) : t, o = e.length - 1, n; o >= 0; o--)
2172
- (n = e[o]) && (i = n(i) || i);
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--)
3020
+ (o = e[n]) && (i = o(i) || i);
2173
3021
  return i;
2174
- }, ze = (e, t) => (r, s) => t(r, s, e);
2175
- let Te = class {
3022
+ }, xt = (e, t) => (s, r) => t(s, r, e);
3023
+ let ye = class {
2176
3024
  constructor(e, t) {
2177
- this._middlewares = t, this._managers = new Map(e.map((r) => [r.type, r]));
3025
+ this._middlewares = t, this._managers = new Map(e.map((s) => [s.type, s]));
2178
3026
  }
2179
3027
  _managers;
2180
3028
  send(e) {
@@ -2186,37 +3034,105 @@ let Te = class {
2186
3034
  code: "MANAGER_NOT_FOUND",
2187
3035
  blocked: !0
2188
3036
  };
2189
- const r = () => (t.manage(...e.payload), null);
2190
- return this._middlewares.reduceRight((i, o) => () => o.handle(i), r)();
3037
+ const s = () => (t.manage(...e.payload), null);
3038
+ return this._middlewares.reduceRight((i, n) => () => n.handle(i), s)();
2191
3039
  }
2192
3040
  dispose() {
2193
3041
  this._managers && this._managers.clear();
2194
3042
  }
2195
3043
  };
2196
- Te = Ns([
2197
- d(),
2198
- ze(0, D("IManager")),
2199
- ze(1, D("IMiddleware"))
2200
- ], Te);
2201
- let Ne = !1;
2202
- const h = et.createChildContainer();
2203
- function Us(e) {
2204
- return Ne || (h.registerInstance("Canvas", e), h.registerSingleton("EventBus", Ie), h.registerSingleton("IController", se), h.registerSingleton("Renderer", te), h.register("IRenderable", { useToken: "Renderer" }), h.register("IRendererAccess", { useToken: "Renderer" }), h.register("IRendererCameraAccess", { useToken: "Renderer" }), h.register("IRendererDomAccess", { useToken: "Renderer" }), h.register("IRendererSceneAccess", { useToken: "Renderer" }), h.registerSingleton("ToolPolicy", Le), h.registerSingleton("IMeshApi", re), h.registerSingleton("IControlsStateApi", le), h.registerSingleton("IRaycastApi", ie), h.registerSingleton("ITransformApi", oe), h.registerSingleton("ICameraApi", ne), h.registerSingleton("IDomApi", ae), h.registerSingleton("ISceneApi", ce), h.registerSingleton("ControlsModule", he), h.registerSingleton("GizmoModule", _e), h.registerSingleton("RaycastModule", de), h.registerSingleton("SceneModule", ue), h.register("IUpdatableModule", { useToken: "ControlsModule" }), h.register("IRenderableModule", { useToken: "GizmoModule" }), h.register("IRuntimeModule", { useToken: "RaycastModule" }), h.register("IRuntimeModule", { useToken: "SceneModule" }), h.registerSingleton("IDisplayHandler", ve), h.registerSingleton("ISelectHandler", fe), h.registerSingleton("ISelectHandler", Me), h.registerSingleton("ISelectHandler", we), h.registerSingleton("ISelectHandler", ye), h.registerSingleton("IToolHandler", be), h.registerSingleton("IToolHandler", Se), h.registerSingleton("IToolHandler", Ae), h.registerSingleton("ISceneHandler", xe), h.registerSingleton("ISceneHandler", Oe), h.registerSingleton("DisplayManager", pe), h.register("IDisplayManager", { useToken: "DisplayManager" }), h.register("IManager", { useToken: "DisplayManager" }), h.registerSingleton("SelectManager", me), h.register("ISelectManager", { useToken: "SelectManager" }), h.register("IManager", { useToken: "SelectManager" }), h.registerSingleton("ToolManager", Y), h.register("IToolManager", { useToken: "ToolManager" }), h.register("IManager", { useToken: "ToolManager" }), h.registerSingleton("SceneManager", ge), h.register("ISceneManager", { useToken: "SceneManager" }), h.register("IManager", { useToken: "SceneManager" }), h.registerSingleton("IMiddleware", Ee), h.registerSingleton("IMediator", Te), h.registerSingleton("EditorHub", Ce), h.registerSingleton("EditorStore", Pe), Ne = !0), h;
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;
3109
+ }
3110
+ function ai(e, t) {
3111
+ return be || (a.registerInstance("Canvas", e), a.registerInstance(
3112
+ "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;
2205
3115
  }
2206
- let H = null;
2207
- const er = (e) => (H || (H = Us(e)), H.resolve("EditorHub")), tr = () => {
2208
- if (!H)
2209
- throw new Error("EditorHub is not initialized. Call createAppHub(canvas) first.");
2210
- return H.resolve("EditorHub");
3116
+ let R = null;
3117
+ const gi = (e, t) => (R || (R = oi(e, t)), R.resolve("EditorHub")), fi = () => {
3118
+ if (!R)
3119
+ 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)
3123
+ throw new Error("ViewerHub is not initialized. Call createViewerHub(canvas) first.");
3124
+ return R.resolve("ViewerHub");
2211
3125
  };
2212
3126
  export {
2213
- Ce as EditorHub,
2214
- Ie as EventBus,
2215
- V as EventTopics,
2216
- P as FeatureType,
2217
- Js as ObjLoader,
2218
- te as Renderer,
2219
- G as ResponseType,
2220
- er as createAppHub,
2221
- tr as getAppHub
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
2222
3138
  };