@vertexvis/viewer 0.13.2-canary.5 → 0.13.2-canary.8

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 (80) hide show
  1. package/dist/cjs/{config-51717484.js → config-fb124bac.js} +1 -1
  2. package/dist/cjs/{entities-44af4bed.js → entities-90f1347a.js} +2 -2
  3. package/dist/cjs/index.cjs.js +5 -5
  4. package/dist/cjs/{mapper-c2984708.js → mapper-80ee2957.js} +1 -1
  5. package/dist/cjs/{scene-b94ed69f.js → scene-92728420.js} +1 -1
  6. package/dist/cjs/{streamAttributes-24243bf7.js → streamAttributes-81eb52f2.js} +62 -2
  7. package/dist/cjs/vertex-scene-tree-table-cell.cjs.entry.js +3 -0
  8. package/dist/cjs/vertex-scene-tree.cjs.entry.js +2 -2
  9. package/dist/cjs/vertex-viewer-dom-element_3.cjs.entry.js +6 -5
  10. package/dist/cjs/vertex-viewer-measurement-details.cjs.entry.js +1 -1
  11. package/dist/cjs/vertex-viewer-measurement-distance.cjs.entry.js +12 -7
  12. package/dist/cjs/vertex-viewer-measurement-line_2.cjs.entry.js +2 -2
  13. package/dist/cjs/vertex-viewer-measurement-precise.cjs.entry.js +4 -4
  14. package/dist/cjs/vertex-viewer-measurement-tool.cjs.entry.js +1 -1
  15. package/dist/cjs/vertex-viewer-measurements.cjs.entry.js +2 -2
  16. package/dist/cjs/vertex-viewer-view-cube.cjs.entry.js +1 -1
  17. package/dist/cjs/vertex-viewer.cjs.entry.js +27 -32
  18. package/dist/cjs/{viewport-d2b5a8e7.js → viewport-54b1389d.js} +33 -1
  19. package/dist/collection/components/scene-tree-table-cell/scene-tree-table-cell.js +4 -1
  20. package/dist/collection/components/viewer-dom-renderer/renderer3d.js +4 -2
  21. package/dist/collection/components/viewer-dom-renderer/viewer-dom-renderer.js +2 -3
  22. package/dist/collection/components/viewer-measurement-distance/hitTest.js +9 -4
  23. package/dist/collection/components/viewer-measurement-distance/viewer-measurement-distance.js +2 -2
  24. package/dist/collection/lib/interactions/interactionApiOrthographic.js +22 -29
  25. package/dist/collection/lib/interactions/multiTouchInteractionHandler.js +3 -2
  26. package/dist/collection/lib/types/depthBuffer.js +32 -3
  27. package/dist/collection/lib/types/frame.js +32 -1
  28. package/dist/collection/lib/types/viewport.js +34 -2
  29. package/dist/collection/testing/fixtures.js +7 -7
  30. package/dist/custom-elements/index.js +134 -38
  31. package/dist/esm/{config-74107d81.js → config-fb7cd8ff.js} +1 -1
  32. package/dist/esm/{entities-aee9e3b5.js → entities-78557270.js} +2 -2
  33. package/dist/esm/index.js +5 -5
  34. package/dist/esm/index.mjs +5 -5
  35. package/dist/esm/{mapper-8e05e52a.js → mapper-da36de17.js} +1 -1
  36. package/dist/esm/{scene-1b4f21d2.js → scene-2bfcce74.js} +1 -1
  37. package/dist/esm/{streamAttributes-aeeb30b7.js → streamAttributes-d0b384b3.js} +63 -3
  38. package/dist/esm/vertex-scene-tree-table-cell.entry.js +3 -0
  39. package/dist/esm/vertex-scene-tree.entry.js +2 -2
  40. package/dist/esm/vertex-viewer-dom-element_3.entry.js +6 -5
  41. package/dist/esm/vertex-viewer-measurement-details.entry.js +1 -1
  42. package/dist/esm/vertex-viewer-measurement-distance.entry.js +12 -7
  43. package/dist/esm/vertex-viewer-measurement-line_2.entry.js +2 -2
  44. package/dist/esm/vertex-viewer-measurement-precise.entry.js +4 -4
  45. package/dist/esm/vertex-viewer-measurement-tool.entry.js +1 -1
  46. package/dist/esm/vertex-viewer-measurements.entry.js +2 -2
  47. package/dist/esm/vertex-viewer-view-cube.entry.js +1 -1
  48. package/dist/esm/vertex-viewer.entry.js +27 -32
  49. package/dist/esm/{viewport-b5cfb917.js → viewport-5cc7b128.js} +33 -1
  50. package/dist/types/components/scene-tree-table-cell/scene-tree-table-cell.d.ts +1 -1
  51. package/dist/types/components/viewer-measurement-distance/hitTest.d.ts +3 -2
  52. package/dist/types/lib/interactions/interactionApiOrthographic.d.ts +3 -2
  53. package/dist/types/lib/types/depthBuffer.d.ts +24 -2
  54. package/dist/types/lib/types/frame.d.ts +22 -0
  55. package/dist/types/lib/types/viewport.d.ts +22 -1
  56. package/dist/types/testing/fixtures.d.ts +4 -3
  57. package/dist/viewer/index.esm.js +1 -1
  58. package/dist/viewer/{p-e24a91d1.entry.js → p-0a189e62.entry.js} +1 -1
  59. package/dist/viewer/{p-3ab84758.js → p-69058178.js} +1 -1
  60. package/dist/viewer/{p-bbd34830.entry.js → p-73a5eacc.entry.js} +1 -1
  61. package/dist/viewer/{p-299ef720.js → p-77be081a.js} +1 -1
  62. package/dist/viewer/{p-6796ee68.js → p-809d09d9.js} +1 -1
  63. package/dist/viewer/{p-deed329f.entry.js → p-858bd2c7.entry.js} +1 -1
  64. package/dist/viewer/{p-60bab172.entry.js → p-89b66838.entry.js} +1 -1
  65. package/dist/viewer/p-96020463.entry.js +4 -0
  66. package/dist/viewer/p-a93a63a9.js +4 -0
  67. package/dist/viewer/{p-d4f82540.entry.js → p-b0ac6b3c.entry.js} +1 -1
  68. package/dist/viewer/{p-c5792433.js → p-b8774c9c.js} +1 -1
  69. package/dist/viewer/p-bcde5521.entry.js +4 -0
  70. package/dist/viewer/{p-a10fa95c.js → p-d32b54cb.js} +1 -1
  71. package/dist/viewer/{p-fd6ee00f.entry.js → p-d9f99f4d.entry.js} +1 -1
  72. package/dist/viewer/{p-be1e893e.entry.js → p-ebd55df7.entry.js} +1 -1
  73. package/dist/viewer/{p-fad89057.entry.js → p-f0411993.entry.js} +1 -1
  74. package/dist/viewer/p-fd261908.entry.js +4 -0
  75. package/dist/viewer/viewer.esm.js +1 -1
  76. package/package.json +7 -7
  77. package/dist/viewer/p-48fefcfa.js +0 -4
  78. package/dist/viewer/p-da31a14a.entry.js +0 -4
  79. package/dist/viewer/p-de82f35a.entry.js +0 -4
  80. package/dist/viewer/p-fec1a8d0.entry.js +0 -4
@@ -4,7 +4,7 @@
4
4
  'use strict';
5
5
 
6
6
  const browser_esm = require('./browser.esm-075810bf.js');
7
- require('./streamAttributes-24243bf7.js');
7
+ require('./streamAttributes-81eb52f2.js');
8
8
 
9
9
  const DEFAULT_ANIMATION_DURATION = 500;
10
10
  const defaultAnimationConfig = {
@@ -3,9 +3,9 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- const mapper = require('./mapper-c2984708.js');
6
+ const mapper = require('./mapper-80ee2957.js');
7
7
  const grpcWebClient_umd = require('./grpc-web-client.umd-60a79aae.js');
8
- const streamAttributes = require('./streamAttributes-24243bf7.js');
8
+ const streamAttributes = require('./streamAttributes-81eb52f2.js');
9
9
  const browser_esm = require('./browser.esm-075810bf.js');
10
10
 
11
11
  function requestUnary(caller) {
@@ -5,18 +5,18 @@
5
5
 
6
6
  Object.defineProperty(exports, '__esModule', { value: true });
7
7
 
8
- const scene = require('./scene-b94ed69f.js');
8
+ const scene = require('./scene-92728420.js');
9
9
  const cursors = require('./cursors-d71f6a74.js');
10
- const entities = require('./entities-44af4bed.js');
10
+ const entities = require('./entities-90f1347a.js');
11
11
  const model = require('./model-55abd9ab.js');
12
12
  const overlays = require('./overlays-68e8eff2.js');
13
13
  const results = require('./results-e9496869.js');
14
- const streamAttributes = require('./streamAttributes-24243bf7.js');
14
+ const streamAttributes = require('./streamAttributes-81eb52f2.js');
15
15
  const markup = require('./markup-7f7de5f2.js');
16
- const viewport = require('./viewport-d2b5a8e7.js');
16
+ const viewport = require('./viewport-54b1389d.js');
17
17
  require('./browser.esm-075810bf.js');
18
18
  require('./bundle.esm-618a5fe9.js');
19
- require('./mapper-c2984708.js');
19
+ require('./mapper-80ee2957.js');
20
20
  require('./_commonjsHelpers-537d719a.js');
21
21
  require('./grpc-web-client.umd-60a79aae.js');
22
22
 
@@ -6,7 +6,7 @@
6
6
  const _commonjsHelpers = require('./_commonjsHelpers-537d719a.js');
7
7
  const grpcWebClient_umd = require('./grpc-web-client.umd-60a79aae.js');
8
8
  const browser_esm = require('./browser.esm-075810bf.js');
9
- const streamAttributes = require('./streamAttributes-24243bf7.js');
9
+ const streamAttributes = require('./streamAttributes-81eb52f2.js');
10
10
 
11
11
  var uuid_pb = _commonjsHelpers.createCommonjsModule(function (module, exports) {
12
12
  /**
@@ -5,7 +5,7 @@
5
5
 
6
6
  const browser_esm = require('./browser.esm-075810bf.js');
7
7
  const bundle_esm = require('./bundle.esm-618a5fe9.js');
8
- const streamAttributes = require('./streamAttributes-24243bf7.js');
8
+ const streamAttributes = require('./streamAttributes-81eb52f2.js');
9
9
 
10
10
  const defaultColor = {
11
11
  opacity: 100,
@@ -36587,7 +36587,7 @@ class DepthBuffer {
36587
36587
  /**
36588
36588
  * Computes the depth from a 2D point within the coordinate space of the depth
36589
36589
  * buffer. The returned depth is a value that's between the near and far plane
36590
- * of the camera.
36590
+ * of the perspective camera.
36591
36591
  *
36592
36592
  * @param point A 2D point within the viewport.
36593
36593
  * @param fallbackNormalizedDepth A fallback value if the depth is the max
@@ -36599,6 +36599,21 @@ class DepthBuffer {
36599
36599
  const depth = this.getNormalizedDepthAtPoint(point, fallbackNormalizedDepth);
36600
36600
  return depth * (far - near) + near;
36601
36601
  }
36602
+ /**
36603
+ * Computes the depth from a 2D point within the coordinate space of the depth
36604
+ * buffer. The returned depth is a value that's between the near and far plane
36605
+ * of the orthographic camera.
36606
+ *
36607
+ * @param point A 2D point within the viewport.
36608
+ * @param fallbackNormalizedDepth A fallback value if the depth is the max
36609
+ * depth value, or cannot be determined.
36610
+ * @returns A depth between the near and far plane.
36611
+ */
36612
+ getOrthographicDepthAtPoint(point, fallbackNormalizedDepth) {
36613
+ const { near, far } = this.camera;
36614
+ const depth = this.getNormalizedDepthAtPoint(point, fallbackNormalizedDepth);
36615
+ return depth * (far - near) + near / 2;
36616
+ }
36602
36617
  /**
36603
36618
  * Computes a depth from a 2D point within the coordinate space of the frame.
36604
36619
  * The returned depth is a normalized value (`[0, 1]`) between the near and
@@ -36639,7 +36654,7 @@ class DepthBuffer {
36639
36654
  return this.getNormalizedDepthAtPoint(point) < 1;
36640
36655
  }
36641
36656
  /**
36642
- * Computes a 3D point in world space coordinates from the depth value at the
36657
+ * Computes a 3D point in perspective world space coordinates from the depth value at the
36643
36658
  * given pixel and ray.
36644
36659
  *
36645
36660
  * @param point A pixel to use for reading a depth value.
@@ -36659,6 +36674,20 @@ class DepthBuffer {
36659
36674
  (bundle_esm.vector3.magnitude(vv) * bundle_esm.vector3.magnitude(eyeToWorldPt));
36660
36675
  return bundle_esm.ray.at(ray, distance / angle);
36661
36676
  }
36677
+ /**
36678
+ * Computes a 3D point in orthographic world space coordinates from the depth value at the
36679
+ * given pixel and ray.
36680
+ *
36681
+ * @param point A pixel to use for reading a depth value.
36682
+ * @param ray A ray that specifies the origin and direction.
36683
+ * @param fallbackNormalizedDepth A fallback value if the depth is the max
36684
+ * depth value, or cannot be determined.
36685
+ * @returns A point in world space coordinates.
36686
+ */
36687
+ getOrthographicWorldPoint(point, ray, fallbackNormalizedDepth) {
36688
+ const distance = this.getOrthographicDepthAtPoint(point, fallbackNormalizedDepth);
36689
+ return bundle_esm.ray.at(ray, distance);
36690
+ }
36662
36691
  /**
36663
36692
  * Returns `true` if the given point in world space is occluded by any
36664
36693
  * geometry.
@@ -36938,6 +36967,9 @@ class FrameCameraBase {
36938
36967
  get projectionViewMatrix() {
36939
36968
  return this.computeCameraMatrices().projectionViewMatrix;
36940
36969
  }
36970
+ get frustumProjectionViewMatrix() {
36971
+ return this.computeCameraMatrices().projectionViewMatrix;
36972
+ }
36941
36973
  static fromBoundingBox(camera, boundingBox, aspectRatio) {
36942
36974
  const { near, far } = fromBoundingBoxAndLookAtCamera(boundingBox, camera);
36943
36975
  if (isOrthographicFrameCamera(camera)) {
@@ -36947,9 +36979,15 @@ class FrameCameraBase {
36947
36979
  return new FramePerspectiveCamera(camera.position, camera.lookAt, camera.up, near, far, aspectRatio, 45);
36948
36980
  }
36949
36981
  }
36982
+ /**
36983
+ * Returns whether this `FrameCameraBase` is an orthographic camera.
36984
+ */
36950
36985
  isOrthographic() {
36951
36986
  return false;
36952
36987
  }
36988
+ /**
36989
+ * Returns whether this `FrameCameraBase` is a perspective camera.
36990
+ */
36953
36991
  isPerspective() {
36954
36992
  return false;
36955
36993
  }
@@ -37010,6 +37048,15 @@ class FramePerspectiveCamera extends FrameCameraBase {
37010
37048
  this.aspectRatio = aspectRatio;
37011
37049
  this.fovY = fovY;
37012
37050
  }
37051
+ /**
37052
+ * Converts this `FramePerspectiveCamera` to a `FrameOrthographicCamera` using
37053
+ * the provided `boundingBox` to compute the viewing frustum.
37054
+ *
37055
+ * @param boundingBox The visible bounding box.
37056
+ */
37057
+ toOrthographic(boundingBox) {
37058
+ return FrameCameraBase.fromBoundingBox(toOrthographic(this, boundingBox), boundingBox, this.aspectRatio);
37059
+ }
37013
37060
  isPerspective() {
37014
37061
  return true;
37015
37062
  }
@@ -37045,9 +37092,22 @@ class FrameOrthographicCamera extends FrameCameraBase {
37045
37092
  this.right = this.top * aspectRatio;
37046
37093
  this.left = -this.right;
37047
37094
  }
37095
+ /**
37096
+ * Converts this `FrameOrthographicCamera` to a `FramePerspectiveCamera` using
37097
+ * the provided `boundingBox` to compute the near and far clipping planes.
37098
+ *
37099
+ * @param boundingBox The visible bounding box.
37100
+ */
37101
+ toPerspective(boundingBox) {
37102
+ return FrameCameraBase.fromBoundingBox(toPerspective(this), boundingBox, this.aspectRatio);
37103
+ }
37048
37104
  isOrthographic() {
37049
37105
  return true;
37050
37106
  }
37107
+ get frustumProjectionViewMatrix() {
37108
+ const frustumProjectionMatrix = bundle_esm.matrix4.makeFrustum(this.left, this.right, this.top, this.bottom, this.near, this.far);
37109
+ return bundle_esm.matrix4.multiply(frustumProjectionMatrix, this.computeCameraMatrices().viewMatrix);
37110
+ }
37051
37111
  computeCameraMatrices() {
37052
37112
  if (this.cameraMatrices == null) {
37053
37113
  const viewMatrix = bundle_esm.matrix4.makeLookAtView(this.position, this.lookAt, this.up);
@@ -104,6 +104,9 @@ let SceneTreeTableCell = class {
104
104
  }) })))), index.h("div", { class: "content" }, this.value != null && this.value.trim() !== '' ? (index.h("slot", null, this.displayValue())) : (index.h("slot", { name: "placeholder" }, this.placeholder))), this.visibilityToggle && (index.h("button", { class: "visibility-btn no-shrink", "data-test-id": 'visibility-btn-' + ((_g = this.node) === null || _g === void 0 ? void 0 : _g.name), onPointerDown: (event) => {
105
105
  event === null || event === void 0 ? void 0 : event.preventDefault();
106
106
  this.toggleVisibility(event);
107
+ }, onTouchStart: (event) => {
108
+ event === null || event === void 0 ? void 0 : event.preventDefault();
109
+ this.toggleVisibility(event);
107
110
  } }, index.h("div", { class: index$1.classnames('icon', {
108
111
  'icon-visible': !((_h = this.node) === null || _h === void 0 ? void 0 : _h.partiallyVisible) && ((_j = this.node) === null || _j === void 0 ? void 0 : _j.visible),
109
112
  'icon-hidden': !((_k = this.node) === null || _k === void 0 ? void 0 : _k.partiallyVisible) && !((_l = this.node) === null || _l === void 0 ? void 0 : _l.visible),
@@ -9,10 +9,10 @@ const index = require('./index-e100709a.js');
9
9
  const bundle_esm = require('./bundle.esm-618a5fe9.js');
10
10
  const _commonjsHelpers = require('./_commonjsHelpers-537d719a.js');
11
11
  const grpcWebClient_umd = require('./grpc-web-client.umd-60a79aae.js');
12
- const config = require('./config-51717484.js');
12
+ const config = require('./config-fb124bac.js');
13
13
  const browser_esm = require('./browser.esm-075810bf.js');
14
14
  const dom = require('./dom-d162f898.js');
15
- require('./streamAttributes-24243bf7.js');
15
+ require('./streamAttributes-81eb52f2.js');
16
16
 
17
17
  window.requestIdleCallback =
18
18
  window.requestIdleCallback ||
@@ -7,8 +7,8 @@ Object.defineProperty(exports, '__esModule', { value: true });
7
7
 
8
8
  const index = require('./index-e100709a.js');
9
9
  const bundle_esm = require('./bundle.esm-618a5fe9.js');
10
- require('./streamAttributes-24243bf7.js');
11
- const viewport = require('./viewport-d2b5a8e7.js');
10
+ require('./streamAttributes-81eb52f2.js');
11
+ const viewport = require('./viewport-54b1389d.js');
12
12
  require('./browser.esm-075810bf.js');
13
13
  require('./_commonjsHelpers-537d719a.js');
14
14
 
@@ -445,7 +445,9 @@ function getScreenPosition(pt, projectionViewMatrix, viewport) {
445
445
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
446
446
  const Renderer3d = ({ camera, viewport }, children) => {
447
447
  const pMatrix = bundle_esm.matrix4.toObject(camera.projectionMatrix);
448
- const fovY = pMatrix.m22 * (viewport.height / 2);
448
+ const fovY = camera.isOrthographic()
449
+ ? ((camera.far * 2) / (camera.fovHeight * 2)) * (viewport.height / 2)
450
+ : pMatrix.m22 * (viewport.height / 2);
449
451
  const cameraTransform = [
450
452
  `translateZ(${fovY}px)`,
451
453
  getCameraCssMatrix(camera.viewMatrix),
@@ -623,11 +625,10 @@ let ViewerDomRenderer = class {
623
625
  this.invalidateFrame();
624
626
  }
625
627
  async updatePropsFromViewer() {
626
- var _a;
627
628
  const { frame, depthBuffers } = this.viewer || {};
628
629
  this.depthBuffer =
629
630
  depthBuffers === 'all' ? await (frame === null || frame === void 0 ? void 0 : frame.depthBuffer()) : undefined;
630
- this.camera = (_a = frame === null || frame === void 0 ? void 0 : frame.scene) === null || _a === void 0 ? void 0 : _a.camera;
631
+ this.camera = frame === null || frame === void 0 ? void 0 : frame.scene.camera;
631
632
  }
632
633
  get hostEl() { return index.getElement(this); }
633
634
  static get watchers() { return {
@@ -6,7 +6,7 @@
6
6
  Object.defineProperty(exports, '__esModule', { value: true });
7
7
 
8
8
  const index = require('./index-e100709a.js');
9
- const streamAttributes = require('./streamAttributes-24243bf7.js');
9
+ const streamAttributes = require('./streamAttributes-81eb52f2.js');
10
10
  const bundle_esm = require('./bundle.esm-618a5fe9.js');
11
11
  const index$1 = require('./index-3bc6bac0.js');
12
12
  require('./browser.esm-075810bf.js');
@@ -10,13 +10,13 @@ const bundle_esm = require('./bundle.esm-618a5fe9.js');
10
10
  const constants = require('./constants-be2deb55.js');
11
11
  const cursors = require('./cursors-d71f6a74.js');
12
12
  const dom = require('./dom-57ef84e9.js');
13
- require('./mapper-c2984708.js');
13
+ require('./mapper-80ee2957.js');
14
14
  require('./grpc-web-client.umd-60a79aae.js');
15
- const streamAttributes = require('./streamAttributes-24243bf7.js');
15
+ const streamAttributes = require('./streamAttributes-81eb52f2.js');
16
16
  const model = require('./model-55abd9ab.js');
17
17
  const overlays = require('./overlays-68e8eff2.js');
18
18
  const results = require('./results-e9496869.js');
19
- const viewport = require('./viewport-d2b5a8e7.js');
19
+ const viewport = require('./viewport-54b1389d.js');
20
20
  const browser_esm = require('./browser.esm-075810bf.js');
21
21
  const utils = require('./utils-463cd52e.js');
22
22
  const index$1 = require('./index-3bc6bac0.js');
@@ -27,10 +27,11 @@ function getMeasurementBoundingClientRect(el) {
27
27
  }
28
28
 
29
29
  class PointToPointHitTester {
30
- constructor(stencil, depthBuffer, viewport) {
30
+ constructor(stencil, depthBuffer, viewport, camera) {
31
31
  this.stencil = stencil;
32
32
  this.depthBuffer = depthBuffer;
33
33
  this.viewport = viewport;
34
+ this.camera = camera;
34
35
  }
35
36
  hitTest(pt) {
36
37
  const dpt = this.viewport.transformPointToFrame(pt, this.depthBuffer);
@@ -55,10 +56,14 @@ class PointToPointHitTester {
55
56
  transformPointToWorld(pt, { ignoreHitTest = false } = {}) {
56
57
  const buffer = this.pickDepthBuffer(pt);
57
58
  if (buffer != null) {
58
- return this.viewport.transformPointToWorldSpace(pt, buffer);
59
+ return this.camera == null || this.camera.isPerspective()
60
+ ? this.viewport.transformPointToWorldSpace(pt, buffer)
61
+ : this.viewport.transformPointToOrthographicWorldSpace(pt, buffer);
59
62
  }
60
63
  else if (ignoreHitTest) {
61
- return this.viewport.transformPointToWorldSpace(pt, this.depthBuffer);
64
+ return this.camera == null || this.camera.isPerspective()
65
+ ? this.viewport.transformPointToWorldSpace(pt, this.depthBuffer)
66
+ : this.viewport.transformPointToOrthographicWorldSpace(pt, this.depthBuffer);
62
67
  }
63
68
  }
64
69
  pickDepthBuffer(pt) {
@@ -945,7 +950,7 @@ let ViewerMeasurementDistance = class {
945
950
  getHitTester() {
946
951
  const { stencil, depthBuffer } = this.stateMap;
947
952
  if (depthBuffer != null) {
948
- return new PointToPointHitTester(stencil, depthBuffer, this.viewport);
953
+ return new PointToPointHitTester(stencil, depthBuffer, this.viewport, this.internalCamera);
949
954
  }
950
955
  }
951
956
  updateMeasurementPropsFromModel() {
@@ -7,9 +7,9 @@ Object.defineProperty(exports, '__esModule', { value: true });
7
7
 
8
8
  const index = require('./index-e100709a.js');
9
9
  const bundle_esm = require('./bundle.esm-618a5fe9.js');
10
- require('./mapper-c2984708.js');
10
+ require('./mapper-80ee2957.js');
11
11
  require('./grpc-web-client.umd-60a79aae.js');
12
- require('./streamAttributes-24243bf7.js');
12
+ require('./streamAttributes-81eb52f2.js');
13
13
  const overlays = require('./overlays-68e8eff2.js');
14
14
  const utils = require('./utils-463cd52e.js');
15
15
  require('./_commonjsHelpers-537d719a.js');
@@ -6,11 +6,11 @@
6
6
  Object.defineProperty(exports, '__esModule', { value: true });
7
7
 
8
8
  const index = require('./index-e100709a.js');
9
- const mapper = require('./mapper-c2984708.js');
9
+ const mapper = require('./mapper-80ee2957.js');
10
10
  const grpcWebClient_umd = require('./grpc-web-client.umd-60a79aae.js');
11
- const config = require('./config-51717484.js');
12
- const entities = require('./entities-44af4bed.js');
13
- const streamAttributes = require('./streamAttributes-24243bf7.js');
11
+ const config = require('./config-fb124bac.js');
12
+ const entities = require('./entities-90f1347a.js');
13
+ const streamAttributes = require('./streamAttributes-81eb52f2.js');
14
14
  const model = require('./model-55abd9ab.js');
15
15
  const overlays = require('./overlays-68e8eff2.js');
16
16
  const bundle_esm = require('./bundle.esm-618a5fe9.js');
@@ -8,7 +8,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
8
8
  const index = require('./index-e100709a.js');
9
9
  const constants = require('./constants-be2deb55.js');
10
10
  const templates = require('./templates-e57b3741.js');
11
- require('./streamAttributes-24243bf7.js');
11
+ require('./streamAttributes-81eb52f2.js');
12
12
  const measurement = require('./measurement-f1ae9248.js');
13
13
  const utils = require('./utils-463cd52e.js');
14
14
  require('./bundle.esm-618a5fe9.js');
@@ -7,9 +7,9 @@ Object.defineProperty(exports, '__esModule', { value: true });
7
7
 
8
8
  const index = require('./index-e100709a.js');
9
9
  const constants = require('./constants-be2deb55.js');
10
- require('./mapper-c2984708.js');
10
+ require('./mapper-80ee2957.js');
11
11
  require('./grpc-web-client.umd-60a79aae.js');
12
- require('./streamAttributes-24243bf7.js');
12
+ require('./streamAttributes-81eb52f2.js');
13
13
  const model = require('./model-55abd9ab.js');
14
14
  const results = require('./results-e9496869.js');
15
15
  const templates = require('./templates-e57b3741.js');
@@ -8,7 +8,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
8
8
  const index = require('./index-e100709a.js');
9
9
  const bundle_esm = require('./bundle.esm-618a5fe9.js');
10
10
  const stencil = require('./stencil-a664cd10.js');
11
- const streamAttributes = require('./streamAttributes-24243bf7.js');
11
+ const streamAttributes = require('./streamAttributes-81eb52f2.js');
12
12
  const index$1 = require('./index-3bc6bac0.js');
13
13
  require('./browser.esm-075810bf.js');
14
14
  require('./_commonjsHelpers-537d719a.js');
@@ -7,14 +7,14 @@ Object.defineProperty(exports, '__esModule', { value: true });
7
7
 
8
8
  const index = require('./index-e100709a.js');
9
9
  const bundle_esm = require('./bundle.esm-618a5fe9.js');
10
- const streamAttributes = require('./streamAttributes-24243bf7.js');
10
+ const streamAttributes = require('./streamAttributes-81eb52f2.js');
11
11
  const browser_esm = require('./browser.esm-075810bf.js');
12
12
  const index$1 = require('./index-3bc6bac0.js');
13
- const config = require('./config-51717484.js');
13
+ const config = require('./config-fb124bac.js');
14
14
  const cursors = require('./cursors-d71f6a74.js');
15
15
  const dom = require('./dom-57ef84e9.js');
16
- const scene = require('./scene-b94ed69f.js');
17
- const viewport = require('./viewport-d2b5a8e7.js');
16
+ const scene = require('./scene-92728420.js');
17
+ const viewport = require('./viewport-54b1389d.js');
18
18
  require('./_commonjsHelpers-537d719a.js');
19
19
 
20
20
  /**
@@ -709,35 +709,25 @@ class InteractionApiOrthographic extends InteractionApi {
709
709
  * @param screenPt A point in screen coordinates.
710
710
  */
711
711
  async panCameraToScreenPoint(screenPt) {
712
- return this.transformCamera(({ camera, frame, viewport, depthBuffer }) => {
712
+ return this.transformCamera(({ camera, frame, viewport }) => {
713
713
  // Capture the starting state of the pan.
714
714
  if (this.panData == null) {
715
715
  const startingCamera = camera.toFrameCamera();
716
716
  const direction = startingCamera.direction;
717
- const ray = viewport.transformPointToRay(screenPt, frame.image, startingCamera);
718
- const fallbackPlane = bundle_esm.plane.fromNormalAndCoplanarPoint(direction, camera.lookAt);
719
- const fallback = bundle_esm.ray.intersectPlane(ray, fallbackPlane);
720
- if (fallback == null) {
717
+ const ray = viewport.transformPointToOrthographicRay(screenPt, frame.image, startingCamera);
718
+ const hitPlane = bundle_esm.plane.fromNormalAndCoplanarPoint(direction, camera.lookAt);
719
+ const hitPt = bundle_esm.ray.intersectPlane(ray, hitPlane);
720
+ if (hitPt == null) {
721
721
  console.warn('Cannot determine fallback for pan. Ray does not intersect plane.');
722
722
  return camera;
723
723
  }
724
- // TODO: properly support depth buffer in orthographic
725
- const hitPt = fallback;
726
- // Create a plane for the hit point that will be used to determine the
727
- // delta of future mouse movements to the original hit point. Fallback
728
- // to a plane placed at the look at point, in case there's no hit.
729
- // const hitPt =
730
- // depthBuffer != null
731
- // ? this.getWorldPoint(screenPt, depthBuffer, fallback)
732
- // : fallback;
733
- const hitPlane = bundle_esm.plane.fromNormalAndCoplanarPoint(direction, hitPt);
734
724
  this.panData = { hitPt, hitPlane, startingCamera };
735
725
  }
736
726
  if (this.panData != null) {
737
727
  const { hitPt, hitPlane, startingCamera } = this.panData;
738
728
  // Use a ray that originates at the screen and intersects with the hit
739
729
  // plane to determine the move distance.
740
- const ray = viewport.transformPointToRay(screenPt, frame.image, startingCamera);
730
+ const ray = viewport.transformPointToOrthographicRay(screenPt, frame.image, startingCamera);
741
731
  const movePt = bundle_esm.ray.intersectPlane(ray, hitPlane);
742
732
  if (movePt != null) {
743
733
  const delta = bundle_esm.vector3.subtract(hitPt, movePt);
@@ -751,25 +741,20 @@ class InteractionApiOrthographic extends InteractionApi {
751
741
  }
752
742
  async zoomCameraToPoint(point, delta) {
753
743
  return this.transformCamera(({ camera, viewport, frame, depthBuffer }) => {
754
- var _a;
755
744
  if (this.orthographicZoomData == null ||
756
745
  bundle_esm.point.distance(point, this.orthographicZoomData.startingScreenPt) > 2) {
757
746
  const frameCam = camera.toFrameCamera();
758
- const asPerspective = streamAttributes.toPerspective(frameCam);
759
- const planes = streamAttributes.fromBoundingBoxAndLookAtCamera(frame.scene.boundingBox, asPerspective);
760
- const perspectiveCam = new streamAttributes.FramePerspectiveCamera(asPerspective.position, asPerspective.lookAt, asPerspective.up, planes.near, planes.far, camera.aspectRatio, (_a = asPerspective.fovY) !== null && _a !== void 0 ? _a : 45);
761
747
  const dir = frameCam.direction;
762
- const ray = viewport.transformPointToRay(point, frame.image, perspectiveCam);
748
+ const ray = viewport.transformPointToOrthographicRay(point, frame.image, frameCam);
763
749
  const fallbackPlane = bundle_esm.plane.fromNormalAndCoplanarPoint(dir, frameCam.lookAt);
764
750
  const fallbackPt = bundle_esm.ray.intersectPlane(ray, fallbackPlane);
765
751
  if (fallbackPt == null) {
766
752
  console.warn('Cannot determine fallback point for zoom. Ray does not intersect plane.');
767
753
  return camera;
768
754
  }
769
- const hitPt = fallbackPt;
770
- // depthBuffer != null
771
- // ? this.getWorldPoint(point, depthBuffer, fallbackPt)
772
- // : fallbackPt;
755
+ const hitPt = depthBuffer != null
756
+ ? this.getWorldPoint(point, depthBuffer, fallbackPt)
757
+ : fallbackPt;
773
758
  const hitPlane = bundle_esm.plane.fromNormalAndCoplanarPoint(dir, hitPt);
774
759
  this.orthographicZoomData = {
775
760
  hitPt,
@@ -778,10 +763,11 @@ class InteractionApiOrthographic extends InteractionApi {
778
763
  };
779
764
  }
780
765
  if (this.orthographicZoomData != null) {
781
- const { hitPt } = this.orthographicZoomData;
766
+ const { hitPt, hitPlane } = this.orthographicZoomData;
782
767
  const relativeDelta = 2 * (camera.fovHeight / viewport.height) * delta;
783
768
  const fovHeight = Math.max(1, camera.fovHeight - relativeDelta);
784
- const diff = bundle_esm.vector3.scale((camera.fovHeight - fovHeight) / camera.fovHeight, bundle_esm.vector3.subtract(hitPt, camera.lookAt));
769
+ const projectedLookAt = bundle_esm.plane.projectPoint(hitPlane, camera.lookAt);
770
+ const diff = bundle_esm.vector3.scale((camera.fovHeight - fovHeight) / camera.fovHeight, bundle_esm.vector3.subtract(hitPt, projectedLookAt));
785
771
  return camera.update({
786
772
  lookAt: bundle_esm.vector3.add(camera.lookAt, diff),
787
773
  fovHeight: Math.max(1, camera.fovHeight - relativeDelta),
@@ -790,6 +776,14 @@ class InteractionApiOrthographic extends InteractionApi {
790
776
  return camera;
791
777
  });
792
778
  }
779
+ getWorldPoint(point, depthBuffer, fallbackPoint) {
780
+ const viewport = this.getViewport();
781
+ const framePt = viewport.transformPointToFrame(point, depthBuffer);
782
+ const hasDepth = depthBuffer.hitTest(framePt);
783
+ return hasDepth
784
+ ? viewport.transformPointToOrthographicWorldSpace(point, depthBuffer)
785
+ : fallbackPoint;
786
+ }
793
787
  async transformCamera(t) {
794
788
  var _a;
795
789
  if (this.isInteracting()) {
@@ -1389,7 +1383,8 @@ class MultiTouchInteractionHandler {
1389
1383
  (_b = this.interactionApi) === null || _b === void 0 ? void 0 : _b.zoomCamera(zoom);
1390
1384
  (_c = this.interactionApi) === null || _c === void 0 ? void 0 : _c.panCameraByDelta(delta);
1391
1385
  // Setting a minimum angle to prevent wobbling
1392
- if (Math.abs(angle) > 0.2) {
1386
+ console.log(Math.abs(angle));
1387
+ if (Math.abs(angle) > 0.4) {
1393
1388
  (_d = this.interactionApi) === null || _d === void 0 ? void 0 : _d.twistCamera(angle);
1394
1389
  }
1395
1390
  }
@@ -75,7 +75,7 @@ class Viewport {
75
75
  return bundle_esm.point.scale(pt, 1 / scaleX, 1 / scaleY);
76
76
  }
77
77
  /**
78
- * Transforms a point in viewport coordinates to a point in world space
78
+ * Transforms a point in viewport coordinates to a point in perspective world space
79
79
  * coordinates. This method expects a depth buffer in order to compute a value
80
80
  * for the Z axis.
81
81
  *
@@ -90,6 +90,21 @@ class Viewport {
90
90
  const ray = this.transformPointToRay(pt, depthBuffer, depthBuffer.camera);
91
91
  return depthBuffer.getWorldPoint(depthPt, ray, fallbackNormalizedDepth);
92
92
  }
93
+ /**
94
+ * Transforms a point in viewport coordinates to a point in orthographic world space
95
+ * coordinates. This method expects a depth buffer in order to compute a value
96
+ * for the Z axis.
97
+ *
98
+ * @param pt A point in viewport coordinates.
99
+ * @param depthBuffer A depth buffer for computing the Z axis.
100
+ * @param fallbackNormalizedDepth A fallback value if the depth is the max
101
+ * depth value, or cannot be determined.
102
+ */
103
+ transformPointToOrthographicWorldSpace(pt, depthBuffer, fallbackNormalizedDepth) {
104
+ const depthPt = this.transformPointToFrame(pt, depthBuffer);
105
+ const ray = this.transformPointToOrthographicRay(pt, depthBuffer, depthBuffer.camera);
106
+ return depthBuffer.getOrthographicWorldPoint(depthPt, ray, fallbackNormalizedDepth);
107
+ }
93
108
  /**
94
109
  * Transforms a point in viewport coordinates to a ray. The returned ray will
95
110
  * have an origin that is at the position of the camera with a direction that
@@ -107,6 +122,23 @@ class Viewport {
107
122
  const direction = bundle_esm.vector3.normalize(bundle_esm.vector3.subtract(world, origin));
108
123
  return bundle_esm.ray.create({ origin, direction });
109
124
  }
125
+ /**
126
+ * Transforms a point in viewport coordinates to a ray. The returned ray will
127
+ * have an origin that is at the world point of viewport coordinate with a direction that
128
+ * is pointing into world space away from the camera.
129
+ *
130
+ * @param pt A point in viewport coordinates.
131
+ * @param image An image of a frame.
132
+ * @param camera A camera used to determine orientation of the scene.
133
+ */
134
+ transformPointToOrthographicRay(pt, image, camera) {
135
+ const ndc = this.transformScreenPointToNdc(pt, image);
136
+ const world = bundle_esm.vector3.transformNdcToWorldSpace(bundle_esm.vector3.create(ndc.x, ndc.y, 0.5), camera.worldMatrix, camera.projectionMatrixInverse);
137
+ return bundle_esm.ray.create({
138
+ origin: world,
139
+ direction: bundle_esm.vector3.normalize(camera.viewVector),
140
+ });
141
+ }
110
142
  /**
111
143
  * Maps a screen point to normalized device coordinates (NDC). A screen point
112
144
  * at 0,0 represents the top-left of the viewport.
@@ -94,6 +94,9 @@ export class SceneTreeTableCell {
94
94
  this.visibilityToggle && (h("button", { class: "visibility-btn no-shrink", "data-test-id": 'visibility-btn-' + ((_g = this.node) === null || _g === void 0 ? void 0 : _g.name), onPointerDown: (event) => {
95
95
  event === null || event === void 0 ? void 0 : event.preventDefault();
96
96
  this.toggleVisibility(event);
97
+ }, onTouchStart: (event) => {
98
+ event === null || event === void 0 ? void 0 : event.preventDefault();
99
+ this.toggleVisibility(event);
97
100
  } },
98
101
  h("div", { class: classNames('icon', {
99
102
  'icon-visible': !((_h = this.node) === null || _h === void 0 ? void 0 : _h.partiallyVisible) && ((_j = this.node) === null || _j === void 0 ? void 0 : _j.visible),
@@ -368,4 +371,4 @@ export class SceneTreeTableCell {
368
371
  }]; }
369
372
  static get elementRef() { return "hostEl"; }
370
373
  }
371
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUtdHJlZS10YWJsZS1jZWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc2NlbmUtdHJlZS10YWJsZS1jZWxsL3NjZW5lLXRyZWUtdGFibGUtY2VsbC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxPQUFPLEVBQ1AsS0FBSyxFQUVMLENBQUMsRUFDRCxJQUFJLEVBQ0osSUFBSSxHQUNMLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sVUFBVSxNQUFNLFlBQVksQ0FBQztBQVlwQyxNQUFNLE9BQU8sa0JBQWtCO0VBTC9CO0lBMEJFOzs7T0FHRztJQUVJLGdCQUFXLEdBQUcsSUFBSSxDQUFDO0lBc0IxQjs7OztPQUlHO0lBRUkseUJBQW9CLEdBQUcsS0FBSyxDQUFDO0lBRXBDOzs7OztPQUtHO0lBRUksbUNBQThCLEdBQUcsS0FBSyxDQUFDO0lBdUh0QyxpQkFBWSxHQUFHLEdBQVcsRUFBRTtNQUNsQyxNQUFNLElBQUksR0FDUixJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7UUFDNUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXO1FBQ2xCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO01BRWpCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxDQUFDO0lBRU0sMEJBQXFCLEdBQUcsQ0FBQyxLQUFtQixFQUFRLEVBQUU7O01BQzVELElBQ0UsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCO1FBQ3ZCLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUNsQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFDMUI7UUFDQSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUksTUFBQSxJQUFJLENBQUMsSUFBSSwwQ0FBRSxRQUFRLENBQUEs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
374
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NlbmUtdHJlZS10YWJsZS1jZWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc2NlbmUtdHJlZS10YWJsZS1jZWxsL3NjZW5lLXRyZWUtdGFibGUtY2VsbC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxPQUFPLEVBQ1AsS0FBSyxFQUVMLENBQUMsRUFDRCxJQUFJLEVBQ0osSUFBSSxHQUNMLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sVUFBVSxNQUFNLFlBQVksQ0FBQztBQVlwQyxNQUFNLE9BQU8sa0JBQWtCO0VBTC9CO0lBMEJFOzs7T0FHRztJQUVJLGdCQUFXLEdBQUcsSUFBSSxDQUFDO0lBc0IxQjs7OztPQUlHO0lBRUkseUJBQW9CLEdBQUcsS0FBSyxDQUFDO0lBRXBDOzs7OztPQUtHO0lBRUksbUNBQThCLEdBQUcsS0FBSyxDQUFDO0lBMkh0QyxpQkFBWSxHQUFHLEdBQVcsRUFBRTtNQUNsQyxNQUFNLElBQUksR0FDUixJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7UUFDNUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXO1FBQ2xCLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO01BRWpCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQyxDQUFDO0lBRU0sMEJBQXFCLEdBQUcsQ0FBQyxLQUFtQixFQUFRLEVBQUU7O01BQzVELElBQ0UsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCO1FBQ3ZCLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUNsQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFDMUI7UUFDQSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUksTUFBQSxJQUFJLENBQUMsSUFBSSwwQ0FBRSxRQUFRLENBQUEs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