redhotmagma-visualization 1.44.0 → 1.44.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.
@@ -1111,7 +1111,7 @@ var Three3DScene = exports.Three3DScene = /*#__PURE__*/function (_Three3D) {
1111
1111
  var lookat = dir.multiplyScalar(distance).add(position);
1112
1112
  var rotation = new _three.Quaternion();
1113
1113
  camera.getWorldQuaternion(rotation);
1114
- var orientation = _three.Object3D.DefaultUp.clone().applyQuaternion(rotation);
1114
+ var orientation = _three.Object3D.DefaultUp.clone();
1115
1115
  var fov = camera.fov || 45;
1116
1116
  var cameraView = {
1117
1117
  position: position,
@@ -1187,11 +1187,17 @@ var Three3DScene = exports.Three3DScene = /*#__PURE__*/function (_Three3D) {
1187
1187
  };
1188
1188
  }
1189
1189
  this.screenshotViews = this.calculateRelativeViews(this.relativeScreenshotViews, center, (this.controls.minDistance + this.controls.maxDistance) * 0.5);
1190
- if (!this._firstCameraInitDone) {
1191
- this._firstCameraInitDone = true;
1192
- this.currentCameraView = null;
1193
- this.jumpToView("default", false);
1194
- }
1190
+ }
1191
+ }, {
1192
+ key: "getCameraViewRatio",
1193
+ value: function getCameraViewRatio(view1, view2) {
1194
+ return view2.lookat.distanceTo(view2.position) / view1.lookat.distanceTo(view1.position);
1195
+ }
1196
+ }, {
1197
+ key: "shouldViewChangeTriggerJumpToView",
1198
+ value: function shouldViewChangeTriggerJumpToView(view1, view2) {
1199
+ var tolerance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.5;
1200
+ return Math.abs(this.getCameraViewRatio(view1, view2) - 1) > tolerance;
1195
1201
  }
1196
1202
  }, {
1197
1203
  key: "initCameraViews",
@@ -1205,8 +1211,18 @@ var Three3DScene = exports.Three3DScene = /*#__PURE__*/function (_Three3D) {
1205
1211
  }
1206
1212
  var box = this.getSceneContainerBox();
1207
1213
  var center = box.getCenter(new _three.Vector3());
1214
+ var currentCameraName = this.currentCameraView;
1215
+ var previousCameraView = this.cameraViews[currentCameraName];
1208
1216
  this.setupRelativeCameras(center);
1209
1217
  this.setupSceneCameras(cameras, center);
1218
+ if (!this._firstCameraInitDone) {
1219
+ this._firstCameraInitDone = true;
1220
+ this.currentCameraView = null;
1221
+ this.jumpToView("default", false);
1222
+ } else if (previousCameraView && this.cameraViews[currentCameraName] && this.shouldViewChangeTriggerJumpToView(previousCameraView, this.cameraViews[currentCameraName])) {
1223
+ this.currentCameraView = null;
1224
+ this.jumpToView(currentCameraName, true);
1225
+ }
1210
1226
  }
1211
1227
  }, {
1212
1228
  key: "jumpToView",
@@ -1348,9 +1364,13 @@ var Three3DScene = exports.Three3DScene = /*#__PURE__*/function (_Three3D) {
1348
1364
  controls.maxDistance = maxDistance;
1349
1365
  camera.near = minDistance * 0.01;
1350
1366
  camera.far = maxDistance * 100;
1351
- camera.position.copy(camera.position.normalize().multiplyScalar(maxDistance * 0.75));
1367
+ // update current position only if it does not fit into the distance range
1368
+ var currentDistance = sphere.center.distanceTo(camera.position);
1369
+ if (currentDistance < minDistance || currentDistance > maxDistance) {
1370
+ camera.position.copy(camera.position.normalize().multiplyScalar(maxDistance * 0.75));
1371
+ controls.target = sphere.center;
1372
+ }
1352
1373
  camera.updateProjectionMatrix();
1353
- controls.target = sphere.center;
1354
1374
  controls.update();
1355
1375
  }
1356
1376
  }, {
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "redhotmagma-visualization",
3
- "version": "1.44.0",
3
+ "version": "1.44.2",
4
4
  "license": "UNLICENSED",
5
5
  "private": false,
6
6
  "main": "./index.js",
7
7
  "dependencies": {
8
8
  "@babel/polyfill": "^7.12.1",
9
- "@configuratorware/scripts": "1.44.0",
9
+ "@configuratorware/scripts": "1.44.2",
10
10
  "@tweenjs/tween.js": "^17.6.0",
11
11
  "console-polyfill": "^0.3.0",
12
12
  "css-element-queries": "^1.2.3",
@@ -888,7 +888,7 @@ export class Three3DScene extends Three3D {
888
888
 
889
889
  const rotation = new Quaternion();
890
890
  camera.getWorldQuaternion(rotation);
891
- const orientation = Object3D.DefaultUp.clone().applyQuaternion(rotation);
891
+ const orientation = Object3D.DefaultUp.clone();
892
892
 
893
893
  const fov = camera.fov || 45;
894
894
 
@@ -964,12 +964,14 @@ export class Three3DScene extends Three3D {
964
964
  center,
965
965
  (this.controls.minDistance + this.controls.maxDistance) * 0.5
966
966
  );
967
+ }
967
968
 
968
- if (!this._firstCameraInitDone) {
969
- this._firstCameraInitDone = true;
970
- this.currentCameraView = null;
971
- this.jumpToView("default", false);
972
- }
969
+ getCameraViewRatio(view1, view2) {
970
+ return view2.lookat.distanceTo(view2.position) / view1.lookat.distanceTo(view1.position);
971
+ }
972
+
973
+ shouldViewChangeTriggerJumpToView(view1, view2, tolerance = 0.5) {
974
+ return Math.abs(this.getCameraViewRatio(view1, view2) - 1) > tolerance;
973
975
  }
974
976
 
975
977
  initCameraViews(cameras) {
@@ -983,8 +985,27 @@ export class Three3DScene extends Three3D {
983
985
  const box = this.getSceneContainerBox();
984
986
  const center = box.getCenter(new Vector3());
985
987
 
988
+ const currentCameraName = this.currentCameraView;
989
+ const previousCameraView = this.cameraViews[currentCameraName];
990
+
986
991
  this.setupRelativeCameras(center);
987
992
  this.setupSceneCameras(cameras, center);
993
+
994
+ if (!this._firstCameraInitDone) {
995
+ this._firstCameraInitDone = true;
996
+ this.currentCameraView = null;
997
+ this.jumpToView("default", false);
998
+ } else if (
999
+ previousCameraView &&
1000
+ this.cameraViews[currentCameraName] &&
1001
+ this.shouldViewChangeTriggerJumpToView(
1002
+ previousCameraView,
1003
+ this.cameraViews[currentCameraName]
1004
+ )
1005
+ ) {
1006
+ this.currentCameraView = null;
1007
+ this.jumpToView(currentCameraName, true);
1008
+ }
988
1009
  }
989
1010
 
990
1011
  jumpToView(viewName, animate = true, duration = {}) {
@@ -1109,9 +1130,13 @@ export class Three3DScene extends Three3D {
1109
1130
  controls.maxDistance = maxDistance;
1110
1131
  camera.near = minDistance * 0.01;
1111
1132
  camera.far = maxDistance * 100;
1112
- camera.position.copy(camera.position.normalize().multiplyScalar(maxDistance * 0.75));
1133
+ // update current position only if it does not fit into the distance range
1134
+ const currentDistance = sphere.center.distanceTo(camera.position);
1135
+ if (currentDistance < minDistance || currentDistance > maxDistance) {
1136
+ camera.position.copy(camera.position.normalize().multiplyScalar(maxDistance * 0.75));
1137
+ controls.target = sphere.center;
1138
+ }
1113
1139
  camera.updateProjectionMatrix();
1114
- controls.target = sphere.center;
1115
1140
 
1116
1141
  controls.update();
1117
1142
  }