@configura/babylon-view 1.6.1-alpha.4 → 1.6.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.
Files changed (126) hide show
  1. package/.eslintrc.json +18 -0
  2. package/LICENSE +201 -201
  3. package/README.md +1 -1
  4. package/dist/animation/AnimatableObject.d.ts +8 -8
  5. package/dist/animation/AnimatableObject.js +3 -3
  6. package/dist/animation/animator/Animator.d.ts +33 -33
  7. package/dist/animation/animator/Animator.js +58 -58
  8. package/dist/animation/animator/AnimatorEasing.d.ts +16 -16
  9. package/dist/animation/animator/AnimatorEasing.js +31 -31
  10. package/dist/animation/animator/AnimatorEasingMatrix.d.ts +14 -14
  11. package/dist/animation/animator/AnimatorEasingMatrix.js +16 -16
  12. package/dist/animation/animator/AnimatorHighlight.d.ts +16 -16
  13. package/dist/animation/animator/AnimatorHighlight.js +32 -32
  14. package/dist/animation/animator/AnimatorPointToPoint.d.ts +8 -8
  15. package/dist/animation/animator/AnimatorPointToPoint.js +14 -14
  16. package/dist/animation/animator/AnimatorQueue.d.ts +13 -13
  17. package/dist/animation/animator/AnimatorQueue.js +57 -57
  18. package/dist/animation/animator/AnimatorScale.d.ts +8 -8
  19. package/dist/animation/animator/AnimatorScale.js +13 -13
  20. package/dist/animation/animator/AnimatorSpin.d.ts +10 -10
  21. package/dist/animation/animator/AnimatorSpin.js +13 -13
  22. package/dist/animation/animator/EasingFunctions.d.ts +35 -35
  23. package/dist/animation/animator/EasingFunctions.js +137 -137
  24. package/dist/animation/coordinator/Coordinator.d.ts +28 -28
  25. package/dist/animation/coordinator/Coordinator.js +53 -47
  26. package/dist/animation/coordinator/CoordinatorDropAndSpin.d.ts +22 -22
  27. package/dist/animation/coordinator/CoordinatorDropAndSpin.js +138 -133
  28. package/dist/animation/coordinator/CoordinatorIdentity.d.ts +11 -11
  29. package/dist/animation/coordinator/CoordinatorIdentity.js +14 -12
  30. package/dist/animation/coordinator/CoordinatorNodeQueues.d.ts +18 -18
  31. package/dist/animation/coordinator/CoordinatorNodeQueues.js +50 -50
  32. package/dist/animation/coordinator/CoordinatorPulse.d.ts +21 -21
  33. package/dist/animation/coordinator/CoordinatorPulse.js +47 -47
  34. package/dist/animation/coordinator/CoordinatorPulseBounce.d.ts +14 -14
  35. package/dist/animation/coordinator/CoordinatorPulseBounce.js +35 -40
  36. package/dist/animation/coordinator/CoordinatorPulseHighlight.d.ts +13 -13
  37. package/dist/animation/coordinator/CoordinatorPulseHighlight.js +29 -34
  38. package/dist/animation/coordinator/CoordinatorPulseInflate.d.ts +14 -14
  39. package/dist/animation/coordinator/CoordinatorPulseInflate.js +23 -30
  40. package/dist/camera/CameraCreator.d.ts +5 -5
  41. package/dist/camera/CameraCreator.js +4 -4
  42. package/dist/camera/CfgArcRotateCameraPointersInput.d.ts +26 -26
  43. package/dist/camera/CfgArcRotateCameraPointersInput.js +266 -264
  44. package/dist/camera/CfgOrbitalCamera.d.ts +68 -68
  45. package/dist/camera/CfgOrbitalCamera.js +250 -250
  46. package/dist/camera/CfgOrbitalCameraControlProps.d.ts +6 -6
  47. package/dist/camera/CfgOrbitalCameraControlProps.js +3 -3
  48. package/dist/camera/GradingApplier.d.ts +3 -3
  49. package/dist/camera/GradingApplier.js +48 -48
  50. package/dist/engine/EngineCreator.d.ts +3 -3
  51. package/dist/engine/EngineCreator.js +10 -10
  52. package/dist/geometry/CfgGeometry.d.ts +29 -29
  53. package/dist/geometry/CfgGeometry.js +146 -146
  54. package/dist/geometry/CfgMesh.d.ts +10 -10
  55. package/dist/geometry/CfgMesh.js +38 -38
  56. package/dist/geometry/geoSplitter.d.ts +8 -8
  57. package/dist/geometry/geoSplitter.js +192 -192
  58. package/dist/geometry/stretch/CfgMorphTarget.d.ts +15 -15
  59. package/dist/geometry/stretch/CfgMorphTarget.js +65 -65
  60. package/dist/geometry/stretch/CfgStretchData.d.ts +116 -116
  61. package/dist/geometry/stretch/CfgStretchData.js +350 -346
  62. package/dist/geometry/stretch/CfgStretchMorphGeometry.d.ts +16 -16
  63. package/dist/geometry/stretch/CfgStretchMorphGeometry.js +95 -95
  64. package/dist/index.d.ts +13 -13
  65. package/dist/index.js +13 -13
  66. package/dist/light/CfgDirectionalLight.d.ts +8 -8
  67. package/dist/light/CfgDirectionalLight.js +18 -18
  68. package/dist/light/CfgHemisphericLight.d.ts +7 -7
  69. package/dist/light/CfgHemisphericLight.js +17 -17
  70. package/dist/light/CfgPointLight.d.ts +8 -8
  71. package/dist/light/CfgPointLight.js +18 -18
  72. package/dist/light/DefaultLightRig.d.ts +19 -19
  73. package/dist/light/DefaultLightRig.js +77 -77
  74. package/dist/light/LightRigCreator.d.ts +9 -9
  75. package/dist/light/LightRigCreator.js +3 -3
  76. package/dist/material/CfgMaterial.d.ts +68 -68
  77. package/dist/material/CfgMaterial.js +482 -482
  78. package/dist/material/DummyMaterialCreator.d.ts +4 -4
  79. package/dist/material/DummyMaterialCreator.js +15 -15
  80. package/dist/material/material.d.ts +18 -18
  81. package/dist/material/material.js +128 -128
  82. package/dist/material/texture.d.ts +14 -14
  83. package/dist/material/texture.js +306 -306
  84. package/dist/nodes/CfgContentRootNode.d.ts +19 -19
  85. package/dist/nodes/CfgContentRootNode.js +75 -75
  86. package/dist/nodes/CfgDeferredMeshNode.d.ts +55 -55
  87. package/dist/nodes/CfgDeferredMeshNode.js +378 -377
  88. package/dist/nodes/CfgProductNode.d.ts +127 -127
  89. package/dist/nodes/CfgProductNode.js +598 -584
  90. package/dist/nodes/CfgSymNode.d.ts +50 -50
  91. package/dist/nodes/CfgSymNode.js +249 -249
  92. package/dist/nodes/CfgSymRootNode.d.ts +45 -45
  93. package/dist/nodes/CfgSymRootNode.js +229 -220
  94. package/dist/nodes/CfgTransformNode.d.ts +33 -33
  95. package/dist/nodes/CfgTransformNode.js +83 -83
  96. package/dist/scene/SceneCreator.d.ts +6 -6
  97. package/dist/scene/SceneCreator.js +22 -22
  98. package/dist/utilities/CfgBoundingBox.d.ts +21 -21
  99. package/dist/utilities/CfgBoundingBox.js +81 -81
  100. package/dist/utilities/anchor/anchor.d.ts +50 -50
  101. package/dist/utilities/anchor/anchor.js +133 -133
  102. package/dist/utilities/anchor/anchorMap.d.ts +20 -20
  103. package/dist/utilities/anchor/anchorMap.js +111 -111
  104. package/dist/utilities/utilities3D.d.ts +70 -70
  105. package/dist/utilities/utilities3D.js +265 -265
  106. package/dist/utilities/utilitiesColor.d.ts +18 -18
  107. package/dist/utilities/utilitiesColor.js +50 -48
  108. package/dist/utilities/utilitiesImage.d.ts +6 -6
  109. package/dist/utilities/utilitiesImage.js +107 -107
  110. package/dist/utilities/utilitiesSymRootIdentifier.d.ts +7 -7
  111. package/dist/utilities/utilitiesSymRootIdentifier.js +26 -26
  112. package/dist/view/BaseView.d.ts +78 -78
  113. package/dist/view/BaseView.js +303 -297
  114. package/dist/view/BaseViewConfiguration.d.ts +32 -32
  115. package/dist/view/BaseViewConfiguration.js +10 -10
  116. package/dist/view/RenderEnv.d.ts +43 -43
  117. package/dist/view/RenderEnv.js +7 -7
  118. package/dist/view/SingleProductDefaultCameraView.d.ts +34 -33
  119. package/dist/view/SingleProductDefaultCameraView.js +141 -141
  120. package/dist/view/SingleProductDefaultCameraViewConfiguration.d.ts +46 -46
  121. package/dist/view/SingleProductDefaultCameraViewConfiguration.js +11 -11
  122. package/dist/view/SingleProductView.d.ts +42 -42
  123. package/dist/view/SingleProductView.js +207 -206
  124. package/dist/view/SingleProductViewConfiguration.d.ts +32 -32
  125. package/dist/view/SingleProductViewConfiguration.js +19 -19
  126. package/package.json +5 -5
@@ -1,47 +1,47 @@
1
- import { EventListener } from "@configura/web-utilities";
2
- import { CameraConfigurationProps } from "./BaseViewConfiguration.js";
3
- import { SingleProductViewConfiguration, SingleProductViewEventMap } from "./SingleProductViewConfiguration.js";
4
- /**
5
- * @param disableZoom Don't let the camera dolly in and out. Zoom is stricly speaking not correct, we only dolly the camera.
6
- * @param disableAutomaticSizing Turn off automatic adaption of camera distance and light rig size.
7
- * @param disableSubFloorCam It is common that catalogue models are designed to never be shown from below. This limits camera polar angle.
8
- * @param lowestAllowedCameraHeight Relative to the size of the viewed model, the lowest height the camera can reach. Setting this to 0 is the same as disableSubFloorCam. 1 means the camera can not move lower than the height of the model. Any numeric value is allowed.
9
- * @param distance Only works if disableAutomaticSizing is set
10
- * @param yaw Horisontal angle for the camera. Range -π/2 to π/2 radians.
11
- * @param pitch Vertical angle for the camera. Range 0 to π/2 radians, measured from the north pole.
12
- * @param autoRotate See babylon-documentation for parameter-documentation
13
- */
14
- export declare type SingleProductDefaultCameraDirection = {
15
- distance?: number;
16
- yaw?: number;
17
- pitch?: number;
18
- };
19
- export interface SingleProductDefaultCameraViewConfiguration extends SingleProductViewConfiguration {
20
- camera?: SingleProductDefaultCameraDirection & {
21
- disableZoom?: boolean;
22
- disableAutomaticSizing?: boolean;
23
- disableSubFloorCam?: boolean;
24
- lowestAllowedCameraHeight?: number;
25
- autoRotate?: {
26
- idleRotationSpeed?: number;
27
- idleRotationSpinupTime?: number;
28
- idleRotationWaitTime?: number;
29
- zoomStopsAnimation?: boolean;
30
- };
31
- };
32
- }
33
- export interface SingleProductDefaultCameraViewEventMap extends SingleProductViewEventMap {
34
- orbitalCameraConfiguration: OrbitalCameraConfigurationProps;
35
- }
36
- export declare type SingleProductDefaultCameraViewEventListener<K extends keyof SingleProductDefaultCameraViewEventMap> = EventListener<SingleProductDefaultCameraViewEventMap, K>;
37
- export interface OrbitalCameraConfigurationProps extends CameraConfigurationProps {
38
- disableZoom: boolean;
39
- minDistance: number;
40
- maxDistance: number;
41
- minYaw: number;
42
- maxYaw: number;
43
- minPitch: number;
44
- maxPitch: number;
45
- }
46
- export declare function orbitalCameraConfigurationPropsEquals(left: OrbitalCameraConfigurationProps, right: OrbitalCameraConfigurationProps): boolean;
1
+ import { EventListener } from "@configura/web-utilities";
2
+ import { CameraConfigurationProps } from "./BaseViewConfiguration.js";
3
+ import { SingleProductViewConfiguration, SingleProductViewEventMap } from "./SingleProductViewConfiguration.js";
4
+ /**
5
+ * @param disableZoom Don't let the camera dolly in and out. Zoom is stricly speaking not correct, we only dolly the camera.
6
+ * @param disableAutomaticSizing Turn off automatic adaption of camera distance and light rig size.
7
+ * @param disableSubFloorCam It is common that catalogue models are designed to never be shown from below. This limits camera polar angle.
8
+ * @param lowestAllowedCameraHeight Relative to the size of the viewed model, the lowest height the camera can reach. Setting this to 0 is the same as disableSubFloorCam. 1 means the camera can not move lower than the height of the model. Any numeric value is allowed.
9
+ * @param distance Only works if disableAutomaticSizing is set
10
+ * @param yaw Horisontal angle for the camera. Range -π/2 to π/2 radians.
11
+ * @param pitch Vertical angle for the camera. Range 0 to π/2 radians, measured from the north pole.
12
+ * @param autoRotate See babylon-documentation for parameter-documentation
13
+ */
14
+ export declare type SingleProductDefaultCameraDirection = {
15
+ distance?: number;
16
+ yaw?: number;
17
+ pitch?: number;
18
+ };
19
+ export interface SingleProductDefaultCameraViewConfiguration extends SingleProductViewConfiguration {
20
+ camera?: SingleProductDefaultCameraDirection & {
21
+ disableZoom?: boolean;
22
+ disableAutomaticSizing?: boolean;
23
+ disableSubFloorCam?: boolean;
24
+ lowestAllowedCameraHeight?: number;
25
+ autoRotate?: {
26
+ idleRotationSpeed?: number;
27
+ idleRotationSpinupTime?: number;
28
+ idleRotationWaitTime?: number;
29
+ zoomStopsAnimation?: boolean;
30
+ };
31
+ };
32
+ }
33
+ export interface SingleProductDefaultCameraViewEventMap extends SingleProductViewEventMap {
34
+ orbitalCameraConfiguration: OrbitalCameraConfigurationProps;
35
+ }
36
+ export declare type SingleProductDefaultCameraViewEventListener<K extends keyof SingleProductDefaultCameraViewEventMap> = EventListener<SingleProductDefaultCameraViewEventMap, K>;
37
+ export interface OrbitalCameraConfigurationProps extends CameraConfigurationProps {
38
+ disableZoom: boolean;
39
+ minDistance: number;
40
+ maxDistance: number;
41
+ minYaw: number;
42
+ maxYaw: number;
43
+ minPitch: number;
44
+ maxPitch: number;
45
+ }
46
+ export declare function orbitalCameraConfigurationPropsEquals(left: OrbitalCameraConfigurationProps, right: OrbitalCameraConfigurationProps): boolean;
47
47
  //# sourceMappingURL=SingleProductDefaultCameraViewConfiguration.d.ts.map
@@ -1,11 +1,11 @@
1
- import { cameraConfigurationPropsEquals, } from "./BaseViewConfiguration.js";
2
- export function orbitalCameraConfigurationPropsEquals(left, right) {
3
- return (left.disableZoom === right.disableZoom &&
4
- left.minDistance === right.minDistance &&
5
- left.maxDistance === right.maxDistance &&
6
- left.minYaw === right.minYaw &&
7
- left.maxYaw === right.maxYaw &&
8
- left.minPitch === right.minPitch &&
9
- left.maxPitch === right.maxPitch &&
10
- cameraConfigurationPropsEquals(left, right));
11
- }
1
+ import { cameraConfigurationPropsEquals, } from "./BaseViewConfiguration.js";
2
+ export function orbitalCameraConfigurationPropsEquals(left, right) {
3
+ return (left.disableZoom === right.disableZoom &&
4
+ left.minDistance === right.minDistance &&
5
+ left.maxDistance === right.maxDistance &&
6
+ left.minYaw === right.minYaw &&
7
+ left.maxYaw === right.maxYaw &&
8
+ left.minPitch === right.minPitch &&
9
+ left.maxPitch === right.maxPitch &&
10
+ cameraConfigurationPropsEquals(left, right));
11
+ }
@@ -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,206 +1,207 @@
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
- currentProductNode.refreshStretch();
65
- yield currentProductNode.loadGeo(animationCoordinator);
66
- if (isNewProduct) {
67
- // New products needs resizing before rendering the first time
68
- this.notifyPhaseChange(SingleProductViewPhase.HandleSizing);
69
- this.handleSizing(true);
70
- }
71
- if (abortSignal.aborted) {
72
- this.notifyPhaseChange(SingleProductViewPhase.Aborted);
73
- return;
74
- }
75
- if (applicationAreas !== "loading") {
76
- this.notifyPhaseChange(SingleProductViewPhase.SetApplicationAreas);
77
- currentProductNode.setApplicationAreas(applicationAreas.map((a) => CfgMtrlApplication.fromMtrlLikeApplication(CfgMtrlApplicationSource.ApplicationArea, a)));
78
- }
79
- const loadMaterialsPromise = currentProductNode.loadMaterials(animationCoordinator);
80
- const doRenderTemporaryMaterials = yield Promise.race([
81
- (() => __awaiter(this, void 0, void 0, function* () {
82
- yield loadMaterialsPromise;
83
- return false;
84
- }))(),
85
- (() => __awaiter(this, void 0, void 0, function* () {
86
- yield getWaitFramesPromise(10);
87
- return true;
88
- }))(),
89
- ]);
90
- this.notifyPhaseChange(SingleProductViewPhase.ApplyGeo);
91
- yield currentProductNode.applyGeo(animationCoordinator);
92
- this.flushScheduledForRemove(animationCoordinator);
93
- if (abortSignal.aborted) {
94
- this.notifyPhaseChange(SingleProductViewPhase.Aborted);
95
- return;
96
- }
97
- if (!isNewProduct) {
98
- // At this stage, any change in geometry has been applied
99
- this.notifyPhaseChange(SingleProductViewPhase.HandleSizing);
100
- this.handleSizing(false);
101
- }
102
- if (doRenderTemporaryMaterials) {
103
- this.scheduleRerender();
104
- }
105
- if (abortSignal.aborted) {
106
- this.notifyPhaseChange(SingleProductViewPhase.Aborted);
107
- return;
108
- }
109
- this.notifyPhaseChange(SingleProductViewPhase.LoadMaterials);
110
- yield loadMaterialsPromise;
111
- if (abortSignal.aborted) {
112
- this.notifyPhaseChange(SingleProductViewPhase.Aborted);
113
- return;
114
- }
115
- this.notifyPhaseChange(SingleProductViewPhase.ApplyMaterials);
116
- this.pauseRendering();
117
- yield currentProductNode.applyMaterials();
118
- this.resumeRendering();
119
- this.notifyPhaseChange(SingleProductViewPhase.AppliedMaterials);
120
- this.scheduleRerender();
121
- stopLoading();
122
- this.notifyPhaseChange(SingleProductViewPhase.Idle);
123
- }
124
- catch (e) {
125
- this.notifyPhaseChange(SingleProductViewPhase.Error);
126
- this.notifyError(e);
127
- stopLoading();
128
- // Might result in double-unlock of semaphore, this is OK.
129
- this.resumeRendering();
130
- }
131
- }))();
132
- return () => {
133
- abortController.abort();
134
- stopLoading();
135
- };
136
- };
137
- this._animationCoordinator = new CoordinatorIdentity(this, this._viewPhaseObservable);
138
- }
139
- destroy() {
140
- this._animationCoordinator.destroy();
141
- super.destroy();
142
- }
143
- scheduleForRemoval(productNode) {
144
- productNode.destroy();
145
- this._scheduledForRemoval.push(productNode);
146
- }
147
- setConfiguration(configuration) {
148
- const animationCoordinatorCreator = configuration.experimentalAnimationCoordinator;
149
- if (animationCoordinatorCreator !== undefined &&
150
- this._animationCoordinatorCreator !== animationCoordinatorCreator) {
151
- this._animationCoordinatorCreator = animationCoordinatorCreator;
152
- this._animationCoordinator.destroy();
153
- this._animationCoordinator = animationCoordinatorCreator(this, this._viewPhaseObservable);
154
- }
155
- super.setConfiguration(configuration);
156
- }
157
- get currentProductNode() {
158
- return this._currentProductNode;
159
- }
160
- addEventListener(event, listener) {
161
- switch (event) {
162
- case "viewPhase":
163
- this._viewPhaseObservable.listen(listener);
164
- break;
165
- default:
166
- super.addEventListener(event, listener);
167
- }
168
- }
169
- removeEventListener(event, listener) {
170
- switch (event) {
171
- case "viewPhase":
172
- this._viewPhaseObservable.stopListen(listener);
173
- break;
174
- default:
175
- super.removeEventListener(event, listener);
176
- }
177
- }
178
- getNeededFrameRender(time) {
179
- return (super.getNeededFrameRender(time) ||
180
- this._animationCoordinator.willTick(time, this._engine.getDeltaTime()));
181
- }
182
- renderFrame(time) {
183
- this._animationCoordinator.tick(time, this._engine.getDeltaTime());
184
- super.renderFrame(time);
185
- }
186
- flushScheduledForRemove(animationCoordinator) {
187
- return __awaiter(this, void 0, void 0, function* () {
188
- if (this._scheduledForRemoval.length === 0) {
189
- return;
190
- }
191
- const promises = [];
192
- while (true) {
193
- const productNode = this._scheduledForRemoval.shift();
194
- if (productNode === undefined) {
195
- break;
196
- }
197
- promises.push((() => __awaiter(this, void 0, void 0, function* () {
198
- yield productNode.flushScheduledForRemove(animationCoordinator);
199
- this._contentRoot.remove(true, productNode);
200
- }))());
201
- }
202
- yield Promise.all(promises);
203
- this.notifyPhaseChange(SingleProductViewPhase.RemovedProduct);
204
- });
205
- }
206
- }
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
+ const 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
+ void (() => __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
+ currentProductNode.refreshStretch();
65
+ yield currentProductNode.loadGeo(animationCoordinator);
66
+ if (isNewProduct) {
67
+ // New products needs resizing before rendering the first time
68
+ this.notifyPhaseChange(SingleProductViewPhase.HandleSizing);
69
+ this.handleSizing(true);
70
+ }
71
+ if (abortSignal.aborted) {
72
+ this.notifyPhaseChange(SingleProductViewPhase.Aborted);
73
+ return;
74
+ }
75
+ if (applicationAreas !== "loading") {
76
+ this.notifyPhaseChange(SingleProductViewPhase.SetApplicationAreas);
77
+ currentProductNode.setApplicationAreas(applicationAreas.map((a) => CfgMtrlApplication.fromMtrlLikeApplication(CfgMtrlApplicationSource.ApplicationArea, a)));
78
+ }
79
+ const loadMaterialsPromise = currentProductNode.loadMaterials(animationCoordinator);
80
+ const doRenderTemporaryMaterials = yield Promise.race([
81
+ (() => __awaiter(this, void 0, void 0, function* () {
82
+ yield loadMaterialsPromise;
83
+ return false;
84
+ }))(),
85
+ (() => __awaiter(this, void 0, void 0, function* () {
86
+ yield getWaitFramesPromise(10);
87
+ return true;
88
+ }))(),
89
+ ]);
90
+ this.notifyPhaseChange(SingleProductViewPhase.ApplyGeo);
91
+ yield currentProductNode.applyGeo(animationCoordinator);
92
+ // We don't have to wait for this
93
+ void this.flushScheduledForRemove(animationCoordinator);
94
+ if (abortSignal.aborted) {
95
+ this.notifyPhaseChange(SingleProductViewPhase.Aborted);
96
+ return;
97
+ }
98
+ if (!isNewProduct) {
99
+ // At this stage, any change in geometry has been applied
100
+ this.notifyPhaseChange(SingleProductViewPhase.HandleSizing);
101
+ this.handleSizing(false);
102
+ }
103
+ if (doRenderTemporaryMaterials) {
104
+ this.scheduleRerender();
105
+ }
106
+ if (abortSignal.aborted) {
107
+ this.notifyPhaseChange(SingleProductViewPhase.Aborted);
108
+ return;
109
+ }
110
+ this.notifyPhaseChange(SingleProductViewPhase.LoadMaterials);
111
+ yield loadMaterialsPromise;
112
+ if (abortSignal.aborted) {
113
+ this.notifyPhaseChange(SingleProductViewPhase.Aborted);
114
+ return;
115
+ }
116
+ this.notifyPhaseChange(SingleProductViewPhase.ApplyMaterials);
117
+ this.pauseRendering();
118
+ yield currentProductNode.applyMaterials();
119
+ this.resumeRendering();
120
+ this.notifyPhaseChange(SingleProductViewPhase.AppliedMaterials);
121
+ this.scheduleRerender();
122
+ stopLoading();
123
+ this.notifyPhaseChange(SingleProductViewPhase.Idle);
124
+ }
125
+ catch (e) {
126
+ this.notifyPhaseChange(SingleProductViewPhase.Error);
127
+ this.notifyError(e);
128
+ stopLoading();
129
+ // Might result in double-unlock of semaphore, this is OK.
130
+ this.resumeRendering();
131
+ }
132
+ }))();
133
+ return () => {
134
+ abortController.abort();
135
+ stopLoading();
136
+ };
137
+ };
138
+ this._animationCoordinator = new CoordinatorIdentity(this, this._viewPhaseObservable);
139
+ }
140
+ destroy() {
141
+ this._animationCoordinator.destroy();
142
+ super.destroy();
143
+ }
144
+ scheduleForRemoval(productNode) {
145
+ productNode.destroy();
146
+ this._scheduledForRemoval.push(productNode);
147
+ }
148
+ setConfiguration(configuration) {
149
+ const animationCoordinatorCreator = configuration.experimentalAnimationCoordinator;
150
+ if (animationCoordinatorCreator !== undefined &&
151
+ this._animationCoordinatorCreator !== animationCoordinatorCreator) {
152
+ this._animationCoordinatorCreator = animationCoordinatorCreator;
153
+ this._animationCoordinator.destroy();
154
+ this._animationCoordinator = animationCoordinatorCreator(this, this._viewPhaseObservable);
155
+ }
156
+ super.setConfiguration(configuration);
157
+ }
158
+ get currentProductNode() {
159
+ return this._currentProductNode;
160
+ }
161
+ addEventListener(event, listener) {
162
+ switch (event) {
163
+ case "viewPhase":
164
+ this._viewPhaseObservable.listen(listener);
165
+ break;
166
+ default:
167
+ super.addEventListener(event, listener);
168
+ }
169
+ }
170
+ removeEventListener(event, listener) {
171
+ switch (event) {
172
+ case "viewPhase":
173
+ this._viewPhaseObservable.stopListen(listener);
174
+ break;
175
+ default:
176
+ super.removeEventListener(event, listener);
177
+ }
178
+ }
179
+ getNeededFrameRender(time) {
180
+ return (super.getNeededFrameRender(time) ||
181
+ this._animationCoordinator.willTick(time, this._engine.getDeltaTime()));
182
+ }
183
+ renderFrame(time) {
184
+ this._animationCoordinator.tick(time, this._engine.getDeltaTime());
185
+ super.renderFrame(time);
186
+ }
187
+ flushScheduledForRemove(animationCoordinator) {
188
+ return __awaiter(this, void 0, void 0, function* () {
189
+ if (this._scheduledForRemoval.length === 0) {
190
+ return;
191
+ }
192
+ const promises = [];
193
+ for (;;) {
194
+ const productNode = this._scheduledForRemoval.shift();
195
+ if (productNode === undefined) {
196
+ break;
197
+ }
198
+ promises.push((() => __awaiter(this, void 0, void 0, function* () {
199
+ yield productNode.flushScheduledForRemove(animationCoordinator);
200
+ this._contentRoot.remove(true, productNode);
201
+ }))());
202
+ }
203
+ yield Promise.all(promises);
204
+ this.notifyPhaseChange(SingleProductViewPhase.RemovedProduct);
205
+ });
206
+ }
207
+ }