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