@configura/babylon-view 1.2.1 → 1.3.0-alpha.3

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.
Files changed (115) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +1 -1
  3. package/dist/animation/AnimatableObject.d.ts +8 -8
  4. package/dist/animation/AnimatableObject.js +3 -3
  5. package/dist/animation/animator/Animator.d.ts +33 -33
  6. package/dist/animation/animator/Animator.js +58 -58
  7. package/dist/animation/animator/AnimatorEasing.d.ts +16 -16
  8. package/dist/animation/animator/AnimatorEasing.js +31 -31
  9. package/dist/animation/animator/AnimatorEasingMatrix.d.ts +14 -14
  10. package/dist/animation/animator/AnimatorEasingMatrix.js +16 -16
  11. package/dist/animation/animator/AnimatorHighlight.d.ts +16 -16
  12. package/dist/animation/animator/AnimatorHighlight.js +32 -32
  13. package/dist/animation/animator/AnimatorPointToPoint.d.ts +8 -8
  14. package/dist/animation/animator/AnimatorPointToPoint.js +14 -14
  15. package/dist/animation/animator/AnimatorQueue.d.ts +13 -13
  16. package/dist/animation/animator/AnimatorQueue.js +57 -57
  17. package/dist/animation/animator/AnimatorScale.d.ts +8 -8
  18. package/dist/animation/animator/AnimatorScale.js +13 -13
  19. package/dist/animation/animator/AnimatorSpin.d.ts +10 -10
  20. package/dist/animation/animator/AnimatorSpin.js +13 -13
  21. package/dist/animation/animator/EasingFunctions.d.ts +35 -35
  22. package/dist/animation/animator/EasingFunctions.js +137 -137
  23. package/dist/animation/coordinator/Coordinator.d.ts +28 -28
  24. package/dist/animation/coordinator/Coordinator.js +47 -47
  25. package/dist/animation/coordinator/CoordinatorDropAndSpin.d.ts +22 -22
  26. package/dist/animation/coordinator/CoordinatorDropAndSpin.js +133 -133
  27. package/dist/animation/coordinator/CoordinatorIdentity.d.ts +11 -11
  28. package/dist/animation/coordinator/CoordinatorIdentity.js +12 -12
  29. package/dist/animation/coordinator/CoordinatorNodeQueues.d.ts +18 -18
  30. package/dist/animation/coordinator/CoordinatorNodeQueues.js +50 -50
  31. package/dist/animation/coordinator/CoordinatorPulse.d.ts +21 -21
  32. package/dist/animation/coordinator/CoordinatorPulse.js +47 -47
  33. package/dist/animation/coordinator/CoordinatorPulseBounce.d.ts +14 -14
  34. package/dist/animation/coordinator/CoordinatorPulseBounce.js +40 -40
  35. package/dist/animation/coordinator/CoordinatorPulseHighlight.d.ts +13 -13
  36. package/dist/animation/coordinator/CoordinatorPulseHighlight.js +34 -34
  37. package/dist/animation/coordinator/CoordinatorPulseInflate.d.ts +14 -14
  38. package/dist/animation/coordinator/CoordinatorPulseInflate.js +30 -30
  39. package/dist/camera/CameraCreator.d.ts +5 -5
  40. package/dist/camera/CameraCreator.js +4 -4
  41. package/dist/camera/CfgArcRotateCameraPointersInput.d.ts +10 -10
  42. package/dist/camera/CfgArcRotateCameraPointersInput.js +262 -262
  43. package/dist/camera/CfgOrbitalCamera.d.ts +68 -64
  44. package/dist/camera/CfgOrbitalCamera.js +250 -233
  45. package/dist/camera/CfgOrbitalCameraControlProps.d.ts +6 -6
  46. package/dist/camera/CfgOrbitalCameraControlProps.js +3 -3
  47. package/dist/camera/GradingApplier.d.ts +3 -3
  48. package/dist/camera/GradingApplier.js +48 -48
  49. package/dist/engine/EngineCreator.d.ts +3 -3
  50. package/dist/engine/EngineCreator.js +10 -10
  51. package/dist/geometry/CfgGeometry.d.ts +12 -12
  52. package/dist/geometry/CfgGeometry.js +117 -117
  53. package/dist/geometry/CfgMesh.d.ts +7 -7
  54. package/dist/geometry/CfgMesh.js +8 -8
  55. package/dist/geometry/geoSplitter.d.ts +8 -8
  56. package/dist/geometry/geoSplitter.js +192 -192
  57. package/dist/index.d.ts +13 -13
  58. package/dist/index.js +13 -13
  59. package/dist/light/CfgDirectionalLight.d.ts +8 -8
  60. package/dist/light/CfgDirectionalLight.js +18 -18
  61. package/dist/light/CfgHemisphericLight.d.ts +7 -7
  62. package/dist/light/CfgHemisphericLight.js +17 -17
  63. package/dist/light/CfgPointLight.d.ts +8 -8
  64. package/dist/light/CfgPointLight.js +18 -18
  65. package/dist/light/DefaultLightRig.d.ts +19 -19
  66. package/dist/light/DefaultLightRig.js +77 -77
  67. package/dist/light/LightRigCreator.d.ts +9 -9
  68. package/dist/light/LightRigCreator.js +3 -3
  69. package/dist/material/CfgMaterial.d.ts +53 -53
  70. package/dist/material/CfgMaterial.js +454 -454
  71. package/dist/material/DummyMaterialCreator.d.ts +4 -4
  72. package/dist/material/DummyMaterialCreator.js +15 -15
  73. package/dist/material/material.d.ts +18 -18
  74. package/dist/material/material.js +128 -128
  75. package/dist/material/texture.d.ts +14 -14
  76. package/dist/material/texture.js +304 -304
  77. package/dist/nodes/CfgContentRootNode.d.ts +19 -19
  78. package/dist/nodes/CfgContentRootNode.js +75 -75
  79. package/dist/nodes/CfgDeferredMeshNode.d.ts +48 -48
  80. package/dist/nodes/CfgDeferredMeshNode.js +347 -347
  81. package/dist/nodes/CfgProductNode.d.ts +61 -61
  82. package/dist/nodes/CfgProductNode.js +486 -486
  83. package/dist/nodes/CfgSymNode.d.ts +42 -42
  84. package/dist/nodes/CfgSymNode.js +216 -216
  85. package/dist/nodes/CfgSymRootNode.d.ts +33 -33
  86. package/dist/nodes/CfgSymRootNode.js +175 -175
  87. package/dist/nodes/CfgTransformNode.d.ts +29 -29
  88. package/dist/nodes/CfgTransformNode.js +81 -81
  89. package/dist/scene/SceneCreator.d.ts +6 -6
  90. package/dist/scene/SceneCreator.js +22 -22
  91. package/dist/utilities/CfgBoundingBox.d.ts +16 -16
  92. package/dist/utilities/CfgBoundingBox.js +64 -64
  93. package/dist/utilities/utilities3D.d.ts +26 -26
  94. package/dist/utilities/utilities3D.js +187 -187
  95. package/dist/utilities/utilitiesColor.d.ts +18 -18
  96. package/dist/utilities/utilitiesColor.js +48 -48
  97. package/dist/utilities/utilitiesImage.d.ts +6 -6
  98. package/dist/utilities/utilitiesImage.js +107 -107
  99. package/dist/utilities/utilitiesSymRootIdentifier.d.ts +5 -5
  100. package/dist/utilities/utilitiesSymRootIdentifier.js +20 -20
  101. package/dist/view/BaseView.d.ts +70 -70
  102. package/dist/view/BaseView.js +291 -291
  103. package/dist/view/BaseViewConfiguration.d.ts +32 -32
  104. package/dist/view/BaseViewConfiguration.js +8 -8
  105. package/dist/view/RenderEnv.d.ts +38 -38
  106. package/dist/view/RenderEnv.js +7 -7
  107. package/dist/view/SingleProductDefaultCameraView.d.ts +33 -33
  108. package/dist/view/SingleProductDefaultCameraView.js +141 -140
  109. package/dist/view/SingleProductDefaultCameraViewConfiguration.d.ts +46 -44
  110. package/dist/view/SingleProductDefaultCameraViewConfiguration.js +11 -11
  111. package/dist/view/SingleProductView.d.ts +42 -42
  112. package/dist/view/SingleProductView.js +205 -205
  113. package/dist/view/SingleProductViewConfiguration.d.ts +32 -32
  114. package/dist/view/SingleProductViewConfiguration.js +19 -19
  115. package/package.json +5 -5
@@ -1,43 +1,43 @@
1
- import { Camera } from "@babylonjs/core/Cameras/camera.js";
2
- import { ApplicationArea, CfgProduct } from "@configura/web-api";
3
- import { EventListener } from "@configura/web-utilities";
4
- import { CoordinatorWithMeta } from "../animation/coordinator/Coordinator.js";
5
- import { CameraCreator } from "../camera/CameraCreator.js";
6
- import { EngineCreator } from "../engine/EngineCreator.js";
7
- import { LightRigCreator } from "../light/LightRigCreator.js";
8
- import { DummyMaterialCreator } from "../material/DummyMaterialCreator.js";
9
- import { CfgProductNode } from "../nodes/CfgProductNode.js";
10
- import { SceneCreator } from "../scene/SceneCreator.js";
11
- import { BaseView } from "./BaseView.js";
12
- import { SingleProductViewConfiguration, SingleProductViewEventMap } from "./SingleProductViewConfiguration.js";
13
- export declare type LoadingOrApplicationAreas = ApplicationArea[] | "loading";
14
- export declare type SingleProductViewConstructorOptions<C extends Camera> = {
15
- canvas: HTMLCanvasElement;
16
- cameraCreator: CameraCreator<C>;
17
- engineCreator?: EngineCreator;
18
- lightRigCreator?: LightRigCreator;
19
- sceneCreator?: SceneCreator;
20
- dummyMaterialCreator?: DummyMaterialCreator;
21
- };
22
- export declare class SingleProductView<C extends Camera = Camera, T extends SingleProductViewEventMap = SingleProductViewEventMap> extends BaseView<C, T> {
23
- private _currentProductNode;
24
- private _scheduledForRemoval;
25
- private _viewPhaseObservable;
26
- private _currentPhase;
27
- private _animationCoordinatorCreator;
28
- private _animationCoordinator;
29
- constructor(options: SingleProductViewConstructorOptions<C>);
30
- destroy(): void;
31
- private scheduleForRemoval;
32
- setConfiguration(configuration: SingleProductViewConfiguration): void;
33
- get currentProductNode(): CfgProductNode | undefined;
34
- addEventListener<K extends keyof T>(event: K, listener: EventListener<T, K>): void;
35
- removeEventListener<K extends keyof T>(event: K, listener: EventListener<T, K>): void;
36
- protected getNeededFrameRender(time: number): boolean;
37
- protected renderFrame(time: number): void;
38
- private notifyPhaseChange;
39
- clearProduct: () => void;
40
- flushScheduledForRemove(animationCoordinator?: CoordinatorWithMeta): Promise<void>;
41
- loadProduct: (applicationAreas: LoadingOrApplicationAreas, product: CfgProduct) => (() => void);
42
- }
1
+ import { Camera } from "@babylonjs/core/Cameras/camera.js";
2
+ import { ApplicationArea, CfgProduct } from "@configura/web-api";
3
+ import { EventListener } from "@configura/web-utilities";
4
+ import { CoordinatorWithMeta } from "../animation/coordinator/Coordinator.js";
5
+ import { CameraCreator } from "../camera/CameraCreator.js";
6
+ import { EngineCreator } from "../engine/EngineCreator.js";
7
+ import { LightRigCreator } from "../light/LightRigCreator.js";
8
+ import { DummyMaterialCreator } from "../material/DummyMaterialCreator.js";
9
+ import { CfgProductNode } from "../nodes/CfgProductNode.js";
10
+ import { SceneCreator } from "../scene/SceneCreator.js";
11
+ import { BaseView } from "./BaseView.js";
12
+ import { SingleProductViewConfiguration, SingleProductViewEventMap } from "./SingleProductViewConfiguration.js";
13
+ export declare type LoadingOrApplicationAreas = ApplicationArea[] | "loading";
14
+ export declare type SingleProductViewConstructorOptions<C extends Camera> = {
15
+ canvas: HTMLCanvasElement;
16
+ cameraCreator: CameraCreator<C>;
17
+ engineCreator?: EngineCreator;
18
+ lightRigCreator?: LightRigCreator;
19
+ sceneCreator?: SceneCreator;
20
+ dummyMaterialCreator?: DummyMaterialCreator;
21
+ };
22
+ export declare class SingleProductView<C extends Camera = Camera, T extends SingleProductViewEventMap = SingleProductViewEventMap> extends BaseView<C, T> {
23
+ private _currentProductNode;
24
+ private _scheduledForRemoval;
25
+ private _viewPhaseObservable;
26
+ private _currentPhase;
27
+ private _animationCoordinatorCreator;
28
+ private _animationCoordinator;
29
+ constructor(options: SingleProductViewConstructorOptions<C>);
30
+ destroy(): void;
31
+ private scheduleForRemoval;
32
+ setConfiguration(configuration: SingleProductViewConfiguration): void;
33
+ get currentProductNode(): CfgProductNode | undefined;
34
+ addEventListener<K extends keyof T>(event: K, listener: EventListener<T, K>): void;
35
+ removeEventListener<K extends keyof T>(event: K, listener: EventListener<T, K>): void;
36
+ protected getNeededFrameRender(time: number): boolean;
37
+ protected renderFrame(time: number): void;
38
+ private notifyPhaseChange;
39
+ clearProduct: () => void;
40
+ flushScheduledForRemove(animationCoordinator?: CoordinatorWithMeta): Promise<void>;
41
+ loadProduct: (applicationAreas: LoadingOrApplicationAreas, product: CfgProduct) => (() => void);
42
+ }
43
43
  //# sourceMappingURL=SingleProductView.d.ts.map
@@ -1,205 +1,205 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { CfgMtrlApplication, CfgMtrlApplicationSource, } from "@configura/web-api";
11
- import { getWaitFramesPromise, Observable } from "@configura/web-utilities";
12
- import { CoordinatorIdentity } from "../animation/coordinator/CoordinatorIdentity.js";
13
- import { CfgProductNode } from "../nodes/CfgProductNode.js";
14
- import { BaseView } from "./BaseView.js";
15
- import { SingleProductViewPhase, } from "./SingleProductViewConfiguration.js";
16
- export class SingleProductView extends BaseView {
17
- constructor(options) {
18
- super(options);
19
- this._scheduledForRemoval = [];
20
- this._viewPhaseObservable = new Observable();
21
- this._currentPhase = SingleProductViewPhase.Idle;
22
- this.notifyPhaseChange = (phase) => {
23
- this._viewPhaseObservable.notifyAll({
24
- previous: this._currentPhase,
25
- current: phase,
26
- });
27
- this._currentPhase = phase;
28
- };
29
- this.clearProduct = () => {
30
- let currentProductNode = this._currentProductNode;
31
- if (currentProductNode !== undefined) {
32
- this.notifyPhaseChange(SingleProductViewPhase.RemovePreviousProduct);
33
- this.scheduleForRemoval(currentProductNode);
34
- this._currentProductNode = undefined;
35
- }
36
- };
37
- this.loadProduct = (applicationAreas, product) => {
38
- this.notifyPhaseChange(SingleProductViewPhase.LoadProductCalled);
39
- const abortController = new AbortController();
40
- const abortSignal = abortController.signal;
41
- const loadingToken = this._loadingObservable.startChildLoading();
42
- const stopLoading = () => {
43
- this._loadingObservable.stopChildLoading(loadingToken);
44
- };
45
- (() => __awaiter(this, void 0, void 0, function* () {
46
- let isNewProduct = false;
47
- let currentProductNode = this._currentProductNode;
48
- if (currentProductNode === undefined ||
49
- !currentProductNode.product.isBackedBySame(product)) {
50
- this.clearProduct();
51
- this.notifyPhaseChange(SingleProductViewPhase.MakeNewProduct);
52
- currentProductNode = CfgProductNode.make(this._renderEnvironment, product);
53
- this.notifyPhaseChange(SingleProductViewPhase.AddNewProduct);
54
- this._currentProductNode = currentProductNode;
55
- this._contentRoot.add(currentProductNode);
56
- isNewProduct = true;
57
- }
58
- const animationCoordinator = {
59
- coordinator: this._animationCoordinator,
60
- isNewProduct,
61
- };
62
- try {
63
- this.notifyPhaseChange(SingleProductViewPhase.SetModelsAndLoadGeo);
64
- yield currentProductNode.loadGeo(animationCoordinator);
65
- if (isNewProduct) {
66
- // New products needs resizing before rendering the first time
67
- this.notifyPhaseChange(SingleProductViewPhase.HandleSizing);
68
- this.handleSizing(true);
69
- }
70
- if (abortSignal.aborted) {
71
- this.notifyPhaseChange(SingleProductViewPhase.Aborted);
72
- return;
73
- }
74
- if (applicationAreas !== "loading") {
75
- this.notifyPhaseChange(SingleProductViewPhase.SetApplicationAreas);
76
- currentProductNode.setApplicationAreas(applicationAreas.map((a) => CfgMtrlApplication.fromMtrlLikeApplication(CfgMtrlApplicationSource.ApplicationArea, a)));
77
- }
78
- const loadMaterialsPromise = currentProductNode.loadMaterials(animationCoordinator);
79
- const doRenderTemporaryMaterials = yield Promise.race([
80
- (() => __awaiter(this, void 0, void 0, function* () {
81
- yield loadMaterialsPromise;
82
- return false;
83
- }))(),
84
- (() => __awaiter(this, void 0, void 0, function* () {
85
- yield getWaitFramesPromise(10);
86
- return true;
87
- }))(),
88
- ]);
89
- this.notifyPhaseChange(SingleProductViewPhase.ApplyGeo);
90
- yield currentProductNode.applyGeo(animationCoordinator);
91
- this.flushScheduledForRemove(animationCoordinator);
92
- if (abortSignal.aborted) {
93
- this.notifyPhaseChange(SingleProductViewPhase.Aborted);
94
- return;
95
- }
96
- if (!isNewProduct) {
97
- // At this stage, any change in geometry has been applied
98
- this.notifyPhaseChange(SingleProductViewPhase.HandleSizing);
99
- this.handleSizing(false);
100
- }
101
- if (doRenderTemporaryMaterials) {
102
- this.scheduleRerender();
103
- }
104
- if (abortSignal.aborted) {
105
- this.notifyPhaseChange(SingleProductViewPhase.Aborted);
106
- return;
107
- }
108
- this.notifyPhaseChange(SingleProductViewPhase.LoadMaterials);
109
- yield loadMaterialsPromise;
110
- if (abortSignal.aborted) {
111
- this.notifyPhaseChange(SingleProductViewPhase.Aborted);
112
- return;
113
- }
114
- this.notifyPhaseChange(SingleProductViewPhase.ApplyMaterials);
115
- this.pauseRendering();
116
- yield currentProductNode.applyMaterials();
117
- this.resumeRendering();
118
- this.notifyPhaseChange(SingleProductViewPhase.AppliedMaterials);
119
- this.scheduleRerender();
120
- stopLoading();
121
- this.notifyPhaseChange(SingleProductViewPhase.Idle);
122
- }
123
- catch (e) {
124
- this.notifyPhaseChange(SingleProductViewPhase.Error);
125
- this.notifyError(e);
126
- stopLoading();
127
- // Might result in double-unlock of semaphore, this is OK.
128
- this.resumeRendering();
129
- }
130
- }))();
131
- return () => {
132
- abortController.abort();
133
- stopLoading();
134
- };
135
- };
136
- this._animationCoordinator = new CoordinatorIdentity(this, this._viewPhaseObservable);
137
- }
138
- destroy() {
139
- this._animationCoordinator.destroy();
140
- super.destroy();
141
- }
142
- scheduleForRemoval(productNode) {
143
- productNode.destroy();
144
- this._scheduledForRemoval.push(productNode);
145
- }
146
- setConfiguration(configuration) {
147
- const animationCoordinatorCreator = configuration.experimentalAnimationCoordinator;
148
- if (animationCoordinatorCreator !== undefined &&
149
- this._animationCoordinatorCreator !== animationCoordinatorCreator) {
150
- this._animationCoordinatorCreator = animationCoordinatorCreator;
151
- this._animationCoordinator.destroy();
152
- this._animationCoordinator = animationCoordinatorCreator(this, this._viewPhaseObservable);
153
- }
154
- super.setConfiguration(configuration);
155
- }
156
- get currentProductNode() {
157
- return this._currentProductNode;
158
- }
159
- addEventListener(event, listener) {
160
- switch (event) {
161
- case "viewPhase":
162
- this._viewPhaseObservable.listen(listener);
163
- break;
164
- default:
165
- super.addEventListener(event, listener);
166
- }
167
- }
168
- removeEventListener(event, listener) {
169
- switch (event) {
170
- case "viewPhase":
171
- this._viewPhaseObservable.stopListen(listener);
172
- break;
173
- default:
174
- super.removeEventListener(event, listener);
175
- }
176
- }
177
- getNeededFrameRender(time) {
178
- return (super.getNeededFrameRender(time) ||
179
- this._animationCoordinator.willTick(time, this._engine.getDeltaTime()));
180
- }
181
- renderFrame(time) {
182
- this._animationCoordinator.tick(time, this._engine.getDeltaTime());
183
- super.renderFrame(time);
184
- }
185
- flushScheduledForRemove(animationCoordinator) {
186
- return __awaiter(this, void 0, void 0, function* () {
187
- if (this._scheduledForRemoval.length === 0) {
188
- return;
189
- }
190
- const promises = [];
191
- while (true) {
192
- const productNode = this._scheduledForRemoval.shift();
193
- if (productNode === undefined) {
194
- break;
195
- }
196
- promises.push((() => __awaiter(this, void 0, void 0, function* () {
197
- yield productNode.flushScheduledForRemove(animationCoordinator);
198
- this._contentRoot.remove(true, productNode);
199
- }))());
200
- }
201
- yield Promise.all(promises);
202
- this.notifyPhaseChange(SingleProductViewPhase.RemovedProduct);
203
- });
204
- }
205
- }
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { CfgMtrlApplication, CfgMtrlApplicationSource, } from "@configura/web-api";
11
+ import { getWaitFramesPromise, Observable } from "@configura/web-utilities";
12
+ import { CoordinatorIdentity } from "../animation/coordinator/CoordinatorIdentity.js";
13
+ import { CfgProductNode } from "../nodes/CfgProductNode.js";
14
+ import { BaseView } from "./BaseView.js";
15
+ import { SingleProductViewPhase, } from "./SingleProductViewConfiguration.js";
16
+ export class SingleProductView extends BaseView {
17
+ constructor(options) {
18
+ super(options);
19
+ this._scheduledForRemoval = [];
20
+ this._viewPhaseObservable = new Observable();
21
+ this._currentPhase = SingleProductViewPhase.Idle;
22
+ this.notifyPhaseChange = (phase) => {
23
+ this._viewPhaseObservable.notifyAll({
24
+ previous: this._currentPhase,
25
+ current: phase,
26
+ });
27
+ this._currentPhase = phase;
28
+ };
29
+ this.clearProduct = () => {
30
+ let currentProductNode = this._currentProductNode;
31
+ if (currentProductNode !== undefined) {
32
+ this.notifyPhaseChange(SingleProductViewPhase.RemovePreviousProduct);
33
+ this.scheduleForRemoval(currentProductNode);
34
+ this._currentProductNode = undefined;
35
+ }
36
+ };
37
+ this.loadProduct = (applicationAreas, product) => {
38
+ this.notifyPhaseChange(SingleProductViewPhase.LoadProductCalled);
39
+ const abortController = new AbortController();
40
+ const abortSignal = abortController.signal;
41
+ const loadingToken = this._loadingObservable.startChildLoading();
42
+ const stopLoading = () => {
43
+ this._loadingObservable.stopChildLoading(loadingToken);
44
+ };
45
+ (() => __awaiter(this, void 0, void 0, function* () {
46
+ let isNewProduct = false;
47
+ let currentProductNode = this._currentProductNode;
48
+ if (currentProductNode === undefined ||
49
+ !currentProductNode.product.isBackedBySame(product)) {
50
+ this.clearProduct();
51
+ this.notifyPhaseChange(SingleProductViewPhase.MakeNewProduct);
52
+ currentProductNode = CfgProductNode.make(this._renderEnvironment, product);
53
+ this.notifyPhaseChange(SingleProductViewPhase.AddNewProduct);
54
+ this._currentProductNode = currentProductNode;
55
+ this._contentRoot.add(currentProductNode);
56
+ isNewProduct = true;
57
+ }
58
+ const animationCoordinator = {
59
+ coordinator: this._animationCoordinator,
60
+ isNewProduct,
61
+ };
62
+ try {
63
+ this.notifyPhaseChange(SingleProductViewPhase.SetModelsAndLoadGeo);
64
+ yield currentProductNode.loadGeo(animationCoordinator);
65
+ if (isNewProduct) {
66
+ // New products needs resizing before rendering the first time
67
+ this.notifyPhaseChange(SingleProductViewPhase.HandleSizing);
68
+ this.handleSizing(true);
69
+ }
70
+ if (abortSignal.aborted) {
71
+ this.notifyPhaseChange(SingleProductViewPhase.Aborted);
72
+ return;
73
+ }
74
+ if (applicationAreas !== "loading") {
75
+ this.notifyPhaseChange(SingleProductViewPhase.SetApplicationAreas);
76
+ currentProductNode.setApplicationAreas(applicationAreas.map((a) => CfgMtrlApplication.fromMtrlLikeApplication(CfgMtrlApplicationSource.ApplicationArea, a)));
77
+ }
78
+ const loadMaterialsPromise = currentProductNode.loadMaterials(animationCoordinator);
79
+ const doRenderTemporaryMaterials = yield Promise.race([
80
+ (() => __awaiter(this, void 0, void 0, function* () {
81
+ yield loadMaterialsPromise;
82
+ return false;
83
+ }))(),
84
+ (() => __awaiter(this, void 0, void 0, function* () {
85
+ yield getWaitFramesPromise(10);
86
+ return true;
87
+ }))(),
88
+ ]);
89
+ this.notifyPhaseChange(SingleProductViewPhase.ApplyGeo);
90
+ yield currentProductNode.applyGeo(animationCoordinator);
91
+ this.flushScheduledForRemove(animationCoordinator);
92
+ if (abortSignal.aborted) {
93
+ this.notifyPhaseChange(SingleProductViewPhase.Aborted);
94
+ return;
95
+ }
96
+ if (!isNewProduct) {
97
+ // At this stage, any change in geometry has been applied
98
+ this.notifyPhaseChange(SingleProductViewPhase.HandleSizing);
99
+ this.handleSizing(false);
100
+ }
101
+ if (doRenderTemporaryMaterials) {
102
+ this.scheduleRerender();
103
+ }
104
+ if (abortSignal.aborted) {
105
+ this.notifyPhaseChange(SingleProductViewPhase.Aborted);
106
+ return;
107
+ }
108
+ this.notifyPhaseChange(SingleProductViewPhase.LoadMaterials);
109
+ yield loadMaterialsPromise;
110
+ if (abortSignal.aborted) {
111
+ this.notifyPhaseChange(SingleProductViewPhase.Aborted);
112
+ return;
113
+ }
114
+ this.notifyPhaseChange(SingleProductViewPhase.ApplyMaterials);
115
+ this.pauseRendering();
116
+ yield currentProductNode.applyMaterials();
117
+ this.resumeRendering();
118
+ this.notifyPhaseChange(SingleProductViewPhase.AppliedMaterials);
119
+ this.scheduleRerender();
120
+ stopLoading();
121
+ this.notifyPhaseChange(SingleProductViewPhase.Idle);
122
+ }
123
+ catch (e) {
124
+ this.notifyPhaseChange(SingleProductViewPhase.Error);
125
+ this.notifyError(e);
126
+ stopLoading();
127
+ // Might result in double-unlock of semaphore, this is OK.
128
+ this.resumeRendering();
129
+ }
130
+ }))();
131
+ return () => {
132
+ abortController.abort();
133
+ stopLoading();
134
+ };
135
+ };
136
+ this._animationCoordinator = new CoordinatorIdentity(this, this._viewPhaseObservable);
137
+ }
138
+ destroy() {
139
+ this._animationCoordinator.destroy();
140
+ super.destroy();
141
+ }
142
+ scheduleForRemoval(productNode) {
143
+ productNode.destroy();
144
+ this._scheduledForRemoval.push(productNode);
145
+ }
146
+ setConfiguration(configuration) {
147
+ const animationCoordinatorCreator = configuration.experimentalAnimationCoordinator;
148
+ if (animationCoordinatorCreator !== undefined &&
149
+ this._animationCoordinatorCreator !== animationCoordinatorCreator) {
150
+ this._animationCoordinatorCreator = animationCoordinatorCreator;
151
+ this._animationCoordinator.destroy();
152
+ this._animationCoordinator = animationCoordinatorCreator(this, this._viewPhaseObservable);
153
+ }
154
+ super.setConfiguration(configuration);
155
+ }
156
+ get currentProductNode() {
157
+ return this._currentProductNode;
158
+ }
159
+ addEventListener(event, listener) {
160
+ switch (event) {
161
+ case "viewPhase":
162
+ this._viewPhaseObservable.listen(listener);
163
+ break;
164
+ default:
165
+ super.addEventListener(event, listener);
166
+ }
167
+ }
168
+ removeEventListener(event, listener) {
169
+ switch (event) {
170
+ case "viewPhase":
171
+ this._viewPhaseObservable.stopListen(listener);
172
+ break;
173
+ default:
174
+ super.removeEventListener(event, listener);
175
+ }
176
+ }
177
+ getNeededFrameRender(time) {
178
+ return (super.getNeededFrameRender(time) ||
179
+ this._animationCoordinator.willTick(time, this._engine.getDeltaTime()));
180
+ }
181
+ renderFrame(time) {
182
+ this._animationCoordinator.tick(time, this._engine.getDeltaTime());
183
+ super.renderFrame(time);
184
+ }
185
+ flushScheduledForRemove(animationCoordinator) {
186
+ return __awaiter(this, void 0, void 0, function* () {
187
+ if (this._scheduledForRemoval.length === 0) {
188
+ return;
189
+ }
190
+ const promises = [];
191
+ while (true) {
192
+ const productNode = this._scheduledForRemoval.shift();
193
+ if (productNode === undefined) {
194
+ break;
195
+ }
196
+ promises.push((() => __awaiter(this, void 0, void 0, function* () {
197
+ yield productNode.flushScheduledForRemove(animationCoordinator);
198
+ this._contentRoot.remove(true, productNode);
199
+ }))());
200
+ }
201
+ yield Promise.all(promises);
202
+ this.notifyPhaseChange(SingleProductViewPhase.RemovedProduct);
203
+ });
204
+ }
205
+ }
@@ -1,33 +1,33 @@
1
- import { EventListener } from "@configura/web-utilities";
2
- import { CoordinatorCreator } from "../animation/coordinator/Coordinator.js";
3
- import { BaseViewConfiguration, BaseViewEventMap } from "./BaseViewConfiguration.js";
4
- export interface SingleProductViewConfiguration extends BaseViewConfiguration {
5
- experimentalAnimationCoordinator?: CoordinatorCreator;
6
- }
7
- export interface SingleProductViewEventMap extends BaseViewEventMap {
8
- viewPhase: SingleProductViewPhaseEvent;
9
- }
10
- export declare type SingleProductViewEventListener<K extends keyof SingleProductViewEventMap> = EventListener<SingleProductViewEventMap, K>;
11
- export declare type SingleProductViewPhaseEvent = {
12
- previous: SingleProductViewPhase;
13
- current: SingleProductViewPhase;
14
- };
15
- export declare enum SingleProductViewPhase {
16
- Idle = "Idle",
17
- LoadProductCalled = "LoadProductCalled",
18
- RemovePreviousProduct = "RemovePreviousProduct",
19
- RemovedProduct = "RemovedProduct",
20
- MakeNewProduct = "MakeNewProduct",
21
- AddNewProduct = "AddNewProduct",
22
- SetApplicationAreas = "SetApplicationAreas",
23
- SetModelsAndLoadGeo = "SetModelsAndLoadGeo",
24
- GeoLoaded = "GeoLoaded",
25
- ApplyGeo = "ApplyGeo",
26
- HandleSizing = "HandleSizing",
27
- LoadMaterials = "LoadMaterials",
28
- ApplyMaterials = "ApplyMaterials",
29
- AppliedMaterials = "AppliedMaterials",
30
- Aborted = "Aborted",
31
- Error = "Error"
32
- }
1
+ import { EventListener } from "@configura/web-utilities";
2
+ import { CoordinatorCreator } from "../animation/coordinator/Coordinator.js";
3
+ import { BaseViewConfiguration, BaseViewEventMap } from "./BaseViewConfiguration.js";
4
+ export interface SingleProductViewConfiguration extends BaseViewConfiguration {
5
+ experimentalAnimationCoordinator?: CoordinatorCreator;
6
+ }
7
+ export interface SingleProductViewEventMap extends BaseViewEventMap {
8
+ viewPhase: SingleProductViewPhaseEvent;
9
+ }
10
+ export declare type SingleProductViewEventListener<K extends keyof SingleProductViewEventMap> = EventListener<SingleProductViewEventMap, K>;
11
+ export declare type SingleProductViewPhaseEvent = {
12
+ previous: SingleProductViewPhase;
13
+ current: SingleProductViewPhase;
14
+ };
15
+ export declare enum SingleProductViewPhase {
16
+ Idle = "Idle",
17
+ LoadProductCalled = "LoadProductCalled",
18
+ RemovePreviousProduct = "RemovePreviousProduct",
19
+ RemovedProduct = "RemovedProduct",
20
+ MakeNewProduct = "MakeNewProduct",
21
+ AddNewProduct = "AddNewProduct",
22
+ SetApplicationAreas = "SetApplicationAreas",
23
+ SetModelsAndLoadGeo = "SetModelsAndLoadGeo",
24
+ GeoLoaded = "GeoLoaded",
25
+ ApplyGeo = "ApplyGeo",
26
+ HandleSizing = "HandleSizing",
27
+ LoadMaterials = "LoadMaterials",
28
+ ApplyMaterials = "ApplyMaterials",
29
+ AppliedMaterials = "AppliedMaterials",
30
+ Aborted = "Aborted",
31
+ Error = "Error"
32
+ }
33
33
  //# sourceMappingURL=SingleProductViewConfiguration.d.ts.map
@@ -1,19 +1,19 @@
1
- export var SingleProductViewPhase;
2
- (function (SingleProductViewPhase) {
3
- SingleProductViewPhase["Idle"] = "Idle";
4
- SingleProductViewPhase["LoadProductCalled"] = "LoadProductCalled";
5
- SingleProductViewPhase["RemovePreviousProduct"] = "RemovePreviousProduct";
6
- SingleProductViewPhase["RemovedProduct"] = "RemovedProduct";
7
- SingleProductViewPhase["MakeNewProduct"] = "MakeNewProduct";
8
- SingleProductViewPhase["AddNewProduct"] = "AddNewProduct";
9
- SingleProductViewPhase["SetApplicationAreas"] = "SetApplicationAreas";
10
- SingleProductViewPhase["SetModelsAndLoadGeo"] = "SetModelsAndLoadGeo";
11
- SingleProductViewPhase["GeoLoaded"] = "GeoLoaded";
12
- SingleProductViewPhase["ApplyGeo"] = "ApplyGeo";
13
- SingleProductViewPhase["HandleSizing"] = "HandleSizing";
14
- SingleProductViewPhase["LoadMaterials"] = "LoadMaterials";
15
- SingleProductViewPhase["ApplyMaterials"] = "ApplyMaterials";
16
- SingleProductViewPhase["AppliedMaterials"] = "AppliedMaterials";
17
- SingleProductViewPhase["Aborted"] = "Aborted";
18
- SingleProductViewPhase["Error"] = "Error";
19
- })(SingleProductViewPhase || (SingleProductViewPhase = {}));
1
+ export var SingleProductViewPhase;
2
+ (function (SingleProductViewPhase) {
3
+ SingleProductViewPhase["Idle"] = "Idle";
4
+ SingleProductViewPhase["LoadProductCalled"] = "LoadProductCalled";
5
+ SingleProductViewPhase["RemovePreviousProduct"] = "RemovePreviousProduct";
6
+ SingleProductViewPhase["RemovedProduct"] = "RemovedProduct";
7
+ SingleProductViewPhase["MakeNewProduct"] = "MakeNewProduct";
8
+ SingleProductViewPhase["AddNewProduct"] = "AddNewProduct";
9
+ SingleProductViewPhase["SetApplicationAreas"] = "SetApplicationAreas";
10
+ SingleProductViewPhase["SetModelsAndLoadGeo"] = "SetModelsAndLoadGeo";
11
+ SingleProductViewPhase["GeoLoaded"] = "GeoLoaded";
12
+ SingleProductViewPhase["ApplyGeo"] = "ApplyGeo";
13
+ SingleProductViewPhase["HandleSizing"] = "HandleSizing";
14
+ SingleProductViewPhase["LoadMaterials"] = "LoadMaterials";
15
+ SingleProductViewPhase["ApplyMaterials"] = "ApplyMaterials";
16
+ SingleProductViewPhase["AppliedMaterials"] = "AppliedMaterials";
17
+ SingleProductViewPhase["Aborted"] = "Aborted";
18
+ SingleProductViewPhase["Error"] = "Error";
19
+ })(SingleProductViewPhase || (SingleProductViewPhase = {}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@configura/babylon-view",
3
- "version": "1.2.1",
3
+ "version": "1.3.0-alpha.3",
4
4
  "license": "Apache-2.0",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -16,16 +16,16 @@
16
16
  },
17
17
  "dependencies": {
18
18
  "@babylonjs/core": "4.2.0",
19
- "@configura/web-core": "^1.2.1",
20
- "@configura/web-utilities": "^1.2.1"
19
+ "@configura/web-core": "^1.3.0-alpha.3",
20
+ "@configura/web-utilities": "^1.3.0-alpha.3"
21
21
  },
22
22
  "devDependencies": {
23
- "@configura/web-api": "^1.2.1",
23
+ "@configura/web-api": "^1.3.0-alpha.3",
24
24
  "del-cli": "^3.0.0",
25
25
  "typescript": "4.2"
26
26
  },
27
27
  "publishConfig": {
28
28
  "access": "public"
29
29
  },
30
- "gitHead": "1750a720b149f9de7e12cc1a78714e029770e7fa"
30
+ "gitHead": "cf818cec9159a46e5254a1f001da6df7b663c62d"
31
31
  }