@configura/babylon-view 2.0.0-alpha.20 → 2.0.0-alpha.21

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 (134) hide show
  1. package/.eslintrc.json +5 -18
  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 -53
  26. package/dist/animation/coordinator/CoordinatorDropAndSpin.d.ts +22 -22
  27. package/dist/animation/coordinator/CoordinatorDropAndSpin.js +138 -138
  28. package/dist/animation/coordinator/CoordinatorIdentity.d.ts +11 -11
  29. package/dist/animation/coordinator/CoordinatorIdentity.js +14 -14
  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 -35
  36. package/dist/animation/coordinator/CoordinatorPulseHighlight.d.ts +13 -13
  37. package/dist/animation/coordinator/CoordinatorPulseHighlight.js +29 -29
  38. package/dist/animation/coordinator/CoordinatorPulseInflate.d.ts +14 -14
  39. package/dist/animation/coordinator/CoordinatorPulseInflate.js +23 -23
  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 -266
  44. package/dist/camera/CfgOrbitalCamera.d.ts +76 -76
  45. package/dist/camera/CfgOrbitalCamera.js +281 -281
  46. package/dist/camera/CfgOrbitalCameraControlProps.d.ts +14 -14
  47. package/dist/camera/CfgOrbitalCameraControlProps.js +7 -7
  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 -350
  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 +16 -16
  65. package/dist/index.js +16 -16
  66. package/dist/io/CfgHistoryToCameraConfConnector.d.ts +31 -31
  67. package/dist/io/CfgHistoryToCameraConfConnector.js +90 -90
  68. package/dist/io/CfgIOCameraConfConnector.d.ts +35 -35
  69. package/dist/io/CfgIOCameraConfConnector.js +81 -81
  70. package/dist/io/CfgObservableStateToCameraConfConnector.d.ts +10 -10
  71. package/dist/io/CfgObservableStateToCameraConfConnector.js +11 -11
  72. package/dist/io/CfgWindowMessageToCameraConfConnector.d.ts +10 -10
  73. package/dist/io/CfgWindowMessageToCameraConfConnector.js +11 -11
  74. package/dist/light/CfgDirectionalLight.d.ts +8 -8
  75. package/dist/light/CfgDirectionalLight.js +18 -18
  76. package/dist/light/CfgHemisphericLight.d.ts +7 -7
  77. package/dist/light/CfgHemisphericLight.js +17 -17
  78. package/dist/light/CfgPointLight.d.ts +8 -8
  79. package/dist/light/CfgPointLight.js +18 -18
  80. package/dist/light/DefaultLightRig.d.ts +19 -19
  81. package/dist/light/DefaultLightRig.js +77 -77
  82. package/dist/light/LightRigCreator.d.ts +9 -9
  83. package/dist/light/LightRigCreator.js +3 -3
  84. package/dist/material/CfgMaterial.d.ts +68 -68
  85. package/dist/material/CfgMaterial.js +482 -482
  86. package/dist/material/DummyMaterialCreator.d.ts +4 -4
  87. package/dist/material/DummyMaterialCreator.js +15 -15
  88. package/dist/material/material.d.ts +18 -18
  89. package/dist/material/material.js +128 -128
  90. package/dist/material/texture.d.ts +14 -14
  91. package/dist/material/texture.js +306 -306
  92. package/dist/nodes/CfgContentRootNode.d.ts +19 -19
  93. package/dist/nodes/CfgContentRootNode.js +75 -75
  94. package/dist/nodes/CfgDeferredMeshNode.d.ts +55 -55
  95. package/dist/nodes/CfgDeferredMeshNode.js +378 -378
  96. package/dist/nodes/CfgProductNode.d.ts +127 -127
  97. package/dist/nodes/CfgProductNode.js +598 -598
  98. package/dist/nodes/CfgSymNode.d.ts +50 -50
  99. package/dist/nodes/CfgSymNode.js +249 -249
  100. package/dist/nodes/CfgSymRootNode.d.ts +45 -45
  101. package/dist/nodes/CfgSymRootNode.js +229 -229
  102. package/dist/nodes/CfgTransformNode.d.ts +33 -33
  103. package/dist/nodes/CfgTransformNode.js +83 -83
  104. package/dist/scene/SceneCreator.d.ts +6 -6
  105. package/dist/scene/SceneCreator.js +22 -22
  106. package/dist/utilities/CfgBoundingBox.d.ts +21 -21
  107. package/dist/utilities/CfgBoundingBox.js +81 -81
  108. package/dist/utilities/anchor/anchor.d.ts +50 -50
  109. package/dist/utilities/anchor/anchor.js +133 -133
  110. package/dist/utilities/anchor/anchorMap.d.ts +20 -20
  111. package/dist/utilities/anchor/anchorMap.js +111 -111
  112. package/dist/utilities/utilities3D.d.ts +70 -70
  113. package/dist/utilities/utilities3D.js +265 -265
  114. package/dist/utilities/utilitiesColor.d.ts +18 -18
  115. package/dist/utilities/utilitiesColor.js +50 -50
  116. package/dist/utilities/utilitiesImage.d.ts +6 -6
  117. package/dist/utilities/utilitiesImage.js +107 -107
  118. package/dist/utilities/utilitiesSymRootIdentifier.d.ts +7 -7
  119. package/dist/utilities/utilitiesSymRootIdentifier.js +26 -26
  120. package/dist/view/BaseView.d.ts +78 -78
  121. package/dist/view/BaseView.js +303 -303
  122. package/dist/view/BaseViewConfiguration.d.ts +32 -32
  123. package/dist/view/BaseViewConfiguration.js +10 -10
  124. package/dist/view/RenderEnv.d.ts +43 -43
  125. package/dist/view/RenderEnv.js +7 -7
  126. package/dist/view/SingleProductDefaultCameraView.d.ts +38 -38
  127. package/dist/view/SingleProductDefaultCameraView.js +149 -149
  128. package/dist/view/SingleProductDefaultCameraViewConfiguration.d.ts +44 -44
  129. package/dist/view/SingleProductDefaultCameraViewConfiguration.js +11 -11
  130. package/dist/view/SingleProductView.d.ts +44 -44
  131. package/dist/view/SingleProductView.js +212 -212
  132. package/dist/view/SingleProductViewConfiguration.d.ts +32 -32
  133. package/dist/view/SingleProductViewConfiguration.js +19 -19
  134. package/package.json +5 -5
@@ -1,45 +1,45 @@
1
- import { EventListener } from "@configura/web-utilities";
2
- import { CfgOrbitalCameraBasicProps } from "../camera/CfgOrbitalCameraControlProps.js";
3
- import { CameraConfigurationProps } from "./BaseViewConfiguration.js";
4
- import { SingleProductViewConfiguration, SingleProductViewEventMap } from "./SingleProductViewConfiguration.js";
5
- /**
6
- * @param yaw Horizontal angle for the camera. Range -π to π radians. The camera will reset to this angle.
7
- * @param pitch Vertical angle for the camera. Range 0 to π radians, measured from the north pole. The camera will reset to this angle.
8
- * @param distance Only works if disableAutomaticSizing is set
9
- * @param initial If set these values are used for the initial configuration of the camera. If not set yaw, pitch and distance are used.
10
- * @param disableZoom Don't let the camera dolly in and out. Zoom is strictly speaking not correct, we only dolly the camera.
11
- * @param disableAutomaticSizing Turn off automatic adaption of camera distance and light rig size.
12
- * @param disableSubFloorCam It is common that catalogue models are designed to never be shown from below. This limits camera polar angle.
13
- * @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.
14
- * @param autoRotate See babylon-documentation for parameter-documentation
15
- */
16
- export interface SingleProductDefaultCameraViewConfiguration extends SingleProductViewConfiguration {
17
- camera?: CfgOrbitalCameraBasicProps & {
18
- initial?: CfgOrbitalCameraBasicProps;
19
- disableZoom?: boolean;
20
- disableAutomaticSizing?: boolean;
21
- disableSubFloorCam?: boolean;
22
- lowestAllowedCameraHeight?: number;
23
- autoRotate?: {
24
- idleRotationSpeed?: number;
25
- idleRotationSpinupTime?: number;
26
- idleRotationWaitTime?: number;
27
- zoomStopsAnimation?: boolean;
28
- };
29
- };
30
- }
31
- export interface SingleProductDefaultCameraViewEventMap extends SingleProductViewEventMap {
32
- orbitalCameraConfiguration: OrbitalCameraConfigurationProps;
33
- }
34
- export declare type SingleProductDefaultCameraViewEventListener<K extends keyof SingleProductDefaultCameraViewEventMap> = EventListener<SingleProductDefaultCameraViewEventMap, K>;
35
- export interface OrbitalCameraConfigurationProps extends CameraConfigurationProps {
36
- disableZoom: boolean;
37
- minDistance: number;
38
- maxDistance: number;
39
- minYaw: number;
40
- maxYaw: number;
41
- minPitch: number;
42
- maxPitch: number;
43
- }
44
- export declare function orbitalCameraConfigurationPropsEquals(left: OrbitalCameraConfigurationProps, right: OrbitalCameraConfigurationProps): boolean;
1
+ import { EventListener } from "@configura/web-utilities";
2
+ import { CfgOrbitalCameraBasicProps } from "../camera/CfgOrbitalCameraControlProps.js";
3
+ import { CameraConfigurationProps } from "./BaseViewConfiguration.js";
4
+ import { SingleProductViewConfiguration, SingleProductViewEventMap } from "./SingleProductViewConfiguration.js";
5
+ /**
6
+ * @param yaw Horizontal angle for the camera. Range -π to π radians. The camera will reset to this angle.
7
+ * @param pitch Vertical angle for the camera. Range 0 to π radians, measured from the north pole. The camera will reset to this angle.
8
+ * @param distance Only works if disableAutomaticSizing is set
9
+ * @param initial If set these values are used for the initial configuration of the camera. If not set yaw, pitch and distance are used.
10
+ * @param disableZoom Don't let the camera dolly in and out. Zoom is strictly speaking not correct, we only dolly the camera.
11
+ * @param disableAutomaticSizing Turn off automatic adaption of camera distance and light rig size.
12
+ * @param disableSubFloorCam It is common that catalogue models are designed to never be shown from below. This limits camera polar angle.
13
+ * @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.
14
+ * @param autoRotate See babylon-documentation for parameter-documentation
15
+ */
16
+ export interface SingleProductDefaultCameraViewConfiguration extends SingleProductViewConfiguration {
17
+ camera?: CfgOrbitalCameraBasicProps & {
18
+ initial?: CfgOrbitalCameraBasicProps;
19
+ disableZoom?: boolean;
20
+ disableAutomaticSizing?: boolean;
21
+ disableSubFloorCam?: boolean;
22
+ lowestAllowedCameraHeight?: number;
23
+ autoRotate?: {
24
+ idleRotationSpeed?: number;
25
+ idleRotationSpinupTime?: number;
26
+ idleRotationWaitTime?: number;
27
+ zoomStopsAnimation?: boolean;
28
+ };
29
+ };
30
+ }
31
+ export interface SingleProductDefaultCameraViewEventMap extends SingleProductViewEventMap {
32
+ orbitalCameraConfiguration: OrbitalCameraConfigurationProps;
33
+ }
34
+ export declare type SingleProductDefaultCameraViewEventListener<K extends keyof SingleProductDefaultCameraViewEventMap> = EventListener<SingleProductDefaultCameraViewEventMap, K>;
35
+ export interface OrbitalCameraConfigurationProps extends CameraConfigurationProps {
36
+ disableZoom: boolean;
37
+ minDistance: number;
38
+ maxDistance: number;
39
+ minYaw: number;
40
+ maxYaw: number;
41
+ minPitch: number;
42
+ maxPitch: number;
43
+ }
44
+ export declare function orbitalCameraConfigurationPropsEquals(left: OrbitalCameraConfigurationProps, right: OrbitalCameraConfigurationProps): boolean;
45
45
  //# 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,45 +1,45 @@
1
- import { Camera } from "@babylonjs/core/Cameras/camera.js";
2
- import { CfgProduct, DtoApplicationArea } 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 = DtoApplicationArea[] | "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 _isFirstLoad;
24
- private _currentProductNode;
25
- private _scheduledForRemoval;
26
- private _viewPhaseObservable;
27
- private _currentPhase;
28
- private _animationCoordinatorCreator;
29
- private _animationCoordinator;
30
- constructor(options: SingleProductViewConstructorOptions<C>);
31
- destroy(): void;
32
- private scheduleForRemoval;
33
- setConfiguration(configuration: SingleProductViewConfiguration): void;
34
- get currentProductNode(): CfgProductNode | undefined;
35
- get isFirstLoad(): boolean;
36
- addEventListener<K extends keyof T>(event: K, listener: EventListener<T, K>): void;
37
- removeEventListener<K extends keyof T>(event: K, listener: EventListener<T, K>): void;
38
- protected getNeededFrameRender(time: number): boolean;
39
- protected renderFrame(time: number): void;
40
- private notifyPhaseChange;
41
- clearProduct: () => void;
42
- flushScheduledForRemove(animationCoordinator?: CoordinatorWithMeta): Promise<void>;
43
- loadProduct: (applicationAreas: LoadingOrApplicationAreas, product: CfgProduct) => (() => void);
44
- }
1
+ import { Camera } from "@babylonjs/core/Cameras/camera.js";
2
+ import { CfgProduct, DtoApplicationArea } 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 = DtoApplicationArea[] | "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 _isFirstLoad;
24
+ private _currentProductNode;
25
+ private _scheduledForRemoval;
26
+ private _viewPhaseObservable;
27
+ private _currentPhase;
28
+ private _animationCoordinatorCreator;
29
+ private _animationCoordinator;
30
+ constructor(options: SingleProductViewConstructorOptions<C>);
31
+ destroy(): void;
32
+ private scheduleForRemoval;
33
+ setConfiguration(configuration: SingleProductViewConfiguration): void;
34
+ get currentProductNode(): CfgProductNode | undefined;
35
+ get isFirstLoad(): boolean;
36
+ addEventListener<K extends keyof T>(event: K, listener: EventListener<T, K>): void;
37
+ removeEventListener<K extends keyof T>(event: K, listener: EventListener<T, K>): void;
38
+ protected getNeededFrameRender(time: number): boolean;
39
+ protected renderFrame(time: number): void;
40
+ private notifyPhaseChange;
41
+ clearProduct: () => void;
42
+ flushScheduledForRemove(animationCoordinator?: CoordinatorWithMeta): Promise<void>;
43
+ loadProduct: (applicationAreas: LoadingOrApplicationAreas, product: CfgProduct) => (() => void);
44
+ }
45
45
  //# sourceMappingURL=SingleProductView.d.ts.map
@@ -1,212 +1,212 @@
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._isFirstLoad = true;
20
- this._scheduledForRemoval = [];
21
- this._viewPhaseObservable = new Observable();
22
- this._currentPhase = SingleProductViewPhase.Idle;
23
- this.notifyPhaseChange = (phase) => {
24
- this._viewPhaseObservable.notifyAll({
25
- previous: this._currentPhase,
26
- current: phase,
27
- });
28
- this._currentPhase = phase;
29
- };
30
- this.clearProduct = () => {
31
- const currentProductNode = this._currentProductNode;
32
- if (currentProductNode !== undefined) {
33
- this.notifyPhaseChange(SingleProductViewPhase.RemovePreviousProduct);
34
- this.scheduleForRemoval(currentProductNode);
35
- this._currentProductNode = undefined;
36
- }
37
- };
38
- this.loadProduct = (applicationAreas, product) => {
39
- this.notifyPhaseChange(SingleProductViewPhase.LoadProductCalled);
40
- const abortController = new AbortController();
41
- const abortSignal = abortController.signal;
42
- const loadingToken = this._loadingObservable.startChildLoading();
43
- const stopLoading = () => {
44
- this._loadingObservable.stopChildLoading(loadingToken);
45
- };
46
- void (() => __awaiter(this, void 0, void 0, function* () {
47
- let isNewProduct = false;
48
- let currentProductNode = this._currentProductNode;
49
- if (currentProductNode === undefined ||
50
- !currentProductNode.product.isBackedBySame(product)) {
51
- this.clearProduct();
52
- this.notifyPhaseChange(SingleProductViewPhase.MakeNewProduct);
53
- currentProductNode = CfgProductNode.make(this._renderEnvironment, product);
54
- this.notifyPhaseChange(SingleProductViewPhase.AddNewProduct);
55
- this._currentProductNode = currentProductNode;
56
- this._contentRoot.add(currentProductNode);
57
- isNewProduct = true;
58
- }
59
- const animationCoordinator = {
60
- coordinator: this._animationCoordinator,
61
- isNewProduct,
62
- };
63
- try {
64
- this.notifyPhaseChange(SingleProductViewPhase.SetModelsAndLoadGeo);
65
- currentProductNode.refreshStretch();
66
- yield currentProductNode.loadGeo(animationCoordinator);
67
- if (isNewProduct) {
68
- // New products needs resizing before rendering the first time
69
- this.notifyPhaseChange(SingleProductViewPhase.HandleSizing);
70
- this.handleSizing(true);
71
- }
72
- if (abortSignal.aborted) {
73
- this.notifyPhaseChange(SingleProductViewPhase.Aborted);
74
- return;
75
- }
76
- if (applicationAreas !== "loading") {
77
- this.notifyPhaseChange(SingleProductViewPhase.SetApplicationAreas);
78
- currentProductNode.setApplicationAreas(applicationAreas.map((a) => CfgMtrlApplication.fromMtrlLikeApplication(CfgMtrlApplicationSource.ApplicationArea, a)));
79
- }
80
- const loadMaterialsPromise = currentProductNode.loadMaterials(animationCoordinator);
81
- const doRenderTemporaryMaterials = yield Promise.race([
82
- (() => __awaiter(this, void 0, void 0, function* () {
83
- yield loadMaterialsPromise;
84
- return false;
85
- }))(),
86
- (() => __awaiter(this, void 0, void 0, function* () {
87
- yield getWaitFramesPromise(10);
88
- return true;
89
- }))(),
90
- ]);
91
- this.notifyPhaseChange(SingleProductViewPhase.ApplyGeo);
92
- yield currentProductNode.applyGeo(animationCoordinator);
93
- // We don't have to wait for this
94
- void this.flushScheduledForRemove(animationCoordinator);
95
- if (abortSignal.aborted) {
96
- this.notifyPhaseChange(SingleProductViewPhase.Aborted);
97
- return;
98
- }
99
- if (!isNewProduct) {
100
- // At this stage, any change in geometry has been applied
101
- this.notifyPhaseChange(SingleProductViewPhase.HandleSizing);
102
- this.handleSizing(false);
103
- }
104
- this._isFirstLoad = false;
105
- if (doRenderTemporaryMaterials) {
106
- this.scheduleRerender();
107
- }
108
- if (abortSignal.aborted) {
109
- this.notifyPhaseChange(SingleProductViewPhase.Aborted);
110
- return;
111
- }
112
- this.notifyPhaseChange(SingleProductViewPhase.LoadMaterials);
113
- yield loadMaterialsPromise;
114
- if (abortSignal.aborted) {
115
- this.notifyPhaseChange(SingleProductViewPhase.Aborted);
116
- return;
117
- }
118
- this.notifyPhaseChange(SingleProductViewPhase.ApplyMaterials);
119
- this.pauseRendering();
120
- yield currentProductNode.applyMaterials();
121
- this.resumeRendering();
122
- this.notifyPhaseChange(SingleProductViewPhase.AppliedMaterials);
123
- this.scheduleRerender();
124
- stopLoading();
125
- this.notifyPhaseChange(SingleProductViewPhase.Idle);
126
- }
127
- catch (e) {
128
- this.notifyPhaseChange(SingleProductViewPhase.Error);
129
- this.notifyError(e);
130
- stopLoading();
131
- // Might result in double-unlock of semaphore, this is OK.
132
- this.resumeRendering();
133
- }
134
- }))();
135
- return () => {
136
- abortController.abort();
137
- stopLoading();
138
- };
139
- };
140
- this._animationCoordinator = new CoordinatorIdentity(this, this._viewPhaseObservable);
141
- }
142
- destroy() {
143
- this._animationCoordinator.destroy();
144
- super.destroy();
145
- }
146
- scheduleForRemoval(productNode) {
147
- productNode.destroy();
148
- this._scheduledForRemoval.push(productNode);
149
- }
150
- setConfiguration(configuration) {
151
- const animationCoordinatorCreator = configuration.experimentalAnimationCoordinator;
152
- if (animationCoordinatorCreator !== undefined &&
153
- this._animationCoordinatorCreator !== animationCoordinatorCreator) {
154
- this._animationCoordinatorCreator = animationCoordinatorCreator;
155
- this._animationCoordinator.destroy();
156
- this._animationCoordinator = animationCoordinatorCreator(this, this._viewPhaseObservable);
157
- }
158
- super.setConfiguration(configuration);
159
- }
160
- get currentProductNode() {
161
- return this._currentProductNode;
162
- }
163
- get isFirstLoad() {
164
- return this._isFirstLoad;
165
- }
166
- addEventListener(event, listener) {
167
- switch (event) {
168
- case "viewPhase":
169
- this._viewPhaseObservable.listen(listener);
170
- break;
171
- default:
172
- super.addEventListener(event, listener);
173
- }
174
- }
175
- removeEventListener(event, listener) {
176
- switch (event) {
177
- case "viewPhase":
178
- this._viewPhaseObservable.stopListen(listener);
179
- break;
180
- default:
181
- super.removeEventListener(event, listener);
182
- }
183
- }
184
- getNeededFrameRender(time) {
185
- return (super.getNeededFrameRender(time) ||
186
- this._animationCoordinator.willTick(time, this._engine.getDeltaTime()));
187
- }
188
- renderFrame(time) {
189
- this._animationCoordinator.tick(time, this._engine.getDeltaTime());
190
- super.renderFrame(time);
191
- }
192
- flushScheduledForRemove(animationCoordinator) {
193
- return __awaiter(this, void 0, void 0, function* () {
194
- if (this._scheduledForRemoval.length === 0) {
195
- return;
196
- }
197
- const promises = [];
198
- for (;;) {
199
- const productNode = this._scheduledForRemoval.shift();
200
- if (productNode === undefined) {
201
- break;
202
- }
203
- promises.push((() => __awaiter(this, void 0, void 0, function* () {
204
- yield productNode.flushScheduledForRemove(animationCoordinator);
205
- this._contentRoot.remove(true, productNode);
206
- }))());
207
- }
208
- yield Promise.all(promises);
209
- this.notifyPhaseChange(SingleProductViewPhase.RemovedProduct);
210
- });
211
- }
212
- }
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._isFirstLoad = true;
20
+ this._scheduledForRemoval = [];
21
+ this._viewPhaseObservable = new Observable();
22
+ this._currentPhase = SingleProductViewPhase.Idle;
23
+ this.notifyPhaseChange = (phase) => {
24
+ this._viewPhaseObservable.notifyAll({
25
+ previous: this._currentPhase,
26
+ current: phase,
27
+ });
28
+ this._currentPhase = phase;
29
+ };
30
+ this.clearProduct = () => {
31
+ const currentProductNode = this._currentProductNode;
32
+ if (currentProductNode !== undefined) {
33
+ this.notifyPhaseChange(SingleProductViewPhase.RemovePreviousProduct);
34
+ this.scheduleForRemoval(currentProductNode);
35
+ this._currentProductNode = undefined;
36
+ }
37
+ };
38
+ this.loadProduct = (applicationAreas, product) => {
39
+ this.notifyPhaseChange(SingleProductViewPhase.LoadProductCalled);
40
+ const abortController = new AbortController();
41
+ const abortSignal = abortController.signal;
42
+ const loadingToken = this._loadingObservable.startChildLoading();
43
+ const stopLoading = () => {
44
+ this._loadingObservable.stopChildLoading(loadingToken);
45
+ };
46
+ void (() => __awaiter(this, void 0, void 0, function* () {
47
+ let isNewProduct = false;
48
+ let currentProductNode = this._currentProductNode;
49
+ if (currentProductNode === undefined ||
50
+ !currentProductNode.product.isBackedBySame(product)) {
51
+ this.clearProduct();
52
+ this.notifyPhaseChange(SingleProductViewPhase.MakeNewProduct);
53
+ currentProductNode = CfgProductNode.make(this._renderEnvironment, product);
54
+ this.notifyPhaseChange(SingleProductViewPhase.AddNewProduct);
55
+ this._currentProductNode = currentProductNode;
56
+ this._contentRoot.add(currentProductNode);
57
+ isNewProduct = true;
58
+ }
59
+ const animationCoordinator = {
60
+ coordinator: this._animationCoordinator,
61
+ isNewProduct,
62
+ };
63
+ try {
64
+ this.notifyPhaseChange(SingleProductViewPhase.SetModelsAndLoadGeo);
65
+ currentProductNode.refreshStretch();
66
+ yield currentProductNode.loadGeo(animationCoordinator);
67
+ if (isNewProduct) {
68
+ // New products needs resizing before rendering the first time
69
+ this.notifyPhaseChange(SingleProductViewPhase.HandleSizing);
70
+ this.handleSizing(true);
71
+ }
72
+ if (abortSignal.aborted) {
73
+ this.notifyPhaseChange(SingleProductViewPhase.Aborted);
74
+ return;
75
+ }
76
+ if (applicationAreas !== "loading") {
77
+ this.notifyPhaseChange(SingleProductViewPhase.SetApplicationAreas);
78
+ currentProductNode.setApplicationAreas(applicationAreas.map((a) => CfgMtrlApplication.fromMtrlLikeApplication(CfgMtrlApplicationSource.ApplicationArea, a)));
79
+ }
80
+ const loadMaterialsPromise = currentProductNode.loadMaterials(animationCoordinator);
81
+ const doRenderTemporaryMaterials = yield Promise.race([
82
+ (() => __awaiter(this, void 0, void 0, function* () {
83
+ yield loadMaterialsPromise;
84
+ return false;
85
+ }))(),
86
+ (() => __awaiter(this, void 0, void 0, function* () {
87
+ yield getWaitFramesPromise(10);
88
+ return true;
89
+ }))(),
90
+ ]);
91
+ this.notifyPhaseChange(SingleProductViewPhase.ApplyGeo);
92
+ yield currentProductNode.applyGeo(animationCoordinator);
93
+ // We don't have to wait for this
94
+ void this.flushScheduledForRemove(animationCoordinator);
95
+ if (abortSignal.aborted) {
96
+ this.notifyPhaseChange(SingleProductViewPhase.Aborted);
97
+ return;
98
+ }
99
+ if (!isNewProduct) {
100
+ // At this stage, any change in geometry has been applied
101
+ this.notifyPhaseChange(SingleProductViewPhase.HandleSizing);
102
+ this.handleSizing(false);
103
+ }
104
+ this._isFirstLoad = false;
105
+ if (doRenderTemporaryMaterials) {
106
+ this.scheduleRerender();
107
+ }
108
+ if (abortSignal.aborted) {
109
+ this.notifyPhaseChange(SingleProductViewPhase.Aborted);
110
+ return;
111
+ }
112
+ this.notifyPhaseChange(SingleProductViewPhase.LoadMaterials);
113
+ yield loadMaterialsPromise;
114
+ if (abortSignal.aborted) {
115
+ this.notifyPhaseChange(SingleProductViewPhase.Aborted);
116
+ return;
117
+ }
118
+ this.notifyPhaseChange(SingleProductViewPhase.ApplyMaterials);
119
+ this.pauseRendering();
120
+ yield currentProductNode.applyMaterials();
121
+ this.resumeRendering();
122
+ this.notifyPhaseChange(SingleProductViewPhase.AppliedMaterials);
123
+ this.scheduleRerender();
124
+ stopLoading();
125
+ this.notifyPhaseChange(SingleProductViewPhase.Idle);
126
+ }
127
+ catch (e) {
128
+ this.notifyPhaseChange(SingleProductViewPhase.Error);
129
+ this.notifyError(e);
130
+ stopLoading();
131
+ // Might result in double-unlock of semaphore, this is OK.
132
+ this.resumeRendering();
133
+ }
134
+ }))();
135
+ return () => {
136
+ abortController.abort();
137
+ stopLoading();
138
+ };
139
+ };
140
+ this._animationCoordinator = new CoordinatorIdentity(this, this._viewPhaseObservable);
141
+ }
142
+ destroy() {
143
+ this._animationCoordinator.destroy();
144
+ super.destroy();
145
+ }
146
+ scheduleForRemoval(productNode) {
147
+ productNode.destroy();
148
+ this._scheduledForRemoval.push(productNode);
149
+ }
150
+ setConfiguration(configuration) {
151
+ const animationCoordinatorCreator = configuration.experimentalAnimationCoordinator;
152
+ if (animationCoordinatorCreator !== undefined &&
153
+ this._animationCoordinatorCreator !== animationCoordinatorCreator) {
154
+ this._animationCoordinatorCreator = animationCoordinatorCreator;
155
+ this._animationCoordinator.destroy();
156
+ this._animationCoordinator = animationCoordinatorCreator(this, this._viewPhaseObservable);
157
+ }
158
+ super.setConfiguration(configuration);
159
+ }
160
+ get currentProductNode() {
161
+ return this._currentProductNode;
162
+ }
163
+ get isFirstLoad() {
164
+ return this._isFirstLoad;
165
+ }
166
+ addEventListener(event, listener) {
167
+ switch (event) {
168
+ case "viewPhase":
169
+ this._viewPhaseObservable.listen(listener);
170
+ break;
171
+ default:
172
+ super.addEventListener(event, listener);
173
+ }
174
+ }
175
+ removeEventListener(event, listener) {
176
+ switch (event) {
177
+ case "viewPhase":
178
+ this._viewPhaseObservable.stopListen(listener);
179
+ break;
180
+ default:
181
+ super.removeEventListener(event, listener);
182
+ }
183
+ }
184
+ getNeededFrameRender(time) {
185
+ return (super.getNeededFrameRender(time) ||
186
+ this._animationCoordinator.willTick(time, this._engine.getDeltaTime()));
187
+ }
188
+ renderFrame(time) {
189
+ this._animationCoordinator.tick(time, this._engine.getDeltaTime());
190
+ super.renderFrame(time);
191
+ }
192
+ flushScheduledForRemove(animationCoordinator) {
193
+ return __awaiter(this, void 0, void 0, function* () {
194
+ if (this._scheduledForRemoval.length === 0) {
195
+ return;
196
+ }
197
+ const promises = [];
198
+ for (;;) {
199
+ const productNode = this._scheduledForRemoval.shift();
200
+ if (productNode === undefined) {
201
+ break;
202
+ }
203
+ promises.push((() => __awaiter(this, void 0, void 0, function* () {
204
+ yield productNode.flushScheduledForRemove(animationCoordinator);
205
+ this._contentRoot.remove(true, productNode);
206
+ }))());
207
+ }
208
+ yield Promise.all(promises);
209
+ this.notifyPhaseChange(SingleProductViewPhase.RemovedProduct);
210
+ });
211
+ }
212
+ }