@vived/app 2.44.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/ObservableEntityRepo.d.ts +6 -0
- package/lib/Entities/ObservableEntityRepo.js +20 -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,69 +1,29 @@
|
|
|
1
1
|
import { Quaternion, Vector3 } from "../ValueObjects";
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import { ObservableEntity } from "./ObservableEntity";
|
|
3
|
+
import { SceneObject } from "./SceneObject";
|
|
4
|
+
import { EaseFn } from "./TransformNode";
|
|
5
|
+
export declare const SCENE_ROOT_ID = "scene-root";
|
|
4
6
|
export interface DefaultSceneRootData {
|
|
5
7
|
position: [number, number, number];
|
|
6
8
|
rotation: [number, number, number, number];
|
|
7
9
|
scale: number;
|
|
8
|
-
id: string;
|
|
9
10
|
minScale: number;
|
|
10
11
|
maxScale: number;
|
|
11
12
|
}
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
*/
|
|
28
|
-
minScale: number;
|
|
29
|
-
/**
|
|
30
|
-
* The maximum scale allowed for the scene root
|
|
31
|
-
*/
|
|
32
|
-
maxScale: number;
|
|
33
|
-
/**
|
|
34
|
-
* The identifier for the scene root
|
|
35
|
-
*/
|
|
36
|
-
id: string;
|
|
37
|
-
/**
|
|
38
|
-
* Transform node for the scene root
|
|
39
|
-
*/
|
|
40
|
-
transform: TransformNode;
|
|
41
|
-
/**
|
|
42
|
-
* Applies the default data to this entity. This will not trigger a notification
|
|
43
|
-
*/
|
|
44
|
-
applyDefaultData: (data: DefaultSceneRootData) => void;
|
|
45
|
-
/**
|
|
46
|
-
* Smoothly moves the transform so that the point is a the world origin
|
|
47
|
-
* @param point The point to center on in world coordinates
|
|
48
|
-
* @param durationMS The duration of the transition in milliseconds
|
|
49
|
-
* @param easeFn The easing funciton
|
|
50
|
-
* @param onCompleted An optional callback function when the ease is completed
|
|
51
|
-
*/
|
|
52
|
-
centerOnPoint: (point: Vector3, durationMS: number, easeFn: EaseFn, onCompleted?: () => void) => void;
|
|
53
|
-
/**
|
|
54
|
-
* Smoothly moves the transform so that it is back in the default pose
|
|
55
|
-
* @param durationMS The duration of the transition in milliseconds
|
|
56
|
-
* @param easeFn The easing funciton
|
|
57
|
-
* @param onCompleted An optional callback function when the ease is completed
|
|
58
|
-
*/
|
|
59
|
-
lerpToDefault: (durationMS: number, easeFn: EaseFn, onCompleted?: () => void) => void;
|
|
60
|
-
/**
|
|
61
|
-
* Bumps the scale of the root by a specific amount. Note this will enforce the min and max limits
|
|
62
|
-
* @param amount The world amount to bump the scale by. It will be applied uniformly
|
|
63
|
-
* @param worldPoint The world position about which to apply the scaling
|
|
64
|
-
*/
|
|
65
|
-
bumpScaleAboutPoint: (amount: number, worldPoint: Vector3) => void;
|
|
66
|
-
addObserver: (observer: OnSceneRootChange) => void;
|
|
67
|
-
removeObserver: (observer: OnSceneRootChange) => void;
|
|
13
|
+
export declare abstract class SceneRoot extends ObservableEntity {
|
|
14
|
+
abstract defaultPosition: Vector3;
|
|
15
|
+
abstract defaultRoation: Quaternion;
|
|
16
|
+
abstract defaultScale: number;
|
|
17
|
+
abstract minScale: number;
|
|
18
|
+
abstract maxScale: number;
|
|
19
|
+
abstract id: string;
|
|
20
|
+
abstract sceneObject: SceneObject | undefined;
|
|
21
|
+
abstract position: Vector3;
|
|
22
|
+
abstract rotation: Quaternion;
|
|
23
|
+
abstract scale: number;
|
|
24
|
+
abstract applyDefaultData: (data: DefaultSceneRootData) => void;
|
|
25
|
+
abstract centerOnPoint: (point: Vector3, durationMS: number, easeFn: EaseFn, onCompleted?: () => void) => void;
|
|
26
|
+
abstract lerpToDefault: (durationMS: number, easeFn: EaseFn, onCompleted?: () => void) => void;
|
|
27
|
+
abstract bumpScaleAboutPoint: (amount: number, worldPoint: Vector3) => void;
|
|
68
28
|
}
|
|
69
29
|
export declare function makeSceneRoot(): SceneRoot;
|
|
@@ -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>;
|