@configura/babylon-view 2.1.0 → 2.2.0-alpha.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 (134) hide show
  1. package/.eslintrc.json +5 -5
  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/CfgOrbitalCamera.d.ts +76 -76
  43. package/dist/camera/CfgOrbitalCamera.js +277 -281
  44. package/dist/camera/CfgOrbitalCameraControlProps.d.ts +14 -14
  45. package/dist/camera/CfgOrbitalCameraControlProps.js +7 -7
  46. package/dist/camera/GradingApplier.d.ts +3 -3
  47. package/dist/camera/GradingApplier.js +48 -48
  48. package/dist/engine/EngineCreator.d.ts +3 -3
  49. package/dist/engine/EngineCreator.js +10 -10
  50. package/dist/geometry/CfgGeometry.d.ts +29 -29
  51. package/dist/geometry/CfgGeometry.js +146 -146
  52. package/dist/geometry/CfgMesh.d.ts +10 -10
  53. package/dist/geometry/CfgMesh.js +38 -38
  54. package/dist/geometry/geoSplitter.d.ts +8 -8
  55. package/dist/geometry/geoSplitter.js +192 -192
  56. package/dist/geometry/stretch/CfgMorphTarget.d.ts +15 -15
  57. package/dist/geometry/stretch/CfgMorphTarget.js +65 -65
  58. package/dist/geometry/stretch/CfgStretchData.d.ts +116 -116
  59. package/dist/geometry/stretch/CfgStretchData.js +347 -347
  60. package/dist/geometry/stretch/CfgStretchMorphGeometry.d.ts +16 -16
  61. package/dist/geometry/stretch/CfgStretchMorphGeometry.js +95 -95
  62. package/dist/index.d.ts +16 -16
  63. package/dist/index.js +16 -16
  64. package/dist/io/CfgHistoryToCameraConfConnector.d.ts +31 -31
  65. package/dist/io/CfgHistoryToCameraConfConnector.js +90 -90
  66. package/dist/io/CfgIOCameraConfConnector.d.ts +35 -35
  67. package/dist/io/CfgIOCameraConfConnector.js +81 -81
  68. package/dist/io/CfgObservableStateToCameraConfConnector.d.ts +10 -10
  69. package/dist/io/CfgObservableStateToCameraConfConnector.js +11 -11
  70. package/dist/io/CfgWindowMessageToCameraConfConnector.d.ts +10 -10
  71. package/dist/io/CfgWindowMessageToCameraConfConnector.js +11 -11
  72. package/dist/light/CfgDirectionalLight.d.ts +8 -8
  73. package/dist/light/CfgDirectionalLight.js +18 -18
  74. package/dist/light/CfgHemisphericLight.d.ts +7 -7
  75. package/dist/light/CfgHemisphericLight.js +17 -17
  76. package/dist/light/CfgPointLight.d.ts +8 -8
  77. package/dist/light/CfgPointLight.js +18 -18
  78. package/dist/light/DefaultLightRig.d.ts +19 -19
  79. package/dist/light/DefaultLightRig.js +77 -77
  80. package/dist/light/LightRigCreator.d.ts +9 -9
  81. package/dist/light/LightRigCreator.js +3 -3
  82. package/dist/material/CfgMaterial.d.ts +68 -68
  83. package/dist/material/CfgMaterial.js +482 -482
  84. package/dist/material/DummyMaterialCreator.d.ts +4 -4
  85. package/dist/material/DummyMaterialCreator.js +15 -15
  86. package/dist/material/material.d.ts +18 -18
  87. package/dist/material/material.js +128 -128
  88. package/dist/material/texture.d.ts +14 -14
  89. package/dist/material/texture.js +306 -306
  90. package/dist/nodes/CfgContentRootNode.d.ts +19 -19
  91. package/dist/nodes/CfgContentRootNode.js +75 -75
  92. package/dist/nodes/CfgDeferredMeshNode.d.ts +55 -55
  93. package/dist/nodes/CfgDeferredMeshNode.js +378 -378
  94. package/dist/nodes/CfgProductNode.d.ts +127 -127
  95. package/dist/nodes/CfgProductNode.js +598 -598
  96. package/dist/nodes/CfgSymNode.d.ts +50 -50
  97. package/dist/nodes/CfgSymNode.js +249 -249
  98. package/dist/nodes/CfgSymRootNode.d.ts +45 -45
  99. package/dist/nodes/CfgSymRootNode.js +240 -239
  100. package/dist/nodes/CfgTransformNode.d.ts +33 -33
  101. package/dist/nodes/CfgTransformNode.js +83 -83
  102. package/dist/scene/SceneCreator.d.ts +6 -6
  103. package/dist/scene/SceneCreator.js +22 -22
  104. package/dist/utilities/CfgBoundingBox.d.ts +21 -21
  105. package/dist/utilities/CfgBoundingBox.js +81 -81
  106. package/dist/utilities/anchor/anchor.d.ts +50 -50
  107. package/dist/utilities/anchor/anchor.js +133 -133
  108. package/dist/utilities/anchor/anchorMap.d.ts +20 -20
  109. package/dist/utilities/anchor/anchorMap.js +111 -111
  110. package/dist/utilities/utilities3D.d.ts +70 -70
  111. package/dist/utilities/utilities3D.js +259 -265
  112. package/dist/utilities/utilitiesColor.d.ts +18 -18
  113. package/dist/utilities/utilitiesColor.js +50 -50
  114. package/dist/utilities/utilitiesImage.d.ts +6 -6
  115. package/dist/utilities/utilitiesImage.js +107 -107
  116. package/dist/utilities/utilitiesSymRootIdentifier.d.ts +7 -7
  117. package/dist/utilities/utilitiesSymRootIdentifier.js +26 -26
  118. package/dist/view/BaseView.d.ts +78 -78
  119. package/dist/view/BaseView.js +303 -303
  120. package/dist/view/BaseViewConfiguration.d.ts +32 -32
  121. package/dist/view/BaseViewConfiguration.js +10 -10
  122. package/dist/view/RenderEnv.d.ts +43 -43
  123. package/dist/view/RenderEnv.js +7 -7
  124. package/dist/view/SingleProductDefaultCameraView.d.ts +38 -38
  125. package/dist/view/SingleProductDefaultCameraView.js +149 -149
  126. package/dist/view/SingleProductDefaultCameraViewConfiguration.d.ts +44 -44
  127. package/dist/view/SingleProductDefaultCameraViewConfiguration.js +11 -11
  128. package/dist/view/SingleProductView.d.ts +44 -44
  129. package/dist/view/SingleProductView.js +212 -212
  130. package/dist/view/SingleProductViewConfiguration.d.ts +32 -32
  131. package/dist/view/SingleProductViewConfiguration.js +19 -19
  132. package/package.json +16 -7
  133. package/dist/camera/CfgArcRotateCameraPointersInput.d.ts +0 -27
  134. package/dist/camera/CfgArcRotateCameraPointersInput.js +0 -266
@@ -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
+ }