@vived/app 3.0.2 → 3.1.1

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.
@@ -7,9 +7,9 @@ export declare abstract class AppObjectPM<T> implements AppObjectComponent {
7
7
  private _lastVM?;
8
8
  get lastVM(): T | undefined;
9
9
  private observerList;
10
- addView: (updateView: (vm: T) => void) => void;
11
- removeView: (updateView: (vm: T) => void) => void;
12
- doUpdateView: (vm: T) => void;
10
+ addView(updateView: (vm: T) => void): void;
11
+ removeView(updateView: (vm: T) => void): void;
12
+ doUpdateView(vm: T): void;
13
13
  dispose(): void;
14
14
  constructor(appObject: AppObject, type: string);
15
15
  }
@@ -5,22 +5,6 @@ const Entities_1 = require("../Entities");
5
5
  class AppObjectPM {
6
6
  constructor(appObject, type) {
7
7
  this.observerList = new Entities_1.ObserverList();
8
- this.addView = (updateView) => {
9
- this.observerList.add(updateView);
10
- if (this._lastVM) {
11
- updateView(this._lastVM);
12
- }
13
- };
14
- this.removeView = (updateView) => {
15
- this.observerList.remove(updateView);
16
- };
17
- this.doUpdateView = (vm) => {
18
- if (this._lastVM && this.vmsAreEqual(this._lastVM, vm)) {
19
- return;
20
- }
21
- this._lastVM = vm;
22
- this.observerList.notify(vm);
23
- };
24
8
  this.type = type;
25
9
  this.appObject = appObject;
26
10
  appObject.addComponent(this);
@@ -28,6 +12,25 @@ class AppObjectPM {
28
12
  get lastVM() {
29
13
  return this._lastVM;
30
14
  }
15
+ addView(updateView) {
16
+ this.observerList.add(updateView);
17
+ if (this._lastVM) {
18
+ updateView(this._lastVM);
19
+ }
20
+ }
21
+ ;
22
+ removeView(updateView) {
23
+ this.observerList.remove(updateView);
24
+ }
25
+ ;
26
+ doUpdateView(vm) {
27
+ if (this._lastVM && this.vmsAreEqual(this._lastVM, vm)) {
28
+ return;
29
+ }
30
+ this._lastVM = vm;
31
+ this.observerList.notify(vm);
32
+ }
33
+ ;
31
34
  dispose() {
32
35
  this.observerList.clear();
33
36
  if (this.appObject.getComponent(this.type) === this) {
@@ -13,6 +13,7 @@ class IsHiddenPM extends AppObjectPM_1.AppObjectPM {
13
13
  };
14
14
  this.dispose = () => {
15
15
  var _a, _b;
16
+ super.dispose();
16
17
  (_a = this.hideable) === null || _a === void 0 ? void 0 : _a.removeChangeObserver(this.onIsHiddenChange);
17
18
  (_b = this.hideable) === null || _b === void 0 ? void 0 : _b.removeOnDisposeObserver(this.dispose);
18
19
  };
@@ -23,7 +24,7 @@ class IsHiddenPM extends AppObjectPM_1.AppObjectPM {
23
24
  }
24
25
  else {
25
26
  this.hideable.addChangeObserver(this.onIsHiddenChange);
26
- this.hideable.addOnDisposeObserver(() => this.dispose());
27
+ this.hideable.addOnDisposeObserver(this.dispose);
27
28
  this.onIsHiddenChange();
28
29
  }
29
30
  }
@@ -28,7 +28,7 @@ class LabelPM extends AppObject_1.AppObjectPM {
28
28
  this.label = Label_1.Label.get(appObject);
29
29
  if (this.label) {
30
30
  this.label.addChangeObserver(this.onLabelChange);
31
- this.label.addOnDisposeObserver(() => this.dispose());
31
+ this.label.addOnDisposeObserver(this.dispose);
32
32
  this.onLabelChange();
33
33
  }
34
34
  else {
@@ -13,6 +13,7 @@ class OverlayColorPM extends AppObjectPM_1.AppObjectPM {
13
13
  };
14
14
  this.dispose = () => {
15
15
  var _a, _b;
16
+ super.dispose();
16
17
  (_a = this.overlayColor) === null || _a === void 0 ? void 0 : _a.removeChangeObserver(this.onColorChange);
17
18
  (_b = this.overlayColor) === null || _b === void 0 ? void 0 : _b.removeOnDisposeObserver(this.dispose);
18
19
  };
@@ -23,7 +24,7 @@ class OverlayColorPM extends AppObjectPM_1.AppObjectPM {
23
24
  }
24
25
  else {
25
26
  this.overlayColor.addChangeObserver(this.onColorChange);
26
- this.overlayColor.addOnDisposeObserver(() => this.dispose());
27
+ this.overlayColor.addOnDisposeObserver(this.dispose);
27
28
  this.onColorChange();
28
29
  }
29
30
  }
@@ -0,0 +1,31 @@
1
+ import { AppObject } from "../../../AppObject/AppObject";
2
+ import { AppObjectEntity } from "../../../AppObject/AppObjectEntity";
3
+ import { AppObjectRepo } from "../../../AppObject/AppObjectRepo";
4
+ import { EaseFn } from "../../../Types";
5
+ import { Quaternion, Vector3 } from "../../../ValueObjects";
6
+ import { Transform3D } from "../../Transform3D";
7
+ export interface DefaultSceneRootData {
8
+ position: [number, number, number];
9
+ rotation: [number, number, number, number];
10
+ scale: number;
11
+ minScale: number;
12
+ maxScale: number;
13
+ }
14
+ export declare abstract class SceneRoot extends AppObjectEntity {
15
+ static readonly type = "SCENE_ROOT";
16
+ abstract defaultPosition: Vector3;
17
+ abstract defaultRoation: Quaternion;
18
+ abstract defaultScale: number;
19
+ abstract minScale: number;
20
+ abstract maxScale: number;
21
+ abstract position: Vector3;
22
+ abstract rotation: Quaternion;
23
+ abstract scale: number;
24
+ abstract readonly transform: Transform3D;
25
+ abstract applyDefaultData: (data: DefaultSceneRootData) => void;
26
+ abstract centerOnPoint: (point: Vector3, durationMS: number, easeFn: EaseFn, onCompleted?: () => void) => void;
27
+ abstract lerpToDefault: (durationMS: number, easeFn: EaseFn, onCompleted?: () => void) => void;
28
+ abstract bumpScaleAboutPoint: (amount: number, worldPoint: Vector3) => void;
29
+ static get(appObjects: AppObjectRepo): SceneRoot | undefined;
30
+ }
31
+ export declare function makeSceneRoot(appObj: AppObject): SceneRoot;
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeSceneRoot = exports.SceneRoot = void 0;
4
+ const AppObjectEntity_1 = require("../../../AppObject/AppObjectEntity");
5
+ const ValueObjects_1 = require("../../../ValueObjects");
6
+ const Transform3D_1 = require("../../Transform3D");
7
+ class SceneRoot extends AppObjectEntity_1.AppObjectEntity {
8
+ static get(appObjects) {
9
+ const repo = appObjects.getAllComponents(SceneRoot.type);
10
+ if (repo.length === 0) {
11
+ console.warn("[SceneRoot] Unable to find Scene Root Entity. Add one on Mount");
12
+ return undefined;
13
+ }
14
+ else if (repo.length > 1) {
15
+ console.warn("[SceneRoot] Multiple Scene Root Entity have been found. There should only be one. Using the first one");
16
+ }
17
+ return repo[0];
18
+ }
19
+ }
20
+ exports.SceneRoot = SceneRoot;
21
+ SceneRoot.type = "SCENE_ROOT";
22
+ function makeSceneRoot(appObj) {
23
+ Transform3D_1.Transform3D.addIfMissing(appObj);
24
+ return new SceneRootImp(appObj);
25
+ }
26
+ exports.makeSceneRoot = makeSceneRoot;
27
+ class SceneRootImp extends SceneRoot {
28
+ constructor(appObject) {
29
+ super(appObject, SceneRoot.type);
30
+ this._defaultPosition = ValueObjects_1.Vector3.Zero();
31
+ this._defaultRoation = ValueObjects_1.Quaternion.Identity();
32
+ this._defaultScale = 1;
33
+ this._minScale = 0.01;
34
+ this._maxScale = 10;
35
+ this.applyDefaultData = (data) => {
36
+ this._defaultPosition = ValueObjects_1.Vector3.FromArray(data.position);
37
+ this._defaultRoation = ValueObjects_1.Quaternion.FromArray(data.rotation);
38
+ this._defaultScale = data.scale;
39
+ this._maxScale = data.maxScale;
40
+ this._minScale = data.minScale;
41
+ };
42
+ this.centerOnPoint = (point, durationMS, easeFn, onCompleted) => {
43
+ const finalPosition = ValueObjects_1.Vector3.Subtract(this.transform.worldPosition, point);
44
+ this.transform.lerp(durationMS, easeFn, finalPosition, undefined, undefined, onCompleted);
45
+ };
46
+ this.bumpScaleAboutPoint = (amount, worldPoint) => {
47
+ const localPickOffset = this.transform.worldPointToLocal(worldPoint);
48
+ const currentScale = this.transform.worldScale.x;
49
+ let newScale = currentScale + amount;
50
+ if (newScale < this.minScale) {
51
+ newScale = this.minScale;
52
+ }
53
+ else if (newScale > this.maxScale) {
54
+ newScale = this.maxScale;
55
+ }
56
+ this.transform.worldScale = new ValueObjects_1.Vector3(newScale, newScale, newScale);
57
+ const worldPickOffset = this.transform.localPointToWorld(localPickOffset);
58
+ const bump = ValueObjects_1.Vector3.Subtract(worldPoint, worldPickOffset);
59
+ this.transform.worldPosition = ValueObjects_1.Vector3.Add(bump, this.transform.worldPosition);
60
+ };
61
+ this.lerpToDefault = (durationMS, easeFn, onCompleted) => {
62
+ this.transform.lerp(durationMS, easeFn, this.defaultPosition, this.defaultRoation, new ValueObjects_1.Vector3(this.defaultScale, this.defaultScale, this.defaultScale), onCompleted);
63
+ };
64
+ const transform = Transform3D_1.Transform3D.get(appObject);
65
+ if (transform) {
66
+ this.transform = transform;
67
+ transform.addChangeObserver(this.notifyOnChange);
68
+ }
69
+ else {
70
+ throw Error("Scene Root does not have a Transform3D Component. Use the factory to make this");
71
+ }
72
+ }
73
+ get position() {
74
+ return this.transform.localPosition;
75
+ }
76
+ set position(p) {
77
+ this.transform.localPosition = p;
78
+ }
79
+ get rotation() {
80
+ return this.transform.localRotation;
81
+ }
82
+ set rotation(r) {
83
+ this.transform.localRotation = r;
84
+ }
85
+ get scale() {
86
+ return this.transform.localScale.x;
87
+ }
88
+ set scale(s) {
89
+ this.transform.localScale = new ValueObjects_1.Vector3(s, s, s);
90
+ }
91
+ get defaultPosition() {
92
+ return this._defaultPosition;
93
+ }
94
+ get defaultRoation() {
95
+ return this._defaultRoation;
96
+ }
97
+ get defaultScale() {
98
+ return this._defaultScale;
99
+ }
100
+ get minScale() {
101
+ return this._minScale;
102
+ }
103
+ get maxScale() {
104
+ return this._maxScale;
105
+ }
106
+ }
@@ -0,0 +1,31 @@
1
+ import { AppObject } from "../../../AppObject/AppObject";
2
+ import { AppObjectUC } from "../../../AppObject/AppObjectUC";
3
+ import { SerializedSystem, StateMachine } from "../../../Entities";
4
+ export declare abstract class SerializeSceneRoot extends AppObjectUC implements SerializedSystem {
5
+ static readonly type = "SerializeSceneRoot";
6
+ name: string;
7
+ abstract seriliziationVersion: number;
8
+ abstract getSystemState(): object;
9
+ abstract applySystemState(state: object, version: number, transitionDuration: number): void;
10
+ abstract applyDefaultState(transitionDuration: number): void;
11
+ }
12
+ export declare function makeSerializeSceneRoot(appObject: AppObject, stateMachine: StateMachine): SerializeSceneRoot;
13
+ export interface SceneRootDataV1 {
14
+ position: [number, number, number];
15
+ rotation: [number, number, number, number];
16
+ scale: [number, number, number];
17
+ }
18
+ export interface SceneRootDataV2 {
19
+ position: {
20
+ x: number;
21
+ y: number;
22
+ z: number;
23
+ };
24
+ rotation: {
25
+ x: number;
26
+ y: number;
27
+ z: number;
28
+ w: number;
29
+ };
30
+ scale: number;
31
+ }
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeSerializeSceneRoot = exports.SerializeSceneRoot = void 0;
4
+ const AppObjectUC_1 = require("../../../AppObject/AppObjectUC");
5
+ const ValueObjects_1 = require("../../../ValueObjects");
6
+ const SceneRoot_1 = require("../Entities/SceneRoot");
7
+ class SerializeSceneRoot extends AppObjectUC_1.AppObjectUC {
8
+ constructor() {
9
+ super(...arguments);
10
+ this.name = "sceneRoot";
11
+ }
12
+ }
13
+ exports.SerializeSceneRoot = SerializeSceneRoot;
14
+ SerializeSceneRoot.type = "SerializeSceneRoot";
15
+ function makeSerializeSceneRoot(appObject, stateMachine) {
16
+ return new SerializeSceneRootImp(appObject, stateMachine);
17
+ }
18
+ exports.makeSerializeSceneRoot = makeSerializeSceneRoot;
19
+ class SerializeSceneRootImp extends SerializeSceneRoot {
20
+ constructor(appObject, stateMachine) {
21
+ super(appObject, SerializeSceneRoot.type);
22
+ this.seriliziationVersion = 2;
23
+ this.stateMachine = stateMachine;
24
+ this.sceneRoot = appObject.getComponent(SceneRoot_1.SceneRoot.type);
25
+ if (!this.sceneRoot) {
26
+ console.warn("SerializeSceneRoot UC has been added to an App Object that does not have a SceneRoot Entity. Add one before adding the UC");
27
+ this.dispose();
28
+ return;
29
+ }
30
+ stateMachine.registerSerializedSystem(this);
31
+ }
32
+ getSystemState() {
33
+ if (!this.sceneRoot) {
34
+ console.warn("[SerializeSceneRoot] No scene root entity");
35
+ return {};
36
+ }
37
+ const data = {
38
+ position: this.sceneRoot.position.dto,
39
+ rotation: this.sceneRoot.rotation.dto,
40
+ scale: this.sceneRoot.scale,
41
+ };
42
+ return data;
43
+ }
44
+ applySystemState(serializedState, version, transitionTime) {
45
+ try {
46
+ if (version === 1) {
47
+ const castState = serializedState;
48
+ this.applyV1Data(castState, transitionTime);
49
+ }
50
+ else if (version === 2) {
51
+ const castState = serializedState;
52
+ this.applyV2Data(castState, transitionTime);
53
+ }
54
+ else {
55
+ console.warn(`[SerializeSceneRoot] Unsupported version number ${version}. Defaulting`);
56
+ this.applyDefaultState(transitionTime);
57
+ }
58
+ }
59
+ catch (e) {
60
+ console.warn(`[SerializeSceneRoot] Caught when deserializing ${e}. Defaulting`);
61
+ this.applyDefaultState(transitionTime);
62
+ }
63
+ }
64
+ applyDefaultState(transitionDuration) {
65
+ if (!this.sceneRoot) {
66
+ console.warn("[SerializeSceneRoot] No scene root entity");
67
+ return;
68
+ }
69
+ this.sceneRoot.lerpToDefault(transitionDuration * 1000, this.stateMachine.transitionEaseFunction);
70
+ }
71
+ applyV2Data(data, transitionTime) {
72
+ if (!this.sceneRoot) {
73
+ console.warn("[SerializeSceneRoot] No scene root entity");
74
+ return;
75
+ }
76
+ const pos = ValueObjects_1.Vector3.FromDTO(data.position);
77
+ const rot = ValueObjects_1.Quaternion.FromDTO(data.rotation);
78
+ const scale = new ValueObjects_1.Vector3(data.scale, data.scale, data.scale);
79
+ const rootTransform = this.sceneRoot.transform;
80
+ rootTransform.lerp(transitionTime * 1000, this.stateMachine.transitionEaseFunction, pos, rot, scale);
81
+ }
82
+ applyV1Data(data, transitionTime) {
83
+ if (!this.sceneRoot) {
84
+ console.warn("[SerializeSceneRoot] No scene root entity");
85
+ return;
86
+ }
87
+ const pos = ValueObjects_1.Vector3.FromArray(data.position);
88
+ const rot = ValueObjects_1.Quaternion.FromArray(data.rotation);
89
+ const scale = ValueObjects_1.Vector3.FromArray(data.scale);
90
+ const rootTransform = this.sceneRoot.transform;
91
+ rootTransform.lerp(transitionTime * 1000, this.stateMachine.transitionEaseFunction, pos, rot, scale);
92
+ }
93
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./Entities/SceneRoot";
2
+ export * from "./UC/SerializeSceneRoot";
@@ -0,0 +1,14 @@
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("./Entities/SceneRoot"), exports);
14
+ __exportStar(require("./UC/SerializeSceneRoot"), exports);
@@ -16,6 +16,7 @@ class CanBeStuckPM extends AppObjectPM_1.AppObjectPM {
16
16
  };
17
17
  this.dispose = () => {
18
18
  var _a, _b;
19
+ super.dispose();
19
20
  (_a = this.transform) === null || _a === void 0 ? void 0 : _a.removeChangeObserver(this.onTransformChange);
20
21
  (_b = this.transform) === null || _b === void 0 ? void 0 : _b.removeOnDisposeObserver(this.dispose);
21
22
  };
@@ -26,7 +27,7 @@ class CanBeStuckPM extends AppObjectPM_1.AppObjectPM {
26
27
  }
27
28
  else {
28
29
  this.transform.addChangeObserver(this.onTransformChange);
29
- this.transform.addOnDisposeObserver(() => this.dispose());
30
+ this.transform.addOnDisposeObserver(this.dispose);
30
31
  this.onTransformChange();
31
32
  }
32
33
  }
@@ -19,6 +19,7 @@ class Transform3DPM extends AppObjectPM_1.AppObjectPM {
19
19
  };
20
20
  this.dispose = () => {
21
21
  var _a, _b;
22
+ super.dispose();
22
23
  (_a = this.transform) === null || _a === void 0 ? void 0 : _a.removeChangeObserver(this.onTransformChange);
23
24
  (_b = this.transform) === null || _b === void 0 ? void 0 : _b.removeOnDisposeObserver(this.dispose);
24
25
  };
@@ -29,7 +30,7 @@ class Transform3DPM extends AppObjectPM_1.AppObjectPM {
29
30
  }
30
31
  else {
31
32
  this.transform.addChangeObserver(this.onTransformChange);
32
- this.transform.addOnDisposeObserver(() => this.dispose());
33
+ this.transform.addOnDisposeObserver(this.dispose);
33
34
  this.onTransformChange();
34
35
  }
35
36
  }
@@ -3,4 +3,5 @@ export * from "./Hideable";
3
3
  export * from "./Label";
4
4
  export * from "./Mesh";
5
5
  export * from "./OverlayColor";
6
+ export * from "./SceneRoot";
6
7
  export * from "./Transform3D";
@@ -15,4 +15,5 @@ __exportStar(require("./Hideable"), exports);
15
15
  __exportStar(require("./Label"), exports);
16
16
  __exportStar(require("./Mesh"), exports);
17
17
  __exportStar(require("./OverlayColor"), exports);
18
+ __exportStar(require("./SceneRoot"), exports);
18
19
  __exportStar(require("./Transform3D"), exports);
@@ -20,7 +20,6 @@ export * from "./SceneModelMesh";
20
20
  export * from "./SceneModelRepo";
21
21
  export * from "./SceneObject";
22
22
  export * from "./SceneObjectsRepo";
23
- export * from "./SceneRoot";
24
23
  export * from "./StateMachine";
25
24
  export * from "./Tool";
26
25
  export * from "./ToolRepository";
@@ -32,7 +32,6 @@ __exportStar(require("./SceneModelMesh"), exports);
32
32
  __exportStar(require("./SceneModelRepo"), exports);
33
33
  __exportStar(require("./SceneObject"), exports);
34
34
  __exportStar(require("./SceneObjectsRepo"), exports);
35
- __exportStar(require("./SceneRoot"), exports);
36
35
  __exportStar(require("./StateMachine"), exports);
37
36
  __exportStar(require("./Tool"), exports);
38
37
  __exportStar(require("./ToolRepository"), exports);
@@ -1,9 +1,7 @@
1
1
  export * from "./setDevicePreview";
2
2
  export * from "./Handlers";
3
3
  export * from "./QuestionChallenge";
4
- export * from "./SceneModel";
5
4
  export * from "./LerpVector3";
6
- export * from "./SceneRoot";
7
5
  export * from "./HoverLabels/trySetHoverLabel";
8
6
  export * from "./HoverLabels/SerializeAllowHoverLabel";
9
7
  export * from "./setupStandardAppObjects";
@@ -13,9 +13,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
13
13
  __exportStar(require("./setDevicePreview"), exports);
14
14
  __exportStar(require("./Handlers"), exports);
15
15
  __exportStar(require("./QuestionChallenge"), exports);
16
- __exportStar(require("./SceneModel"), exports);
17
16
  __exportStar(require("./LerpVector3"), exports);
18
- __exportStar(require("./SceneRoot"), exports);
19
17
  __exportStar(require("./HoverLabels/trySetHoverLabel"), exports);
20
18
  __exportStar(require("./HoverLabels/SerializeAllowHoverLabel"), exports);
21
19
  __exportStar(require("./setupStandardAppObjects"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vived/app",
3
- "version": "3.0.2",
3
+ "version": "3.1.1",
4
4
  "description": "Public package for the VIVED Learning App system",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",