@vived/app 2.47.1 → 2.48.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.
- package/lib/Entities/FocusCamera.d.ts +70 -0
- package/lib/Entities/FocusCamera.js +272 -0
- package/lib/Entities/KeyboardInput.d.ts +1 -0
- package/lib/Entities/KeyboardInput.js +16 -0
- package/lib/Entities/MeshModel.d.ts +68 -0
- package/lib/Entities/MeshModel.js +174 -0
- package/lib/Entities/ModelObject.d.ts +10 -0
- package/lib/Entities/ModelObject.js +42 -0
- package/lib/Entities/SceneObject.d.ts +11 -0
- package/lib/Entities/SceneObject.js +43 -7
- package/lib/Entities/SceneObjectsRepo.d.ts +3 -0
- package/lib/Entities/SceneObjectsRepo.js +20 -0
- package/lib/PresentationManagers/FocusCameraPM.d.ts +15 -0
- package/lib/PresentationManagers/FocusCameraPM.js +31 -0
- package/lib/PresentationManagers/FocusCameraPosRotPM.d.ts +13 -0
- package/lib/PresentationManagers/FocusCameraPosRotPM.js +28 -0
- package/lib/PresentationManagers/SceneObject/SceneObjectPM.d.ts +5 -0
- package/lib/PresentationManagers/SceneObject/SceneObjectPM.js +17 -0
- package/lib/PresentationManagers/index.d.ts +0 -1
- package/lib/PresentationManagers/index.js +0 -1
- package/lib/UseCases/FocusCamera/BumpDollyFocusCamera.d.ts +17 -0
- package/lib/UseCases/FocusCamera/BumpDollyFocusCamera.js +64 -0
- package/lib/UseCases/FocusCamera/LerpFocusCamera.d.ts +36 -0
- package/lib/UseCases/FocusCamera/LerpFocusCamera.js +71 -0
- package/lib/UseCases/FocusCamera/PinchDollyFocusCamera.d.ts +11 -0
- package/lib/UseCases/FocusCamera/PinchDollyFocusCamera.js +36 -0
- package/lib/UseCases/FocusCamera/PixelDollyFocusCamera.d.ts +11 -0
- package/lib/UseCases/FocusCamera/PixelDollyFocusCamera.js +36 -0
- package/lib/UseCases/FocusCamera/PixelOrbitFocusCamera.d.ts +11 -0
- package/lib/UseCases/FocusCamera/PixelOrbitFocusCamera.js +26 -0
- package/lib/UseCases/FocusCamera/PixelPlanePanFocusCamera.d.ts +11 -0
- package/lib/UseCases/FocusCamera/PixelPlanePanFocusCamera.js +33 -0
- package/lib/UseCases/FocusCamera/SerializeFocusCamera.d.ts +22 -0
- package/lib/UseCases/FocusCamera/SerializeFocusCamera.js +81 -0
- package/lib/UseCases/FocusCamera/index.d.ts +7 -0
- package/lib/{PresentationManagers/SceneModel → UseCases/FocusCamera}/index.js +7 -1
- package/package.json +1 -1
- package/lib/Entities/ModelMesh.d.ts +0 -53
- package/lib/Entities/ModelMesh.js +0 -106
- package/lib/Entities/SceneModelObject.d.ts +0 -40
- package/lib/Entities/SceneModelObject.js +0 -77
- package/lib/PresentationManagers/SceneModel/SceneModelPM.d.ts +0 -15
- package/lib/PresentationManagers/SceneModel/SceneModelPM.js +0 -36
- package/lib/PresentationManagers/SceneModel/index.d.ts +0 -1
- package/lib/UseCases/SceneModel/PeelSceneMeshBase.d.ts +0 -20
- package/lib/UseCases/SceneModel/PeelSceneMeshBase.js +0 -66
- package/lib/UseCases/SceneModel/setActiveSceneModel.d.ts +0 -2
- package/lib/UseCases/SceneModel/setActiveSceneModel.js +0 -90
- package/lib/UseCases/SceneModel/setupSceneModelFromData.d.ts +0 -2
- package/lib/UseCases/SceneModel/setupSceneModelFromData.js +0 -72
- package/lib/UseCases/SceneObject/PeelSceneObjectBase.d.ts +0 -20
- package/lib/UseCases/SceneObject/PeelSceneObjectBase.js +0 -66
- package/lib/UseCases/SceneObject/index.d.ts +0 -1
- package/lib/UseCases/SceneObject/index.js +0 -13
- package/lib/UseCases/SceneRoot/initializeSceneRoot.d.ts +0 -2
- package/lib/UseCases/SceneRoot/initializeSceneRoot.js +0 -9
|
@@ -6,6 +6,17 @@ export declare abstract class SceneObject extends ObservableEntity {
|
|
|
6
6
|
abstract set shown(shown: boolean);
|
|
7
7
|
abstract get enabled(): boolean;
|
|
8
8
|
abstract set enabled(enabled: boolean);
|
|
9
|
+
abstract get selected(): boolean;
|
|
10
|
+
abstract set selected(selected: boolean);
|
|
11
|
+
abstract get hovered(): boolean;
|
|
12
|
+
abstract set hovered(hovered: boolean);
|
|
13
|
+
abstract get pressed(): boolean;
|
|
14
|
+
abstract set pressed(pressed: boolean);
|
|
15
|
+
abstract get defaultLabel(): string;
|
|
16
|
+
abstract set defaultLabel(defaultLabel: string);
|
|
17
|
+
abstract get customLabel(): string;
|
|
18
|
+
abstract set customLabel(customLabel: string);
|
|
19
|
+
abstract get validationMessage(): string | null;
|
|
9
20
|
abstract transform: TransformNode;
|
|
10
21
|
abstract sceneTransform: unknown;
|
|
11
22
|
}
|
|
@@ -15,24 +15,42 @@ exports.makeSceneObject = makeSceneObject;
|
|
|
15
15
|
class SceneObjectImp extends SceneObject {
|
|
16
16
|
constructor(id) {
|
|
17
17
|
super();
|
|
18
|
-
this.
|
|
18
|
+
this.memoizedDefaultLabel = new MemoizedString_1.MemoizedString("", this.notify);
|
|
19
|
+
this.memoizedCustomLabel = new MemoizedString_1.MemoizedString("", this.notify);
|
|
19
20
|
this.memoizedShown = new MemoizedBoolean_1.MemoizedBoolean(true, this.notify);
|
|
20
21
|
this.memoizedEnabled = new MemoizedBoolean_1.MemoizedBoolean(true, this.notify);
|
|
22
|
+
this.memoizedSelected = new MemoizedBoolean_1.MemoizedBoolean(false, this.notify);
|
|
23
|
+
this.memoizedHovered = new MemoizedBoolean_1.MemoizedBoolean(false, this.notify);
|
|
24
|
+
this.memoizedPressed = new MemoizedBoolean_1.MemoizedBoolean(false, this.notify);
|
|
21
25
|
this.transform = TransformNode_1.makeTransformNode();
|
|
22
26
|
this.id = id;
|
|
23
27
|
this.transform.addObserver(this.notify);
|
|
24
28
|
}
|
|
25
|
-
get
|
|
26
|
-
return this.
|
|
29
|
+
get defaultLabel() {
|
|
30
|
+
return this.memoizedDefaultLabel.val;
|
|
27
31
|
}
|
|
28
|
-
set
|
|
29
|
-
this.
|
|
32
|
+
set defaultLabel(defaultLabel) {
|
|
33
|
+
this.memoizedDefaultLabel.val = defaultLabel;
|
|
34
|
+
}
|
|
35
|
+
get customLabel() {
|
|
36
|
+
return this.memoizedCustomLabel.val;
|
|
37
|
+
}
|
|
38
|
+
set customLabel(customLabel) {
|
|
39
|
+
this.memoizedCustomLabel.val = customLabel;
|
|
40
|
+
}
|
|
41
|
+
get validationMessage() {
|
|
42
|
+
if (this.customLabel.length > 40) {
|
|
43
|
+
return "Object labels are limited to 40 characters";
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
30
48
|
}
|
|
31
49
|
get shown() {
|
|
32
50
|
return this.memoizedShown.val;
|
|
33
51
|
}
|
|
34
|
-
set shown(
|
|
35
|
-
this.memoizedShown.val =
|
|
52
|
+
set shown(shown) {
|
|
53
|
+
this.memoizedShown.val = shown;
|
|
36
54
|
}
|
|
37
55
|
get enabled() {
|
|
38
56
|
return this.memoizedEnabled.val;
|
|
@@ -40,4 +58,22 @@ class SceneObjectImp extends SceneObject {
|
|
|
40
58
|
set enabled(enabled) {
|
|
41
59
|
this.memoizedEnabled.val = enabled;
|
|
42
60
|
}
|
|
61
|
+
get selected() {
|
|
62
|
+
return this.memoizedSelected.val;
|
|
63
|
+
}
|
|
64
|
+
set selected(selected) {
|
|
65
|
+
this.memoizedSelected.val = selected;
|
|
66
|
+
}
|
|
67
|
+
get hovered() {
|
|
68
|
+
return this.memoizedHovered.val;
|
|
69
|
+
}
|
|
70
|
+
set hovered(hovered) {
|
|
71
|
+
this.memoizedHovered.val = hovered;
|
|
72
|
+
}
|
|
73
|
+
get pressed() {
|
|
74
|
+
return this.memoizedPressed.val;
|
|
75
|
+
}
|
|
76
|
+
set pressed(pressed) {
|
|
77
|
+
this.memoizedPressed.val = pressed;
|
|
78
|
+
}
|
|
43
79
|
}
|
|
@@ -5,5 +5,8 @@ export declare abstract class SceneObjectsRepo extends ObservableEntityRepo<Scen
|
|
|
5
5
|
abstract set pressedSceneObject(sceneObjectId: string | null);
|
|
6
6
|
abstract get hoveredSceneObject(): string | null;
|
|
7
7
|
abstract set hoveredSceneObject(sceneObjectId: string | null);
|
|
8
|
+
abstract unselectAllSceneObjects: () => void;
|
|
9
|
+
abstract getSelectedSceneObjects: () => SceneObject[];
|
|
10
|
+
abstract selectSceneObject: (id: string) => void;
|
|
8
11
|
}
|
|
9
12
|
export declare function makeSceneObjectRepo(): SceneObjectsRepo;
|
|
@@ -14,6 +14,26 @@ class SceneObjectsRepoImp extends SceneObjectsRepo {
|
|
|
14
14
|
super(...arguments);
|
|
15
15
|
this._pressedSceneObject = null;
|
|
16
16
|
this._hoveredSceneObject = null;
|
|
17
|
+
this.unselectAllSceneObjects = () => {
|
|
18
|
+
this.getAll().forEach(sceneObject => {
|
|
19
|
+
sceneObject.selected = false;
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
this.getSelectedSceneObjects = () => {
|
|
23
|
+
const selectedObjects = [];
|
|
24
|
+
this.getAll().forEach(sceneObject => {
|
|
25
|
+
if (sceneObject.selected) {
|
|
26
|
+
selectedObjects.push(sceneObject);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
return selectedObjects;
|
|
30
|
+
};
|
|
31
|
+
this.selectSceneObject = (id) => {
|
|
32
|
+
const sceneObject = this.get(id);
|
|
33
|
+
if (sceneObject) {
|
|
34
|
+
sceneObject.selected = true;
|
|
35
|
+
}
|
|
36
|
+
};
|
|
17
37
|
}
|
|
18
38
|
get pressedSceneObject() {
|
|
19
39
|
return this._pressedSceneObject;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { FocusCamera } from "../Entities";
|
|
2
|
+
import { Vector3 } from "../ValueObjects";
|
|
3
|
+
export interface FocusCameraVM {
|
|
4
|
+
alphaEuler: Vector3;
|
|
5
|
+
betaEuler: Vector3;
|
|
6
|
+
cameraLocalPosition: Vector3;
|
|
7
|
+
target: Vector3;
|
|
8
|
+
}
|
|
9
|
+
export declare class FocusCameraPM {
|
|
10
|
+
private orbitCam;
|
|
11
|
+
private view;
|
|
12
|
+
dispose(): void;
|
|
13
|
+
private doUpdateView;
|
|
14
|
+
constructor(orbitCamera: FocusCamera, view: (vm: FocusCameraVM) => void);
|
|
15
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FocusCameraPM = void 0;
|
|
4
|
+
const Utilities_1 = require("../Utilities");
|
|
5
|
+
const ValueObjects_1 = require("../ValueObjects");
|
|
6
|
+
class FocusCameraPM {
|
|
7
|
+
constructor(orbitCamera, view) {
|
|
8
|
+
this.doUpdateView = () => {
|
|
9
|
+
const { alpha, beta, radius, target } = this.orbitCam;
|
|
10
|
+
const alphaRadians = Utilities_1.degreesToRadians(alpha);
|
|
11
|
+
const alphaEuler = new ValueObjects_1.Vector3(0, alphaRadians, 0);
|
|
12
|
+
const betaRadians = Utilities_1.degreesToRadians(beta);
|
|
13
|
+
const betaEuler = new ValueObjects_1.Vector3(betaRadians, 0, 0);
|
|
14
|
+
const cameraLocalPosition = new ValueObjects_1.Vector3(0, 0, -radius);
|
|
15
|
+
this.view({
|
|
16
|
+
alphaEuler,
|
|
17
|
+
betaEuler,
|
|
18
|
+
cameraLocalPosition,
|
|
19
|
+
target,
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
this.orbitCam = orbitCamera;
|
|
23
|
+
this.view = view;
|
|
24
|
+
this.doUpdateView();
|
|
25
|
+
this.orbitCam.addObserver(this.doUpdateView);
|
|
26
|
+
}
|
|
27
|
+
dispose() {
|
|
28
|
+
this.orbitCam.removeObserver(this.doUpdateView);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.FocusCameraPM = FocusCameraPM;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { FocusCamera } from "../Entities";
|
|
2
|
+
import { Vector3 } from "../ValueObjects";
|
|
3
|
+
export interface FocusCameraPosRotVM {
|
|
4
|
+
position: Vector3;
|
|
5
|
+
rotation: Vector3;
|
|
6
|
+
}
|
|
7
|
+
export declare class FocusCameraPosRotPM {
|
|
8
|
+
private focusCam;
|
|
9
|
+
private view;
|
|
10
|
+
dispose(): void;
|
|
11
|
+
private doUpdateView;
|
|
12
|
+
constructor(orbitCamera: FocusCamera, view: (vm: FocusCameraPosRotVM) => void);
|
|
13
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FocusCameraPosRotPM = void 0;
|
|
4
|
+
const Utilities_1 = require("../Utilities");
|
|
5
|
+
const ValueObjects_1 = require("../ValueObjects");
|
|
6
|
+
class FocusCameraPosRotPM {
|
|
7
|
+
constructor(orbitCamera, view) {
|
|
8
|
+
this.doUpdateView = () => {
|
|
9
|
+
const { alpha, beta } = this.focusCam;
|
|
10
|
+
const alphaRadians = Utilities_1.degreesToRadians(alpha);
|
|
11
|
+
const betaRadians = Utilities_1.degreesToRadians(beta);
|
|
12
|
+
const position = this.focusCam.cameraPosition;
|
|
13
|
+
const rotation = new ValueObjects_1.Vector3(betaRadians, alphaRadians, 0);
|
|
14
|
+
this.view({
|
|
15
|
+
position,
|
|
16
|
+
rotation,
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
this.focusCam = orbitCamera;
|
|
20
|
+
this.view = view;
|
|
21
|
+
this.doUpdateView();
|
|
22
|
+
this.focusCam.addObserver(this.doUpdateView);
|
|
23
|
+
}
|
|
24
|
+
dispose() {
|
|
25
|
+
this.focusCam.removeObserver(this.doUpdateView);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.FocusCameraPosRotPM = FocusCameraPosRotPM;
|
|
@@ -6,6 +6,11 @@ export interface SceneObjectVM {
|
|
|
6
6
|
rotation: Quaternion;
|
|
7
7
|
scale: Vector3;
|
|
8
8
|
enabled: boolean;
|
|
9
|
+
selected: boolean;
|
|
10
|
+
hovered: boolean;
|
|
11
|
+
pressed: boolean;
|
|
12
|
+
defaultLabel: string;
|
|
13
|
+
label: string;
|
|
9
14
|
}
|
|
10
15
|
export declare class SceneObjectPM extends PresentionManager {
|
|
11
16
|
private sceneObject;
|
|
@@ -10,11 +10,18 @@ class SceneObjectPM extends PresentationManager_1.PresentionManager {
|
|
|
10
10
|
this.updateView = updateView;
|
|
11
11
|
this.doUpdateView = () => {
|
|
12
12
|
const enabled = this.sceneObject.shown && this.sceneObject.enabled;
|
|
13
|
+
const label = this.sceneObject.customLabel.length > 0 ?
|
|
14
|
+
this.sceneObject.customLabel : this.sceneObject.defaultLabel;
|
|
13
15
|
const vm = {
|
|
14
16
|
position: this.sceneObject.transform.localPosition,
|
|
15
17
|
rotation: this.sceneObject.transform.localRotation,
|
|
16
18
|
scale: this.sceneObject.transform.localScale,
|
|
17
19
|
enabled,
|
|
20
|
+
selected: this.sceneObject.selected,
|
|
21
|
+
hovered: this.sceneObject.hovered,
|
|
22
|
+
pressed: this.sceneObject.pressed,
|
|
23
|
+
defaultLabel: this.sceneObject.defaultLabel,
|
|
24
|
+
label
|
|
18
25
|
};
|
|
19
26
|
if (this.vmHasChanged(vm)) {
|
|
20
27
|
this.updateView(vm);
|
|
@@ -34,6 +41,16 @@ class SceneObjectPM extends PresentationManager_1.PresentionManager {
|
|
|
34
41
|
return true;
|
|
35
42
|
if (!ValueObjects_1.Quaternion.Close(this.lastVM.rotation, newVM.rotation))
|
|
36
43
|
return true;
|
|
44
|
+
if (this.lastVM.selected !== newVM.selected)
|
|
45
|
+
return true;
|
|
46
|
+
if (this.lastVM.hovered !== newVM.hovered)
|
|
47
|
+
return true;
|
|
48
|
+
if (this.lastVM.pressed !== newVM.pressed)
|
|
49
|
+
return true;
|
|
50
|
+
if (this.lastVM.defaultLabel !== newVM.defaultLabel)
|
|
51
|
+
return true;
|
|
52
|
+
if (this.lastVM.label !== newVM.label)
|
|
53
|
+
return true;
|
|
37
54
|
return false;
|
|
38
55
|
}
|
|
39
56
|
}
|
|
@@ -6,7 +6,6 @@ export * from "./ShowBabylonInspectorPM";
|
|
|
6
6
|
export * from "./HasRedoPM";
|
|
7
7
|
export * from "./HasUndoPM";
|
|
8
8
|
export * from "./QuestionChallenge";
|
|
9
|
-
export * from "./SceneModel";
|
|
10
9
|
export * from "./SceneObject";
|
|
11
10
|
export * from "./ToolPM";
|
|
12
11
|
export * from "./TransformNodePM";
|
|
@@ -18,7 +18,6 @@ __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("./SceneModel"), exports);
|
|
22
21
|
__exportStar(require("./SceneObject"), exports);
|
|
23
22
|
__exportStar(require("./ToolPM"), exports);
|
|
24
23
|
__exportStar(require("./TransformNodePM"), exports);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { FocusCamera } from "../../Entities";
|
|
2
|
+
import { Vector3 } from "../../ValueObjects";
|
|
3
|
+
export declare class BumpDollyFocusCamera {
|
|
4
|
+
private focusCamera;
|
|
5
|
+
bumpDurationMS: number;
|
|
6
|
+
bumpLerp: (percent: number) => number;
|
|
7
|
+
bumpAmount: number;
|
|
8
|
+
private interval?;
|
|
9
|
+
private chrono;
|
|
10
|
+
private delta;
|
|
11
|
+
private initialRadius;
|
|
12
|
+
private finalRadius;
|
|
13
|
+
private pickPoint?;
|
|
14
|
+
private onTick;
|
|
15
|
+
bump(direction: "IN" | "OUT", target?: Vector3): void;
|
|
16
|
+
constructor(focusCamera: FocusCamera);
|
|
17
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BumpDollyFocusCamera = void 0;
|
|
4
|
+
const ValueObjects_1 = require("../../ValueObjects");
|
|
5
|
+
class BumpDollyFocusCamera {
|
|
6
|
+
constructor(focusCamera) {
|
|
7
|
+
this.focusCamera = focusCamera;
|
|
8
|
+
this.bumpDurationMS = 500;
|
|
9
|
+
this.bumpLerp = (p) => {
|
|
10
|
+
return p;
|
|
11
|
+
}; // Linear
|
|
12
|
+
this.bumpAmount = 0.1;
|
|
13
|
+
this.chrono = 0;
|
|
14
|
+
this.delta = 10;
|
|
15
|
+
this.initialRadius = 0;
|
|
16
|
+
this.finalRadius = 0;
|
|
17
|
+
this.onTick = () => {
|
|
18
|
+
this.chrono = this.chrono + this.delta;
|
|
19
|
+
let nomralizedTime = this.chrono / this.bumpDurationMS;
|
|
20
|
+
if (nomralizedTime > 1) {
|
|
21
|
+
nomralizedTime = 1;
|
|
22
|
+
}
|
|
23
|
+
const percent = this.bumpLerp(nomralizedTime);
|
|
24
|
+
const range = this.finalRadius - this.initialRadius;
|
|
25
|
+
const currentRadius = this.focusCamera.radius;
|
|
26
|
+
this.focusCamera.radius = this.initialRadius + range * percent;
|
|
27
|
+
if (this.pickPoint !== undefined) {
|
|
28
|
+
const percentChange = this.focusCamera.radius / currentRadius;
|
|
29
|
+
let pickToTarget = ValueObjects_1.Vector3.Subtract(this.focusCamera.target, this.pickPoint);
|
|
30
|
+
const newLength = pickToTarget.magnitued * percentChange;
|
|
31
|
+
pickToTarget = ValueObjects_1.Vector3.NewVectorOfLength(pickToTarget, newLength);
|
|
32
|
+
const newTargetPos = ValueObjects_1.Vector3.Add(this.pickPoint, pickToTarget);
|
|
33
|
+
this.focusCamera.target = newTargetPos;
|
|
34
|
+
}
|
|
35
|
+
if (nomralizedTime >= 1 && this.interval) {
|
|
36
|
+
this.focusCamera.radius = this.finalRadius;
|
|
37
|
+
clearInterval(this.interval);
|
|
38
|
+
this.interval = undefined;
|
|
39
|
+
this.pickPoint = undefined;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
bump(direction, target) {
|
|
44
|
+
let delta = this.bumpAmount;
|
|
45
|
+
if (direction === "IN") {
|
|
46
|
+
delta *= -1;
|
|
47
|
+
}
|
|
48
|
+
this.initialRadius = this.focusCamera.radius;
|
|
49
|
+
if (this.interval) {
|
|
50
|
+
clearInterval(this.interval);
|
|
51
|
+
this.interval = undefined;
|
|
52
|
+
this.finalRadius = this.finalRadius + delta;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
this.finalRadius = this.initialRadius + delta;
|
|
56
|
+
}
|
|
57
|
+
this.chrono = 0;
|
|
58
|
+
this.pickPoint = target;
|
|
59
|
+
this.interval = setInterval(() => {
|
|
60
|
+
this.onTick();
|
|
61
|
+
}, 10);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
exports.BumpDollyFocusCamera = BumpDollyFocusCamera;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { FocusCamera } from "../../Entities";
|
|
2
|
+
export interface LerpFocusCameraParameters {
|
|
3
|
+
duration: number;
|
|
4
|
+
finalRadius?: number;
|
|
5
|
+
finalBeta?: number;
|
|
6
|
+
finalAlpha?: number;
|
|
7
|
+
finalTarget?: {
|
|
8
|
+
x: number;
|
|
9
|
+
y: number;
|
|
10
|
+
z: number;
|
|
11
|
+
};
|
|
12
|
+
onComplete?: () => void;
|
|
13
|
+
onAbort?: () => void;
|
|
14
|
+
}
|
|
15
|
+
export declare class LerpFocusCamera {
|
|
16
|
+
get isLerping(): boolean;
|
|
17
|
+
private _isLerping;
|
|
18
|
+
private focusCamera;
|
|
19
|
+
private easeFn;
|
|
20
|
+
private lerpDuration;
|
|
21
|
+
private lerpRadius;
|
|
22
|
+
private lerpBeta;
|
|
23
|
+
private lerpAlpha;
|
|
24
|
+
private lerpX;
|
|
25
|
+
private lerpY;
|
|
26
|
+
private lerpZ;
|
|
27
|
+
private onComplete?;
|
|
28
|
+
private onAbort?;
|
|
29
|
+
private interval;
|
|
30
|
+
private chrono;
|
|
31
|
+
private delta;
|
|
32
|
+
cancelLerp: () => void;
|
|
33
|
+
private onTick;
|
|
34
|
+
constructor(focusCamera: FocusCamera, easeFn: (normalizedTime: number) => number, parameters: LerpFocusCameraParameters);
|
|
35
|
+
private makeLerpNumber;
|
|
36
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LerpFocusCamera = void 0;
|
|
4
|
+
const ValueObjects_1 = require("../../ValueObjects");
|
|
5
|
+
class LerpFocusCamera {
|
|
6
|
+
constructor(focusCamera, easeFn, parameters) {
|
|
7
|
+
var _a, _b, _c;
|
|
8
|
+
this._isLerping = false;
|
|
9
|
+
this.chrono = 0;
|
|
10
|
+
this.delta = 10;
|
|
11
|
+
this.cancelLerp = () => {
|
|
12
|
+
if (!this._isLerping)
|
|
13
|
+
return;
|
|
14
|
+
clearInterval(this.interval);
|
|
15
|
+
if (this.onAbort) {
|
|
16
|
+
this.onAbort();
|
|
17
|
+
}
|
|
18
|
+
this._isLerping = false;
|
|
19
|
+
};
|
|
20
|
+
this.onTick = () => {
|
|
21
|
+
this.chrono = this.chrono + this.delta / 1000;
|
|
22
|
+
let nomralizedTime = this.chrono / this.lerpDuration;
|
|
23
|
+
if (nomralizedTime > 1) {
|
|
24
|
+
nomralizedTime = 1;
|
|
25
|
+
}
|
|
26
|
+
const percent = this.easeFn(nomralizedTime);
|
|
27
|
+
this.focusCamera.radius = this.lerpRadius(percent);
|
|
28
|
+
this.focusCamera.beta = this.lerpBeta(percent);
|
|
29
|
+
this.focusCamera.alpha = this.lerpAlpha(percent);
|
|
30
|
+
const x = this.lerpX(percent);
|
|
31
|
+
const y = this.lerpY(percent);
|
|
32
|
+
const z = this.lerpZ(percent);
|
|
33
|
+
this.focusCamera.target = new ValueObjects_1.Vector3(x, y, z);
|
|
34
|
+
if (nomralizedTime >= 1) {
|
|
35
|
+
clearInterval(this.interval);
|
|
36
|
+
if (this.onComplete) {
|
|
37
|
+
this.onComplete();
|
|
38
|
+
}
|
|
39
|
+
this._isLerping = false;
|
|
40
|
+
this.focusCamera.lerpCompleted();
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
this.focusCamera = focusCamera;
|
|
44
|
+
this.easeFn = easeFn;
|
|
45
|
+
this.lerpDuration = parameters.duration;
|
|
46
|
+
this.onComplete = parameters.onComplete;
|
|
47
|
+
this.onAbort = parameters.onAbort;
|
|
48
|
+
this.lerpRadius = this.makeLerpNumber(this.focusCamera.radius, parameters.finalRadius);
|
|
49
|
+
this.lerpBeta = this.makeLerpNumber(this.focusCamera.beta, parameters.finalBeta);
|
|
50
|
+
this.lerpAlpha = this.makeLerpNumber(this.focusCamera.alpha, parameters.finalAlpha);
|
|
51
|
+
this.lerpX = this.makeLerpNumber(this.focusCamera.target.x, (_a = parameters.finalTarget) === null || _a === void 0 ? void 0 : _a.x);
|
|
52
|
+
this.lerpY = this.makeLerpNumber(this.focusCamera.target.y, (_b = parameters.finalTarget) === null || _b === void 0 ? void 0 : _b.y);
|
|
53
|
+
this.lerpZ = this.makeLerpNumber(this.focusCamera.target.z, (_c = parameters.finalTarget) === null || _c === void 0 ? void 0 : _c.z);
|
|
54
|
+
this.interval = setInterval(() => {
|
|
55
|
+
this.onTick();
|
|
56
|
+
}, this.delta);
|
|
57
|
+
this.focusCamera.registerLerp(this);
|
|
58
|
+
this._isLerping = true;
|
|
59
|
+
}
|
|
60
|
+
get isLerping() {
|
|
61
|
+
return this._isLerping;
|
|
62
|
+
}
|
|
63
|
+
makeLerpNumber(initial, final) {
|
|
64
|
+
const actualFinal = final !== null && final !== void 0 ? final : initial;
|
|
65
|
+
return function Lerp(percent) {
|
|
66
|
+
const range = actualFinal - initial;
|
|
67
|
+
return initial + range * percent;
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
exports.LerpFocusCamera = LerpFocusCamera;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FocusCamera } from "../../Entities";
|
|
2
|
+
import { Vector3 } from "../../ValueObjects";
|
|
3
|
+
export declare class PinchDollyFocusCamera {
|
|
4
|
+
private focusCamera;
|
|
5
|
+
sensitivity: number;
|
|
6
|
+
private previousDistanceBetweenTouches;
|
|
7
|
+
private pickPoint?;
|
|
8
|
+
doDolly: (distanceBetweenTouches: number) => void;
|
|
9
|
+
initializeDolly: (distanceBetweenTouches: number, pickPoint?: Vector3 | undefined) => void;
|
|
10
|
+
constructor(focusCamera: FocusCamera);
|
|
11
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PinchDollyFocusCamera = void 0;
|
|
4
|
+
const ValueObjects_1 = require("../../ValueObjects");
|
|
5
|
+
class PinchDollyFocusCamera {
|
|
6
|
+
constructor(focusCamera) {
|
|
7
|
+
this.focusCamera = focusCamera;
|
|
8
|
+
this.sensitivity = 0.05;
|
|
9
|
+
this.previousDistanceBetweenTouches = 0;
|
|
10
|
+
this.doDolly = (distanceBetweenTouches) => {
|
|
11
|
+
const pinchDelta = distanceBetweenTouches - this.previousDistanceBetweenTouches;
|
|
12
|
+
const deltaRadius = pinchDelta * this.sensitivity;
|
|
13
|
+
const currentRadius = this.focusCamera.radius;
|
|
14
|
+
this.focusCamera.radius = currentRadius - deltaRadius;
|
|
15
|
+
if (this.pickPoint !== undefined) {
|
|
16
|
+
const percentChange = this.focusCamera.radius / currentRadius;
|
|
17
|
+
let pickToTarget = ValueObjects_1.Vector3.Subtract(this.focusCamera.target, this.pickPoint);
|
|
18
|
+
const newLength = pickToTarget.magnitued * percentChange;
|
|
19
|
+
pickToTarget = ValueObjects_1.Vector3.NewVectorOfLength(pickToTarget, newLength);
|
|
20
|
+
const newTargetPos = ValueObjects_1.Vector3.Add(this.pickPoint, pickToTarget);
|
|
21
|
+
this.focusCamera.target = newTargetPos;
|
|
22
|
+
}
|
|
23
|
+
this.previousDistanceBetweenTouches = distanceBetweenTouches;
|
|
24
|
+
};
|
|
25
|
+
this.initializeDolly = (distanceBetweenTouches, pickPoint) => {
|
|
26
|
+
this.previousDistanceBetweenTouches = distanceBetweenTouches;
|
|
27
|
+
if (pickPoint) {
|
|
28
|
+
this.pickPoint = pickPoint;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
this.pickPoint = undefined;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.PinchDollyFocusCamera = PinchDollyFocusCamera;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FocusCamera } from "../../Entities";
|
|
2
|
+
import { Vector2, Vector3 } from "../../ValueObjects";
|
|
3
|
+
export declare class PixelDollyFocusCamera {
|
|
4
|
+
private focusCamera;
|
|
5
|
+
sensitivity: number;
|
|
6
|
+
private previousPixelPosition;
|
|
7
|
+
private pickPoint?;
|
|
8
|
+
doDolly: (pixelPosition: Vector2) => void;
|
|
9
|
+
initializeDolly: (pixelPosition: Vector2, pickPoint?: Vector3 | undefined) => void;
|
|
10
|
+
constructor(focusCamera: FocusCamera);
|
|
11
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PixelDollyFocusCamera = void 0;
|
|
4
|
+
const ValueObjects_1 = require("../../ValueObjects");
|
|
5
|
+
class PixelDollyFocusCamera {
|
|
6
|
+
constructor(focusCamera) {
|
|
7
|
+
this.focusCamera = focusCamera;
|
|
8
|
+
this.sensitivity = 0.05;
|
|
9
|
+
this.previousPixelPosition = ValueObjects_1.Vector2.Zero();
|
|
10
|
+
this.doDolly = (pixelPosition) => {
|
|
11
|
+
const pixelDeltaY = pixelPosition.y - this.previousPixelPosition.y;
|
|
12
|
+
const deltaRadius = pixelDeltaY * this.sensitivity;
|
|
13
|
+
const currentRadius = this.focusCamera.radius;
|
|
14
|
+
this.focusCamera.radius = currentRadius - deltaRadius;
|
|
15
|
+
if (this.pickPoint !== undefined) {
|
|
16
|
+
const percentChange = this.focusCamera.radius / currentRadius;
|
|
17
|
+
let pickToTarget = ValueObjects_1.Vector3.Subtract(this.focusCamera.target, this.pickPoint);
|
|
18
|
+
const newLength = pickToTarget.magnitued * percentChange;
|
|
19
|
+
pickToTarget = ValueObjects_1.Vector3.NewVectorOfLength(pickToTarget, newLength);
|
|
20
|
+
const newTargetPos = ValueObjects_1.Vector3.Add(this.pickPoint, pickToTarget);
|
|
21
|
+
this.focusCamera.target = newTargetPos;
|
|
22
|
+
}
|
|
23
|
+
this.previousPixelPosition = pixelPosition;
|
|
24
|
+
};
|
|
25
|
+
this.initializeDolly = (pixelPosition, pickPoint) => {
|
|
26
|
+
this.previousPixelPosition = pixelPosition;
|
|
27
|
+
if (pickPoint) {
|
|
28
|
+
this.pickPoint = pickPoint;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
this.pickPoint = undefined;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.PixelDollyFocusCamera = PixelDollyFocusCamera;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { FocusCamera } from "../../Entities";
|
|
2
|
+
import { Vector2, Vector3 } from "../../ValueObjects";
|
|
3
|
+
export declare class PixelOrbitFocusCamera {
|
|
4
|
+
private focusCamera;
|
|
5
|
+
sensitivity: number;
|
|
6
|
+
private previousPixelPos?;
|
|
7
|
+
private pickPoint?;
|
|
8
|
+
doOrbit: (pixelPosition: Vector2) => void;
|
|
9
|
+
initializeOrbit: (initialPixelPos: Vector2, pickPoint?: Vector3 | undefined) => void;
|
|
10
|
+
constructor(focusCamera: FocusCamera);
|
|
11
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PixelOrbitFocusCamera = void 0;
|
|
4
|
+
const ValueObjects_1 = require("../../ValueObjects");
|
|
5
|
+
class PixelOrbitFocusCamera {
|
|
6
|
+
constructor(focusCamera) {
|
|
7
|
+
this.focusCamera = focusCamera;
|
|
8
|
+
this.sensitivity = 0.5;
|
|
9
|
+
this.doOrbit = (pixelPosition) => {
|
|
10
|
+
if (!this.previousPixelPos) {
|
|
11
|
+
console.error("[PixelOrbitFocusCamera] You must initialize first!");
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const pixelChange = ValueObjects_1.Vector2.Subtract(pixelPosition, this.previousPixelPos);
|
|
15
|
+
this.focusCamera.alpha += pixelChange.x * this.sensitivity;
|
|
16
|
+
this.focusCamera.beta += pixelChange.y * this.sensitivity;
|
|
17
|
+
this.previousPixelPos = pixelPosition;
|
|
18
|
+
};
|
|
19
|
+
this.initializeOrbit = (initialPixelPos, pickPoint) => {
|
|
20
|
+
this.previousPixelPos = initialPixelPos;
|
|
21
|
+
this.pickPoint = pickPoint;
|
|
22
|
+
this.focusCamera.cancelLerp();
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.PixelOrbitFocusCamera = PixelOrbitFocusCamera;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Babylon, FocusCamera } from "../../Entities";
|
|
2
|
+
import { ParametricPlane, Vector2 } from "../../ValueObjects";
|
|
3
|
+
export declare class PixelPlanePanFocusCamera {
|
|
4
|
+
private focusCamera;
|
|
5
|
+
private babylon;
|
|
6
|
+
private plane?;
|
|
7
|
+
private previousPixelPos?;
|
|
8
|
+
doPan: (pixelPosition: Vector2) => void;
|
|
9
|
+
initializePan: (initialPixelPos: Vector2, panPlane: ParametricPlane) => void;
|
|
10
|
+
constructor(focusCamera: FocusCamera, babylon: Babylon);
|
|
11
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PixelPlanePanFocusCamera = void 0;
|
|
4
|
+
const ValueObjects_1 = require("../../ValueObjects");
|
|
5
|
+
class PixelPlanePanFocusCamera {
|
|
6
|
+
constructor(focusCamera, babylon) {
|
|
7
|
+
this.focusCamera = focusCamera;
|
|
8
|
+
this.babylon = babylon;
|
|
9
|
+
this.doPan = (pixelPosition) => {
|
|
10
|
+
if (!this.plane || !this.previousPixelPos) {
|
|
11
|
+
console.error("[PixelPlanePan_OrbitCamera] You must initialize first!");
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const initialRay = this.babylon.sceneRay(this.previousPixelPos);
|
|
15
|
+
const finalRay = this.babylon.sceneRay(pixelPosition);
|
|
16
|
+
const p1 = this.plane.intersectLine(initialRay);
|
|
17
|
+
const p2 = this.plane.intersectLine(finalRay);
|
|
18
|
+
if (!p1 || !p2)
|
|
19
|
+
return;
|
|
20
|
+
const delta = ValueObjects_1.Vector3.Subtract(p2, p1);
|
|
21
|
+
const currentTarget = this.focusCamera.target;
|
|
22
|
+
const newTarget = new ValueObjects_1.Vector3(currentTarget.x - delta.x, currentTarget.y - delta.y, currentTarget.z - delta.z);
|
|
23
|
+
this.focusCamera.target = new ValueObjects_1.Vector3(newTarget.x, newTarget.y, newTarget.z);
|
|
24
|
+
this.previousPixelPos = pixelPosition;
|
|
25
|
+
};
|
|
26
|
+
this.initializePan = (initialPixelPos, panPlane) => {
|
|
27
|
+
this.plane = panPlane;
|
|
28
|
+
this.previousPixelPos = initialPixelPos;
|
|
29
|
+
this.focusCamera.cancelLerp();
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.PixelPlanePanFocusCamera = PixelPlanePanFocusCamera;
|