@configura/babylon-view 1.6.1 → 2.0.0-alpha.2

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 +18 -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 +73 -68
  45. package/dist/camera/CfgOrbitalCamera.js +260 -250
  46. package/dist/camera/CfgOrbitalCameraControlProps.d.ts +11 -6
  47. package/dist/camera/CfgOrbitalCameraControlProps.js +6 -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 -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 -13
  65. package/dist/index.js +16 -13
  66. package/dist/io/CfgHistoryToCameraConfConnector.d.ts +30 -0
  67. package/dist/io/CfgHistoryToCameraConfConnector.js +80 -0
  68. package/dist/io/CfgIOCameraConfConnector.d.ts +36 -0
  69. package/dist/io/CfgIOCameraConfConnector.js +82 -0
  70. package/dist/io/CfgObservableStateToCameraConfConnector.d.ts +11 -0
  71. package/dist/io/CfgObservableStateToCameraConfConnector.js +11 -0
  72. package/dist/io/CfgWindowMessageToCameraConfConnector.d.ts +11 -0
  73. package/dist/io/CfgWindowMessageToCameraConfConnector.js +11 -0
  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 +37 -34
  127. package/dist/view/SingleProductDefaultCameraView.js +145 -141
  128. package/dist/view/SingleProductDefaultCameraViewConfiguration.d.ts +42 -46
  129. package/dist/view/SingleProductDefaultCameraViewConfiguration.js +11 -11
  130. package/dist/view/SingleProductView.d.ts +44 -42
  131. package/dist/view/SingleProductView.js +212 -207
  132. package/dist/view/SingleProductViewConfiguration.d.ts +32 -32
  133. package/dist/view/SingleProductViewConfiguration.js +19 -19
  134. package/package.json +5 -5
@@ -1,250 +1,260 @@
1
- import { ArcRotateCamera } from "@babylonjs/core/Cameras/arcRotateCamera.js";
2
- import { Vector3 } from "@babylonjs/core/Maths/math.vector.js";
3
- import { degToRad, Observable } from "@configura/web-utilities";
4
- import { CfgBoundingBox } from "../utilities/CfgBoundingBox.js";
5
- import { boundingBoxesAreSignificantlyDifferent, measureLongestDistanceToCorner, } from "../utilities/utilities3D.js";
6
- import { CfgArcRotateCameraPointersInput } from "./CfgArcRotateCameraPointersInput.js";
7
- import { orbitalCameraControlPropsEquals, } from "./CfgOrbitalCameraControlProps.js";
8
- const NEAREST_ALLOWED_TO_BETA_LIMITS = 0.1;
9
- export const MAX_UPPER_BETA_LIMIT = Math.PI - NEAREST_ALLOWED_TO_BETA_LIMITS;
10
- export const MIN_LOWER_BETA_LIMIT = NEAREST_ALLOWED_TO_BETA_LIMITS;
11
- const defaultOrbitalCameraConfig = {
12
- fov: degToRad(30),
13
- mouseWheelSpeedFactor: 200,
14
- pinchZoomFactor: 100,
15
- inertia: 0.93,
16
- keyboardSpeedFactor: 0.002,
17
- pointerSpeedFactor: 2000,
18
- keepCameraFromGettingTooCloseFactor: 1.5,
19
- significantBoundingBoxSizeChangeShrinkFactor: 0.4,
20
- significantBoundingBoxSizeChangeGrowFactor: 0.1,
21
- };
22
- // This is a workaround as you are not allowed to override fields with accessors.
23
- // By adding this abstract field this becomes possible. This is a hack.
24
- class WorkaroundCfgOrbitalCamera extends ArcRotateCamera {
25
- }
26
- export class CfgOrbitalCamera extends WorkaroundCfgOrbitalCamera {
27
- constructor(scene, _canvas, config) {
28
- super("CfgOrbitalCamera", 0, degToRad(90), 50, new Vector3(0, 0, 0), scene);
29
- this._canvas = _canvas;
30
- this._currentBoundingBox = new CfgBoundingBox();
31
- this._latestSignificantChangeBoundingBox = new CfgBoundingBox();
32
- this._disableSubFloorCam = false;
33
- this._lowestAllowedCameraHeight = undefined;
34
- this.disableAutomaticSizing = false;
35
- this.disableZoom = false;
36
- this._externalControlHasHappened = false;
37
- this._radius = 0;
38
- this._boundNotifyCameraControlListeners = () => {
39
- this._notifyCameraControlListeners();
40
- };
41
- this.attachControl(_canvas, // This parameters is not actually used for anything. But still required.
42
- false, // No panning with keyboard
43
- false // No panning with mouse
44
- );
45
- // Workaround for touch issues on iOS, see comments in CfgArcRotateCameraPointersInput.ts
46
- this.inputs.removeByType("ArcRotateCameraPointersInput");
47
- this.inputs.add(new CfgArcRotateCameraPointersInput());
48
- // Make sure to disable all forms of "panning", which for the ArcRotateCamera is defined
49
- // as movement sideways without rotation to keep the camera centered on the target.
50
- // The settings above for attachControl will not disable two-finger touch.
51
- this.panningAxis = Vector3.Zero();
52
- this.panningDistanceLimit = 0;
53
- this.panningSensibility = 0;
54
- this.panningInertia = 0;
55
- this._config = Object.assign(Object.assign({}, defaultOrbitalCameraConfig), config);
56
- const keyboardInput = this.inputs.attached["keyboard"];
57
- keyboardInput.angularSpeed = this._config.keyboardSpeedFactor;
58
- this.fov = this._config.fov;
59
- this.inertia = this._config.inertia;
60
- this.angularSensibilityX = this.angularSensibilityY = this._config.pointerSpeedFactor;
61
- this.onViewMatrixChangedObservable.add(this._boundNotifyCameraControlListeners);
62
- }
63
- dispose() {
64
- this.detachControl(this._canvas);
65
- this.onViewMatrixChangedObservable.removeCallback(this._boundNotifyCameraControlListeners);
66
- super.dispose();
67
- }
68
- set disableSubFloorCam(v) {
69
- this._disableSubFloorCam = v;
70
- }
71
- set lowestAllowedCameraHeight(v) {
72
- this._lowestAllowedCameraHeight = v;
73
- }
74
- get lowestAllowedCameraHeight() {
75
- if (this._lowestAllowedCameraHeight !== undefined) {
76
- if (this._disableSubFloorCam) {
77
- return Math.max(0, this._lowestAllowedCameraHeight);
78
- }
79
- return this._lowestAllowedCameraHeight;
80
- }
81
- if (this._disableSubFloorCam) {
82
- return 0;
83
- }
84
- return undefined;
85
- }
86
- forceRadius(r) {
87
- this._radius = r;
88
- }
89
- set radius(r) {
90
- if (this.disableZoom) {
91
- return;
92
- }
93
- this._radius = r;
94
- }
95
- get radius() {
96
- return this._radius;
97
- }
98
- get _orbitalCameraControlProps() {
99
- return {
100
- distance: this.radius,
101
- yaw: this.alpha,
102
- pitch: this.beta,
103
- };
104
- }
105
- frameRenderNeeded() {
106
- const externalControlHasHappened = this._externalControlHasHappened;
107
- if (externalControlHasHappened) {
108
- this._externalControlHasHappened = false;
109
- }
110
- return (this.useAutoRotationBehavior ||
111
- externalControlHasHappened ||
112
- this.inertialAlphaOffset !== 0 ||
113
- this.inertialBetaOffset !== 0 ||
114
- this.inertialPanningX !== 0 ||
115
- this.inertialPanningY !== 0 ||
116
- this.inertialRadiusOffset !== 0);
117
- }
118
- _notifyCameraControlListeners() {
119
- if (this._orbitalCameraControlObservable === undefined) {
120
- return;
121
- }
122
- const orbitalCameraControlProps = this._orbitalCameraControlProps;
123
- if (this._previousOrbitalCameraControlProps !== undefined &&
124
- orbitalCameraControlPropsEquals(this._previousOrbitalCameraControlProps, orbitalCameraControlProps)) {
125
- return;
126
- }
127
- this._orbitalCameraControlObservable.notifyAll(orbitalCameraControlProps, this._orbitalCameraControlObservable);
128
- this._previousOrbitalCameraControlProps = orbitalCameraControlProps;
129
- }
130
- get cameraControlObservable() {
131
- if (this._orbitalCameraControlObservable === undefined) {
132
- this._orbitalCameraControlObservable = new Observable();
133
- this._orbitalCameraControlObservable.listen((c) => {
134
- const { distance, yaw, pitch } = c;
135
- let change = false;
136
- if (distance !== undefined && distance !== this.radius) {
137
- this.forceRadius(distance);
138
- change = true;
139
- }
140
- if (yaw !== undefined && yaw !== this.alpha) {
141
- this.alpha = yaw;
142
- change = true;
143
- }
144
- if (pitch !== undefined && pitch !== this.beta) {
145
- this.beta = pitch;
146
- change = true;
147
- }
148
- if (change) {
149
- this._externalControlHasHappened = true;
150
- this._notifyCameraControlListeners();
151
- }
152
- }, this._orbitalCameraControlObservable);
153
- }
154
- return this._orbitalCameraControlObservable;
155
- }
156
- setContentBoundingBox(newBoundingBox, force) {
157
- this._currentBoundingBox = newBoundingBox;
158
- const significantChange = boundingBoxesAreSignificantlyDifferent(this._latestSignificantChangeBoundingBox, newBoundingBox, this._config.significantBoundingBoxSizeChangeShrinkFactor, this._config.significantBoundingBoxSizeChangeGrowFactor);
159
- if (!significantChange && !force) {
160
- return;
161
- }
162
- this._latestSignificantChangeBoundingBox = newBoundingBox;
163
- this._applyAdaptToContentBoundingBox(force);
164
- this._applyNoSneakPeeking();
165
- }
166
- _applyAdaptToContentBoundingBox(force) {
167
- const bb = this._currentBoundingBox;
168
- if (bb.isEmpty) {
169
- return;
170
- }
171
- // Keeps the camera from recomputing angles
172
- const pre = [this.alpha, this.beta];
173
- this.target = bb.center;
174
- if (this.disableAutomaticSizing) {
175
- return;
176
- }
177
- [this.alpha, this.beta] = pre;
178
- this._updateCameraLimits();
179
- const minDistanceToFitModelInView = this._currentMinDistanceToFitModelInView;
180
- const minDistanceToKeepCameraOutOfModel = this._currentMinDistanceToKeepCameraOutOfModel;
181
- if (minDistanceToFitModelInView !== undefined) {
182
- if (force || this.radius < minDistanceToFitModelInView) {
183
- this.forceRadius(minDistanceToFitModelInView);
184
- }
185
- }
186
- if (minDistanceToKeepCameraOutOfModel !== undefined &&
187
- minDistanceToFitModelInView !== undefined) {
188
- this.lowerRadiusLimit =
189
- minDistanceToKeepCameraOutOfModel *
190
- this._config.keepCameraFromGettingTooCloseFactor;
191
- this.upperRadiusLimit = minDistanceToFitModelInView * 2;
192
- this.wheelPrecision =
193
- this._config.mouseWheelSpeedFactor / minDistanceToKeepCameraOutOfModel;
194
- this.pinchPrecision = this._config.pinchZoomFactor / minDistanceToKeepCameraOutOfModel;
195
- this.speed = minDistanceToKeepCameraOutOfModel * 0.1;
196
- }
197
- }
198
- refreshCameraNearFar() {
199
- const minDistanceToKeepCameraOutOfModel = this._currentMinDistanceToKeepCameraOutOfModel;
200
- if (minDistanceToKeepCameraOutOfModel === undefined) {
201
- return;
202
- }
203
- const cameraDistance = this.radius;
204
- const extraSpaceFactor = 1.5; // Because when zooming fast it seems the limits do not keep up
205
- const graceDistance = minDistanceToKeepCameraOutOfModel * extraSpaceFactor;
206
- this.minZ = cameraDistance - graceDistance;
207
- this.maxZ = cameraDistance + graceDistance;
208
- }
209
- _applyNoSneakPeeking() {
210
- //It might be impolite to look at a Cfg models underside
211
- const noPeekLimit = this._calculateNoPeekingLimit();
212
- if (noPeekLimit === undefined || !isFinite(noPeekLimit)) {
213
- this.upperBetaLimit = MAX_UPPER_BETA_LIMIT;
214
- return;
215
- }
216
- this.upperBetaLimit = Math.min(MAX_UPPER_BETA_LIMIT, Math.PI / 2 - noPeekLimit);
217
- }
218
- _updateCameraLimits() {
219
- const bb = this._currentBoundingBox;
220
- const fovVertical = this.fov;
221
- const aspect = this.getEngine().getScreenAspectRatio();
222
- const bbAdjustedForCameraPosition = bb.clone().translate(this.target.negate());
223
- const longestDistanceToCornerInXYZSpace = measureLongestDistanceToCorner(bbAdjustedForCameraPosition, [0, 1, 2]);
224
- const longestDistanceToCornerInXZPlane = measureLongestDistanceToCorner(bbAdjustedForCameraPosition, [0, 2]);
225
- const fovHorizontalRad = 2 * Math.atan(Math.tan(fovVertical / 2) * aspect);
226
- const maxAllowedHeight = longestDistanceToCornerInXYZSpace * 2;
227
- const maxAllowedWidth = longestDistanceToCornerInXZPlane * 2; //Because the model can not be tilted, only spun
228
- const minDistanceToFitInViewFromWidth = maxAllowedWidth / (2 * Math.tan(fovHorizontalRad / 2));
229
- const minDistanceToFitInViewFromHeight = maxAllowedHeight / (2 * Math.tan(fovVertical / 2));
230
- const minDistanceToFitModelInView = Math.max(minDistanceToFitInViewFromWidth, minDistanceToFitInViewFromHeight);
231
- this._currentMinDistanceToKeepCameraOutOfModel = isFinite(longestDistanceToCornerInXYZSpace)
232
- ? longestDistanceToCornerInXYZSpace
233
- : undefined;
234
- this._currentMinDistanceToFitModelInView = isFinite(minDistanceToFitModelInView)
235
- ? minDistanceToFitModelInView
236
- : undefined;
237
- }
238
- _calculateNoPeekingLimit() {
239
- const bb = this._currentBoundingBox;
240
- if (bb.isEmpty || this.lowestAllowedCameraHeight === undefined) {
241
- return undefined;
242
- }
243
- const bottomDepth = bb.minimum.y -
244
- this.target.y +
245
- (bb.maximum.y - bb.minimum.y) * this.lowestAllowedCameraHeight;
246
- const cameraDistance = this.radius;
247
- const lowestAngleUnderHorizonRad = Math.asin(bottomDepth / cameraDistance);
248
- return lowestAngleUnderHorizonRad;
249
- }
250
- }
1
+ import { ArcRotateCamera } from "@babylonjs/core/Cameras/arcRotateCamera.js";
2
+ import { Vector3 } from "@babylonjs/core/Maths/math.vector.js";
3
+ import { degToRad, normalizeAngle, Observable } from "@configura/web-utilities";
4
+ import { CfgBoundingBox } from "../utilities/CfgBoundingBox.js";
5
+ import { boundingBoxesAreSignificantlyDifferent, measureLongestDistanceToCorner, } from "../utilities/utilities3D.js";
6
+ import { CfgArcRotateCameraPointersInput } from "./CfgArcRotateCameraPointersInput.js";
7
+ import { orbitalCameraControlPropsEquals, } from "./CfgOrbitalCameraControlProps.js";
8
+ const NEAREST_ALLOWED_TO_BETA_LIMITS = 0.1;
9
+ export const MAX_UPPER_BETA_LIMIT = Math.PI - NEAREST_ALLOWED_TO_BETA_LIMITS;
10
+ export const MIN_LOWER_BETA_LIMIT = NEAREST_ALLOWED_TO_BETA_LIMITS;
11
+ const defaultOrbitalCameraConfig = {
12
+ fov: degToRad(30),
13
+ mouseWheelSpeedFactor: 200,
14
+ pinchZoomFactor: 100,
15
+ inertia: 0.93,
16
+ keyboardSpeedFactor: 0.002,
17
+ pointerSpeedFactor: 2000,
18
+ keepCameraFromGettingTooCloseFactor: 1.5,
19
+ significantBoundingBoxSizeChangeShrinkFactor: 0.4,
20
+ significantBoundingBoxSizeChangeGrowFactor: 0.1,
21
+ };
22
+ // Babylon initializes radius to this to avoid divide by zero
23
+ const BABYLON_DO_NOT_DIVIDE_BY_ZERO_MAGIC_CONSTANT = 0.0001;
24
+ // This is a workaround as you are not allowed to override fields with accessors.
25
+ // By adding this abstract field this becomes possible. This is a hack.
26
+ class WorkaroundCfgOrbitalCamera extends ArcRotateCamera {
27
+ }
28
+ export class CfgOrbitalCamera extends WorkaroundCfgOrbitalCamera {
29
+ constructor(scene, _canvas, config) {
30
+ super("CfgOrbitalCamera", 0, degToRad(90), 50, new Vector3(0, 0, 0), scene);
31
+ this._canvas = _canvas;
32
+ this._currentBoundingBox = new CfgBoundingBox();
33
+ this._latestSignificantChangeBoundingBox = new CfgBoundingBox();
34
+ this._disableSubFloorCam = false;
35
+ this._lowestAllowedCameraHeight = undefined;
36
+ this.disableAutomaticSizing = false;
37
+ this.disableZoom = false;
38
+ this._externalControlHasHappened = false;
39
+ this._radius = 0;
40
+ this._boundNotifyCameraControlListeners = () => this._notifyCameraControlListeners();
41
+ this.attachControl(_canvas, // This parameters is not actually used for anything. But still required.
42
+ false, // No panning with keyboard
43
+ false // No panning with mouse
44
+ );
45
+ // Workaround for touch issues on iOS, see comments in CfgArcRotateCameraPointersInput.ts
46
+ this.inputs.removeByType("ArcRotateCameraPointersInput");
47
+ this.inputs.add(new CfgArcRotateCameraPointersInput());
48
+ // Make sure to disable all forms of "panning", which for the ArcRotateCamera is defined
49
+ // as movement sideways without rotation to keep the camera centered on the target.
50
+ // The settings above for attachControl will not disable two-finger touch.
51
+ this.panningAxis = Vector3.Zero();
52
+ this.panningDistanceLimit = 0;
53
+ this.panningSensibility = 0;
54
+ this.panningInertia = 0;
55
+ this._config = Object.assign(Object.assign({}, defaultOrbitalCameraConfig), config);
56
+ const keyboardInput = this.inputs.attached["keyboard"];
57
+ keyboardInput.angularSpeed = this._config.keyboardSpeedFactor;
58
+ this.fov = this._config.fov;
59
+ this.inertia = this._config.inertia;
60
+ this.angularSensibilityX = this.angularSensibilityY = this._config.pointerSpeedFactor;
61
+ this.onViewMatrixChangedObservable.add(this._boundNotifyCameraControlListeners);
62
+ }
63
+ dispose() {
64
+ this.detachControl(this._canvas);
65
+ this.onViewMatrixChangedObservable.removeCallback(this._boundNotifyCameraControlListeners);
66
+ super.dispose();
67
+ }
68
+ set disableSubFloorCam(v) {
69
+ this._disableSubFloorCam = v;
70
+ }
71
+ set lowestAllowedCameraHeight(v) {
72
+ this._lowestAllowedCameraHeight = v;
73
+ }
74
+ get lowestAllowedCameraHeight() {
75
+ if (this._lowestAllowedCameraHeight !== undefined) {
76
+ if (this._disableSubFloorCam) {
77
+ return Math.max(0, this._lowestAllowedCameraHeight);
78
+ }
79
+ return this._lowestAllowedCameraHeight;
80
+ }
81
+ if (this._disableSubFloorCam) {
82
+ return 0;
83
+ }
84
+ return undefined;
85
+ }
86
+ forceRadius(r) {
87
+ this._radius = r;
88
+ }
89
+ set radius(r) {
90
+ if (this.disableZoom) {
91
+ return;
92
+ }
93
+ this._radius = r;
94
+ }
95
+ get radius() {
96
+ return this._radius;
97
+ }
98
+ get _orbitalCameraControlProps() {
99
+ return {
100
+ distance: this.radius === BABYLON_DO_NOT_DIVIDE_BY_ZERO_MAGIC_CONSTANT
101
+ ? undefined
102
+ : this.radius,
103
+ yaw: normalizeAngle(this.alpha),
104
+ pitch: this.beta,
105
+ distanceWasAutoSet: this.radius === this._currentMinDistanceToFitModelInView,
106
+ };
107
+ }
108
+ frameRenderNeeded() {
109
+ const externalControlHasHappened = this._externalControlHasHappened;
110
+ if (externalControlHasHappened) {
111
+ this._externalControlHasHappened = false;
112
+ }
113
+ return (this.useAutoRotationBehavior ||
114
+ externalControlHasHappened ||
115
+ this.inertialAlphaOffset !== 0 ||
116
+ this.inertialBetaOffset !== 0 ||
117
+ this.inertialPanningX !== 0 ||
118
+ this.inertialPanningY !== 0 ||
119
+ this.inertialRadiusOffset !== 0);
120
+ }
121
+ _notifyCameraControlListeners() {
122
+ if (this._orbitalCameraControlObservable === undefined) {
123
+ return;
124
+ }
125
+ const orbitalCameraControlProps = this._orbitalCameraControlProps;
126
+ if (this._previousOrbitalCameraControlProps !== undefined &&
127
+ orbitalCameraControlPropsEquals(this._previousOrbitalCameraControlProps, orbitalCameraControlProps)) {
128
+ return;
129
+ }
130
+ this._orbitalCameraControlObservable.notifyAll(orbitalCameraControlProps, this._orbitalCameraControlObservable);
131
+ this._previousOrbitalCameraControlProps = orbitalCameraControlProps;
132
+ }
133
+ get cameraControlObservable() {
134
+ if (this._orbitalCameraControlObservable === undefined) {
135
+ this._orbitalCameraControlObservable = new Observable();
136
+ this._orbitalCameraControlObservable.listen((c) => {
137
+ const { distance, yaw, pitch, distanceWasAutoSet } = c;
138
+ let change = false;
139
+ if (distanceWasAutoSet !== true &&
140
+ distance !== undefined &&
141
+ distance !== this.radius) {
142
+ this.forceRadius(distance);
143
+ change = true;
144
+ }
145
+ if (yaw !== undefined && yaw !== this.alpha) {
146
+ this.alpha = yaw;
147
+ change = true;
148
+ }
149
+ if (pitch !== undefined && pitch !== this.beta) {
150
+ this.beta = pitch;
151
+ change = true;
152
+ }
153
+ if (change) {
154
+ this._externalControlHasHappened = true;
155
+ this._notifyCameraControlListeners();
156
+ }
157
+ }, this._orbitalCameraControlObservable);
158
+ }
159
+ return this._orbitalCameraControlObservable;
160
+ }
161
+ /**
162
+ * @param force true makes the camera distance adapt to the new bounds, even if they have
163
+ * not changed significantly. false makes the camera distance not adapt even if the
164
+ * bounding box size change is significant.
165
+ */
166
+ setContentBoundingBox(newBoundingBox, force) {
167
+ this._currentBoundingBox = newBoundingBox;
168
+ const significantChange = boundingBoxesAreSignificantlyDifferent(this._latestSignificantChangeBoundingBox, newBoundingBox, this._config.significantBoundingBoxSizeChangeShrinkFactor, this._config.significantBoundingBoxSizeChangeGrowFactor);
169
+ if (!significantChange && force !== true) {
170
+ return;
171
+ }
172
+ this._latestSignificantChangeBoundingBox = newBoundingBox;
173
+ this._applyAdaptToContentBoundingBox(force);
174
+ this._applyNoSneakPeeking();
175
+ }
176
+ _applyAdaptToContentBoundingBox(force) {
177
+ const bb = this._currentBoundingBox;
178
+ if (bb.isEmpty) {
179
+ return;
180
+ }
181
+ // Keeps the camera from recomputing angles and distance
182
+ const pre = [this.alpha, this.beta, this.radius];
183
+ this.target = bb.center;
184
+ if (this.disableAutomaticSizing) {
185
+ return;
186
+ }
187
+ [this.alpha, this.beta, this.radius] = pre;
188
+ this._updateCameraLimits();
189
+ const minDistanceToFitModelInView = this._currentMinDistanceToFitModelInView;
190
+ const minDistanceToKeepCameraOutOfModel = this._currentMinDistanceToKeepCameraOutOfModel;
191
+ if (minDistanceToFitModelInView !== undefined) {
192
+ if (force !== false && (force === true || this.radius < minDistanceToFitModelInView)) {
193
+ this.forceRadius(minDistanceToFitModelInView);
194
+ }
195
+ }
196
+ if (minDistanceToKeepCameraOutOfModel !== undefined &&
197
+ minDistanceToFitModelInView !== undefined) {
198
+ this.lowerRadiusLimit =
199
+ minDistanceToKeepCameraOutOfModel *
200
+ this._config.keepCameraFromGettingTooCloseFactor;
201
+ this.upperRadiusLimit = minDistanceToFitModelInView * 2;
202
+ this.wheelPrecision =
203
+ this._config.mouseWheelSpeedFactor / minDistanceToKeepCameraOutOfModel;
204
+ this.pinchPrecision = this._config.pinchZoomFactor / minDistanceToKeepCameraOutOfModel;
205
+ this.speed = minDistanceToKeepCameraOutOfModel * 0.1;
206
+ }
207
+ }
208
+ refreshCameraNearFar() {
209
+ const minDistanceToKeepCameraOutOfModel = this._currentMinDistanceToKeepCameraOutOfModel;
210
+ if (minDistanceToKeepCameraOutOfModel === undefined) {
211
+ return;
212
+ }
213
+ const cameraDistance = this.radius;
214
+ const extraSpaceFactor = 1.5; // Because when zooming fast it seems the limits do not keep up
215
+ const graceDistance = minDistanceToKeepCameraOutOfModel * extraSpaceFactor;
216
+ this.minZ = cameraDistance - graceDistance;
217
+ this.maxZ = cameraDistance + graceDistance;
218
+ }
219
+ _applyNoSneakPeeking() {
220
+ //It might be impolite to look at a Cfg models underside
221
+ const noPeekLimit = this._calculateNoPeekingLimit();
222
+ if (noPeekLimit === undefined || !isFinite(noPeekLimit)) {
223
+ this.upperBetaLimit = MAX_UPPER_BETA_LIMIT;
224
+ return;
225
+ }
226
+ this.upperBetaLimit = Math.min(MAX_UPPER_BETA_LIMIT, Math.PI / 2 - noPeekLimit);
227
+ }
228
+ _updateCameraLimits() {
229
+ const bb = this._currentBoundingBox;
230
+ const fovVertical = this.fov;
231
+ const aspect = this.getEngine().getScreenAspectRatio();
232
+ const bbAdjustedForCameraPosition = bb.clone().translate(this.target.negate());
233
+ const longestDistanceToCornerInXYZSpace = measureLongestDistanceToCorner(bbAdjustedForCameraPosition, [0, 1, 2]);
234
+ const longestDistanceToCornerInXZPlane = measureLongestDistanceToCorner(bbAdjustedForCameraPosition, [0, 2]);
235
+ const fovHorizontalRad = 2 * Math.atan(Math.tan(fovVertical / 2) * aspect);
236
+ const maxAllowedHeight = longestDistanceToCornerInXYZSpace * 2;
237
+ const maxAllowedWidth = longestDistanceToCornerInXZPlane * 2; //Because the model can not be tilted, only spun
238
+ const minDistanceToFitInViewFromWidth = maxAllowedWidth / (2 * Math.tan(fovHorizontalRad / 2));
239
+ const minDistanceToFitInViewFromHeight = maxAllowedHeight / (2 * Math.tan(fovVertical / 2));
240
+ const minDistanceToFitModelInView = Math.max(minDistanceToFitInViewFromWidth, minDistanceToFitInViewFromHeight);
241
+ this._currentMinDistanceToKeepCameraOutOfModel = isFinite(longestDistanceToCornerInXYZSpace)
242
+ ? longestDistanceToCornerInXYZSpace
243
+ : undefined;
244
+ this._currentMinDistanceToFitModelInView = isFinite(minDistanceToFitModelInView)
245
+ ? minDistanceToFitModelInView
246
+ : undefined;
247
+ }
248
+ _calculateNoPeekingLimit() {
249
+ const bb = this._currentBoundingBox;
250
+ if (bb.isEmpty || this.lowestAllowedCameraHeight === undefined) {
251
+ return undefined;
252
+ }
253
+ const bottomDepth = bb.minimum.y -
254
+ this.target.y +
255
+ (bb.maximum.y - bb.minimum.y) * this.lowestAllowedCameraHeight;
256
+ const cameraDistance = this.radius;
257
+ const lowestAngleUnderHorizonRad = Math.asin(bottomDepth / cameraDistance);
258
+ return lowestAngleUnderHorizonRad;
259
+ }
260
+ }
@@ -1,7 +1,12 @@
1
- export interface CfgOrbitalCameraControlProps {
2
- distance?: number;
3
- yaw?: number;
4
- pitch?: number;
5
- }
6
- export declare function orbitalCameraControlPropsEquals(left: CfgOrbitalCameraControlProps, right: CfgOrbitalCameraControlProps): boolean;
1
+ /**
2
+ * @param distanceWasAutoSet Indicates that the camera distance was auto set. If true when setting
3
+ * camera settings @param distance will be ignored.
4
+ */
5
+ export interface CfgOrbitalCameraControlProps {
6
+ distance?: number;
7
+ yaw?: number;
8
+ pitch?: number;
9
+ distanceWasAutoSet?: boolean;
10
+ }
11
+ export declare function orbitalCameraControlPropsEquals(left: CfgOrbitalCameraControlProps, right: CfgOrbitalCameraControlProps): boolean;
7
12
  //# sourceMappingURL=CfgOrbitalCameraControlProps.d.ts.map
@@ -1,3 +1,6 @@
1
- export function orbitalCameraControlPropsEquals(left, right) {
2
- return left.distance === right.distance && left.yaw === right.yaw && left.pitch === right.pitch;
3
- }
1
+ export function orbitalCameraControlPropsEquals(left, right) {
2
+ return (((left.distanceWasAutoSet && right.distanceWasAutoSet) ||
3
+ left.distance === right.distance) &&
4
+ left.yaw === right.yaw &&
5
+ left.pitch === right.pitch);
6
+ }
@@ -1,4 +1,4 @@
1
- import { Camera } from "@babylonjs/core/Cameras/camera.js";
2
- export declare type GradingApplier = (camera: Camera) => void;
3
- export declare const getDefaultGradingApplier: () => GradingApplier;
1
+ import { Camera } from "@babylonjs/core/Cameras/camera.js";
2
+ export declare type GradingApplier = (camera: Camera) => void;
3
+ export declare const getDefaultGradingApplier: () => GradingApplier;
4
4
  //# sourceMappingURL=GradingApplier.d.ts.map