@vived/app 2.42.1 → 2.43.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.
@@ -4,8 +4,10 @@ export declare abstract class SceneObject extends ObservableEntity {
4
4
  abstract readonly id: string;
5
5
  abstract get label(): string;
6
6
  abstract set label(label: string);
7
- abstract get enabled(): boolean;
8
- abstract set enabled(enabled: boolean);
7
+ abstract get shown(): boolean;
8
+ abstract set shown(shown: boolean);
9
+ abstract get canBeStuck(): boolean;
10
+ abstract stick(durationMS: number, easeFn: (val: number) => number, onStickComplete?: () => void): void;
9
11
  abstract transform: TransformNode;
10
12
  }
11
13
  export declare function makeSceneObject(id: string): SceneObject;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.makeSceneObject = exports.SceneObject = void 0;
4
+ const ValueObjects_1 = require("../ValueObjects");
4
5
  const MemoizedBoolean_1 = require("./MemoizedBoolean");
5
6
  const MemoizedString_1 = require("./MemoizedString");
6
7
  const ObservableEntity_1 = require("./ObservableEntity");
@@ -16,8 +17,16 @@ class SceneObjectImp extends SceneObject {
16
17
  constructor(id) {
17
18
  super();
18
19
  this.memoizedLabel = new MemoizedString_1.MemoizedString("", this.notify);
19
- this.memoizedEnabled = new MemoizedBoolean_1.MemoizedBoolean(true, this.notify);
20
+ this.memoizedShown = new MemoizedBoolean_1.MemoizedBoolean(true, this.notify);
20
21
  this.transform = TransformNode_1.makeTransformNode();
22
+ this.stick = (durationMS, easeFn, onStickComplete) => {
23
+ if (!this.canBeStuck) {
24
+ if (onStickComplete)
25
+ onStickComplete();
26
+ return;
27
+ }
28
+ this.transform.lerp(durationMS, easeFn, ValueObjects_1.Vector3.Zero(), undefined, undefined, onStickComplete);
29
+ };
21
30
  this.id = id;
22
31
  this.transform.addObserver(this.notify);
23
32
  }
@@ -27,10 +36,18 @@ class SceneObjectImp extends SceneObject {
27
36
  set label(label) {
28
37
  this.memoizedLabel.val = label;
29
38
  }
30
- get enabled() {
31
- return this.memoizedEnabled.val;
39
+ get shown() {
40
+ return this.memoizedShown.val;
32
41
  }
33
- set enabled(enabled) {
34
- this.memoizedEnabled.val = enabled;
42
+ set shown(enabled) {
43
+ this.memoizedShown.val = enabled;
44
+ }
45
+ get canBeStuck() {
46
+ if (ValueObjects_1.Vector3.Equal(this.transform.localPosition, ValueObjects_1.Vector3.Zero())) {
47
+ return false;
48
+ }
49
+ else {
50
+ return true;
51
+ }
35
52
  }
36
53
  }
@@ -0,0 +1,2 @@
1
+ export * from './modelDataLoader';
2
+ export * from './setActiveSceneModel';
@@ -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("./modelDataLoader"), exports);
14
+ __exportStar(require("./setActiveSceneModel"), exports);
@@ -0,0 +1,3 @@
1
+ import { AppDispatcher, SceneModelDTO } from "../../Entities";
2
+ export declare const SCENE_MODEL_DATA_ASSET_LINK_TYPE = "default_model_data";
3
+ export declare function makeModelDataLoader(appDispatcher: AppDispatcher): (modelID: string) => Promise<SceneModelDTO>;
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.makeModelDataLoader = exports.SCENE_MODEL_DATA_ASSET_LINK_TYPE = void 0;
13
+ exports.SCENE_MODEL_DATA_ASSET_LINK_TYPE = "default_model_data";
14
+ function makeModelDataLoader(appDispatcher) {
15
+ return function modelDataLoader(modelID) {
16
+ return __awaiter(this, void 0, void 0, function* () {
17
+ try {
18
+ const dataAssets = yield appDispatcher.getLinkedAssets(modelID, exports.SCENE_MODEL_DATA_ASSET_LINK_TYPE);
19
+ if (dataAssets.length === 0) {
20
+ return Promise.reject(new Error("Model asset does not have data"));
21
+ }
22
+ const dataFileBlobURL = yield appDispatcher.getAssetBlobURL(dataAssets[0].id);
23
+ const fetchDataResp = yield fetch(dataFileBlobURL);
24
+ const modelJSONData = yield fetchDataResp.json();
25
+ return Promise.resolve(modelJSONData);
26
+ }
27
+ catch (e) {
28
+ return Promise.reject(e);
29
+ }
30
+ });
31
+ };
32
+ }
33
+ exports.makeModelDataLoader = makeModelDataLoader;
@@ -0,0 +1,2 @@
1
+ import { AppDispatcher, SceneModel, SceneModelRepo, SceneObjectsRepo, SceneRoot } from "../../Entities";
2
+ export declare function makeSetActiveModel(sceneModelRepo: SceneModelRepo, sceneObjectRepo: SceneObjectsRepo, sceneRoot: SceneRoot, appDispatcher: AppDispatcher): (modelID: string) => Promise<SceneModel>;
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.makeSetActiveModel = void 0;
13
+ const Entities_1 = require("../../Entities");
14
+ function makeSetActiveModel(sceneModelRepo, sceneObjectRepo, sceneRoot, appDispatcher) {
15
+ return function setActiveSceneModel(modelID) {
16
+ return __awaiter(this, void 0, void 0, function* () {
17
+ let sceneModel = sceneModelRepo.get(modelID);
18
+ if (sceneModel === undefined) {
19
+ sceneModel = Entities_1.makeSceneModel(modelID);
20
+ sceneModelRepo.add(modelID, sceneModel);
21
+ }
22
+ sceneModelRepo.activeModelID = modelID;
23
+ if (sceneModel.state === Entities_1.SceneModelState.LOADING) {
24
+ return Promise.resolve(sceneModel);
25
+ }
26
+ if (sceneModel.state === Entities_1.SceneModelState.READY) {
27
+ sceneModelRepo.activeModelID = modelID;
28
+ return Promise.resolve(sceneModel);
29
+ }
30
+ sceneModel.error = undefined;
31
+ sceneModel.state = Entities_1.SceneModelState.LOADING;
32
+ sceneModelRepo.isLoadingSceneModel = true;
33
+ const dto = {
34
+ title: "Loading active model and data",
35
+ message: "Loading...",
36
+ };
37
+ const closeSpinner = yield appDispatcher.showSpinner(dto);
38
+ try {
39
+ const dataDTO = yield sceneModelRepo.dataLoader(modelID);
40
+ sceneModel.applyData(dataDTO);
41
+ sceneModel.getAllObjects().forEach((meshObject) => {
42
+ let so = sceneObjectRepo.get(meshObject.id);
43
+ if (!so) {
44
+ so = Entities_1.makeSceneObject(meshObject.id);
45
+ sceneObjectRepo.add(meshObject.id, so);
46
+ }
47
+ so.label = meshObject.label;
48
+ so.transform.parent = sceneRoot.transform;
49
+ so.notify();
50
+ });
51
+ yield sceneModelRepo.modelLoader(modelID);
52
+ sceneModel.state = Entities_1.SceneModelState.READY;
53
+ sceneModelRepo.isLoadingSceneModel = false;
54
+ closeSpinner();
55
+ return Promise.resolve(sceneModel);
56
+ }
57
+ catch (e) {
58
+ const error = e;
59
+ sceneModelRepo.isLoadingSceneModel = false;
60
+ sceneModelRepo.clearActiveModel();
61
+ sceneModel.error = error;
62
+ closeSpinner();
63
+ const alertDTO = {
64
+ title: "Load Error",
65
+ message: `Failed to Load the Model and Data. Error message: ${error.message}`,
66
+ closeButtonLabel: "OK",
67
+ closeCallback: () => {
68
+ // nada
69
+ },
70
+ };
71
+ appDispatcher.showAlert(alertDTO);
72
+ return Promise.reject(error);
73
+ }
74
+ });
75
+ };
76
+ }
77
+ exports.makeSetActiveModel = makeSetActiveModel;
@@ -0,0 +1,20 @@
1
+ import { Babylon, SceneObjectsRepo, TransformNode } from "../../Entities";
2
+ import { ParametricLine } from "../../ValueObjects";
3
+ export declare class PeelSceneObjectBase {
4
+ private babylon;
5
+ private sceneObjectRepo;
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, sceneObjectRepo: SceneObjectsRepo);
20
+ }
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PeelSceneObjectBase = void 0;
4
+ const ValueObjects_1 = require("../../ValueObjects");
5
+ class PeelSceneObjectBase {
6
+ constructor(babylon, sceneObjectRepo) {
7
+ this.babylon = babylon;
8
+ this.sceneObjectRepo = sceneObjectRepo;
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;
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 = this.sceneObjectRepo.get(sceneObjectID);
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 = (_a = scenePick.worldPickPoint) !== null && _a !== void 0 ? _a : ValueObjects_1.Vector3.Zero();
32
+ this._peelPlane = ValueObjects_1.ParametricPlane.FromPointNormal(planePickPos, pickPlaneDirection);
33
+ const pick = (_b = this._peelPlane.intersectLine(pickRay)) !== null && _b !== void 0 ? _b : 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.PeelSceneObjectBase = PeelSceneObjectBase;
@@ -0,0 +1 @@
1
+ export * from "./PeelSceneObjectBase";
@@ -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("./PeelSceneObjectBase"), exports);
@@ -1,6 +1,8 @@
1
1
  export * from "./setDevicePreview";
2
2
  export * from "./Handlers";
3
3
  export * from "./QuestionChallenge";
4
+ export * from "./SceneModel";
5
+ export * from "./SceneObject";
4
6
  export * from "./LerpVector3";
5
7
  export * from "./SceneRoot";
6
8
  export * from "./HoverLabels/trySetHoverLabel";
@@ -13,6 +13,8 @@ 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
+ __exportStar(require("./SceneObject"), exports);
16
18
  __exportStar(require("./LerpVector3"), exports);
17
19
  __exportStar(require("./SceneRoot"), exports);
18
20
  __exportStar(require("./HoverLabels/trySetHoverLabel"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vived/app",
3
- "version": "2.42.1",
3
+ "version": "2.43.0",
4
4
  "description": "Public package for the VIVED Learning App system",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",