@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.
- package/dist/api/modules/controls-state-api.d.ts +1 -1
- package/dist/api/modules/controls-state-api.d.ts.map +1 -1
- package/dist/api/modules/index.d.ts +5 -0
- package/dist/api/modules/index.d.ts.map +1 -0
- package/dist/api/modules/mesh-api.d.ts +1 -1
- package/dist/api/modules/mesh-api.d.ts.map +1 -1
- package/dist/api/modules/raycast-api.d.ts +1 -1
- package/dist/api/modules/raycast-api.d.ts.map +1 -1
- package/dist/api/modules/transform-api.d.ts +2 -2
- package/dist/api/modules/transform-api.d.ts.map +1 -1
- package/dist/api/renderer/camera-api.d.ts +2 -2
- package/dist/api/renderer/camera-api.d.ts.map +1 -1
- package/dist/api/renderer/dom-api.d.ts +2 -2
- package/dist/api/renderer/dom-api.d.ts.map +1 -1
- package/dist/api/renderer/index.d.ts +4 -0
- package/dist/api/renderer/index.d.ts.map +1 -0
- package/dist/api/renderer/scene-api.d.ts +2 -2
- package/dist/api/renderer/scene-api.d.ts.map +1 -1
- package/dist/constants/figure-geometries.d.ts.map +1 -1
- package/dist/constants/index.d.ts +6 -0
- package/dist/constants/index.d.ts.map +1 -0
- package/dist/controllers/index.d.ts +2 -0
- package/dist/controllers/index.d.ts.map +1 -0
- package/dist/controllers/renderer-controller.d.ts +7 -9
- package/dist/controllers/renderer-controller.d.ts.map +1 -1
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/renderer.d.ts +10 -15
- package/dist/core/renderer.d.ts.map +1 -1
- package/dist/decorators/index.d.ts +3 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/dist/decorators/use-policy.d.ts.map +1 -1
- package/dist/decorators/use-validator.d.ts +5 -0
- package/dist/decorators/use-validator.d.ts.map +1 -0
- package/dist/errors/index.d.ts +3 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/policy-error.d.ts +1 -1
- package/dist/errors/policy-error.d.ts.map +1 -1
- package/dist/errors/validation-error.d.ts +9 -0
- package/dist/errors/validation-error.d.ts.map +1 -0
- package/dist/events/editor-events.d.ts +1 -1
- package/dist/events/editor-events.d.ts.map +1 -1
- package/dist/events/event-bus.d.ts +1 -1
- package/dist/events/event-bus.d.ts.map +1 -1
- package/dist/events/index.d.ts +4 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/handlers/display/index.d.ts +2 -0
- package/dist/handlers/display/index.d.ts.map +1 -0
- package/dist/handlers/display/wireframe-handler.d.ts +2 -2
- package/dist/handlers/display/wireframe-handler.d.ts.map +1 -1
- package/dist/handlers/scene/add-figure-scene-handler.d.ts +2 -2
- package/dist/handlers/scene/add-figure-scene-handler.d.ts.map +1 -1
- package/dist/handlers/scene/delete-figure-scene-handler.d.ts +3 -3
- package/dist/handlers/scene/delete-figure-scene-handler.d.ts.map +1 -1
- package/dist/handlers/scene/export-scene-handler.d.ts +23 -0
- package/dist/handlers/scene/export-scene-handler.d.ts.map +1 -0
- package/dist/handlers/scene/index.d.ts +6 -0
- package/dist/handlers/scene/index.d.ts.map +1 -0
- package/dist/handlers/scene/load-figure-scene-handler.d.ts +23 -0
- package/dist/handlers/scene/load-figure-scene-handler.d.ts.map +1 -0
- package/dist/handlers/scene/load-scene-handler.d.ts +23 -0
- package/dist/handlers/scene/load-scene-handler.d.ts.map +1 -0
- package/dist/handlers/select/edge-select-handler.d.ts +5 -8
- package/dist/handlers/select/edge-select-handler.d.ts.map +1 -1
- package/dist/handlers/select/face-select-handler.d.ts +5 -8
- package/dist/handlers/select/face-select-handler.d.ts.map +1 -1
- package/dist/handlers/select/index.d.ts +5 -0
- package/dist/handlers/select/index.d.ts.map +1 -0
- package/dist/handlers/select/mesh-select-handler.d.ts +5 -6
- package/dist/handlers/select/mesh-select-handler.d.ts.map +1 -1
- package/dist/handlers/select/vertex-select-handler.d.ts +5 -8
- package/dist/handlers/select/vertex-select-handler.d.ts.map +1 -1
- package/dist/handlers/tool/base-tool-handler.d.ts +3 -3
- package/dist/handlers/tool/base-tool-handler.d.ts.map +1 -1
- package/dist/handlers/tool/index.d.ts +4 -0
- package/dist/handlers/tool/index.d.ts.map +1 -0
- package/dist/handlers/tool/rotate-tool-handler.d.ts +2 -2
- package/dist/handlers/tool/rotate-tool-handler.d.ts.map +1 -1
- package/dist/handlers/tool/scale-tool-handler.d.ts +2 -2
- package/dist/handlers/tool/scale-tool-handler.d.ts.map +1 -1
- package/dist/handlers/tool/translate-tool-handler.d.ts +2 -2
- package/dist/handlers/tool/translate-tool-handler.d.ts.map +1 -1
- package/dist/hub/editor-hub.d.ts +11 -8
- package/dist/hub/editor-hub.d.ts.map +1 -1
- package/dist/hub/index.d.ts +26 -0
- package/dist/hub/index.d.ts.map +1 -0
- package/dist/hub/viewer-hub.d.ts +30 -0
- package/dist/hub/viewer-hub.d.ts.map +1 -0
- package/dist/index.cjs.js +20 -2
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.js +2063 -1147
- package/dist/index.full.d.ts +67 -57
- package/dist/index.public.d.ts +67 -57
- package/dist/index.umd.js +20 -2
- package/dist/interfaces/api/index.d.ts +9 -0
- package/dist/interfaces/api/index.d.ts.map +1 -0
- package/dist/interfaces/api/renderer/index.d.ts +6 -0
- package/dist/interfaces/api/renderer/index.d.ts.map +1 -0
- package/dist/interfaces/api/transform-api.d.ts +1 -1
- package/dist/interfaces/api/transform-api.d.ts.map +1 -1
- package/dist/interfaces/command/index.d.ts +1 -1
- package/dist/interfaces/command/index.d.ts.map +1 -1
- package/dist/interfaces/controller/{controller.d.ts → index.d.ts} +1 -1
- package/dist/interfaces/controller/index.d.ts.map +1 -0
- package/dist/interfaces/handler/index.d.ts +6 -0
- package/dist/interfaces/handler/index.d.ts.map +1 -0
- package/dist/interfaces/manager/display-manager.d.ts.map +1 -1
- package/dist/interfaces/manager/index.d.ts +6 -0
- package/dist/interfaces/manager/index.d.ts.map +1 -0
- package/dist/interfaces/manager/manager.d.ts +1 -1
- package/dist/interfaces/manager/manager.d.ts.map +1 -1
- package/dist/interfaces/manager/select-manager.d.ts.map +1 -1
- package/dist/interfaces/manager/tool-manager.d.ts.map +1 -1
- package/dist/interfaces/mediator/index.d.ts +1 -1
- package/dist/interfaces/mediator/index.d.ts.map +1 -1
- package/dist/interfaces/middleware/index.d.ts +1 -1
- package/dist/interfaces/middleware/index.d.ts.map +1 -1
- package/dist/interfaces/module/index.d.ts +4 -0
- package/dist/interfaces/module/index.d.ts.map +1 -0
- package/dist/interfaces/module/renderable-module.d.ts +1 -1
- package/dist/interfaces/module/renderable-module.d.ts.map +1 -1
- package/dist/interfaces/store/export-store.d.ts +8 -0
- package/dist/interfaces/store/export-store.d.ts.map +1 -0
- package/dist/interfaces/store/index.d.ts +6 -0
- package/dist/interfaces/store/index.d.ts.map +1 -0
- package/dist/interfaces/store/select-store.d.ts +1 -1
- package/dist/interfaces/store/select-store.d.ts.map +1 -1
- package/dist/interfaces/store/tool-store.d.ts +1 -1
- package/dist/interfaces/store/tool-store.d.ts.map +1 -1
- package/dist/interfaces/validator/index.d.ts +21 -0
- package/dist/interfaces/validator/index.d.ts.map +1 -0
- package/dist/ioc/container.d.ts +3 -1
- package/dist/ioc/container.d.ts.map +1 -1
- package/dist/managers/display/display-manager.d.ts +4 -4
- package/dist/managers/display/display-manager.d.ts.map +1 -1
- package/dist/managers/display/index.d.ts +2 -0
- package/dist/managers/display/index.d.ts.map +1 -0
- package/dist/managers/index.d.ts +5 -0
- package/dist/managers/index.d.ts.map +1 -0
- package/dist/managers/scene/index.d.ts +2 -0
- package/dist/managers/scene/index.d.ts.map +1 -0
- package/dist/managers/scene/scene-manager.d.ts +5 -5
- package/dist/managers/scene/scene-manager.d.ts.map +1 -1
- package/dist/managers/select/index.d.ts +2 -0
- package/dist/managers/select/index.d.ts.map +1 -0
- package/dist/managers/select/select-manager.d.ts +5 -5
- package/dist/managers/select/select-manager.d.ts.map +1 -1
- package/dist/managers/tool/index.d.ts +2 -0
- package/dist/managers/tool/index.d.ts.map +1 -0
- package/dist/managers/tool/tool-manager.d.ts +4 -4
- package/dist/managers/tool/tool-manager.d.ts.map +1 -1
- package/dist/mediator/index.d.ts +2 -2
- package/dist/mediator/index.d.ts.map +1 -1
- package/dist/middlewares/exception-middleware.d.ts +7 -2
- package/dist/middlewares/exception-middleware.d.ts.map +1 -1
- package/dist/middlewares/index.d.ts +2 -0
- package/dist/middlewares/index.d.ts.map +1 -0
- package/dist/modules/controls-module.d.ts +11 -9
- package/dist/modules/controls-module.d.ts.map +1 -1
- package/dist/modules/gizmo-module.d.ts +2 -4
- package/dist/modules/gizmo-module.d.ts.map +1 -1
- package/dist/modules/index.d.ts +6 -0
- package/dist/modules/index.d.ts.map +1 -0
- package/dist/modules/raycast-module.d.ts +4 -8
- package/dist/modules/raycast-module.d.ts.map +1 -1
- package/dist/modules/scene-module.d.ts +2 -3
- package/dist/modules/scene-module.d.ts.map +1 -1
- package/dist/modules/scene-preview-module.d.ts +26 -0
- package/dist/modules/scene-preview-module.d.ts.map +1 -0
- package/dist/policy/index.d.ts +2 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/tool-policy.d.ts +1 -1
- package/dist/policy/tool-policy.d.ts.map +1 -1
- package/dist/store/editor-store.d.ts +33 -0
- package/dist/store/editor-store.d.ts.map +1 -0
- package/dist/store/export-store.d.ts +12 -0
- package/dist/store/export-store.d.ts.map +1 -0
- package/dist/store/index.d.ts +2 -35
- package/dist/store/index.d.ts.map +1 -1
- package/dist/types/camera/index.d.ts +2 -0
- package/dist/types/camera/index.d.ts.map +1 -0
- package/dist/types/event/index.d.ts +2 -0
- package/dist/types/event/index.d.ts.map +1 -0
- package/dist/types/feature/index.d.ts +2 -0
- package/dist/types/feature/index.d.ts.map +1 -0
- package/dist/types/listener/index.d.ts +3 -0
- package/dist/types/listener/index.d.ts.map +1 -0
- package/dist/types/select/index.d.ts +2 -0
- package/dist/types/select/index.d.ts.map +1 -0
- package/dist/utils/default-renderer-config.d.ts +9 -0
- package/dist/utils/default-renderer-config.d.ts.map +1 -0
- package/dist/utils/helpers.d.ts +14 -1
- package/dist/utils/helpers.d.ts.map +1 -1
- package/dist/utils/index.d.ts +3 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/validators/index.d.ts +2 -0
- package/dist/validators/index.d.ts.map +1 -0
- package/dist/validators/obj-validator.d.ts +12 -0
- package/dist/validators/obj-validator.d.ts.map +1 -0
- package/package.json +2 -2
- package/dist/hub/app-hub.d.ts +0 -13
- package/dist/hub/app-hub.d.ts.map +0 -1
- package/dist/interfaces/controller/controller.d.ts.map +0 -1
- package/dist/interfaces/response/index.d.ts +0 -22
- package/dist/interfaces/response/index.d.ts.map +0 -1
- package/dist/types/response/response-type.d.ts +0 -19
- 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
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
},
|
|
13
|
-
let
|
|
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
|
-
* @
|
|
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
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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
|
|
785
|
+
const s = t.split(`
|
|
184
786
|
`);
|
|
185
|
-
for (const i of
|
|
787
|
+
for (const i of s) {
|
|
186
788
|
if (!i.trim() || i.startsWith("#")) continue;
|
|
187
|
-
const
|
|
188
|
-
switch (
|
|
789
|
+
const n = i.trim().split(/\s+/);
|
|
790
|
+
switch (n[0]) {
|
|
189
791
|
case "v":
|
|
190
|
-
this._tmpPositions.push(
|
|
792
|
+
this._tmpPositions.push(n.slice(1).map(Number));
|
|
191
793
|
break;
|
|
192
794
|
case "vn":
|
|
193
|
-
this._tmpNormals.push(
|
|
795
|
+
this._tmpNormals.push(n.slice(1).map(Number));
|
|
194
796
|
break;
|
|
195
797
|
case "vt":
|
|
196
|
-
this._tmpUVs.push(
|
|
798
|
+
this._tmpUVs.push(n.slice(1).map(Number));
|
|
197
799
|
break;
|
|
198
800
|
case "f":
|
|
199
|
-
this.processFaceLine(
|
|
801
|
+
this.processFaceLine(n);
|
|
200
802
|
break;
|
|
201
803
|
}
|
|
202
804
|
}
|
|
203
|
-
const
|
|
204
|
-
type:
|
|
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
|
|
811
|
+
return new Qt(r);
|
|
210
812
|
}
|
|
211
813
|
/**
|
|
212
814
|
* Обрабатывает строку face (f) и разворачивает индексы в массивы для рендеринга
|
|
213
815
|
*/
|
|
214
816
|
processFaceLine(t) {
|
|
215
|
-
for (let
|
|
216
|
-
const
|
|
217
|
-
if (!
|
|
218
|
-
const [i,
|
|
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
|
|
221
|
-
|
|
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
|
|
229
|
-
|
|
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
|
|
235
|
-
for (var i =
|
|
236
|
-
(
|
|
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
|
-
},
|
|
239
|
-
let
|
|
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,
|
|
252
|
-
this._updatable = e, this._renderable = t, this._runtime =
|
|
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
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
],
|
|
300
|
-
var
|
|
301
|
-
for (var i =
|
|
302
|
-
(
|
|
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
|
-
},
|
|
305
|
-
let
|
|
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
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
],
|
|
330
|
-
var
|
|
331
|
-
for (var i =
|
|
332
|
-
(
|
|
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
|
-
},
|
|
335
|
-
let
|
|
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
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
],
|
|
348
|
-
var
|
|
349
|
-
for (var i =
|
|
350
|
-
(
|
|
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
|
-
},
|
|
353
|
-
let
|
|
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
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
],
|
|
375
|
-
var
|
|
376
|
-
for (var i =
|
|
377
|
-
(
|
|
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
|
-
},
|
|
380
|
-
let
|
|
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
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
],
|
|
398
|
-
var
|
|
399
|
-
for (var i =
|
|
400
|
-
(
|
|
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
|
-
},
|
|
403
|
-
let
|
|
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
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
],
|
|
418
|
-
var
|
|
419
|
-
for (var i =
|
|
420
|
-
(
|
|
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
|
-
},
|
|
423
|
-
let
|
|
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
|
|
438
|
-
|
|
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
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
],
|
|
466
|
-
var
|
|
467
|
-
for (var i =
|
|
468
|
-
(
|
|
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
|
-
},
|
|
471
|
-
let
|
|
472
|
-
constructor(e, t,
|
|
473
|
-
this._cameraApi = e, this._domApi = t, this._sceneApi =
|
|
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
|
|
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",
|
|
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
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
],
|
|
537
|
-
var
|
|
538
|
-
for (var i =
|
|
539
|
-
(
|
|
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
|
-
},
|
|
542
|
-
let
|
|
543
|
-
constructor(e, t,
|
|
544
|
-
this._cameraApi = e, this._domApi = t, this._rendererApi =
|
|
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
|
|
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
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
],
|
|
572
|
-
var
|
|
573
|
-
|
|
574
|
-
|
|
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
|
-
}
|
|
579
|
-
let
|
|
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
|
-
*
|
|
1194
|
+
* Внутренний эмиттер событий Node.js.
|
|
585
1195
|
*
|
|
586
1196
|
* @private
|
|
587
1197
|
* @member
|
|
588
1198
|
*/
|
|
589
|
-
|
|
1199
|
+
_emitter;
|
|
1200
|
+
/** @constructor */
|
|
1201
|
+
constructor() {
|
|
1202
|
+
this._emitter = new ns();
|
|
1203
|
+
}
|
|
590
1204
|
/**
|
|
591
|
-
*
|
|
1205
|
+
* Публикует событие в шину.
|
|
592
1206
|
*
|
|
593
|
-
* @
|
|
594
|
-
* @
|
|
595
|
-
*/
|
|
596
|
-
_mouse;
|
|
597
|
-
/**
|
|
598
|
-
* Ключ последней модели, на которую наводились,
|
|
599
|
-
* необходим для отправки только уникальных событий в event bus
|
|
1207
|
+
* @param event - название события (из `EventTopics`)
|
|
1208
|
+
* @param payload - данные события (тип зависит от события)
|
|
600
1209
|
*
|
|
601
|
-
* @
|
|
602
|
-
*
|
|
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
|
-
*
|
|
1326
|
+
* Текущий режим для raycaster
|
|
607
1327
|
*
|
|
608
1328
|
* @private
|
|
609
1329
|
* @member
|
|
610
1330
|
*/
|
|
611
|
-
_currentRaycastMode =
|
|
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
|
|
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
|
|
632
|
-
case
|
|
633
|
-
e.layers.set(
|
|
1351
|
+
case P.Mesh:
|
|
1352
|
+
case P.Face:
|
|
1353
|
+
e.layers.set(z);
|
|
634
1354
|
break;
|
|
635
|
-
case
|
|
636
|
-
e.layers.set(
|
|
1355
|
+
case P.Edge:
|
|
1356
|
+
e.layers.set(Ct), e.params.Line.threshold = fs;
|
|
637
1357
|
break;
|
|
638
|
-
case
|
|
639
|
-
e.layers.set(
|
|
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(),
|
|
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
|
|
648
|
-
this._mouse.x = (e.clientX -
|
|
649
|
-
const
|
|
650
|
-
if (this._currentRaycastMode ===
|
|
651
|
-
return
|
|
1367
|
+
const n = s.getBoundingClientRect();
|
|
1368
|
+
this._mouse.x = (e.clientX - n.left) / n.width * 2 - 1, this._mouse.y = -((e.clientY - n.top) / n.height) * 2 + 1, this._raycaster.setFromCamera(this._mouse, r);
|
|
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(
|
|
654
|
-
const
|
|
655
|
-
return this._raycaster.layers.mask = c, this._getVisibleHit(
|
|
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,
|
|
661
|
-
const
|
|
662
|
-
if (
|
|
663
|
-
const
|
|
664
|
-
if (
|
|
665
|
-
if (!
|
|
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
|
|
670
|
-
|
|
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
|
-
|
|
1393
|
+
r && this._bus.emit(t, { intersection: r });
|
|
674
1394
|
}
|
|
675
1395
|
/** Поиск видимой части меша
|
|
676
1396
|
* необходимо это для того, чтобы отправлять только видимые элементы модели, а не все попадания
|
|
677
1397
|
*/
|
|
678
|
-
_getVisibleHit(e, t,
|
|
679
|
-
return e ? t ? e.distance <= t.distance +
|
|
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
|
|
1406
|
+
case P.Face:
|
|
687
1407
|
return `${t}:face:${e.faceIndex ?? -1}`;
|
|
688
|
-
case
|
|
1408
|
+
case P.Edge:
|
|
689
1409
|
return `${t}:edge:${Math.floor((e.index ?? -1) / 2)}`;
|
|
690
|
-
case
|
|
1410
|
+
case P.Vertex:
|
|
691
1411
|
return `${t}:vertex:${e.index ?? -1}`;
|
|
692
|
-
case
|
|
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,
|
|
1419
|
+
this._processRaycastEvent(e, k.SelectHover, !0);
|
|
700
1420
|
};
|
|
701
1421
|
/** Обработчик события на click */
|
|
702
1422
|
_handleMouseClick = (e) => {
|
|
703
|
-
this._processRaycastEvent(e,
|
|
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(
|
|
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(
|
|
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
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
],
|
|
735
|
-
var
|
|
736
|
-
for (var i =
|
|
737
|
-
(
|
|
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
|
-
},
|
|
740
|
-
let
|
|
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
|
|
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
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
],
|
|
784
|
-
var
|
|
785
|
-
for (var i =
|
|
786
|
-
(
|
|
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
|
-
},
|
|
789
|
-
let
|
|
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((
|
|
1556
|
+
this._store = t, this._handlers = new Map(e.map((s) => [s.mode, s]));
|
|
792
1557
|
}
|
|
793
1558
|
/** Текущий режим отображения */
|
|
794
|
-
_currentMode =
|
|
1559
|
+
_currentMode = K.Plane;
|
|
795
1560
|
/** Хендлеры, которые управляют отображением */
|
|
796
1561
|
_handlers;
|
|
797
1562
|
/** Тип фичи, за которую отвечает менеджер. */
|
|
798
|
-
type =
|
|
1563
|
+
type = E.Display;
|
|
799
1564
|
/** Установка режима отображения */
|
|
800
1565
|
manage(e) {
|
|
801
|
-
e !== this._currentMode && (this._handlers.get(this._currentMode)?.rollback(), e !==
|
|
1566
|
+
e !== this._currentMode && (this._handlers.get(this._currentMode)?.rollback(), e !== K.Plane && this._handlers.get(e)?.handle(), this._currentMode = e, this._store.setDisplayMode(this._currentMode));
|
|
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 =
|
|
1599
|
+
this._handlers && this._handlers.clear(), this._currentMode = T.AddFigure;
|
|
806
1600
|
}
|
|
807
1601
|
};
|
|
808
|
-
pe =
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
Re(1, l("EditorStore"))
|
|
1602
|
+
pe = dr([
|
|
1603
|
+
w(),
|
|
1604
|
+
ur(0, B("ISceneHandler"))
|
|
812
1605
|
], pe);
|
|
813
|
-
var
|
|
814
|
-
for (var i =
|
|
815
|
-
(
|
|
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
|
-
},
|
|
818
|
-
let
|
|
819
|
-
constructor(e, t,
|
|
820
|
-
this._eventBus = e, this._store =
|
|
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 =
|
|
1616
|
+
_currentMode = P.Mesh;
|
|
824
1617
|
/** Хендлеры, которые управляют выборкой */
|
|
825
1618
|
_handlers;
|
|
826
1619
|
/** Тип фичи, за которую отвечает менеджер. */
|
|
827
|
-
type =
|
|
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,
|
|
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,
|
|
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(
|
|
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
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
],
|
|
851
|
-
const
|
|
852
|
-
const i =
|
|
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
|
|
856
|
-
return e(this).check(...
|
|
857
|
-
},
|
|
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
|
|
860
|
-
for (var i =
|
|
861
|
-
(
|
|
862
|
-
return
|
|
863
|
-
},
|
|
864
|
-
let
|
|
865
|
-
constructor(e, t,
|
|
866
|
-
this._store = t, this._policy =
|
|
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 =
|
|
1671
|
+
_currentTool = U.Translate;
|
|
872
1672
|
/** Хендлеры, которые управляют инструментами */
|
|
873
1673
|
_handlers;
|
|
874
1674
|
/** Событие обновления выбора объекта */
|
|
875
1675
|
_unsubSelected;
|
|
876
1676
|
/** Тип фичи, за которую отвечает менеджер. */
|
|
877
|
-
type =
|
|
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 =
|
|
1683
|
+
this._unsubSelected?.(), this._handlers && this._handlers.clear(), this._currentTool = U.Translate, this._store.setToolType(this._currentTool);
|
|
884
1684
|
}
|
|
885
1685
|
};
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
],
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
],
|
|
895
|
-
var
|
|
896
|
-
for (var i =
|
|
897
|
-
(
|
|
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
|
-
},
|
|
928
|
-
let
|
|
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 =
|
|
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
|
|
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
|
|
946
|
-
for (const
|
|
947
|
-
t.traverse((
|
|
948
|
-
if (
|
|
949
|
-
const i =
|
|
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
|
|
952
|
-
this._prevColorLines.set(
|
|
1723
|
+
const o = i.material;
|
|
1724
|
+
this._prevColorLines.set(o, o.color.clone());
|
|
953
1725
|
}
|
|
954
|
-
const
|
|
955
|
-
|
|
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
|
|
967
|
-
|
|
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
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
],
|
|
988
|
-
|
|
989
|
-
var
|
|
990
|
-
|
|
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
|
-
},
|
|
994
|
-
let
|
|
995
|
-
constructor(e, t) {
|
|
996
|
-
this.
|
|
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 =
|
|
1000
|
-
/**
|
|
1001
|
-
|
|
1002
|
-
/**
|
|
1003
|
-
|
|
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 =
|
|
1007
|
-
/** Цвет
|
|
1008
|
-
_selectColor =
|
|
1009
|
-
/**
|
|
1010
|
-
_origLineColors = /* @__PURE__ */ new WeakMap();
|
|
1780
|
+
/** Цвет ребра, на которое навелись */
|
|
1781
|
+
_hoverColor = Me;
|
|
1782
|
+
/** Цвет выделенного ребра */
|
|
1783
|
+
_selectColor = xe;
|
|
1784
|
+
/** Обработка текущего режима выборки. */
|
|
1011
1785
|
handle(e, t) {
|
|
1012
|
-
if (this.
|
|
1786
|
+
if (this._raycastApi.setRaycastMode(this.mode), t === F.Hover) {
|
|
1013
1787
|
if (!e) {
|
|
1014
|
-
this.
|
|
1788
|
+
this._hoverLine.visible = !1, this._hovered = null;
|
|
1015
1789
|
return;
|
|
1016
1790
|
}
|
|
1017
|
-
const
|
|
1018
|
-
|
|
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 ===
|
|
1798
|
+
if (t === F.Click) {
|
|
1021
1799
|
if (!e) {
|
|
1022
|
-
this.
|
|
1800
|
+
this._selectLine.visible = !1, this._selected = null, this._store.setSelectedObject(null);
|
|
1023
1801
|
return;
|
|
1024
1802
|
}
|
|
1025
|
-
const
|
|
1026
|
-
|
|
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.
|
|
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
|
-
*
|
|
1818
|
+
/** Инициализация буферных линий для режима (hover и click).
|
|
1819
|
+
* На весь режим будет использовано 2 глобальных линии на сцене,
|
|
1820
|
+
* использоваться они будут только для обозначения геометрии ребер конкретной фигуры.
|
|
1038
1821
|
*/
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
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
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
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 =
|
|
1920
|
+
_hoverColor = Me;
|
|
1096
1921
|
/** Цвет выделенной граней */
|
|
1097
|
-
_selectColor =
|
|
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 ===
|
|
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
|
|
1111
|
-
if (!
|
|
1112
|
-
const
|
|
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
|
|
1115
|
-
if (!
|
|
1116
|
-
this._selected && this._same(
|
|
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 ===
|
|
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
|
|
1125
|
-
if (!
|
|
1126
|
-
const
|
|
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
|
|
1129
|
-
if (!
|
|
1130
|
-
this._writeWorldFaceGroup(this._selectFace,
|
|
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
|
|
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:
|
|
1978
|
+
side: l.DoubleSide,
|
|
1154
1979
|
polygonOffset: !0,
|
|
1155
1980
|
polygonOffsetFactor: -1,
|
|
1156
1981
|
polygonOffsetUnits: -1
|
|
1157
|
-
}),
|
|
1158
|
-
return
|
|
1159
|
-
},
|
|
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
|
|
1167
|
-
if (!
|
|
1168
|
-
const i =
|
|
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
|
|
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: [
|
|
1176
|
-
proxyVertexMap: [
|
|
2000
|
+
vertexIndices: [b, C, M],
|
|
2001
|
+
proxyVertexMap: [b, C, M]
|
|
1177
2002
|
};
|
|
1178
2003
|
}
|
|
1179
|
-
const
|
|
1180
|
-
if (t < 0 || t >=
|
|
1181
|
-
const
|
|
1182
|
-
for (;
|
|
1183
|
-
const
|
|
1184
|
-
if (
|
|
1185
|
-
|
|
1186
|
-
const [
|
|
1187
|
-
if (!
|
|
1188
|
-
|
|
1189
|
-
const
|
|
1190
|
-
if (
|
|
1191
|
-
for (const
|
|
1192
|
-
|
|
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
|
-
|
|
1195
|
-
const
|
|
1196
|
-
for (const
|
|
1197
|
-
const [
|
|
1198
|
-
|
|
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:
|
|
1204
|
-
vertexIndices: Array.from(
|
|
1205
|
-
proxyVertexMap:
|
|
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
|
|
1211
|
-
let
|
|
1212
|
-
for (const
|
|
1213
|
-
let
|
|
1214
|
-
i ? [
|
|
1215
|
-
const g = this._readVertex(
|
|
1216
|
-
o
|
|
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
|
|
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((
|
|
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:
|
|
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:
|
|
1235
|
-
lines:
|
|
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,
|
|
1245
|
-
if (!
|
|
1246
|
-
const
|
|
1247
|
-
for (let i = 0; i <
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
for (let i = 0; i <
|
|
1251
|
-
|
|
1252
|
-
|
|
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,
|
|
1256
|
-
const i = t <
|
|
1257
|
-
|
|
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
|
|
1262
|
-
for (let c = 0; c <
|
|
1263
|
-
const [
|
|
1264
|
-
this._pushEdge(
|
|
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 (
|
|
1276
|
-
n.set(c,
|
|
1277
|
-
|
|
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
|
|
2110
|
+
return new l.Vector3(e.getX(t), e.getY(t), e.getZ(t));
|
|
1286
2111
|
}
|
|
1287
2112
|
/** Построение ключа вершины по позиции */
|
|
1288
|
-
_vertexKey(e, t,
|
|
1289
|
-
const
|
|
1290
|
-
return `${
|
|
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
|
|
2123
|
+
const s = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
|
|
1299
2124
|
let i = 0;
|
|
1300
|
-
for (let
|
|
1301
|
-
const
|
|
1302
|
-
if (
|
|
1303
|
-
const c = this._vertexKey(t,
|
|
1304
|
-
let
|
|
1305
|
-
|
|
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
|
|
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
|
|
1315
|
-
for (const g of
|
|
1316
|
-
const
|
|
1317
|
-
for (let
|
|
1318
|
-
i.fromBufferAttribute(
|
|
1319
|
-
const
|
|
1320
|
-
|
|
1321
|
-
for (const
|
|
1322
|
-
c.set(
|
|
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
|
|
1327
|
-
|
|
2151
|
+
const f = c.get(g);
|
|
2152
|
+
u.push(f ?? -1);
|
|
1328
2153
|
}
|
|
1329
|
-
const
|
|
1330
|
-
vertexIndexGroups:
|
|
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
|
|
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
|
|
1343
|
-
for (const
|
|
1344
|
-
const g = this._readVertex(
|
|
1345
|
-
for (let
|
|
1346
|
-
c.fromBufferAttribute(
|
|
1347
|
-
|
|
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
|
|
2174
|
+
return m;
|
|
1350
2175
|
}
|
|
1351
2176
|
};
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
],
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
/**
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
/**
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
1382
|
-
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
|
|
1389
|
-
|
|
1390
|
-
|
|
1391
|
-
|
|
1392
|
-
|
|
1393
|
-
|
|
1394
|
-
|
|
1395
|
-
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
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
|
-
*
|
|
1402
|
-
* @returns Сфера радиусом 0.5, 32 сегмента по ширине, 16 по высоте
|
|
2232
|
+
* Перекрасить рёбра меша и запомнить оригинальный цвет (один раз на LineSegments).
|
|
1403
2233
|
*/
|
|
1404
|
-
|
|
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
|
-
*
|
|
2244
|
+
* Восстановить исходный цвет рёбер меша из WeakMap.
|
|
2245
|
+
* Если исходный цвет не сохранён (на всякий случай) — ничего не меняем.
|
|
1408
2246
|
*/
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
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
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
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
|
-
},
|
|
1453
|
-
let
|
|
1454
|
-
constructor(e, t,
|
|
1455
|
-
this._cameraApi = e, this._sceneApi = t, this._raycastApi =
|
|
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 =
|
|
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 =
|
|
2284
|
+
_hoverColor = Me;
|
|
1468
2285
|
/** Цвет выделенного ребра */
|
|
1469
|
-
_selectColor =
|
|
2286
|
+
_selectColor = xe;
|
|
1470
2287
|
handle(e, t) {
|
|
1471
|
-
if (this._raycastApi.setRaycastMode(this.mode), t ===
|
|
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
|
|
1477
|
-
if (!
|
|
1478
|
-
const
|
|
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:
|
|
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 ===
|
|
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
|
|
1489
|
-
if (!
|
|
1490
|
-
const
|
|
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,
|
|
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 =
|
|
1503
|
-
const
|
|
1504
|
-
|
|
1505
|
-
const
|
|
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
|
|
2330
|
+
}), i = new l.Points(s, r);
|
|
1514
2331
|
return i.renderOrder = 1e3, i.raycast = () => {
|
|
1515
|
-
}, i.layers.set(
|
|
2332
|
+
}, i.layers.set($), i.visible = !1, i;
|
|
1516
2333
|
}
|
|
1517
2334
|
/** Локальную вершину points переводим в world и пишем в target (прокси-точку) */
|
|
1518
|
-
_writeWorldVertex(e, t,
|
|
1519
|
-
const
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1523
|
-
).applyMatrix4(t.matrixWorld),
|
|
1524
|
-
|
|
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
|
|
1532
|
-
if (!
|
|
1533
|
-
const
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
).applyMatrix4(e.matrixWorld),
|
|
1538
|
-
for (let
|
|
1539
|
-
|
|
1540
|
-
const
|
|
1541
|
-
let
|
|
1542
|
-
if (
|
|
1543
|
-
const
|
|
1544
|
-
for (let
|
|
1545
|
-
|
|
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:
|
|
2367
|
+
mesh: s,
|
|
1551
2368
|
vertexIndices: g,
|
|
1552
|
-
lines:
|
|
1553
|
-
edgeVertexIndices:
|
|
2369
|
+
lines: f ?? null,
|
|
2370
|
+
edgeVertexIndices: h
|
|
1554
2371
|
};
|
|
1555
2372
|
}
|
|
1556
2373
|
/** Центрует прокси-вершину на выбранной точке */
|
|
1557
|
-
_centerVertexOnPoint(e, t,
|
|
1558
|
-
const
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
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
|
|
1565
|
-
let
|
|
1566
|
-
(!
|
|
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
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
],
|
|
1576
|
-
class
|
|
1577
|
-
constructor(t,
|
|
1578
|
-
this.api = t, this.store =
|
|
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
|
|
1604
|
-
for (var i =
|
|
1605
|
-
(
|
|
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
|
-
},
|
|
1608
|
-
let
|
|
2424
|
+
}, mt = (e, t) => (s, r) => t(s, r, e);
|
|
2425
|
+
let Ne = class extends tt {
|
|
1609
2426
|
/** Инструмент, которым управляет хендлер, нужен только менеджеру */
|
|
1610
|
-
mode =
|
|
2427
|
+
mode = U.Rotate;
|
|
1611
2428
|
constructor(e, t) {
|
|
1612
2429
|
super(e, t);
|
|
1613
2430
|
}
|
|
1614
2431
|
};
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
],
|
|
1620
|
-
var
|
|
1621
|
-
for (var i =
|
|
1622
|
-
(
|
|
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
|
-
},
|
|
1625
|
-
let
|
|
2441
|
+
}, gt = (e, t) => (s, r) => t(s, r, e);
|
|
2442
|
+
let Xe = class extends tt {
|
|
1626
2443
|
/** Инструмент, которым управляет хендлер, нужен только менеджеру */
|
|
1627
|
-
mode =
|
|
2444
|
+
mode = U.Scale;
|
|
1628
2445
|
constructor(e, t) {
|
|
1629
2446
|
super(e, t);
|
|
1630
2447
|
}
|
|
1631
2448
|
};
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
],
|
|
1637
|
-
var
|
|
1638
|
-
for (var i =
|
|
1639
|
-
(
|
|
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
|
-
},
|
|
1642
|
-
let
|
|
2458
|
+
}, ft = (e, t) => (s, r) => t(s, r, e);
|
|
2459
|
+
let Ye = class extends tt {
|
|
1643
2460
|
/** Инструмент, которым управляет хендлер, нужен только менеджеру */
|
|
1644
|
-
mode =
|
|
2461
|
+
mode = U.Translate;
|
|
1645
2462
|
constructor(e, t) {
|
|
1646
2463
|
super(e, t);
|
|
1647
2464
|
}
|
|
1648
2465
|
};
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
],
|
|
1654
|
-
var
|
|
1655
|
-
for (var i =
|
|
1656
|
-
(
|
|
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
|
-
},
|
|
1659
|
-
let
|
|
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 =
|
|
2481
|
+
mode = T.AddFigure;
|
|
1800
2482
|
/** Последняя добавленная фигура, нужно для отката через `ctrl + z`. */
|
|
1801
2483
|
_lastAddedMesh = null;
|
|
1802
2484
|
/** Добавление базовых фигур на сцену, которые приписаны в `FigureType`. */
|
|
1803
2485
|
handle(e) {
|
|
1804
|
-
const t =
|
|
1805
|
-
|
|
1806
|
-
const
|
|
1807
|
-
|
|
1808
|
-
const i = t.index ? t.toNonIndexed() : t,
|
|
1809
|
-
|
|
1810
|
-
const
|
|
1811
|
-
|
|
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
|
-
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
],
|
|
1826
|
-
var
|
|
1827
|
-
for (var i =
|
|
1828
|
-
(
|
|
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
|
-
},
|
|
1831
|
-
let
|
|
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 =
|
|
2518
|
+
mode = T.DeleteFigure;
|
|
1837
2519
|
/** Последняя удаленная фигура, сохраняем для отката через `ctrl + z` */
|
|
1838
2520
|
_lastDeletedMesh = null;
|
|
1839
2521
|
handle() {
|
|
1840
2522
|
const e = this._store.getSelectedObject();
|
|
1841
|
-
|
|
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
|
-
|
|
1853
|
-
|
|
1854
|
-
|
|
1855
|
-
|
|
1856
|
-
],
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
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
|
-
},
|
|
1862
|
-
let
|
|
1863
|
-
constructor(e, t
|
|
1864
|
-
this.
|
|
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
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
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
|
-
|
|
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:
|
|
2737
|
+
type: E.Display,
|
|
1875
2738
|
payload: [e]
|
|
1876
2739
|
});
|
|
1877
2740
|
}
|
|
1878
2741
|
setSelectMode(e) {
|
|
1879
2742
|
return this._mediator.send({
|
|
1880
|
-
type:
|
|
2743
|
+
type: E.Select,
|
|
1881
2744
|
payload: [e]
|
|
1882
2745
|
});
|
|
1883
2746
|
}
|
|
1884
2747
|
setToolMode(e) {
|
|
1885
2748
|
return this._mediator.send({
|
|
1886
|
-
type:
|
|
2749
|
+
type: E.Tool,
|
|
1887
2750
|
payload: [e]
|
|
1888
2751
|
});
|
|
1889
2752
|
}
|
|
1890
|
-
addFigure(e
|
|
2753
|
+
addFigure(e) {
|
|
1891
2754
|
return this._mediator.send({
|
|
1892
|
-
type:
|
|
1893
|
-
payload: [
|
|
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
|
-
}),
|
|
2808
|
+
}), s = this._store.onSelectedTransformChange(() => {
|
|
1919
2809
|
e();
|
|
1920
2810
|
});
|
|
1921
2811
|
return () => {
|
|
1922
|
-
t(),
|
|
2812
|
+
t(), s();
|
|
1923
2813
|
};
|
|
1924
2814
|
}
|
|
1925
2815
|
dispose() {
|
|
1926
2816
|
this._mediator.dispose();
|
|
1927
2817
|
}
|
|
1928
2818
|
};
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
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
|
|
2832
|
+
let Ke = class {
|
|
2049
2833
|
/** Текущий режим выборки. */
|
|
2050
|
-
_selectMode =
|
|
2834
|
+
_selectMode = P.Mesh;
|
|
2051
2835
|
/** Текущий выбранный инструмент. */
|
|
2052
|
-
_toolType =
|
|
2836
|
+
_toolType = U.Translate;
|
|
2053
2837
|
/** Выбранный режим отображения. */
|
|
2054
|
-
_displayMode =
|
|
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
|
-
|
|
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 ?
|
|
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
|
-
|
|
2106
|
-
|
|
2107
|
-
],
|
|
2108
|
-
|
|
2109
|
-
|
|
2110
|
-
constructor(
|
|
2111
|
-
|
|
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
|
-
|
|
2116
|
-
|
|
2117
|
-
(
|
|
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
|
-
},
|
|
2120
|
-
let
|
|
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 (!
|
|
2127
|
-
throw new
|
|
2128
|
-
G.
|
|
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
|
-
|
|
2135
|
-
|
|
2136
|
-
|
|
2137
|
-
],
|
|
2138
|
-
|
|
2139
|
-
|
|
2140
|
-
|
|
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
|
|
2986
|
+
let ve = class {
|
|
2144
2987
|
handle(e) {
|
|
2145
2988
|
try {
|
|
2146
2989
|
return e();
|
|
2147
2990
|
} catch (t) {
|
|
2148
|
-
return t instanceof
|
|
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
|
-
|
|
2168
|
-
|
|
2169
|
-
],
|
|
2170
|
-
var
|
|
2171
|
-
for (var i =
|
|
2172
|
-
(
|
|
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
|
-
},
|
|
2175
|
-
let
|
|
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((
|
|
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
|
|
2190
|
-
return this._middlewares.reduceRight((i,
|
|
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
|
-
|
|
2197
|
-
|
|
2198
|
-
|
|
2199
|
-
|
|
2200
|
-
],
|
|
2201
|
-
|
|
2202
|
-
|
|
2203
|
-
|
|
2204
|
-
return
|
|
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
|
|
2207
|
-
const
|
|
2208
|
-
if (!
|
|
2209
|
-
throw new Error("EditorHub is not initialized. Call
|
|
2210
|
-
return
|
|
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
|
-
|
|
2214
|
-
|
|
2215
|
-
|
|
2216
|
-
|
|
2217
|
-
|
|
2218
|
-
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
|
|
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
|
};
|