@vived/app 2.45.0 → 2.46.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/lib/Entities/ModelMesh.d.ts +53 -0
- package/lib/Entities/ModelMesh.js +106 -0
- package/lib/Entities/SceneModel.d.ts +7 -7
- package/lib/Entities/SceneModel.js +16 -14
- package/lib/Entities/SceneModelMesh.d.ts +65 -0
- package/lib/Entities/SceneModelMesh.js +159 -0
- package/lib/Entities/SceneObject.d.ts +1 -4
- package/lib/Entities/SceneObject.js +0 -17
- package/lib/Entities/SceneRoot.d.ts +19 -59
- package/lib/Entities/SceneRoot.js +94 -26
- package/lib/Entities/index.d.ts +1 -1
- package/lib/Entities/index.js +1 -1
- package/lib/PresentationManagers/SceneObject/SceneObjectPM.d.ts +17 -0
- package/lib/PresentationManagers/SceneObject/SceneObjectPM.js +40 -0
- package/lib/PresentationManagers/SceneObject/index.d.ts +1 -0
- package/lib/PresentationManagers/SceneObject/index.js +13 -0
- package/lib/PresentationManagers/index.d.ts +1 -0
- package/lib/PresentationManagers/index.js +1 -0
- package/lib/UseCases/SceneModel/PeelSceneMeshBase.d.ts +20 -0
- package/lib/UseCases/SceneModel/PeelSceneMeshBase.js +66 -0
- package/lib/UseCases/SceneModel/SerializeActiveModel.d.ts +18 -0
- package/lib/UseCases/SceneModel/SerializeActiveModel.js +74 -0
- package/lib/UseCases/SceneModel/SetMeshesEnabledHook.d.ts +7 -0
- package/lib/UseCases/SceneModel/SetMeshesEnabledHook.js +22 -0
- package/lib/UseCases/SceneModel/index.d.ts +4 -2
- package/lib/UseCases/SceneModel/index.js +3 -1
- package/lib/UseCases/SceneModel/loadNewModel.d.ts +2 -0
- package/lib/UseCases/SceneModel/loadNewModel.js +84 -0
- package/lib/UseCases/SceneModel/setActiveSceneModel.js +4 -3
- package/lib/UseCases/SceneModel/setupSceneModelFromData.d.ts +2 -0
- package/lib/UseCases/SceneModel/setupSceneModelFromData.js +72 -0
- package/lib/UseCases/SceneObjects/PeelSceneObject.d.ts +18 -0
- package/lib/UseCases/SceneObjects/PeelSceneObject.js +61 -0
- package/lib/UseCases/SceneObjects/index.d.ts +1 -0
- package/lib/UseCases/SceneObjects/index.js +13 -0
- package/lib/UseCases/SceneRoot/SerializeSceneRoot.d.ts +15 -0
- package/lib/UseCases/SceneRoot/SerializeSceneRoot.js +26 -7
- package/lib/UseCases/SceneRoot/index.d.ts +1 -0
- package/lib/UseCases/SceneRoot/index.js +1 -0
- package/lib/UseCases/SceneRoot/initializeSceneRoot.d.ts +2 -0
- package/lib/UseCases/SceneRoot/initializeSceneRoot.js +9 -0
- package/lib/UseCases/SceneRoot/setupSceneRoot.d.ts +2 -0
- package/lib/UseCases/SceneRoot/setupSceneRoot.js +11 -0
- package/lib/UseCases/index.d.ts +1 -1
- package/lib/UseCases/index.js +1 -1
- package/lib/ValueObjects/Vector3.d.ts +7 -10
- package/lib/ValueObjects/Vector3.js +1 -0
- package/package.json +1 -1
|
@@ -1,37 +1,46 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.makeSceneRoot = void 0;
|
|
3
|
+
exports.makeSceneRoot = exports.SceneRoot = exports.SCENE_ROOT_ID = void 0;
|
|
4
4
|
const ValueObjects_1 = require("../ValueObjects");
|
|
5
|
-
const
|
|
6
|
-
|
|
5
|
+
const ObservableEntity_1 = require("./ObservableEntity");
|
|
6
|
+
exports.SCENE_ROOT_ID = "scene-root";
|
|
7
|
+
class SceneRoot extends ObservableEntity_1.ObservableEntity {
|
|
8
|
+
}
|
|
9
|
+
exports.SceneRoot = SceneRoot;
|
|
7
10
|
function makeSceneRoot() {
|
|
8
11
|
return new SceneRootImp();
|
|
9
12
|
}
|
|
10
13
|
exports.makeSceneRoot = makeSceneRoot;
|
|
11
|
-
class SceneRootImp {
|
|
14
|
+
class SceneRootImp extends SceneRoot {
|
|
12
15
|
constructor() {
|
|
13
|
-
|
|
16
|
+
super(...arguments);
|
|
14
17
|
this._defaultPosition = ValueObjects_1.Vector3.Zero();
|
|
15
18
|
this._defaultRoation = ValueObjects_1.Quaternion.Identity();
|
|
16
|
-
this._defaultScale =
|
|
19
|
+
this._defaultScale = 1;
|
|
17
20
|
this._minScale = 0.01;
|
|
18
21
|
this._maxScale = 10;
|
|
19
|
-
this._id = "scene_root";
|
|
20
22
|
this.applyDefaultData = (data) => {
|
|
21
23
|
this._defaultPosition = ValueObjects_1.Vector3.FromArray(data.position);
|
|
22
24
|
this._defaultRoation = ValueObjects_1.Quaternion.FromArray(data.rotation);
|
|
23
|
-
this._defaultScale =
|
|
25
|
+
this._defaultScale = data.scale;
|
|
24
26
|
this._maxScale = data.maxScale;
|
|
25
27
|
this._minScale = data.minScale;
|
|
26
|
-
this._id = data.id;
|
|
27
28
|
};
|
|
28
29
|
this.centerOnPoint = (point, durationMS, easeFn, onCompleted) => {
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
if (!this.sceneObject) {
|
|
31
|
+
console.warn("SceneRoot does not have a scene object");
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const finalPosition = ValueObjects_1.Vector3.Subtract(this.sceneObject.transform.worldPosition, point);
|
|
35
|
+
this.sceneObject.transform.lerp(durationMS, easeFn, finalPosition, undefined, undefined, onCompleted);
|
|
31
36
|
};
|
|
32
37
|
this.bumpScaleAboutPoint = (amount, worldPoint) => {
|
|
33
|
-
|
|
34
|
-
|
|
38
|
+
if (!this.sceneObject) {
|
|
39
|
+
console.warn("SceneRoot does not have a scene object");
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const localPickOffset = this.sceneObject.transform.worldPointToLocal(worldPoint);
|
|
43
|
+
const currentScale = this.sceneObject.transform.worldScale.x;
|
|
35
44
|
let newScale = currentScale + amount;
|
|
36
45
|
if (newScale < this.minScale) {
|
|
37
46
|
newScale = this.minScale;
|
|
@@ -39,22 +48,81 @@ class SceneRootImp {
|
|
|
39
48
|
else if (newScale > this.maxScale) {
|
|
40
49
|
newScale = this.maxScale;
|
|
41
50
|
}
|
|
42
|
-
this.transform.worldScale = new ValueObjects_1.Vector3(newScale, newScale, newScale);
|
|
43
|
-
const worldPickOffset = this.transform.localPointToWorld(localPickOffset);
|
|
51
|
+
this.sceneObject.transform.worldScale = new ValueObjects_1.Vector3(newScale, newScale, newScale);
|
|
52
|
+
const worldPickOffset = this.sceneObject.transform.localPointToWorld(localPickOffset);
|
|
44
53
|
const bump = ValueObjects_1.Vector3.Subtract(worldPoint, worldPickOffset);
|
|
45
|
-
this.transform.worldPosition = ValueObjects_1.Vector3.Add(bump, this.transform.worldPosition);
|
|
54
|
+
this.sceneObject.transform.worldPosition = ValueObjects_1.Vector3.Add(bump, this.sceneObject.transform.worldPosition);
|
|
46
55
|
};
|
|
47
56
|
this.lerpToDefault = (durationMS, easeFn, onCompleted) => {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
this.removeObserver = (observer) => {
|
|
54
|
-
this.observers.remove(observer);
|
|
57
|
+
if (!this.sceneObject) {
|
|
58
|
+
console.warn("SceneRoot does not have a scene object");
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this.sceneObject.transform.lerp(durationMS, easeFn, this.defaultPosition, this.defaultRoation, new ValueObjects_1.Vector3(this.defaultScale, this.defaultScale, this.defaultScale), onCompleted);
|
|
55
62
|
};
|
|
56
|
-
|
|
57
|
-
|
|
63
|
+
}
|
|
64
|
+
get position() {
|
|
65
|
+
if (this.sceneObject) {
|
|
66
|
+
return this.sceneObject.transform.localPosition;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
console.warn("SceneRoot does not have a scene object");
|
|
70
|
+
return ValueObjects_1.Vector3.Zero();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
set position(p) {
|
|
74
|
+
if (this.sceneObject) {
|
|
75
|
+
this.sceneObject.transform.localPosition = p;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
console.warn("SceneRoot does not have a scene object");
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
get rotation() {
|
|
82
|
+
if (this.sceneObject) {
|
|
83
|
+
return this.sceneObject.transform.localRotation;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
console.warn("SceneRoot does not have a scene object");
|
|
87
|
+
return ValueObjects_1.Quaternion.Identity();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
set rotation(r) {
|
|
91
|
+
if (this.sceneObject) {
|
|
92
|
+
this.sceneObject.transform.localRotation = r;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
console.warn("SceneRoot does not have a scene object");
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
get scale() {
|
|
99
|
+
if (this.sceneObject) {
|
|
100
|
+
return this.sceneObject.transform.localScale.x;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
console.warn("SceneRoot does not have a scene object");
|
|
104
|
+
return 1;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
set scale(s) {
|
|
108
|
+
if (this.sceneObject) {
|
|
109
|
+
this.sceneObject.transform.localScale = new ValueObjects_1.Vector3(s, s, s);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
console.warn("SceneRoot does not have a scene object");
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
get sceneObject() {
|
|
116
|
+
return this._sceneObject;
|
|
117
|
+
}
|
|
118
|
+
set sceneObject(so) {
|
|
119
|
+
if (this._sceneObject) {
|
|
120
|
+
this._sceneObject.removeObserver(this.notify);
|
|
121
|
+
}
|
|
122
|
+
this._sceneObject = so;
|
|
123
|
+
if (this._sceneObject) {
|
|
124
|
+
this._sceneObject.addObserver(this.notify);
|
|
125
|
+
}
|
|
58
126
|
}
|
|
59
127
|
get defaultPosition() {
|
|
60
128
|
return this._defaultPosition;
|
|
@@ -72,6 +140,6 @@ class SceneRootImp {
|
|
|
72
140
|
return this._maxScale;
|
|
73
141
|
}
|
|
74
142
|
get id() {
|
|
75
|
-
return
|
|
143
|
+
return exports.SCENE_ROOT_ID;
|
|
76
144
|
}
|
|
77
145
|
}
|
package/lib/Entities/index.d.ts
CHANGED
|
@@ -22,7 +22,7 @@ export * from "./ObserverList";
|
|
|
22
22
|
export * from "./QuestionChallenge";
|
|
23
23
|
export * from "./QuestionChallengeAnswer";
|
|
24
24
|
export * from "./SceneModel";
|
|
25
|
-
export * from "./
|
|
25
|
+
export * from "./SceneModelMesh";
|
|
26
26
|
export * from "./SceneModelRepo";
|
|
27
27
|
export * from "./SceneObject";
|
|
28
28
|
export * from "./SceneObjectsRepo";
|
package/lib/Entities/index.js
CHANGED
|
@@ -34,7 +34,7 @@ __exportStar(require("./ObserverList"), exports);
|
|
|
34
34
|
__exportStar(require("./QuestionChallenge"), exports);
|
|
35
35
|
__exportStar(require("./QuestionChallengeAnswer"), exports);
|
|
36
36
|
__exportStar(require("./SceneModel"), exports);
|
|
37
|
-
__exportStar(require("./
|
|
37
|
+
__exportStar(require("./SceneModelMesh"), exports);
|
|
38
38
|
__exportStar(require("./SceneModelRepo"), exports);
|
|
39
39
|
__exportStar(require("./SceneObject"), exports);
|
|
40
40
|
__exportStar(require("./SceneObjectsRepo"), exports);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { SceneObject } from "../../Entities";
|
|
2
|
+
import { Quaternion, Vector3 } from "../../ValueObjects";
|
|
3
|
+
import { PresentionManager } from "../PresentationManager";
|
|
4
|
+
export interface SceneObjectVM {
|
|
5
|
+
position: Vector3;
|
|
6
|
+
rotation: Quaternion;
|
|
7
|
+
scale: Vector3;
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare class SceneObjectPM extends PresentionManager {
|
|
11
|
+
private sceneObject;
|
|
12
|
+
private updateView;
|
|
13
|
+
private lastVM?;
|
|
14
|
+
doUpdateView: () => void;
|
|
15
|
+
private vmHasChanged;
|
|
16
|
+
constructor(sceneObject: SceneObject, updateView: (vm: SceneObjectVM) => void);
|
|
17
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SceneObjectPM = void 0;
|
|
4
|
+
const ValueObjects_1 = require("../../ValueObjects");
|
|
5
|
+
const PresentationManager_1 = require("../PresentationManager");
|
|
6
|
+
class SceneObjectPM extends PresentationManager_1.PresentionManager {
|
|
7
|
+
constructor(sceneObject, updateView) {
|
|
8
|
+
super(sceneObject);
|
|
9
|
+
this.sceneObject = sceneObject;
|
|
10
|
+
this.updateView = updateView;
|
|
11
|
+
this.doUpdateView = () => {
|
|
12
|
+
const enabled = this.sceneObject.shown && this.sceneObject.enabled;
|
|
13
|
+
const vm = {
|
|
14
|
+
position: this.sceneObject.transform.localPosition,
|
|
15
|
+
rotation: this.sceneObject.transform.localRotation,
|
|
16
|
+
scale: this.sceneObject.transform.localScale,
|
|
17
|
+
enabled,
|
|
18
|
+
};
|
|
19
|
+
if (this.vmHasChanged(vm)) {
|
|
20
|
+
this.updateView(vm);
|
|
21
|
+
this.lastVM = vm;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
this.doUpdateView();
|
|
25
|
+
}
|
|
26
|
+
vmHasChanged(newVM) {
|
|
27
|
+
if (this.lastVM === undefined)
|
|
28
|
+
return true;
|
|
29
|
+
if (this.lastVM.enabled !== newVM.enabled)
|
|
30
|
+
return true;
|
|
31
|
+
if (!ValueObjects_1.Vector3.Equal(this.lastVM.position, newVM.position))
|
|
32
|
+
return true;
|
|
33
|
+
if (!ValueObjects_1.Vector3.Equal(this.lastVM.scale, newVM.scale))
|
|
34
|
+
return true;
|
|
35
|
+
if (!ValueObjects_1.Quaternion.Close(this.lastVM.rotation, newVM.rotation))
|
|
36
|
+
return true;
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.SceneObjectPM = SceneObjectPM;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./SceneObjectPM";
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
__exportStar(require("./SceneObjectPM"), exports);
|
|
@@ -6,6 +6,7 @@ export * from "./ShowBabylonInspectorPM";
|
|
|
6
6
|
export * from "./HasRedoPM";
|
|
7
7
|
export * from "./HasUndoPM";
|
|
8
8
|
export * from "./QuestionChallenge";
|
|
9
|
+
export * from "./SceneObject";
|
|
9
10
|
export * from "./ToolPM";
|
|
10
11
|
export * from "./TransformNodePM";
|
|
11
12
|
export * from "./HoverLabels";
|
|
@@ -18,6 +18,7 @@ __exportStar(require("./ShowBabylonInspectorPM"), exports);
|
|
|
18
18
|
__exportStar(require("./HasRedoPM"), exports);
|
|
19
19
|
__exportStar(require("./HasUndoPM"), exports);
|
|
20
20
|
__exportStar(require("./QuestionChallenge"), exports);
|
|
21
|
+
__exportStar(require("./SceneObject"), exports);
|
|
21
22
|
__exportStar(require("./ToolPM"), exports);
|
|
22
23
|
__exportStar(require("./TransformNodePM"), exports);
|
|
23
24
|
__exportStar(require("./HoverLabels"), exports);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Babylon, SceneModelRepo, TransformNode } from "../../Entities";
|
|
2
|
+
import { ParametricLine } from "../../ValueObjects";
|
|
3
|
+
export declare class PeelSceneMeshBase {
|
|
4
|
+
private babylon;
|
|
5
|
+
private sceneModelRepo;
|
|
6
|
+
get peeledSceneObjectID(): string | undefined;
|
|
7
|
+
private _sceneObject;
|
|
8
|
+
private _didPeel;
|
|
9
|
+
get didPeel(): boolean;
|
|
10
|
+
private _doPeel;
|
|
11
|
+
private _transformToPeel;
|
|
12
|
+
get peelingTransform(): TransformNode | undefined;
|
|
13
|
+
private _rootPos;
|
|
14
|
+
private _peelPlane;
|
|
15
|
+
private _pickOffset;
|
|
16
|
+
tryInitializePeel: (pickRay: ParametricLine) => void;
|
|
17
|
+
updatePeel: (pickRay: ParametricLine) => void;
|
|
18
|
+
stopPeel: () => void;
|
|
19
|
+
constructor(babylon: Babylon, sceneModelRepo: SceneModelRepo);
|
|
20
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PeelSceneMeshBase = void 0;
|
|
4
|
+
const ValueObjects_1 = require("../../ValueObjects");
|
|
5
|
+
class PeelSceneMeshBase {
|
|
6
|
+
constructor(babylon, sceneModelRepo) {
|
|
7
|
+
this.babylon = babylon;
|
|
8
|
+
this.sceneModelRepo = sceneModelRepo;
|
|
9
|
+
this._didPeel = false;
|
|
10
|
+
this._doPeel = false;
|
|
11
|
+
this._transformToPeel = undefined;
|
|
12
|
+
this._peelPlane = ValueObjects_1.ParametricPlane.XY();
|
|
13
|
+
this._pickOffset = ValueObjects_1.Vector3.Zero();
|
|
14
|
+
this.tryInitializePeel = (pickRay) => {
|
|
15
|
+
var _a, _b, _c, _d;
|
|
16
|
+
this._doPeel = false;
|
|
17
|
+
this._didPeel = false;
|
|
18
|
+
this._transformToPeel = undefined;
|
|
19
|
+
const sceneObjectID = this.babylon.sceneObjectRayPick(pickRay);
|
|
20
|
+
if (!sceneObjectID)
|
|
21
|
+
return;
|
|
22
|
+
const sceneObject = (_b = (_a = this.sceneModelRepo.activeModel) === null || _a === void 0 ? void 0 : _a.getMeshById(sceneObjectID)) === null || _b === void 0 ? void 0 : _b.sceneObject;
|
|
23
|
+
if (!sceneObject)
|
|
24
|
+
return;
|
|
25
|
+
this._sceneObject = sceneObject;
|
|
26
|
+
this._transformToPeel = sceneObject.transform;
|
|
27
|
+
const scenePick = this.babylon.sceneRayPick(pickRay);
|
|
28
|
+
if (!scenePick)
|
|
29
|
+
return;
|
|
30
|
+
const pickPlaneDirection = ValueObjects_1.Vector3.Backward();
|
|
31
|
+
const planePickPos = (_c = scenePick.worldPickPoint) !== null && _c !== void 0 ? _c : ValueObjects_1.Vector3.Zero();
|
|
32
|
+
this._peelPlane = ValueObjects_1.ParametricPlane.FromPointNormal(planePickPos, pickPlaneDirection);
|
|
33
|
+
const pick = (_d = this._peelPlane.intersectLine(pickRay)) !== null && _d !== void 0 ? _d : ValueObjects_1.Vector3.Zero();
|
|
34
|
+
this._rootPos = this._transformToPeel.worldPosition;
|
|
35
|
+
this._pickOffset = ValueObjects_1.Vector3.Subtract(this._rootPos, pick);
|
|
36
|
+
this._doPeel = true;
|
|
37
|
+
};
|
|
38
|
+
this.updatePeel = (pickRay) => {
|
|
39
|
+
var _a;
|
|
40
|
+
if (!this._doPeel)
|
|
41
|
+
return;
|
|
42
|
+
if (!this._transformToPeel)
|
|
43
|
+
return;
|
|
44
|
+
const pick = (_a = this._peelPlane.intersectLine(pickRay)) !== null && _a !== void 0 ? _a : ValueObjects_1.Vector3.Zero();
|
|
45
|
+
this._transformToPeel.worldPosition = ValueObjects_1.Vector3.Add(pick, this._pickOffset);
|
|
46
|
+
this._didPeel = true;
|
|
47
|
+
};
|
|
48
|
+
this.stopPeel = () => {
|
|
49
|
+
this._doPeel = false;
|
|
50
|
+
this._didPeel = false;
|
|
51
|
+
this._transformToPeel = undefined;
|
|
52
|
+
this._rootPos = undefined;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
get peeledSceneObjectID() {
|
|
56
|
+
var _a;
|
|
57
|
+
return (_a = this._sceneObject) === null || _a === void 0 ? void 0 : _a.id;
|
|
58
|
+
}
|
|
59
|
+
get didPeel() {
|
|
60
|
+
return this._didPeel;
|
|
61
|
+
}
|
|
62
|
+
get peelingTransform() {
|
|
63
|
+
return this._transformToPeel;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
exports.PeelSceneMeshBase = PeelSceneMeshBase;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { StateMachine, SceneModelMeshStateDTO, SerializedSystem, SceneModelRepo } from "../../Entities";
|
|
2
|
+
export declare class SerializeActiveModel implements SerializedSystem {
|
|
3
|
+
private sceneModelRepo;
|
|
4
|
+
private easeFn;
|
|
5
|
+
name: string;
|
|
6
|
+
seriliziationVersion: number;
|
|
7
|
+
loadNewModel: (modelID: string, initialStateLookup: Map<string, SceneModelMeshStateDTO>) => void;
|
|
8
|
+
selectActiveModel: () => void;
|
|
9
|
+
getSystemState(): object;
|
|
10
|
+
applySystemState(state: object, version: number, transitionDurationSec: number): void;
|
|
11
|
+
private applyStateV1;
|
|
12
|
+
applyDefaultState: () => void;
|
|
13
|
+
constructor(sceneModelRepo: SceneModelRepo, easeFn: (normalizedTime: number) => number, stateMachine: StateMachine);
|
|
14
|
+
}
|
|
15
|
+
export interface SerializedActiveModelV1 {
|
|
16
|
+
modelID: string;
|
|
17
|
+
meshModelStates: SceneModelMeshStateDTO[];
|
|
18
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SerializeActiveModel = void 0;
|
|
4
|
+
const ValueObjects_1 = require("../../ValueObjects");
|
|
5
|
+
class SerializeActiveModel {
|
|
6
|
+
constructor(sceneModelRepo, easeFn, stateMachine) {
|
|
7
|
+
this.sceneModelRepo = sceneModelRepo;
|
|
8
|
+
this.easeFn = easeFn;
|
|
9
|
+
this.name = "active-model";
|
|
10
|
+
this.seriliziationVersion = 1;
|
|
11
|
+
this.loadNewModel = () => {
|
|
12
|
+
throw new Error("setActiveModel has not been injected into SerializeActiveModel serializer");
|
|
13
|
+
};
|
|
14
|
+
this.selectActiveModel = () => {
|
|
15
|
+
throw new Error("selectActiveModel has not been injected into SerializeActiveModel serializer");
|
|
16
|
+
};
|
|
17
|
+
this.applyDefaultState = () => {
|
|
18
|
+
this.selectActiveModel();
|
|
19
|
+
};
|
|
20
|
+
stateMachine.registerSerializedSystem(this);
|
|
21
|
+
}
|
|
22
|
+
getSystemState() {
|
|
23
|
+
const modelStates = [];
|
|
24
|
+
if (this.sceneModelRepo.activeModel) {
|
|
25
|
+
this.sceneModelRepo.activeModel.getAllMeshes().forEach((mesh) => {
|
|
26
|
+
const meshState = mesh.getState();
|
|
27
|
+
if (meshState !== null) {
|
|
28
|
+
modelStates.push(meshState);
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
const state = {
|
|
33
|
+
modelID: this.sceneModelRepo.activeModelID,
|
|
34
|
+
meshModelStates: modelStates,
|
|
35
|
+
};
|
|
36
|
+
return state;
|
|
37
|
+
}
|
|
38
|
+
applySystemState(state, version, transitionDurationSec) {
|
|
39
|
+
if (version === 1) {
|
|
40
|
+
this.applyStateV1(state, transitionDurationSec);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
this.applyDefaultState();
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
applyStateV1(state, transitionDurationSec) {
|
|
47
|
+
const { meshModelStates, modelID } = state;
|
|
48
|
+
if (meshModelStates === undefined || modelID === undefined) {
|
|
49
|
+
console.warn("[SerializeActiveModel] Unable to parse state: ", JSON.stringify(state));
|
|
50
|
+
this.applyDefaultState();
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const stateLookup = new Map();
|
|
54
|
+
meshModelStates.forEach((mmState) => {
|
|
55
|
+
stateLookup.set(mmState.id, mmState);
|
|
56
|
+
});
|
|
57
|
+
const existingModel = this.sceneModelRepo.get(modelID);
|
|
58
|
+
if (existingModel) {
|
|
59
|
+
this.sceneModelRepo.activeModelID = modelID;
|
|
60
|
+
existingModel.getAllMeshes().forEach((meshModel) => {
|
|
61
|
+
const mmState = stateLookup.get(meshModel.id);
|
|
62
|
+
const pos = mmState
|
|
63
|
+
? ValueObjects_1.Vector3.FromDTO(mmState.position)
|
|
64
|
+
: ValueObjects_1.Vector3.Zero();
|
|
65
|
+
meshModel.moveTo(pos, transitionDurationSec * 1000, this.easeFn);
|
|
66
|
+
meshModel.shown = mmState ? mmState.shown : true;
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
this.loadNewModel(modelID, stateLookup);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
exports.SerializeActiveModel = SerializeActiveModel;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SetMeshesEnabledHook = void 0;
|
|
4
|
+
class SetMeshesEnabledHook {
|
|
5
|
+
constructor(sceneModelRepo) {
|
|
6
|
+
this.sceneModelRepo = sceneModelRepo;
|
|
7
|
+
this.onSceneModelRepoChange = () => {
|
|
8
|
+
if (this.lastActiveModelID === this.sceneModelRepo.activeModelID)
|
|
9
|
+
return;
|
|
10
|
+
this.lastActiveModelID = this.sceneModelRepo.activeModelID;
|
|
11
|
+
this.sceneModelRepo.getAll().forEach((sceneModel) => {
|
|
12
|
+
const enabled = sceneModel.id === this.sceneModelRepo.activeModelID;
|
|
13
|
+
sceneModel.getAllMeshes().forEach((mesh) => {
|
|
14
|
+
if (mesh.sceneObject)
|
|
15
|
+
mesh.sceneObject.enabled = enabled;
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
sceneModelRepo.addObserver(this.onSceneModelRepoChange);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.SetMeshesEnabledHook = SetMeshesEnabledHook;
|
|
@@ -11,4 +11,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
11
11
|
};
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
13
|
__exportStar(require("./modelDataLoader"), exports);
|
|
14
|
-
__exportStar(require("./
|
|
14
|
+
__exportStar(require("./loadNewModel"), exports);
|
|
15
|
+
__exportStar(require("./SerializeActiveModel"), exports);
|
|
16
|
+
__exportStar(require("./SetMeshesEnabledHook"), exports);
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { AppDispatcher, SceneModel, SceneModelMeshStateDTO, SceneModelRepo, SceneObjectsRepo, SceneRoot } from "../../Entities";
|
|
2
|
+
export declare function makeLoadNewModel(sceneModelRepo: SceneModelRepo, sceneObjectRepo: SceneObjectsRepo, sceneRoot: SceneRoot, appDispatcher: AppDispatcher): (modelID: string, initialStateLookup: Map<string, SceneModelMeshStateDTO>) => Promise<SceneModel>;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.makeLoadNewModel = void 0;
|
|
13
|
+
const Entities_1 = require("../../Entities");
|
|
14
|
+
const ValueObjects_1 = require("../../ValueObjects");
|
|
15
|
+
function makeLoadNewModel(sceneModelRepo, sceneObjectRepo, sceneRoot, appDispatcher) {
|
|
16
|
+
return function loadNewModel(modelID, initialStateLookup) {
|
|
17
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
18
|
+
let sceneModel = sceneModelRepo.get(modelID);
|
|
19
|
+
if (sceneModel === undefined) {
|
|
20
|
+
sceneModel = Entities_1.makeSceneModel(modelID);
|
|
21
|
+
sceneModelRepo.add(modelID, sceneModel);
|
|
22
|
+
}
|
|
23
|
+
sceneModelRepo.activeModelID = modelID;
|
|
24
|
+
if (sceneModel.state === Entities_1.SceneModelState.LOADING) {
|
|
25
|
+
return Promise.resolve(sceneModel);
|
|
26
|
+
}
|
|
27
|
+
if (sceneModel.state === Entities_1.SceneModelState.READY) {
|
|
28
|
+
return Promise.resolve(sceneModel);
|
|
29
|
+
}
|
|
30
|
+
sceneModel.error = undefined;
|
|
31
|
+
sceneModel.state = Entities_1.SceneModelState.LOADING;
|
|
32
|
+
sceneModelRepo.isLoadingSceneModel = true;
|
|
33
|
+
const dto = {
|
|
34
|
+
title: "Loading active model and data",
|
|
35
|
+
message: "Loading...",
|
|
36
|
+
};
|
|
37
|
+
const closeSpinner = yield appDispatcher.showSpinner(dto);
|
|
38
|
+
try {
|
|
39
|
+
const dataDTO = yield sceneModelRepo.dataLoader(modelID);
|
|
40
|
+
sceneModel.applyData(dataDTO);
|
|
41
|
+
sceneModel.getAllMeshes().forEach((meshObject) => {
|
|
42
|
+
var _a;
|
|
43
|
+
let so = sceneObjectRepo.get(meshObject.id);
|
|
44
|
+
if (!so) {
|
|
45
|
+
so = Entities_1.makeSceneObject(meshObject.id);
|
|
46
|
+
sceneObjectRepo.add(meshObject.id, so);
|
|
47
|
+
}
|
|
48
|
+
so.transform.parent = (_a = sceneRoot.sceneObject) === null || _a === void 0 ? void 0 : _a.transform;
|
|
49
|
+
meshObject.sceneObject = so;
|
|
50
|
+
const initialState = initialStateLookup.get(meshObject.id);
|
|
51
|
+
meshObject.position = initialState
|
|
52
|
+
? ValueObjects_1.Vector3.FromDTO(initialState.position)
|
|
53
|
+
: ValueObjects_1.Vector3.Zero();
|
|
54
|
+
meshObject.shown = initialState ? initialState.shown : true;
|
|
55
|
+
so.transform.localRotation = ValueObjects_1.Quaternion.Identity();
|
|
56
|
+
so.transform.localScale = ValueObjects_1.Vector3.One();
|
|
57
|
+
});
|
|
58
|
+
yield sceneModelRepo.modelLoader(modelID);
|
|
59
|
+
sceneModel.state = Entities_1.SceneModelState.READY;
|
|
60
|
+
sceneModelRepo.isLoadingSceneModel = false;
|
|
61
|
+
closeSpinner();
|
|
62
|
+
return Promise.resolve(sceneModel);
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
const error = e;
|
|
66
|
+
sceneModelRepo.isLoadingSceneModel = false;
|
|
67
|
+
sceneModelRepo.clearActiveModel();
|
|
68
|
+
sceneModel.error = error;
|
|
69
|
+
closeSpinner();
|
|
70
|
+
const alertDTO = {
|
|
71
|
+
title: "Load Error",
|
|
72
|
+
message: `Failed to Load the Model and Data. Error message: ${error.message}`,
|
|
73
|
+
closeButtonLabel: "OK",
|
|
74
|
+
closeCallback: () => {
|
|
75
|
+
// nada
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
appDispatcher.showAlert(alertDTO);
|
|
79
|
+
return Promise.reject(error);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
exports.makeLoadNewModel = makeLoadNewModel;
|
|
@@ -38,14 +38,15 @@ function makeSetActiveModel(sceneModelRepo, sceneObjectRepo, sceneRoot, appDispa
|
|
|
38
38
|
try {
|
|
39
39
|
const dataDTO = yield sceneModelRepo.dataLoader(modelID);
|
|
40
40
|
sceneModel.applyData(dataDTO);
|
|
41
|
-
sceneModel.
|
|
41
|
+
sceneModel.getAllMeshes().forEach((meshObject) => {
|
|
42
|
+
var _a;
|
|
42
43
|
let so = sceneObjectRepo.get(meshObject.id);
|
|
43
44
|
if (!so) {
|
|
44
45
|
so = Entities_1.makeSceneObject(meshObject.id);
|
|
45
46
|
sceneObjectRepo.add(meshObject.id, so);
|
|
46
47
|
}
|
|
47
48
|
so.label = meshObject.label;
|
|
48
|
-
so.transform.parent = sceneRoot.transform;
|
|
49
|
+
so.transform.parent = (_a = sceneRoot.sceneObject) === null || _a === void 0 ? void 0 : _a.transform;
|
|
49
50
|
so.notify();
|
|
50
51
|
});
|
|
51
52
|
yield sceneModelRepo.modelLoader(modelID);
|
|
@@ -79,7 +80,7 @@ exports.makeSetActiveModel = makeSetActiveModel;
|
|
|
79
80
|
function setSceneObjectsEnabled(sceneObjectRepo, activeModel) {
|
|
80
81
|
const allSOs = sceneObjectRepo.getAll();
|
|
81
82
|
allSOs.forEach(so => {
|
|
82
|
-
if (activeModel.
|
|
83
|
+
if (activeModel.hasMesh(so.id)) {
|
|
83
84
|
so.enabled = true;
|
|
84
85
|
}
|
|
85
86
|
else {
|