@vived/app 2.40.1 → 2.42.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/AppDispatcher.d.ts +1 -1
- package/lib/Entities/AppDispatcher.js +3 -2
- package/lib/Entities/MemoizedQuaternion.d.ts +9 -0
- package/lib/Entities/MemoizedQuaternion.js +23 -0
- package/lib/Entities/ObservableEntityRepo.d.ts +14 -0
- package/lib/Entities/ObservableEntityRepo.js +60 -0
- package/lib/Entities/SceneModel.d.ts +85 -0
- package/lib/Entities/SceneModel.js +200 -0
- package/lib/Entities/SceneModelObject.d.ts +40 -0
- package/lib/Entities/SceneModelObject.js +77 -0
- package/lib/Entities/SceneModelRepo.d.ts +11 -0
- package/lib/Entities/SceneModelRepo.js +48 -0
- package/lib/Entities/SceneObject.d.ts +23 -0
- package/lib/Entities/SceneObject.js +36 -0
- package/lib/Entities/SceneObjectsRepo.d.ts +9 -0
- package/lib/Entities/SceneObjectsRepo.js +38 -0
- package/lib/Entities/index.d.ts +14 -9
- package/lib/Entities/index.js +14 -9
- package/lib/ValueObjects/Quaternion.d.ts +20 -0
- package/lib/ValueObjects/Quaternion.js +14 -0
- package/lib/ValueObjects/Vector2.d.ts +16 -0
- package/lib/ValueObjects/Vector2.js +14 -0
- package/lib/ValueObjects/Vector3.d.ts +18 -0
- package/lib/ValueObjects/Vector3.js +14 -0
- package/package.json +1 -1
- package/lib/Entities/MeshModel.d.ts +0 -68
- package/lib/Entities/MeshModel.js +0 -174
- package/lib/Entities/ModelObject.d.ts +0 -10
- package/lib/Entities/ModelObject.js +0 -42
|
@@ -34,7 +34,7 @@ export interface SpinnerDTO {
|
|
|
34
34
|
export declare abstract class AppDispatcher {
|
|
35
35
|
abstract registerHostHandler: (hostHandler: Handler) => void;
|
|
36
36
|
abstract dispatch: (request: Request) => void;
|
|
37
|
-
abstract stateHasChanged: (state: object, validationErrorMessage?: string) => void;
|
|
37
|
+
abstract stateHasChanged: (state: object, assets: string[], validationErrorMessage?: string) => void;
|
|
38
38
|
abstract stateIsCompleted: () => void;
|
|
39
39
|
abstract goToPreviousState: () => void;
|
|
40
40
|
abstract goToNextState: () => void;
|
|
@@ -21,12 +21,13 @@ class AppDistpatcherImp extends AppDispatcher {
|
|
|
21
21
|
}
|
|
22
22
|
this.hostHandler(request);
|
|
23
23
|
};
|
|
24
|
-
this.stateHasChanged = (stateObject, validationErrorMessage) => {
|
|
24
|
+
this.stateHasChanged = (stateObject, assets, validationErrorMessage) => {
|
|
25
25
|
const payload = {
|
|
26
26
|
stateObject,
|
|
27
|
+
assets,
|
|
27
28
|
validationErrorMessage,
|
|
28
29
|
};
|
|
29
|
-
this.formRequestAndDispatch("ON_STATE_CHANGE",
|
|
30
|
+
this.formRequestAndDispatch("ON_STATE_CHANGE", 3, payload);
|
|
30
31
|
};
|
|
31
32
|
this.stateIsCompleted = () => {
|
|
32
33
|
this.formRequestAndDispatch("ON_STATE_COMPLETED", 1);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Quaternion } from "../ValueObjects";
|
|
2
|
+
export declare class MemoizedQuaternion {
|
|
3
|
+
private _val;
|
|
4
|
+
get val(): Quaternion;
|
|
5
|
+
set val(v: Quaternion);
|
|
6
|
+
setValQuietly(val: Quaternion): void;
|
|
7
|
+
private onChangeCallback;
|
|
8
|
+
constructor(initialValue: Quaternion, onChangeCallback: () => void);
|
|
9
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MemoizedQuaternion = void 0;
|
|
4
|
+
const ValueObjects_1 = require("../ValueObjects");
|
|
5
|
+
class MemoizedQuaternion {
|
|
6
|
+
constructor(initialValue, onChangeCallback) {
|
|
7
|
+
this._val = initialValue;
|
|
8
|
+
this.onChangeCallback = onChangeCallback;
|
|
9
|
+
}
|
|
10
|
+
get val() {
|
|
11
|
+
return this._val;
|
|
12
|
+
}
|
|
13
|
+
set val(v) {
|
|
14
|
+
if (ValueObjects_1.Quaternion.Equal(v, this._val))
|
|
15
|
+
return;
|
|
16
|
+
this._val = v;
|
|
17
|
+
this.onChangeCallback();
|
|
18
|
+
}
|
|
19
|
+
setValQuietly(val) {
|
|
20
|
+
this._val = val;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.MemoizedQuaternion = MemoizedQuaternion;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ObservableEntity } from "./ObservableEntity";
|
|
2
|
+
export declare class ObservableEntityRepo<T extends ObservableEntity> extends ObservableEntity {
|
|
3
|
+
private entityLookup;
|
|
4
|
+
has: (id: string) => boolean;
|
|
5
|
+
add: (id: string, entity: T) => void;
|
|
6
|
+
remove: (id: string) => void;
|
|
7
|
+
clear: () => void;
|
|
8
|
+
get: (id: string) => T | undefined;
|
|
9
|
+
getAll: () => T[];
|
|
10
|
+
set: (entities: {
|
|
11
|
+
id: string;
|
|
12
|
+
entity: T;
|
|
13
|
+
}[]) => void;
|
|
14
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ObservableEntityRepo = void 0;
|
|
4
|
+
const ObservableEntity_1 = require("./ObservableEntity");
|
|
5
|
+
class ObservableEntityRepo extends ObservableEntity_1.ObservableEntity {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(...arguments);
|
|
8
|
+
this.entityLookup = new Map();
|
|
9
|
+
this.has = (id) => {
|
|
10
|
+
return this.entityLookup.has(id);
|
|
11
|
+
};
|
|
12
|
+
this.add = (id, entity) => {
|
|
13
|
+
const existing = this.entityLookup.get(id);
|
|
14
|
+
if (existing) {
|
|
15
|
+
existing.removeObserver(this.notify);
|
|
16
|
+
}
|
|
17
|
+
this.entityLookup.set(id, entity);
|
|
18
|
+
entity.addObserver(this.notify);
|
|
19
|
+
this.notify();
|
|
20
|
+
};
|
|
21
|
+
this.remove = (id) => {
|
|
22
|
+
const existing = this.entityLookup.get(id);
|
|
23
|
+
if (!existing)
|
|
24
|
+
return;
|
|
25
|
+
this.entityLookup.delete(id);
|
|
26
|
+
existing.removeObserver(this.notify);
|
|
27
|
+
this.notify();
|
|
28
|
+
};
|
|
29
|
+
this.clear = () => {
|
|
30
|
+
if (this.entityLookup.size === 0)
|
|
31
|
+
return;
|
|
32
|
+
this.entityLookup.forEach((entity) => {
|
|
33
|
+
entity.removeObserver(this.notify);
|
|
34
|
+
});
|
|
35
|
+
this.entityLookup.clear();
|
|
36
|
+
this.notify();
|
|
37
|
+
};
|
|
38
|
+
this.get = (id) => {
|
|
39
|
+
return this.entityLookup.get(id);
|
|
40
|
+
};
|
|
41
|
+
this.getAll = () => {
|
|
42
|
+
return Array.from(this.entityLookup.values());
|
|
43
|
+
};
|
|
44
|
+
this.set = (entities) => {
|
|
45
|
+
if (this.entityLookup.size === 0 && entities.length === 0) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
this.entityLookup.forEach((entity) => {
|
|
49
|
+
entity.removeObserver(this.notify);
|
|
50
|
+
});
|
|
51
|
+
this.entityLookup.clear();
|
|
52
|
+
entities.forEach((e) => {
|
|
53
|
+
this.entityLookup.set(e.id, e.entity);
|
|
54
|
+
e.entity.addObserver(this.notify);
|
|
55
|
+
});
|
|
56
|
+
this.notify();
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.ObservableEntityRepo = ObservableEntityRepo;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Quaternion, Vector3 } from "../ValueObjects";
|
|
2
|
+
import { ObservableEntity } from "./ObservableEntity";
|
|
3
|
+
import { SceneModelObjectDTOv1, SceneModelObjectDTOv0 as SceneModelObjectDTOv0, SceneModelObject } from "./SceneModelObject";
|
|
4
|
+
export declare enum SceneModelState {
|
|
5
|
+
INIT = "Initialized",
|
|
6
|
+
LOADING = "Loading",
|
|
7
|
+
READY = "Ready",
|
|
8
|
+
ERROR = "Error"
|
|
9
|
+
}
|
|
10
|
+
export declare abstract class SceneModel extends ObservableEntity {
|
|
11
|
+
abstract readonly id: string;
|
|
12
|
+
abstract name: string;
|
|
13
|
+
abstract state: SceneModelState;
|
|
14
|
+
abstract error: Error | undefined;
|
|
15
|
+
abstract bounds_min: Vector3;
|
|
16
|
+
abstract bounds_max: Vector3;
|
|
17
|
+
abstract defaultPosition: Vector3;
|
|
18
|
+
abstract defaultRotation: Quaternion;
|
|
19
|
+
abstract defaultScale: number;
|
|
20
|
+
abstract hasObject(id: string): boolean;
|
|
21
|
+
abstract getObjectById(id: string): SceneModelObject | undefined;
|
|
22
|
+
abstract getObjectByPath(path: string): SceneModelObject | undefined;
|
|
23
|
+
abstract addObject(object: SceneModelObject): void;
|
|
24
|
+
abstract removeObject(id: string): void;
|
|
25
|
+
abstract getAllObjects(): SceneModelObject[];
|
|
26
|
+
abstract applyData(data: SceneModelDTO): void;
|
|
27
|
+
abstract toData(): SceneModelDTO;
|
|
28
|
+
}
|
|
29
|
+
export declare function makeSceneModel(id: string): SceneModel;
|
|
30
|
+
export declare type SceneModelDTO = SceneModelDTOV0 | SceneModelDTOv1;
|
|
31
|
+
export interface SceneModelDTOV0 {
|
|
32
|
+
version: number;
|
|
33
|
+
objects: SceneModelObjectDTOv0[];
|
|
34
|
+
name: string;
|
|
35
|
+
description: string;
|
|
36
|
+
bounds_min: {
|
|
37
|
+
x: number;
|
|
38
|
+
y: number;
|
|
39
|
+
z: number;
|
|
40
|
+
};
|
|
41
|
+
bounds_max: {
|
|
42
|
+
x: number;
|
|
43
|
+
y: number;
|
|
44
|
+
z: number;
|
|
45
|
+
};
|
|
46
|
+
defaultPosition: {
|
|
47
|
+
x: number;
|
|
48
|
+
y: number;
|
|
49
|
+
z: number;
|
|
50
|
+
};
|
|
51
|
+
defaultRotation: {
|
|
52
|
+
x: number;
|
|
53
|
+
y: number;
|
|
54
|
+
z: number;
|
|
55
|
+
w: number;
|
|
56
|
+
};
|
|
57
|
+
defaultScale: number;
|
|
58
|
+
}
|
|
59
|
+
export interface SceneModelDTOv1 {
|
|
60
|
+
version: number;
|
|
61
|
+
objects: SceneModelObjectDTOv1[];
|
|
62
|
+
name: string;
|
|
63
|
+
bounds_min: {
|
|
64
|
+
x: number;
|
|
65
|
+
y: number;
|
|
66
|
+
z: number;
|
|
67
|
+
};
|
|
68
|
+
bounds_max: {
|
|
69
|
+
x: number;
|
|
70
|
+
y: number;
|
|
71
|
+
z: number;
|
|
72
|
+
};
|
|
73
|
+
defaultPosition: {
|
|
74
|
+
x: number;
|
|
75
|
+
y: number;
|
|
76
|
+
z: number;
|
|
77
|
+
};
|
|
78
|
+
defaultRotation: {
|
|
79
|
+
x: number;
|
|
80
|
+
y: number;
|
|
81
|
+
z: number;
|
|
82
|
+
w: number;
|
|
83
|
+
};
|
|
84
|
+
defaultScale: number;
|
|
85
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeSceneModel = exports.SceneModel = exports.SceneModelState = void 0;
|
|
4
|
+
const ValueObjects_1 = require("../ValueObjects");
|
|
5
|
+
const MemoizedNumber_1 = require("./MemoizedNumber");
|
|
6
|
+
const MemoizedQuaternion_1 = require("./MemoizedQuaternion");
|
|
7
|
+
const MemoizedString_1 = require("./MemoizedString");
|
|
8
|
+
const MemoizedVector3_1 = require("./MemoizedVector3");
|
|
9
|
+
const ObservableEntity_1 = require("./ObservableEntity");
|
|
10
|
+
const SceneModelObject_1 = require("./SceneModelObject");
|
|
11
|
+
var SceneModelState;
|
|
12
|
+
(function (SceneModelState) {
|
|
13
|
+
SceneModelState["INIT"] = "Initialized";
|
|
14
|
+
SceneModelState["LOADING"] = "Loading";
|
|
15
|
+
SceneModelState["READY"] = "Ready";
|
|
16
|
+
SceneModelState["ERROR"] = "Error";
|
|
17
|
+
})(SceneModelState = exports.SceneModelState || (exports.SceneModelState = {}));
|
|
18
|
+
class SceneModel extends ObservableEntity_1.ObservableEntity {
|
|
19
|
+
}
|
|
20
|
+
exports.SceneModel = SceneModel;
|
|
21
|
+
function makeSceneModel(id) {
|
|
22
|
+
return new SceneModelImp(id);
|
|
23
|
+
}
|
|
24
|
+
exports.makeSceneModel = makeSceneModel;
|
|
25
|
+
class SceneModelImp extends SceneModel {
|
|
26
|
+
constructor(id) {
|
|
27
|
+
super();
|
|
28
|
+
this._name = new MemoizedString_1.MemoizedString("", this.notify);
|
|
29
|
+
this._boundsMin = new MemoizedVector3_1.MemoizedVector3(ValueObjects_1.Vector3.Zero(), this.notify);
|
|
30
|
+
this._boundsMax = new MemoizedVector3_1.MemoizedVector3(ValueObjects_1.Vector3.Zero(), this.notify);
|
|
31
|
+
this._defaultPosition = new MemoizedVector3_1.MemoizedVector3(ValueObjects_1.Vector3.Zero(), this.notify);
|
|
32
|
+
this._defaultRotation = new MemoizedQuaternion_1.MemoizedQuaternion(ValueObjects_1.Quaternion.Identity(), this.notify);
|
|
33
|
+
this._defaultScale = new MemoizedNumber_1.MemoizedNumber(1, this.notify);
|
|
34
|
+
this._state = new MemoizedString_1.MemoizedString(SceneModelState.INIT, this.notify);
|
|
35
|
+
this.sceneModelObjectLookup = new Map();
|
|
36
|
+
this.hasObject = (id) => {
|
|
37
|
+
return this.sceneModelObjectLookup.has(id);
|
|
38
|
+
};
|
|
39
|
+
this.getObjectById = (id) => {
|
|
40
|
+
return this.sceneModelObjectLookup.get(id);
|
|
41
|
+
};
|
|
42
|
+
this.getObjectByPath = (path) => {
|
|
43
|
+
let rVal;
|
|
44
|
+
this.sceneModelObjectLookup.forEach((sceneModelObject) => {
|
|
45
|
+
if (sceneModelObject.hasMeshPath(path)) {
|
|
46
|
+
rVal = sceneModelObject;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
return rVal;
|
|
50
|
+
};
|
|
51
|
+
this.addObject = (object) => {
|
|
52
|
+
if (this.sceneModelObjectLookup.has(object.id)) {
|
|
53
|
+
const orig = this.sceneModelObjectLookup.get(object.id);
|
|
54
|
+
orig === null || orig === void 0 ? void 0 : orig.removeObserver(this.notify);
|
|
55
|
+
}
|
|
56
|
+
this.sceneModelObjectLookup.set(object.id, object);
|
|
57
|
+
object.addObserver(this.notify);
|
|
58
|
+
this.notify();
|
|
59
|
+
};
|
|
60
|
+
this.removeObject = (id) => {
|
|
61
|
+
const orig = this.sceneModelObjectLookup.get(id);
|
|
62
|
+
if (orig) {
|
|
63
|
+
this.sceneModelObjectLookup.delete(id);
|
|
64
|
+
orig.removeObserver(this.notify);
|
|
65
|
+
this.notify();
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
this.getAllObjects = () => {
|
|
69
|
+
return Array.from(this.sceneModelObjectLookup.values());
|
|
70
|
+
};
|
|
71
|
+
this.applyData = (data) => {
|
|
72
|
+
if (data.version === 0) {
|
|
73
|
+
this.applyDataV0(data);
|
|
74
|
+
}
|
|
75
|
+
else if (data.version === 1) {
|
|
76
|
+
this.applyDataV1(data);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
throw new Error(`applyData unsupported version number: ${data.version}`);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
this.toData = () => {
|
|
83
|
+
const data = {
|
|
84
|
+
version: 1,
|
|
85
|
+
bounds_max: this.bounds_max.dto,
|
|
86
|
+
bounds_min: this.bounds_min.dto,
|
|
87
|
+
defaultPosition: this.defaultPosition.dto,
|
|
88
|
+
defaultRotation: this.defaultRotation.dto,
|
|
89
|
+
defaultScale: this.defaultScale,
|
|
90
|
+
name: this.name,
|
|
91
|
+
objects: this.getAllObjects().map((obj) => obj.toData()),
|
|
92
|
+
};
|
|
93
|
+
return data;
|
|
94
|
+
};
|
|
95
|
+
this.id = id;
|
|
96
|
+
}
|
|
97
|
+
get name() {
|
|
98
|
+
return this._name.val;
|
|
99
|
+
}
|
|
100
|
+
set name(name) {
|
|
101
|
+
this._name.val = name;
|
|
102
|
+
}
|
|
103
|
+
get bounds_min() {
|
|
104
|
+
return this._boundsMin.val;
|
|
105
|
+
}
|
|
106
|
+
set bounds_min(bounds_min) {
|
|
107
|
+
this._boundsMin.val = bounds_min;
|
|
108
|
+
}
|
|
109
|
+
get bounds_max() {
|
|
110
|
+
return this._boundsMax.val;
|
|
111
|
+
}
|
|
112
|
+
set bounds_max(bounds_max) {
|
|
113
|
+
this._boundsMax.val = bounds_max;
|
|
114
|
+
}
|
|
115
|
+
get defaultPosition() {
|
|
116
|
+
return this._defaultPosition.val;
|
|
117
|
+
}
|
|
118
|
+
set defaultPosition(position) {
|
|
119
|
+
this._defaultPosition.val = position;
|
|
120
|
+
}
|
|
121
|
+
get defaultRotation() {
|
|
122
|
+
return this._defaultRotation.val;
|
|
123
|
+
}
|
|
124
|
+
set defaultRotation(rotation) {
|
|
125
|
+
this._defaultRotation.val = rotation;
|
|
126
|
+
}
|
|
127
|
+
get defaultScale() {
|
|
128
|
+
return this._defaultScale.val;
|
|
129
|
+
}
|
|
130
|
+
set defaultScale(scale) {
|
|
131
|
+
this._defaultScale.val = scale;
|
|
132
|
+
}
|
|
133
|
+
get state() {
|
|
134
|
+
return this._state.val;
|
|
135
|
+
}
|
|
136
|
+
set state(val) {
|
|
137
|
+
this._state.val = val;
|
|
138
|
+
}
|
|
139
|
+
get error() {
|
|
140
|
+
return this._error;
|
|
141
|
+
}
|
|
142
|
+
set error(val) {
|
|
143
|
+
this._error = val;
|
|
144
|
+
this._state.val = SceneModelState.ERROR;
|
|
145
|
+
}
|
|
146
|
+
applyDataV0(data) {
|
|
147
|
+
this._name.setValQuietly(data.name);
|
|
148
|
+
this._boundsMin.setValQuietly(ValueObjects_1.Vector3.FromDTO(data.bounds_min));
|
|
149
|
+
this._boundsMax.setValQuietly(ValueObjects_1.Vector3.FromDTO(data.bounds_max));
|
|
150
|
+
this._defaultPosition.setValQuietly(ValueObjects_1.Vector3.FromDTO(data.defaultPosition));
|
|
151
|
+
this._defaultScale.setValQuietly(data.defaultScale);
|
|
152
|
+
this._defaultRotation.setValQuietly(ValueObjects_1.Quaternion.FromDTO(data.defaultRotation));
|
|
153
|
+
const objectsToKeep = [];
|
|
154
|
+
data.objects.forEach((objectDTO) => {
|
|
155
|
+
const existingObj = this.sceneModelObjectLookup.get(objectDTO.id);
|
|
156
|
+
if (existingObj) {
|
|
157
|
+
existingObj.applyData(objectDTO);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
const newObj = SceneModelObject_1.makeSceneModelObject(objectDTO);
|
|
161
|
+
this.addObject(newObj);
|
|
162
|
+
}
|
|
163
|
+
objectsToKeep.push(objectDTO.id);
|
|
164
|
+
});
|
|
165
|
+
const allObjects = Array.from(this.sceneModelObjectLookup.keys());
|
|
166
|
+
allObjects.forEach((obj) => {
|
|
167
|
+
if (!objectsToKeep.includes(obj)) {
|
|
168
|
+
this.removeObject(obj);
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
this.notify();
|
|
172
|
+
}
|
|
173
|
+
applyDataV1(data) {
|
|
174
|
+
this._name.setValQuietly(data.name);
|
|
175
|
+
this._boundsMin.setValQuietly(ValueObjects_1.Vector3.FromDTO(data.bounds_min));
|
|
176
|
+
this._boundsMax.setValQuietly(ValueObjects_1.Vector3.FromDTO(data.bounds_max));
|
|
177
|
+
this._defaultPosition.setValQuietly(ValueObjects_1.Vector3.FromDTO(data.defaultPosition));
|
|
178
|
+
this._defaultScale.setValQuietly(data.defaultScale);
|
|
179
|
+
this._defaultRotation.setValQuietly(ValueObjects_1.Quaternion.FromDTO(data.defaultRotation));
|
|
180
|
+
const objectsToKeep = [];
|
|
181
|
+
data.objects.forEach((objectDTO) => {
|
|
182
|
+
const existingObj = this.sceneModelObjectLookup.get(objectDTO.id);
|
|
183
|
+
if (existingObj) {
|
|
184
|
+
existingObj.applyData(objectDTO);
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
const newObj = SceneModelObject_1.makeSceneModelObject(objectDTO);
|
|
188
|
+
this.addObject(newObj);
|
|
189
|
+
}
|
|
190
|
+
objectsToKeep.push(objectDTO.id);
|
|
191
|
+
});
|
|
192
|
+
const allObjects = Array.from(this.sceneModelObjectLookup.keys());
|
|
193
|
+
allObjects.forEach((obj) => {
|
|
194
|
+
if (!objectsToKeep.includes(obj)) {
|
|
195
|
+
this.removeObject(obj);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
this.notify();
|
|
199
|
+
}
|
|
200
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { ObservableEntity } from "./ObservableEntity";
|
|
2
|
+
export declare abstract class SceneModelObject extends ObservableEntity {
|
|
3
|
+
abstract readonly id: string;
|
|
4
|
+
abstract label: string;
|
|
5
|
+
abstract meshPaths: string[];
|
|
6
|
+
abstract addMeshPath(path: string): void;
|
|
7
|
+
abstract hasMeshPath(path: string): boolean;
|
|
8
|
+
abstract removeMeshPath(path: string): void;
|
|
9
|
+
abstract toData(): SceneModelObjectDTO;
|
|
10
|
+
abstract applyData(data: SceneModelObjectDTO): void;
|
|
11
|
+
}
|
|
12
|
+
export declare function makeSceneModelObject(dto: SceneModelObjectDTO): SceneObjectImp;
|
|
13
|
+
declare class SceneObjectImp extends SceneModelObject {
|
|
14
|
+
readonly id: string;
|
|
15
|
+
private _label;
|
|
16
|
+
get label(): string;
|
|
17
|
+
set label(label: string);
|
|
18
|
+
private _meshPaths;
|
|
19
|
+
get meshPaths(): string[];
|
|
20
|
+
set meshPaths(paths: string[]);
|
|
21
|
+
addMeshPath: (path: string) => void;
|
|
22
|
+
hasMeshPath: (path: string) => boolean;
|
|
23
|
+
removeMeshPath: (path: string) => void;
|
|
24
|
+
toData: () => SceneModelObjectDTO;
|
|
25
|
+
applyData: (data: SceneModelObjectDTO) => void;
|
|
26
|
+
constructor(dto: SceneModelObjectDTO);
|
|
27
|
+
}
|
|
28
|
+
export declare type SceneModelObjectDTO = SceneModelObjectDTOv0 | SceneModelObjectDTOv1;
|
|
29
|
+
export interface SceneModelObjectDTOv1 {
|
|
30
|
+
version: number;
|
|
31
|
+
id: string;
|
|
32
|
+
meshPaths: string[];
|
|
33
|
+
label: string;
|
|
34
|
+
}
|
|
35
|
+
export interface SceneModelObjectDTOv0 {
|
|
36
|
+
id: string;
|
|
37
|
+
meshPaths: string[];
|
|
38
|
+
label: string;
|
|
39
|
+
}
|
|
40
|
+
export {};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeSceneModelObject = exports.SceneModelObject = void 0;
|
|
4
|
+
const MemoizedString_1 = require("./MemoizedString");
|
|
5
|
+
const ObservableEntity_1 = require("./ObservableEntity");
|
|
6
|
+
class SceneModelObject extends ObservableEntity_1.ObservableEntity {
|
|
7
|
+
}
|
|
8
|
+
exports.SceneModelObject = SceneModelObject;
|
|
9
|
+
function makeSceneModelObject(dto) {
|
|
10
|
+
return new SceneObjectImp(dto);
|
|
11
|
+
}
|
|
12
|
+
exports.makeSceneModelObject = makeSceneModelObject;
|
|
13
|
+
class SceneObjectImp extends SceneModelObject {
|
|
14
|
+
constructor(dto) {
|
|
15
|
+
super();
|
|
16
|
+
this._label = new MemoizedString_1.MemoizedString("", this.notify);
|
|
17
|
+
this._meshPaths = [];
|
|
18
|
+
this.addMeshPath = (path) => {
|
|
19
|
+
if (this._meshPaths.includes(path))
|
|
20
|
+
return;
|
|
21
|
+
this._meshPaths.push(path);
|
|
22
|
+
this.notify();
|
|
23
|
+
};
|
|
24
|
+
this.hasMeshPath = (path) => {
|
|
25
|
+
return this._meshPaths.includes(path);
|
|
26
|
+
};
|
|
27
|
+
this.removeMeshPath = (path) => {
|
|
28
|
+
const index = this._meshPaths.indexOf(path);
|
|
29
|
+
if (index >= 0) {
|
|
30
|
+
this._meshPaths.splice(index, 1);
|
|
31
|
+
this.notify();
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
this.toData = () => {
|
|
35
|
+
const dto = {
|
|
36
|
+
version: 1,
|
|
37
|
+
id: this.id,
|
|
38
|
+
label: this.label,
|
|
39
|
+
meshPaths: [...this._meshPaths],
|
|
40
|
+
};
|
|
41
|
+
return dto;
|
|
42
|
+
};
|
|
43
|
+
this.applyData = (data) => {
|
|
44
|
+
this.label = data.label;
|
|
45
|
+
this.meshPaths = data.meshPaths;
|
|
46
|
+
};
|
|
47
|
+
this.id = dto.id;
|
|
48
|
+
this._label.setValQuietly(dto.label);
|
|
49
|
+
this._meshPaths = [...dto.meshPaths];
|
|
50
|
+
}
|
|
51
|
+
get label() {
|
|
52
|
+
return this._label.val;
|
|
53
|
+
}
|
|
54
|
+
set label(label) {
|
|
55
|
+
this._label.val = label;
|
|
56
|
+
}
|
|
57
|
+
get meshPaths() {
|
|
58
|
+
return [...this._meshPaths];
|
|
59
|
+
}
|
|
60
|
+
set meshPaths(paths) {
|
|
61
|
+
let pathsHaveChanged = false;
|
|
62
|
+
if (paths.length !== this._meshPaths.length) {
|
|
63
|
+
pathsHaveChanged = true;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
paths.forEach((path, i) => {
|
|
67
|
+
if (path !== this._meshPaths[i]) {
|
|
68
|
+
pathsHaveChanged = true;
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
if (!pathsHaveChanged)
|
|
73
|
+
return;
|
|
74
|
+
this._meshPaths = paths;
|
|
75
|
+
this.notify();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ObservableEntityRepo } from "./ObservableEntityRepo";
|
|
2
|
+
import { SceneModel, SceneModelDTO } from "./SceneModel";
|
|
3
|
+
export declare abstract class SceneModelRepo extends ObservableEntityRepo<SceneModel> {
|
|
4
|
+
abstract get activeModel(): SceneModel | undefined;
|
|
5
|
+
abstract activeModelID: string;
|
|
6
|
+
abstract isLoadingSceneModel: boolean;
|
|
7
|
+
abstract modelLoader(modelID: string): Promise<void>;
|
|
8
|
+
abstract dataLoader(dataID: string): Promise<SceneModelDTO>;
|
|
9
|
+
abstract clearActiveModel(): void;
|
|
10
|
+
}
|
|
11
|
+
export declare function makeSceneModelRepo(): SceneModelRepo;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeSceneModelRepo = exports.SceneModelRepo = void 0;
|
|
4
|
+
const MemoizedBoolean_1 = require("./MemoizedBoolean");
|
|
5
|
+
const MemoizedString_1 = require("./MemoizedString");
|
|
6
|
+
const ObservableEntityRepo_1 = require("./ObservableEntityRepo");
|
|
7
|
+
class SceneModelRepo extends ObservableEntityRepo_1.ObservableEntityRepo {
|
|
8
|
+
}
|
|
9
|
+
exports.SceneModelRepo = SceneModelRepo;
|
|
10
|
+
function makeSceneModelRepo() {
|
|
11
|
+
return new SceneModelRepoImp();
|
|
12
|
+
}
|
|
13
|
+
exports.makeSceneModelRepo = makeSceneModelRepo;
|
|
14
|
+
class SceneModelRepoImp extends SceneModelRepo {
|
|
15
|
+
constructor() {
|
|
16
|
+
super(...arguments);
|
|
17
|
+
this.memoizedActiveModelID = new MemoizedString_1.MemoizedString("", this.notify);
|
|
18
|
+
this.memoizedIsLoading = new MemoizedBoolean_1.MemoizedBoolean(false, this.notify);
|
|
19
|
+
}
|
|
20
|
+
modelLoader( /*modelID: string*/) {
|
|
21
|
+
return Promise.reject(new Error(`SceneModelRepo function modelLoader has not been injected`));
|
|
22
|
+
}
|
|
23
|
+
dataLoader( /*dataID: string*/) {
|
|
24
|
+
return Promise.reject(new Error(`SceneModelRepo function dataLoader has not been injected`));
|
|
25
|
+
}
|
|
26
|
+
get activeModelID() {
|
|
27
|
+
return this.memoizedActiveModelID.val;
|
|
28
|
+
}
|
|
29
|
+
set activeModelID(id) {
|
|
30
|
+
if (!this.has(id)) {
|
|
31
|
+
console.warn("[SceneModelRepo] Unknown Model ID ", id);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
this.memoizedActiveModelID.val = id;
|
|
35
|
+
}
|
|
36
|
+
get isLoadingSceneModel() {
|
|
37
|
+
return this.memoizedIsLoading.val;
|
|
38
|
+
}
|
|
39
|
+
set isLoadingSceneModel(val) {
|
|
40
|
+
this.memoizedIsLoading.val = val;
|
|
41
|
+
}
|
|
42
|
+
clearActiveModel() {
|
|
43
|
+
this.memoizedActiveModelID.val = "";
|
|
44
|
+
}
|
|
45
|
+
get activeModel() {
|
|
46
|
+
return this.get(this.memoizedActiveModelID.val);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ObservableEntity } from "./ObservableEntity";
|
|
2
|
+
import { TransformNode } from "./TransformNode";
|
|
3
|
+
export declare abstract class SceneObject extends ObservableEntity {
|
|
4
|
+
abstract readonly id: string;
|
|
5
|
+
abstract get label(): string;
|
|
6
|
+
abstract set label(label: string);
|
|
7
|
+
abstract get enabled(): boolean;
|
|
8
|
+
abstract set enabled(enabled: boolean);
|
|
9
|
+
abstract transform: TransformNode;
|
|
10
|
+
}
|
|
11
|
+
export declare function makeSceneObject(id: string): SceneObjectImp;
|
|
12
|
+
declare class SceneObjectImp extends SceneObject {
|
|
13
|
+
readonly id: string;
|
|
14
|
+
private memoizedLabel;
|
|
15
|
+
get label(): string;
|
|
16
|
+
set label(label: string);
|
|
17
|
+
private memoizedEnabled;
|
|
18
|
+
get enabled(): boolean;
|
|
19
|
+
set enabled(enabled: boolean);
|
|
20
|
+
transform: TransformNode;
|
|
21
|
+
constructor(id: string);
|
|
22
|
+
}
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeSceneObject = exports.SceneObject = void 0;
|
|
4
|
+
const MemoizedBoolean_1 = require("./MemoizedBoolean");
|
|
5
|
+
const MemoizedString_1 = require("./MemoizedString");
|
|
6
|
+
const ObservableEntity_1 = require("./ObservableEntity");
|
|
7
|
+
const TransformNode_1 = require("./TransformNode");
|
|
8
|
+
class SceneObject extends ObservableEntity_1.ObservableEntity {
|
|
9
|
+
}
|
|
10
|
+
exports.SceneObject = SceneObject;
|
|
11
|
+
function makeSceneObject(id) {
|
|
12
|
+
return new SceneObjectImp(id);
|
|
13
|
+
}
|
|
14
|
+
exports.makeSceneObject = makeSceneObject;
|
|
15
|
+
class SceneObjectImp extends SceneObject {
|
|
16
|
+
constructor(id) {
|
|
17
|
+
super();
|
|
18
|
+
this.memoizedLabel = new MemoizedString_1.MemoizedString("", this.notify);
|
|
19
|
+
this.memoizedEnabled = new MemoizedBoolean_1.MemoizedBoolean(true, this.notify);
|
|
20
|
+
this.transform = TransformNode_1.makeTransformNode();
|
|
21
|
+
this.id = id;
|
|
22
|
+
this.transform.addObserver(this.notify);
|
|
23
|
+
}
|
|
24
|
+
get label() {
|
|
25
|
+
return this.memoizedLabel.val;
|
|
26
|
+
}
|
|
27
|
+
set label(label) {
|
|
28
|
+
this.memoizedLabel.val = label;
|
|
29
|
+
}
|
|
30
|
+
get enabled() {
|
|
31
|
+
return this.memoizedEnabled.val;
|
|
32
|
+
}
|
|
33
|
+
set enabled(enabled) {
|
|
34
|
+
this.memoizedEnabled.val = enabled;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ObservableEntityRepo } from "./ObservableEntityRepo";
|
|
2
|
+
import { SceneObject } from "./SceneObject";
|
|
3
|
+
export declare abstract class SceneObjectsRepo extends ObservableEntityRepo<SceneObject> {
|
|
4
|
+
abstract get pressedSceneObject(): string | null;
|
|
5
|
+
abstract set pressedSceneObject(sceneObjectId: string | null);
|
|
6
|
+
abstract get hoveredSceneObject(): string | null;
|
|
7
|
+
abstract set hoveredSceneObject(sceneObjectId: string | null);
|
|
8
|
+
}
|
|
9
|
+
export declare function makeSceneObjectRepo(): SceneObjectsRepo;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeSceneObjectRepo = exports.SceneObjectsRepo = void 0;
|
|
4
|
+
const ObservableEntityRepo_1 = require("./ObservableEntityRepo");
|
|
5
|
+
class SceneObjectsRepo extends ObservableEntityRepo_1.ObservableEntityRepo {
|
|
6
|
+
}
|
|
7
|
+
exports.SceneObjectsRepo = SceneObjectsRepo;
|
|
8
|
+
function makeSceneObjectRepo() {
|
|
9
|
+
return new SceneObjectsRepoImp();
|
|
10
|
+
}
|
|
11
|
+
exports.makeSceneObjectRepo = makeSceneObjectRepo;
|
|
12
|
+
class SceneObjectsRepoImp extends SceneObjectsRepo {
|
|
13
|
+
constructor() {
|
|
14
|
+
super(...arguments);
|
|
15
|
+
this._pressedSceneObject = null;
|
|
16
|
+
this._hoveredSceneObject = null;
|
|
17
|
+
}
|
|
18
|
+
get pressedSceneObject() {
|
|
19
|
+
return this._pressedSceneObject;
|
|
20
|
+
}
|
|
21
|
+
set pressedSceneObject(sceneObjectId) {
|
|
22
|
+
if (sceneObjectId === this._pressedSceneObject) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
this._pressedSceneObject = sceneObjectId;
|
|
26
|
+
this.notify();
|
|
27
|
+
}
|
|
28
|
+
get hoveredSceneObject() {
|
|
29
|
+
return this._hoveredSceneObject;
|
|
30
|
+
}
|
|
31
|
+
set hoveredSceneObject(sceneObjectId) {
|
|
32
|
+
if (sceneObjectId === this._hoveredSceneObject) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
this._hoveredSceneObject = sceneObjectId;
|
|
36
|
+
this.notify();
|
|
37
|
+
}
|
|
38
|
+
}
|
package/lib/Entities/index.d.ts
CHANGED
|
@@ -4,28 +4,33 @@ export * from "./AppHandler";
|
|
|
4
4
|
export * from "./Babylon";
|
|
5
5
|
export * from "./BaseApp";
|
|
6
6
|
export * from "./DevicePreview";
|
|
7
|
-
export * from "./FramedScreenContainer";
|
|
8
7
|
export * from "./FramedScreen";
|
|
8
|
+
export * from "./FramedScreenContainer";
|
|
9
9
|
export * from "./HoverLabels";
|
|
10
10
|
export * from "./KeyboardInput";
|
|
11
11
|
export * from "./MemoizedBoolean";
|
|
12
12
|
export * from "./MemoizedNumber";
|
|
13
|
+
export * from "./MemoizedQuaternion";
|
|
13
14
|
export * from "./MemoizedString";
|
|
14
15
|
export * from "./MemoizedVector2";
|
|
15
16
|
export * from "./MemoizedVector3";
|
|
16
|
-
export * from "./MeshModel";
|
|
17
17
|
export * from "./MessageSystem";
|
|
18
|
-
export * from "./
|
|
18
|
+
export * from "./MouseInput";
|
|
19
|
+
export * from "./ObservableEntity";
|
|
20
|
+
export * from "./ObservableEntityRepo";
|
|
19
21
|
export * from "./ObserverList";
|
|
22
|
+
export * from "./QuestionChallenge";
|
|
23
|
+
export * from "./QuestionChallengeAnswer";
|
|
24
|
+
export * from "./SceneModel";
|
|
25
|
+
export * from "./SceneModelObject";
|
|
26
|
+
export * from "./SceneModelRepo";
|
|
27
|
+
export * from "./SceneObject";
|
|
28
|
+
export * from "./SceneObjectsRepo";
|
|
29
|
+
export * from "./SceneRoot";
|
|
20
30
|
export * from "./StateMachine";
|
|
21
31
|
export * from "./Tool";
|
|
22
32
|
export * from "./ToolRepository";
|
|
33
|
+
export * from "./TouchInput";
|
|
23
34
|
export * from "./TransformNode";
|
|
24
35
|
export * from "./UndoRedo";
|
|
25
|
-
export * from "./MouseInput";
|
|
26
|
-
export * from "./ObservableEntity";
|
|
27
|
-
export * from "./TouchInput";
|
|
28
|
-
export * from "./QuestionChallengeAnswer";
|
|
29
|
-
export * from "./QuestionChallenge";
|
|
30
|
-
export * from "./SceneRoot";
|
|
31
36
|
export * from "./WorkPlane";
|
package/lib/Entities/index.js
CHANGED
|
@@ -16,28 +16,33 @@ __exportStar(require("./AppHandler"), exports);
|
|
|
16
16
|
__exportStar(require("./Babylon"), exports);
|
|
17
17
|
__exportStar(require("./BaseApp"), exports);
|
|
18
18
|
__exportStar(require("./DevicePreview"), exports);
|
|
19
|
-
__exportStar(require("./FramedScreenContainer"), exports);
|
|
20
19
|
__exportStar(require("./FramedScreen"), exports);
|
|
20
|
+
__exportStar(require("./FramedScreenContainer"), exports);
|
|
21
21
|
__exportStar(require("./HoverLabels"), exports);
|
|
22
22
|
__exportStar(require("./KeyboardInput"), exports);
|
|
23
23
|
__exportStar(require("./MemoizedBoolean"), exports);
|
|
24
24
|
__exportStar(require("./MemoizedNumber"), exports);
|
|
25
|
+
__exportStar(require("./MemoizedQuaternion"), exports);
|
|
25
26
|
__exportStar(require("./MemoizedString"), exports);
|
|
26
27
|
__exportStar(require("./MemoizedVector2"), exports);
|
|
27
28
|
__exportStar(require("./MemoizedVector3"), exports);
|
|
28
|
-
__exportStar(require("./MeshModel"), exports);
|
|
29
29
|
__exportStar(require("./MessageSystem"), exports);
|
|
30
|
-
__exportStar(require("./
|
|
30
|
+
__exportStar(require("./MouseInput"), exports);
|
|
31
|
+
__exportStar(require("./ObservableEntity"), exports);
|
|
32
|
+
__exportStar(require("./ObservableEntityRepo"), exports);
|
|
31
33
|
__exportStar(require("./ObserverList"), exports);
|
|
34
|
+
__exportStar(require("./QuestionChallenge"), exports);
|
|
35
|
+
__exportStar(require("./QuestionChallengeAnswer"), exports);
|
|
36
|
+
__exportStar(require("./SceneModel"), exports);
|
|
37
|
+
__exportStar(require("./SceneModelObject"), exports);
|
|
38
|
+
__exportStar(require("./SceneModelRepo"), exports);
|
|
39
|
+
__exportStar(require("./SceneObject"), exports);
|
|
40
|
+
__exportStar(require("./SceneObjectsRepo"), exports);
|
|
41
|
+
__exportStar(require("./SceneRoot"), exports);
|
|
32
42
|
__exportStar(require("./StateMachine"), exports);
|
|
33
43
|
__exportStar(require("./Tool"), exports);
|
|
34
44
|
__exportStar(require("./ToolRepository"), exports);
|
|
45
|
+
__exportStar(require("./TouchInput"), exports);
|
|
35
46
|
__exportStar(require("./TransformNode"), exports);
|
|
36
47
|
__exportStar(require("./UndoRedo"), exports);
|
|
37
|
-
__exportStar(require("./MouseInput"), exports);
|
|
38
|
-
__exportStar(require("./ObservableEntity"), exports);
|
|
39
|
-
__exportStar(require("./TouchInput"), exports);
|
|
40
|
-
__exportStar(require("./QuestionChallengeAnswer"), exports);
|
|
41
|
-
__exportStar(require("./QuestionChallenge"), exports);
|
|
42
|
-
__exportStar(require("./SceneRoot"), exports);
|
|
43
48
|
__exportStar(require("./WorkPlane"), exports);
|
|
@@ -30,6 +30,17 @@ export declare class Quaternion {
|
|
|
30
30
|
* @returns A Quaterion
|
|
31
31
|
*/
|
|
32
32
|
static FromArray(values: [number, number, number, number]): Quaternion;
|
|
33
|
+
/**
|
|
34
|
+
* Creates a Quaterion from a Data Transfer Object
|
|
35
|
+
* @param dto The Data Transfer Object
|
|
36
|
+
* @returns The Quaternion
|
|
37
|
+
*/
|
|
38
|
+
static FromDTO(dto: {
|
|
39
|
+
x: number;
|
|
40
|
+
y: number;
|
|
41
|
+
z: number;
|
|
42
|
+
w: number;
|
|
43
|
+
}): Quaternion;
|
|
33
44
|
/**
|
|
34
45
|
* Creates an Identity Quaternion
|
|
35
46
|
* @returns An Identity Quaternion
|
|
@@ -86,6 +97,15 @@ export declare class Quaternion {
|
|
|
86
97
|
toArray(): [number, number, number, number];
|
|
87
98
|
get angle(): Angle;
|
|
88
99
|
get axis(): Vector3;
|
|
100
|
+
/**
|
|
101
|
+
* Get the vector as a Data Transfer Object
|
|
102
|
+
*/
|
|
103
|
+
get dto(): {
|
|
104
|
+
x: number;
|
|
105
|
+
y: number;
|
|
106
|
+
z: number;
|
|
107
|
+
w: number;
|
|
108
|
+
};
|
|
89
109
|
readonly x: number;
|
|
90
110
|
readonly y: number;
|
|
91
111
|
readonly z: number;
|
|
@@ -69,6 +69,14 @@ class Quaternion {
|
|
|
69
69
|
static FromArray(values) {
|
|
70
70
|
return new Quaternion(values[0], values[1], values[2], values[3]);
|
|
71
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Creates a Quaterion from a Data Transfer Object
|
|
74
|
+
* @param dto The Data Transfer Object
|
|
75
|
+
* @returns The Quaternion
|
|
76
|
+
*/
|
|
77
|
+
static FromDTO(dto) {
|
|
78
|
+
return new Quaternion(dto.x, dto.y, dto.z, dto.w);
|
|
79
|
+
}
|
|
72
80
|
/**
|
|
73
81
|
* Creates an Identity Quaternion
|
|
74
82
|
* @returns An Identity Quaternion
|
|
@@ -239,5 +247,11 @@ class Quaternion {
|
|
|
239
247
|
const z = this.z / Math.sqrt(1 - this.w * this.w);
|
|
240
248
|
return new Vector3_1.Vector3(x, y, z);
|
|
241
249
|
}
|
|
250
|
+
/**
|
|
251
|
+
* Get the vector as a Data Transfer Object
|
|
252
|
+
*/
|
|
253
|
+
get dto() {
|
|
254
|
+
return { x: this.x, y: this.y, z: this.z, w: this.w };
|
|
255
|
+
}
|
|
242
256
|
}
|
|
243
257
|
exports.Quaternion = Quaternion;
|
|
@@ -17,6 +17,15 @@ export declare class Vector2 {
|
|
|
17
17
|
* @returns True if Vector A === Vector B
|
|
18
18
|
*/
|
|
19
19
|
static Equal(a: Vector2, b: Vector2): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Creates a Vector from a Data Transfer Object
|
|
22
|
+
* @param dto The Data Transfer Object
|
|
23
|
+
* @returns The Vector
|
|
24
|
+
*/
|
|
25
|
+
static FromDTO(dto: {
|
|
26
|
+
x: number;
|
|
27
|
+
y: number;
|
|
28
|
+
}): Vector2;
|
|
20
29
|
/**
|
|
21
30
|
* Adds Vector B to Vector A
|
|
22
31
|
* @param a Vector A
|
|
@@ -100,5 +109,12 @@ export declare class Vector2 {
|
|
|
100
109
|
* Retuns the vector as an array of numbers [x,y]
|
|
101
110
|
*/
|
|
102
111
|
get array(): [number, number];
|
|
112
|
+
/**
|
|
113
|
+
* Get the vector as a Data Transfer Object
|
|
114
|
+
*/
|
|
115
|
+
get dto(): {
|
|
116
|
+
x: number;
|
|
117
|
+
y: number;
|
|
118
|
+
};
|
|
103
119
|
constructor(x: number, y: number);
|
|
104
120
|
}
|
|
@@ -34,6 +34,14 @@ class Vector2 {
|
|
|
34
34
|
return false;
|
|
35
35
|
return true;
|
|
36
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Creates a Vector from a Data Transfer Object
|
|
39
|
+
* @param dto The Data Transfer Object
|
|
40
|
+
* @returns The Vector
|
|
41
|
+
*/
|
|
42
|
+
static FromDTO(dto) {
|
|
43
|
+
return new Vector2(dto.x, dto.y);
|
|
44
|
+
}
|
|
37
45
|
/**
|
|
38
46
|
* Adds Vector B to Vector A
|
|
39
47
|
* @param a Vector A
|
|
@@ -86,6 +94,12 @@ class Vector2 {
|
|
|
86
94
|
get array() {
|
|
87
95
|
return [this.x, this.y];
|
|
88
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Get the vector as a Data Transfer Object
|
|
99
|
+
*/
|
|
100
|
+
get dto() {
|
|
101
|
+
return { x: this.x, y: this.y };
|
|
102
|
+
}
|
|
89
103
|
}
|
|
90
104
|
exports.Vector2 = Vector2;
|
|
91
105
|
/**
|
|
@@ -52,6 +52,16 @@ export declare class Vector3 {
|
|
|
52
52
|
* @returns The Vector
|
|
53
53
|
*/
|
|
54
54
|
static FromArray(values: [number, number, number]): Vector3;
|
|
55
|
+
/**
|
|
56
|
+
* Creates a Vector from a Data Transfer Object
|
|
57
|
+
* @param dto The Data Transfer Object
|
|
58
|
+
* @returns The Vector
|
|
59
|
+
*/
|
|
60
|
+
static FromDTO(dto: {
|
|
61
|
+
x: number;
|
|
62
|
+
y: number;
|
|
63
|
+
z: number;
|
|
64
|
+
}): Vector3;
|
|
55
65
|
/**
|
|
56
66
|
* Adds Vector B to Vector A
|
|
57
67
|
* @param a Vector A
|
|
@@ -129,5 +139,13 @@ export declare class Vector3 {
|
|
|
129
139
|
* @returns an array representing the vector
|
|
130
140
|
*/
|
|
131
141
|
get array(): [number, number, number];
|
|
142
|
+
/**
|
|
143
|
+
* Get the vector as a Data Transfer Object
|
|
144
|
+
*/
|
|
145
|
+
get dto(): {
|
|
146
|
+
x: number;
|
|
147
|
+
y: number;
|
|
148
|
+
z: number;
|
|
149
|
+
};
|
|
132
150
|
constructor(x: number, y: number, z: number);
|
|
133
151
|
}
|
|
@@ -78,6 +78,14 @@ class Vector3 {
|
|
|
78
78
|
static FromArray(values) {
|
|
79
79
|
return new Vector3(values[0], values[1], values[2]);
|
|
80
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* Creates a Vector from a Data Transfer Object
|
|
83
|
+
* @param dto The Data Transfer Object
|
|
84
|
+
* @returns The Vector
|
|
85
|
+
*/
|
|
86
|
+
static FromDTO(dto) {
|
|
87
|
+
return new Vector3(dto.x, dto.y, dto.z);
|
|
88
|
+
}
|
|
81
89
|
/**
|
|
82
90
|
* Gets the magnitude of the Vector3
|
|
83
91
|
* @returns the magnitude of the Vector3
|
|
@@ -110,6 +118,12 @@ class Vector3 {
|
|
|
110
118
|
get array() {
|
|
111
119
|
return [this.x, this.y, this.z];
|
|
112
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* Get the vector as a Data Transfer Object
|
|
123
|
+
*/
|
|
124
|
+
get dto() {
|
|
125
|
+
return { x: this.x, y: this.y, z: this.z };
|
|
126
|
+
}
|
|
113
127
|
}
|
|
114
128
|
exports.Vector3 = Vector3;
|
|
115
129
|
/**
|
package/package.json
CHANGED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { Quaternion, Vector3 } from "../ValueObjects";
|
|
2
|
-
import { ModelObject } from "./ModelObject";
|
|
3
|
-
import { ObservableEntity } from "./ObservableEntity";
|
|
4
|
-
export interface MeshModelData {
|
|
5
|
-
version: number;
|
|
6
|
-
objects: ObjectData[];
|
|
7
|
-
name: string;
|
|
8
|
-
description: string;
|
|
9
|
-
bounds_min: {
|
|
10
|
-
x: number;
|
|
11
|
-
y: number;
|
|
12
|
-
z: number;
|
|
13
|
-
};
|
|
14
|
-
bounds_max: {
|
|
15
|
-
x: number;
|
|
16
|
-
y: number;
|
|
17
|
-
z: number;
|
|
18
|
-
};
|
|
19
|
-
defaultPosition: {
|
|
20
|
-
x: number;
|
|
21
|
-
y: number;
|
|
22
|
-
z: number;
|
|
23
|
-
};
|
|
24
|
-
defaultRotation: {
|
|
25
|
-
x: number;
|
|
26
|
-
y: number;
|
|
27
|
-
z: number;
|
|
28
|
-
w: number;
|
|
29
|
-
};
|
|
30
|
-
defaultScale: number;
|
|
31
|
-
}
|
|
32
|
-
export interface ObjectData {
|
|
33
|
-
id: string;
|
|
34
|
-
meshPaths: string[];
|
|
35
|
-
label: string;
|
|
36
|
-
}
|
|
37
|
-
export declare abstract class MeshModel extends ObservableEntity {
|
|
38
|
-
abstract readonly objects: ModelObject[];
|
|
39
|
-
abstract hasObject(id: string): boolean;
|
|
40
|
-
abstract getObjectById(id: string): ModelObject | undefined;
|
|
41
|
-
abstract getObjectByPath(path: string): ModelObject | undefined;
|
|
42
|
-
abstract addObject(object: ModelObject): void;
|
|
43
|
-
abstract deleteObject(id: string): void;
|
|
44
|
-
abstract get modelFile(): File | undefined;
|
|
45
|
-
abstract set modelFile(file: File | undefined);
|
|
46
|
-
abstract get version(): number;
|
|
47
|
-
abstract set version(scale: number);
|
|
48
|
-
abstract get name(): string;
|
|
49
|
-
abstract set name(name: string);
|
|
50
|
-
abstract get description(): string;
|
|
51
|
-
abstract set description(name: string);
|
|
52
|
-
abstract get image(): Blob | undefined;
|
|
53
|
-
abstract set image(image: Blob | undefined);
|
|
54
|
-
abstract get imageURL(): string | undefined;
|
|
55
|
-
abstract get bounds_min(): Vector3;
|
|
56
|
-
abstract set bounds_min(position: Vector3);
|
|
57
|
-
abstract get bounds_max(): Vector3;
|
|
58
|
-
abstract set bounds_max(position: Vector3);
|
|
59
|
-
abstract get defaultPosition(): Vector3;
|
|
60
|
-
abstract set defaultPosition(position: Vector3);
|
|
61
|
-
abstract get defaultRotation(): Quaternion;
|
|
62
|
-
abstract set defaultRotation(rotation: Quaternion);
|
|
63
|
-
abstract get defaultScale(): number;
|
|
64
|
-
abstract set defaultScale(scale: number);
|
|
65
|
-
abstract getData(): MeshModelData;
|
|
66
|
-
abstract setData(data: MeshModelData): void;
|
|
67
|
-
}
|
|
68
|
-
export declare function makeMeshModel(): MeshModel;
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.makeMeshModel = exports.MeshModel = void 0;
|
|
4
|
-
const ValueObjects_1 = require("../ValueObjects");
|
|
5
|
-
const MemoizedNumber_1 = require("./MemoizedNumber");
|
|
6
|
-
const MemoizedString_1 = require("./MemoizedString");
|
|
7
|
-
const MemoizedVector3_1 = require("./MemoizedVector3");
|
|
8
|
-
const ModelObject_1 = require("./ModelObject");
|
|
9
|
-
const ObservableEntity_1 = require("./ObservableEntity");
|
|
10
|
-
class MeshModel extends ObservableEntity_1.ObservableEntity {
|
|
11
|
-
}
|
|
12
|
-
exports.MeshModel = MeshModel;
|
|
13
|
-
function makeMeshModel() {
|
|
14
|
-
return new MeshModelImp();
|
|
15
|
-
}
|
|
16
|
-
exports.makeMeshModel = makeMeshModel;
|
|
17
|
-
class MeshModelImp extends MeshModel {
|
|
18
|
-
constructor() {
|
|
19
|
-
super(...arguments);
|
|
20
|
-
this.objects = [];
|
|
21
|
-
this._modelFile = undefined;
|
|
22
|
-
this._memoizedVersion = new MemoizedNumber_1.MemoizedNumber(0, this.notify);
|
|
23
|
-
this._memoizedName = new MemoizedString_1.MemoizedString("", this.notify);
|
|
24
|
-
this._memoizedDescription = new MemoizedString_1.MemoizedString("", this.notify);
|
|
25
|
-
this._image = undefined;
|
|
26
|
-
this._memoizedBoundsMin = new MemoizedVector3_1.MemoizedVector3(ValueObjects_1.Vector3.Zero(), this.notify);
|
|
27
|
-
this._memoizedBoundsMax = new MemoizedVector3_1.MemoizedVector3(ValueObjects_1.Vector3.Zero(), this.notify);
|
|
28
|
-
this._memoizedDefaultPosition = new MemoizedVector3_1.MemoizedVector3(ValueObjects_1.Vector3.Zero(), this.notify);
|
|
29
|
-
this._defaultRotation = ValueObjects_1.Quaternion.Identity();
|
|
30
|
-
this._memoizedDefaultScale = new MemoizedNumber_1.MemoizedNumber(1, this.notify);
|
|
31
|
-
this._imageURL = undefined;
|
|
32
|
-
}
|
|
33
|
-
hasObject(id) {
|
|
34
|
-
return !!this.objects.find((obj) => obj.id === id);
|
|
35
|
-
}
|
|
36
|
-
getObjectById(id) {
|
|
37
|
-
return this.objects.find((obj) => obj.id === id);
|
|
38
|
-
}
|
|
39
|
-
getObjectByPath(path) {
|
|
40
|
-
let rVal;
|
|
41
|
-
this.objects.forEach((obj) => {
|
|
42
|
-
if (obj.meshPaths.includes(path)) {
|
|
43
|
-
rVal = obj;
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
return rVal;
|
|
47
|
-
}
|
|
48
|
-
addObject(object) {
|
|
49
|
-
object.addObserver(this.notify);
|
|
50
|
-
this.objects.push(object);
|
|
51
|
-
this.notify();
|
|
52
|
-
}
|
|
53
|
-
deleteObject(id) {
|
|
54
|
-
this.objects = this.objects.filter((obj) => {
|
|
55
|
-
if (obj.id === id) {
|
|
56
|
-
obj.removeObserver(this.notify);
|
|
57
|
-
return false;
|
|
58
|
-
}
|
|
59
|
-
return true;
|
|
60
|
-
});
|
|
61
|
-
this.notify();
|
|
62
|
-
}
|
|
63
|
-
get modelFile() {
|
|
64
|
-
return this._modelFile;
|
|
65
|
-
}
|
|
66
|
-
set modelFile(file) {
|
|
67
|
-
this._modelFile = file;
|
|
68
|
-
this.notify();
|
|
69
|
-
}
|
|
70
|
-
get version() {
|
|
71
|
-
return this._memoizedVersion.val;
|
|
72
|
-
}
|
|
73
|
-
set version(version) {
|
|
74
|
-
this._memoizedVersion.val = version;
|
|
75
|
-
}
|
|
76
|
-
get name() {
|
|
77
|
-
return this._memoizedName.val;
|
|
78
|
-
}
|
|
79
|
-
set name(name) {
|
|
80
|
-
this._memoizedName.val = name;
|
|
81
|
-
}
|
|
82
|
-
get description() {
|
|
83
|
-
return this._memoizedDescription.val;
|
|
84
|
-
}
|
|
85
|
-
set description(description) {
|
|
86
|
-
this._memoizedDescription.val = description;
|
|
87
|
-
}
|
|
88
|
-
get image() {
|
|
89
|
-
return this._image;
|
|
90
|
-
}
|
|
91
|
-
set image(image) {
|
|
92
|
-
if (!this._image && !image)
|
|
93
|
-
return;
|
|
94
|
-
if (this._image && image && this._image.size === image.size)
|
|
95
|
-
return;
|
|
96
|
-
this._image = image;
|
|
97
|
-
if (image === undefined) {
|
|
98
|
-
this._imageURL = undefined;
|
|
99
|
-
}
|
|
100
|
-
else {
|
|
101
|
-
this._imageURL = URL.createObjectURL(image);
|
|
102
|
-
}
|
|
103
|
-
this.notify();
|
|
104
|
-
}
|
|
105
|
-
get imageURL() {
|
|
106
|
-
return this._imageURL;
|
|
107
|
-
}
|
|
108
|
-
get bounds_min() {
|
|
109
|
-
return this._memoizedBoundsMin.val;
|
|
110
|
-
}
|
|
111
|
-
set bounds_min(bounds_min) {
|
|
112
|
-
this._memoizedBoundsMin.val = bounds_min;
|
|
113
|
-
}
|
|
114
|
-
get bounds_max() {
|
|
115
|
-
return this._memoizedBoundsMax.val;
|
|
116
|
-
}
|
|
117
|
-
set bounds_max(bounds_max) {
|
|
118
|
-
this._memoizedBoundsMax.val = bounds_max;
|
|
119
|
-
}
|
|
120
|
-
get defaultPosition() {
|
|
121
|
-
return this._memoizedDefaultPosition.val;
|
|
122
|
-
}
|
|
123
|
-
set defaultPosition(position) {
|
|
124
|
-
this._memoizedDefaultPosition.val = position;
|
|
125
|
-
}
|
|
126
|
-
get defaultRotation() {
|
|
127
|
-
return this._defaultRotation;
|
|
128
|
-
}
|
|
129
|
-
set defaultRotation(rotation) {
|
|
130
|
-
if (ValueObjects_1.Quaternion.Equal(this._defaultRotation, rotation))
|
|
131
|
-
return;
|
|
132
|
-
this._defaultRotation = rotation;
|
|
133
|
-
this.notify();
|
|
134
|
-
}
|
|
135
|
-
get defaultScale() {
|
|
136
|
-
return this._memoizedDefaultScale.val;
|
|
137
|
-
}
|
|
138
|
-
set defaultScale(scale) {
|
|
139
|
-
this._memoizedDefaultScale.val = scale;
|
|
140
|
-
}
|
|
141
|
-
getData() {
|
|
142
|
-
return {
|
|
143
|
-
version: this.version,
|
|
144
|
-
objects: this.objects.map((obj) => ({
|
|
145
|
-
id: obj.id,
|
|
146
|
-
label: obj.label,
|
|
147
|
-
meshPaths: [...obj.meshPaths],
|
|
148
|
-
})),
|
|
149
|
-
name: this.name,
|
|
150
|
-
description: this.description,
|
|
151
|
-
bounds_min: this.bounds_min,
|
|
152
|
-
bounds_max: this.bounds_max,
|
|
153
|
-
defaultPosition: this.defaultPosition,
|
|
154
|
-
defaultRotation: this.defaultRotation,
|
|
155
|
-
defaultScale: this.defaultScale,
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
setData(data) {
|
|
159
|
-
this.version = data.version;
|
|
160
|
-
data.objects.forEach((obj) => {
|
|
161
|
-
const modelObject = ModelObject_1.makeModelObject(obj.id);
|
|
162
|
-
modelObject.label = obj.label;
|
|
163
|
-
obj.meshPaths.forEach((path) => modelObject.addMeshPath(path));
|
|
164
|
-
this.addObject(modelObject);
|
|
165
|
-
});
|
|
166
|
-
this.name = data.name;
|
|
167
|
-
this.description = data.description;
|
|
168
|
-
this.bounds_min = data.bounds_min;
|
|
169
|
-
this.bounds_max = data.bounds_max;
|
|
170
|
-
this.defaultPosition = data.defaultPosition;
|
|
171
|
-
this.defaultRotation = data.defaultRotation;
|
|
172
|
-
this.defaultScale = data.defaultScale;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { ObservableEntity } from "./ObservableEntity";
|
|
2
|
-
export declare abstract class ModelObject extends ObservableEntity {
|
|
3
|
-
abstract readonly id: string;
|
|
4
|
-
abstract get label(): string;
|
|
5
|
-
abstract set label(label: string);
|
|
6
|
-
abstract get meshPaths(): string[];
|
|
7
|
-
abstract addMeshPath(path: string): void;
|
|
8
|
-
abstract removeMeshPath(path: string): void;
|
|
9
|
-
}
|
|
10
|
-
export declare function makeModelObject(id: string): ModelObject;
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.makeModelObject = exports.ModelObject = void 0;
|
|
4
|
-
const MemoizedString_1 = require("./MemoizedString");
|
|
5
|
-
const ObservableEntity_1 = require("./ObservableEntity");
|
|
6
|
-
class ModelObject extends ObservableEntity_1.ObservableEntity {
|
|
7
|
-
}
|
|
8
|
-
exports.ModelObject = ModelObject;
|
|
9
|
-
function makeModelObject(id) {
|
|
10
|
-
return new ModelObjectImp(id);
|
|
11
|
-
}
|
|
12
|
-
exports.makeModelObject = makeModelObject;
|
|
13
|
-
class ModelObjectImp extends ModelObject {
|
|
14
|
-
constructor(id) {
|
|
15
|
-
super();
|
|
16
|
-
this.memoizedLabel = new MemoizedString_1.MemoizedString("", this.notify);
|
|
17
|
-
this._meshPaths = new Set([]);
|
|
18
|
-
this.id = id;
|
|
19
|
-
}
|
|
20
|
-
get label() {
|
|
21
|
-
return this.memoizedLabel.val;
|
|
22
|
-
}
|
|
23
|
-
set label(label) {
|
|
24
|
-
this.memoizedLabel.val = label;
|
|
25
|
-
}
|
|
26
|
-
get meshPaths() {
|
|
27
|
-
return Array.from(this._meshPaths);
|
|
28
|
-
}
|
|
29
|
-
addMeshPath(path) {
|
|
30
|
-
if (this._meshPaths.has(path)) {
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
this._meshPaths.add(path);
|
|
34
|
-
this.notify();
|
|
35
|
-
}
|
|
36
|
-
removeMeshPath(path) {
|
|
37
|
-
if (this._meshPaths.has(path)) {
|
|
38
|
-
this._meshPaths.delete(path);
|
|
39
|
-
this.notify();
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|