@vertexvis/viewer 0.13.1 → 0.13.2-canary.10

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 (177) hide show
  1. package/dist/cjs/{browser.esm-31b03292.js → browser.esm-075810bf.js} +1 -1
  2. package/dist/cjs/{bundle.esm-dc0a8361.js → bundle.esm-618a5fe9.js} +80 -28
  3. package/dist/cjs/{config-90ee43d5.js → config-fb124bac.js} +2 -2
  4. package/dist/cjs/{cursors-ad2fd395.js → cursors-d71f6a74.js} +1 -1
  5. package/dist/cjs/{dom-dd265f48.js → dom-57ef84e9.js} +1 -1
  6. package/dist/cjs/{entities-aa59890e.js → entities-90f1347a.js} +3 -3
  7. package/dist/cjs/index.cjs.js +14 -12
  8. package/dist/cjs/loader.cjs.js +1 -1
  9. package/dist/cjs/{mapper-f6e6cafe.js → mapper-80ee2957.js} +2 -2
  10. package/dist/cjs/{markup-fb1553b1.js → markup-7f7de5f2.js} +2 -2
  11. package/dist/cjs/{measurement-aba1e0e8.js → measurement-f1ae9248.js} +2 -2
  12. package/dist/cjs/{model-4ec0c36e.js → model-55abd9ab.js} +1 -1
  13. package/dist/cjs/{overlays-40c6cbc7.js → overlays-68e8eff2.js} +2 -2
  14. package/dist/cjs/{png-decoder-27d25eed.js → png-decoder-076131d8.js} +1 -1
  15. package/dist/cjs/{results-bc325974.js → results-e9496869.js} +1 -1
  16. package/dist/cjs/{scene-d420fd26.js → scene-92728420.js} +188 -90
  17. package/dist/cjs/{streamAttributes-d6236448.js → streamAttributes-81eb52f2.js} +1508 -43
  18. package/dist/cjs/{utils-545b1865.js → utils-463cd52e.js} +1 -1
  19. package/dist/cjs/{utils-f80be307.js → utils-6397efca.js} +1 -1
  20. package/dist/cjs/vertex-scene-tree-search_3.cjs.entry.js +1 -1
  21. package/dist/cjs/vertex-scene-tree-table-cell.cjs.entry.js +1 -1
  22. package/dist/cjs/vertex-scene-tree.cjs.entry.js +4 -4
  23. package/dist/cjs/vertex-viewer-dom-element_3.cjs.entry.js +8 -7
  24. package/dist/cjs/vertex-viewer-markup-arrow_3.cjs.entry.js +3 -3
  25. package/dist/cjs/vertex-viewer-markup-tool.cjs.entry.js +4 -4
  26. package/dist/cjs/vertex-viewer-markup.cjs.entry.js +4 -4
  27. package/dist/cjs/vertex-viewer-measurement-details.cjs.entry.js +3 -3
  28. package/dist/cjs/vertex-viewer-measurement-distance.cjs.entry.js +20 -15
  29. package/dist/cjs/vertex-viewer-measurement-line_2.cjs.entry.js +6 -6
  30. package/dist/cjs/vertex-viewer-measurement-precise.cjs.entry.js +10 -10
  31. package/dist/cjs/vertex-viewer-measurement-tool.cjs.entry.js +5 -5
  32. package/dist/cjs/vertex-viewer-measurements.cjs.entry.js +8 -8
  33. package/dist/cjs/vertex-viewer-view-cube.cjs.entry.js +3 -3
  34. package/dist/cjs/vertex-viewer.cjs.entry.js +287 -80
  35. package/dist/cjs/viewer.cjs.js +1 -1
  36. package/dist/cjs/{viewport-8c39089f.js → viewport-54b1389d.js} +34 -2
  37. package/dist/collection/components/scene-tree-table-cell/scene-tree-table-cell.css +1 -1
  38. package/dist/collection/components/viewer/viewer.js +68 -4
  39. package/dist/collection/components/viewer-dom-renderer/renderer2d.js +1 -1
  40. package/dist/collection/components/viewer-dom-renderer/renderer3d.js +4 -2
  41. package/dist/collection/components/viewer-dom-renderer/viewer-dom-renderer.js +5 -6
  42. package/dist/collection/components/viewer-measurement-distance/hitTest.js +9 -4
  43. package/dist/collection/components/viewer-measurement-distance/viewer-measurement-distance.js +5 -5
  44. package/dist/collection/components/viewer-measurement-overlays/viewer-measurement-overlays.js +3 -3
  45. package/dist/collection/index.js +2 -2
  46. package/dist/collection/lib/errors.js +8 -1
  47. package/dist/collection/lib/interactions/index.js +3 -1
  48. package/dist/collection/lib/interactions/interactionApi.js +4 -25
  49. package/dist/collection/lib/interactions/interactionApiOrthographic.js +136 -0
  50. package/dist/collection/lib/interactions/interactionApiPerspective.js +51 -0
  51. package/dist/collection/lib/interactions/multiTouchInteractionHandler.js +3 -2
  52. package/dist/collection/lib/mappers/frameStreaming.js +27 -5
  53. package/dist/collection/lib/rendering/matrices.js +13 -4
  54. package/dist/collection/lib/rendering/vectors.js +7 -0
  55. package/dist/collection/lib/scenes/__mocks__/mocks.js +2 -2
  56. package/dist/collection/lib/scenes/camera.js +163 -83
  57. package/dist/collection/lib/scenes/mapper.js +3 -2
  58. package/dist/collection/lib/scenes/scene.js +22 -9
  59. package/dist/collection/lib/types/clippingPlanes.js +48 -20
  60. package/dist/collection/lib/types/depthBuffer.js +32 -3
  61. package/dist/collection/lib/types/frame.js +133 -24
  62. package/dist/collection/lib/types/frameCamera.js +87 -6
  63. package/dist/collection/lib/types/viewport.js +34 -2
  64. package/dist/collection/testing/fixtures.js +28 -15
  65. package/dist/collection/testing/viewer.js +5 -3
  66. package/dist/custom-elements/index.js +2135 -283
  67. package/dist/esm/{browser.esm-59e914f6.js → browser.esm-e72d80ad.js} +1 -1
  68. package/dist/esm/{bundle.esm-d899b2d5.js → bundle.esm-8ceccb91.js} +80 -29
  69. package/dist/esm/{config-604c644e.js → config-fb7cd8ff.js} +2 -2
  70. package/dist/esm/{cursors-a7ec4adb.js → cursors-fc2deed7.js} +1 -1
  71. package/dist/esm/{dom-780d25be.js → dom-2cd18856.js} +1 -1
  72. package/dist/esm/{entities-759d97cd.js → entities-78557270.js} +3 -3
  73. package/dist/esm/index.js +12 -12
  74. package/dist/esm/index.mjs +12 -12
  75. package/dist/esm/loader.js +1 -1
  76. package/dist/esm/loader.mjs +1 -1
  77. package/dist/esm/{mapper-4b815e31.js → mapper-da36de17.js} +2 -2
  78. package/dist/esm/{markup-1d177b4a.js → markup-c313d99c.js} +2 -2
  79. package/dist/esm/{measurement-12cdbf5c.js → measurement-544b69d5.js} +2 -2
  80. package/dist/esm/{model-e5a4f00f.js → model-2a34b443.js} +1 -1
  81. package/dist/esm/{overlays-1919b192.js → overlays-354e275c.js} +2 -2
  82. package/dist/esm/{png-decoder-3f1fa486.js → png-decoder-07de80d1.js} +1 -1
  83. package/dist/esm/{results-994bdb50.js → results-4d0c3568.js} +1 -1
  84. package/dist/esm/{scene-2c2460d5.js → scene-2bfcce74.js} +188 -90
  85. package/dist/esm/{streamAttributes-d623bb60.js → streamAttributes-d0b384b3.js} +1502 -44
  86. package/dist/esm/{utils-83a19677.js → utils-3ea0acdd.js} +1 -1
  87. package/dist/esm/{utils-5e57bf24.js → utils-e0941c61.js} +1 -1
  88. package/dist/esm/vertex-scene-tree-search_3.entry.js +1 -1
  89. package/dist/esm/vertex-scene-tree-table-cell.entry.js +1 -1
  90. package/dist/esm/vertex-scene-tree.entry.js +4 -4
  91. package/dist/esm/vertex-viewer-dom-element_3.entry.js +8 -7
  92. package/dist/esm/vertex-viewer-markup-arrow_3.entry.js +3 -3
  93. package/dist/esm/vertex-viewer-markup-tool.entry.js +4 -4
  94. package/dist/esm/vertex-viewer-markup.entry.js +4 -4
  95. package/dist/esm/vertex-viewer-measurement-details.entry.js +3 -3
  96. package/dist/esm/vertex-viewer-measurement-distance.entry.js +20 -15
  97. package/dist/esm/vertex-viewer-measurement-line_2.entry.js +6 -6
  98. package/dist/esm/vertex-viewer-measurement-precise.entry.js +10 -10
  99. package/dist/esm/vertex-viewer-measurement-tool.entry.js +5 -5
  100. package/dist/esm/vertex-viewer-measurements.entry.js +8 -8
  101. package/dist/esm/vertex-viewer-view-cube.entry.js +3 -3
  102. package/dist/esm/vertex-viewer.entry.js +287 -80
  103. package/dist/esm/viewer.js +1 -1
  104. package/dist/esm/{viewport-01c886ea.js → viewport-5cc7b128.js} +34 -2
  105. package/dist/types/components/scene-tree-table-cell/scene-tree-table-cell.d.ts +1 -1
  106. package/dist/types/components/viewer/viewer.d.ts +8 -0
  107. package/dist/types/components/viewer-dom-renderer/renderer2d.d.ts +2 -2
  108. package/dist/types/components/viewer-dom-renderer/renderer3d.d.ts +3 -3
  109. package/dist/types/components/viewer-dom-renderer/viewer-dom-renderer.d.ts +2 -2
  110. package/dist/types/components/viewer-measurement-distance/hitTest.d.ts +3 -2
  111. package/dist/types/components/viewer-measurement-distance/utils.d.ts +2 -2
  112. package/dist/types/components/viewer-measurement-distance/viewer-measurement-distance.d.ts +2 -2
  113. package/dist/types/components/viewer-measurement-overlays/viewer-measurement-overlays-components.d.ts +2 -2
  114. package/dist/types/components/viewer-measurement-overlays/viewer-measurement-overlays.d.ts +2 -2
  115. package/dist/types/components.d.ts +15 -7
  116. package/dist/types/index.d.ts +1 -1
  117. package/dist/types/lib/errors.d.ts +3 -0
  118. package/dist/types/lib/interactions/index.d.ts +2 -0
  119. package/dist/types/lib/interactions/interactionApi.d.ts +34 -26
  120. package/dist/types/lib/interactions/interactionApiOrthographic.d.ts +35 -0
  121. package/dist/types/lib/interactions/interactionApiPerspective.d.ts +21 -0
  122. package/dist/types/lib/mappers/frameStreaming.d.ts +2 -0
  123. package/dist/types/lib/rendering/vectors.d.ts +2 -0
  124. package/dist/types/lib/scenes/__mocks__/mocks.d.ts +2 -2
  125. package/dist/types/lib/scenes/camera.d.ts +101 -38
  126. package/dist/types/lib/scenes/scene.d.ts +1 -1
  127. package/dist/types/lib/types/clippingPlanes.d.ts +3 -1
  128. package/dist/types/lib/types/depthBuffer.d.ts +28 -6
  129. package/dist/types/lib/types/frame.d.ts +80 -11
  130. package/dist/types/lib/types/frameCamera.d.ts +22 -3
  131. package/dist/types/lib/types/viewport.d.ts +24 -4
  132. package/dist/types/testing/fixtures.d.ts +8 -5
  133. package/dist/viewer/index.esm.js +1 -1
  134. package/dist/viewer/{p-f8d01b8a.entry.js → p-0a189e62.entry.js} +1 -1
  135. package/dist/viewer/{p-e07377fa.entry.js → p-1ca95f9a.entry.js} +1 -1
  136. package/dist/viewer/{p-d00e9203.js → p-3561d910.js} +1 -1
  137. package/dist/viewer/p-388a43f7.js +4 -0
  138. package/dist/viewer/{p-3810c24d.js → p-3f0f83ad.js} +1 -1
  139. package/dist/viewer/{p-8decee06.entry.js → p-41028d3b.entry.js} +1 -1
  140. package/dist/viewer/{p-439220c6.js → p-487e054a.js} +1 -1
  141. package/dist/viewer/p-49d36e94.entry.js +4 -0
  142. package/dist/viewer/{p-da2f4a56.js → p-5b342e97.js} +1 -1
  143. package/dist/viewer/p-661f0612.js +18 -0
  144. package/dist/viewer/{p-364ce21c.js → p-69058178.js} +1 -1
  145. package/dist/viewer/{p-353cfc7a.entry.js → p-73a5eacc.entry.js} +1 -1
  146. package/dist/viewer/p-77be081a.js +4 -0
  147. package/dist/viewer/{p-a0df0e0c.js → p-809d09d9.js} +1 -1
  148. package/dist/viewer/{p-d90f2f6d.entry.js → p-858bd2c7.entry.js} +1 -1
  149. package/dist/viewer/{p-25eaab00.entry.js → p-89b66838.entry.js} +1 -1
  150. package/dist/viewer/p-a93a63a9.js +4 -0
  151. package/dist/viewer/{p-df292b56.entry.js → p-b043b076.entry.js} +1 -1
  152. package/dist/viewer/{p-915d95ad.entry.js → p-b0ac6b3c.entry.js} +1 -1
  153. package/dist/viewer/{p-fec1a8d0.entry.js → p-b7624ff2.entry.js} +1 -1
  154. package/dist/viewer/{p-f7cb7e59.js → p-b8774c9c.js} +1 -1
  155. package/dist/viewer/{p-67446e35.js → p-bcb66f97.js} +1 -1
  156. package/dist/viewer/p-bcde5521.entry.js +4 -0
  157. package/dist/viewer/{p-7cad9bf4.js → p-d1584404.js} +1 -1
  158. package/dist/viewer/p-d32b54cb.js +4 -0
  159. package/dist/viewer/{p-f755af5a.entry.js → p-d3a20af4.entry.js} +1 -1
  160. package/dist/viewer/{p-c62cb926.entry.js → p-d9f99f4d.entry.js} +1 -1
  161. package/dist/viewer/p-e38458da.js +4 -0
  162. package/dist/viewer/{p-301660cf.js → p-e75bba97.js} +2 -2
  163. package/dist/viewer/{p-6e80f8b0.entry.js → p-ebd55df7.entry.js} +1 -1
  164. package/dist/viewer/{p-671c113c.entry.js → p-f0411993.entry.js} +1 -1
  165. package/dist/viewer/{p-2cefb1b0.js → p-fa9a0bed.js} +1 -1
  166. package/dist/viewer/p-ffdeb08c.js +4 -0
  167. package/dist/viewer/viewer.esm.js +1 -1
  168. package/package.json +8 -8
  169. package/dist/viewer/p-081e6873.js +0 -4
  170. package/dist/viewer/p-085e908a.js +0 -4
  171. package/dist/viewer/p-0aba71fd.js +0 -18
  172. package/dist/viewer/p-3f6ac74f.js +0 -4
  173. package/dist/viewer/p-423410be.js +0 -4
  174. package/dist/viewer/p-432267bc.entry.js +0 -4
  175. package/dist/viewer/p-4985fad5.js +0 -4
  176. package/dist/viewer/p-e2297df2.entry.js +0 -4
  177. package/dist/viewer/p-fe11d694.js +0 -4
@@ -6,15 +6,15 @@
6
6
  Object.defineProperty(exports, '__esModule', { value: true });
7
7
 
8
8
  const index = require('./index-e100709a.js');
9
- const bundle_esm = require('./bundle.esm-dc0a8361.js');
10
- const streamAttributes = require('./streamAttributes-d6236448.js');
11
- const browser_esm = require('./browser.esm-31b03292.js');
9
+ const bundle_esm = require('./bundle.esm-618a5fe9.js');
10
+ const streamAttributes = require('./streamAttributes-81eb52f2.js');
11
+ const browser_esm = require('./browser.esm-075810bf.js');
12
12
  const index$1 = require('./index-3bc6bac0.js');
13
- const config = require('./config-90ee43d5.js');
14
- const cursors = require('./cursors-ad2fd395.js');
15
- const dom = require('./dom-dd265f48.js');
16
- const scene = require('./scene-d420fd26.js');
17
- const viewport = require('./viewport-8c39089f.js');
13
+ const config = require('./config-fb124bac.js');
14
+ const cursors = require('./cursors-d71f6a74.js');
15
+ const dom = require('./dom-57ef84e9.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
  /**
@@ -273,52 +273,6 @@ class FlyToPartKeyInteraction {
273
273
  }
274
274
  }
275
275
 
276
- class FlyToPositionKeyInteraction {
277
- constructor(stream, configProvider, imageScaleProvider, sceneProvider) {
278
- this.stream = stream;
279
- this.configProvider = configProvider;
280
- this.imageScaleProvider = imageScaleProvider;
281
- this.sceneProvider = sceneProvider;
282
- }
283
- predicate(e) {
284
- return e.altKey && e.shiftKey;
285
- }
286
- async fn(e) {
287
- var _a, _b;
288
- const scale = this.imageScaleProvider();
289
- const hitResult = await this.stream.hitItems({
290
- point: bundle_esm.point.scale(e.position, (scale === null || scale === void 0 ? void 0 : scale.x) || 1, (scale === null || scale === void 0 ? void 0 : scale.y) || 1),
291
- }, true);
292
- if (((_a = hitResult.hitItems) === null || _a === void 0 ? void 0 : _a.hits) != null &&
293
- hitResult.hitItems.hits.length > 0 &&
294
- hitResult.hitItems.hits[0].hitPoint != null) {
295
- const camera = this.sceneProvider().camera();
296
- const hit = hitResult.hitItems.hits[0];
297
- if (hit.hitPoint != null &&
298
- hit.hitPoint.x != null &&
299
- hit.hitPoint.y != null &&
300
- hit.hitPoint.z != null) {
301
- await this.stream.flyTo({
302
- camera: camera
303
- .update({
304
- lookAt: bundle_esm.vector3.create(hit.hitPoint.x, hit.hitPoint.y, hit.hitPoint.z),
305
- })
306
- .toFrameCamera(),
307
- animation: {
308
- duration: streamAttributes.toProtoDuration(this.configProvider().animation.durationMs),
309
- },
310
- });
311
- }
312
- else {
313
- console.debug(`No hit position found for fly to position [position={x: ${e.position.x}, y: ${e.position.y}}, hit-id={${(_b = hit.itemId) === null || _b === void 0 ? void 0 : _b.hex}}]`);
314
- }
315
- }
316
- else {
317
- console.debug(`No hit results found for fly to position [position={x: ${e.position.x}, y: ${e.position.y}}]`);
318
- }
319
- }
320
- }
321
-
322
276
  /**
323
277
  * The `InteractionApi` provides methods that API developers can use to modify
324
278
  * the internal state of an interaction.
@@ -526,27 +480,6 @@ class InteractionApi {
526
480
  return camera;
527
481
  });
528
482
  }
529
- /**
530
- * Performs a pan operation of the scene's camera, and requests a new image
531
- * for the updated scene.
532
- *
533
- * @param delta A position delta `{x, y}` in the 2D coordinate space of the
534
- * viewer.
535
- */
536
- async panCameraByDelta(delta) {
537
- return this.transformCamera(({ camera, viewport }) => {
538
- const vv = camera.viewVector();
539
- const u = bundle_esm.vector3.normalize(camera.up);
540
- const v = bundle_esm.vector3.normalize(vv);
541
- const d = bundle_esm.vector3.magnitude(vv) * Math.tan(camera.fovY);
542
- const epsilonX = (delta.x * d) / viewport.width;
543
- const epsilonY = (delta.y / viewport.width) * d;
544
- const xvec = bundle_esm.vector3.cross(u, v);
545
- const yvec = bundle_esm.vector3.cross(v, xvec);
546
- const offset = bundle_esm.vector3.add(bundle_esm.vector3.scale(epsilonX, xvec), bundle_esm.vector3.scale(epsilonY, yvec));
547
- return camera.moveBy(offset);
548
- });
549
- }
550
483
  /**
551
484
  * Performs a view all operation for the scene's bounding box, and requests a
552
485
  * new image for the updated scene.
@@ -605,8 +538,8 @@ class InteractionApi {
605
538
  return updated.update({
606
539
  // Scale the lookAt point to the same length as the distance to the
607
540
  // center of the bounding box to maintain zoom and pan behavior.
608
- lookAt: bundle_esm.vector3.add(bundle_esm.vector3.scale(camera.distanceToBoundingBoxCenter() /
609
- bundle_esm.vector3.magnitude(updated.viewVector()), updated.viewVector()), updated.position),
541
+ lookAt: bundle_esm.vector3.add(bundle_esm.vector3.scale(Math.abs(camera.signedDistanceToBoundingBoxCenter()) /
542
+ bundle_esm.vector3.magnitude(updated.viewVector), updated.viewVector), updated.position),
610
543
  });
611
544
  });
612
545
  }
@@ -619,7 +552,7 @@ class InteractionApi {
619
552
  */
620
553
  async zoomCamera(delta) {
621
554
  return this.transformCamera(({ camera, viewport }) => {
622
- const vv = camera.viewVector();
555
+ const vv = camera.viewVector;
623
556
  const v = bundle_esm.vector3.normalize(vv);
624
557
  const distance = bundle_esm.vector3.magnitude(vv);
625
558
  const epsilon = (3 * distance * delta) / viewport.height;
@@ -740,6 +673,235 @@ class InteractionApi {
740
673
  }
741
674
  }
742
675
 
676
+ class InteractionApiOrthographic extends InteractionApi {
677
+ constructor(stream, cursors, getConfig, getScene, getFrame, getViewport, tapEmitter, doubleTapEmitter, longPressEmitter, interactionStartedEmitter, interactionFinishedEmitter) {
678
+ super(stream, cursors, getConfig, getScene, getFrame, getViewport, tapEmitter, doubleTapEmitter, longPressEmitter, interactionStartedEmitter, interactionFinishedEmitter);
679
+ }
680
+ /**
681
+ * Performs a pan operation of the scene's camera, and requests a new image
682
+ * for the updated scene.
683
+ *
684
+ * @param delta A position delta `{x, y}` in the 2D coordinate space of the
685
+ * viewer.
686
+ */
687
+ async panCameraByDelta(delta) {
688
+ return this.transformCamera(({ camera, viewport }) => {
689
+ const viewVector = camera.viewVector;
690
+ const normalizedUpVector = bundle_esm.vector3.normalize(camera.up);
691
+ const normalizedViewVector = bundle_esm.vector3.normalize(viewVector);
692
+ const d = bundle_esm.vector3.magnitude(viewVector) * Math.tan(camera.fovHeight);
693
+ const epsilonX = (delta.x * d) / viewport.width;
694
+ const epsilonY = (delta.y / viewport.width) * d;
695
+ const xvec = bundle_esm.vector3.cross(normalizedUpVector, normalizedViewVector);
696
+ const yvec = bundle_esm.vector3.cross(normalizedViewVector, xvec);
697
+ const offset = bundle_esm.vector3.add(bundle_esm.vector3.scale(epsilonX, xvec), bundle_esm.vector3.scale(epsilonY, yvec));
698
+ return camera.moveBy(offset);
699
+ });
700
+ }
701
+ /**
702
+ * Moves the camera's position and look at to the given screen coordinate.
703
+ *
704
+ * If the screen coordinate intersects with an object, the camera will track
705
+ * the hit point so the mouse position is always under the mouse.
706
+ *
707
+ * If the screen coordinate doesn't intersect with an object, then ???.
708
+ *
709
+ * @param screenPt A point in screen coordinates.
710
+ */
711
+ async panCameraToScreenPoint(screenPt) {
712
+ return this.transformCamera(({ camera, frame, viewport }) => {
713
+ // Capture the starting state of the pan.
714
+ if (this.panData == null) {
715
+ const startingCamera = camera.toFrameCamera();
716
+ const direction = startingCamera.direction;
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
+ console.warn('Cannot determine fallback for pan. Ray does not intersect plane.');
722
+ return camera;
723
+ }
724
+ this.panData = { hitPt, hitPlane, startingCamera };
725
+ }
726
+ if (this.panData != null) {
727
+ const { hitPt, hitPlane, startingCamera } = this.panData;
728
+ // Use a ray that originates at the screen and intersects with the hit
729
+ // plane to determine the move distance.
730
+ const ray = viewport.transformPointToOrthographicRay(screenPt, frame.image, startingCamera);
731
+ const movePt = bundle_esm.ray.intersectPlane(ray, hitPlane);
732
+ if (movePt != null) {
733
+ const delta = bundle_esm.vector3.subtract(hitPt, movePt);
734
+ return camera.update({
735
+ lookAt: bundle_esm.vector3.add(startingCamera.lookAt, delta),
736
+ });
737
+ }
738
+ }
739
+ return camera;
740
+ });
741
+ }
742
+ async zoomCameraToPoint(point, delta) {
743
+ return this.transformCamera(({ camera, viewport, frame, depthBuffer }) => {
744
+ if (this.orthographicZoomData == null ||
745
+ bundle_esm.point.distance(point, this.orthographicZoomData.startingScreenPt) > 2) {
746
+ const frameCam = camera.toFrameCamera();
747
+ const dir = frameCam.direction;
748
+ const ray = viewport.transformPointToOrthographicRay(point, frame.image, frameCam);
749
+ const fallbackPlane = bundle_esm.plane.fromNormalAndCoplanarPoint(dir, frameCam.lookAt);
750
+ const fallbackPt = bundle_esm.ray.intersectPlane(ray, fallbackPlane);
751
+ if (fallbackPt == null) {
752
+ console.warn('Cannot determine fallback point for zoom. Ray does not intersect plane.');
753
+ return camera;
754
+ }
755
+ const hitPt = depthBuffer != null
756
+ ? this.getWorldPoint(point, depthBuffer, fallbackPt)
757
+ : fallbackPt;
758
+ const hitPlane = bundle_esm.plane.fromNormalAndCoplanarPoint(dir, hitPt);
759
+ this.orthographicZoomData = {
760
+ hitPt,
761
+ hitPlane,
762
+ startingScreenPt: point,
763
+ };
764
+ }
765
+ if (this.orthographicZoomData != null) {
766
+ const { hitPt, hitPlane } = this.orthographicZoomData;
767
+ const relativeDelta = 2 * (camera.fovHeight / viewport.height) * delta;
768
+ const fovHeight = Math.max(1, camera.fovHeight - relativeDelta);
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));
771
+ return camera.update({
772
+ lookAt: bundle_esm.vector3.add(camera.lookAt, diff),
773
+ fovHeight: Math.max(1, camera.fovHeight - relativeDelta),
774
+ });
775
+ }
776
+ return camera;
777
+ });
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
+ }
787
+ async transformCamera(t) {
788
+ var _a;
789
+ if (this.isInteracting()) {
790
+ const scene = this.getScene();
791
+ const viewport = this.getViewport();
792
+ const frame = this.getFrame();
793
+ const depthBuffer = await (frame === null || frame === void 0 ? void 0 : frame.depthBuffer());
794
+ this.currentCamera =
795
+ this.currentCamera != null && viewport != null && frame != null
796
+ ? t({
797
+ camera: this.currentCamera,
798
+ viewport,
799
+ scale: scene.scale(),
800
+ boundingBox: scene.boundingBox(),
801
+ frame,
802
+ depthBuffer,
803
+ })
804
+ : undefined;
805
+ await ((_a = this.currentCamera) === null || _a === void 0 ? void 0 : _a.render());
806
+ }
807
+ }
808
+ }
809
+
810
+ class InteractionApiPerspective extends InteractionApi {
811
+ constructor(stream, cursors, getConfig, getScene, getFrame, getViewport, tapEmitter, doubleTapEmitter, longPressEmitter, interactionStartedEmitter, interactionFinishedEmitter) {
812
+ super(stream, cursors, getConfig, getScene, getFrame, getViewport, tapEmitter, doubleTapEmitter, longPressEmitter, interactionStartedEmitter, interactionFinishedEmitter);
813
+ }
814
+ /**
815
+ * Performs a pan operation of the scene's camera, and requests a new image
816
+ * for the updated scene.
817
+ *
818
+ * @param delta A position delta `{x, y}` in the 2D coordinate space of the
819
+ * viewer.
820
+ */
821
+ async panCameraByDelta(delta) {
822
+ return this.transformCamera(({ camera, viewport }) => {
823
+ var _a;
824
+ const vv = camera.viewVector;
825
+ const u = bundle_esm.vector3.normalize(camera.up);
826
+ const v = bundle_esm.vector3.normalize(vv);
827
+ const d = bundle_esm.vector3.magnitude(vv) * Math.tan((_a = camera.fovY) !== null && _a !== void 0 ? _a : 45);
828
+ const epsilonX = (delta.x * d) / viewport.width;
829
+ const epsilonY = (delta.y / viewport.width) * d;
830
+ const xvec = bundle_esm.vector3.cross(u, v);
831
+ const yvec = bundle_esm.vector3.cross(v, xvec);
832
+ const offset = bundle_esm.vector3.add(bundle_esm.vector3.scale(epsilonX, xvec), bundle_esm.vector3.scale(epsilonY, yvec));
833
+ return camera.moveBy(offset);
834
+ });
835
+ }
836
+ async transformCamera(t) {
837
+ var _a;
838
+ if (this.isInteracting()) {
839
+ const scene = this.getScene();
840
+ const viewport = this.getViewport();
841
+ const frame = this.getFrame();
842
+ const depthBuffer = await (frame === null || frame === void 0 ? void 0 : frame.depthBuffer());
843
+ this.currentCamera =
844
+ this.currentCamera != null && viewport != null && frame != null
845
+ ? t({
846
+ camera: this.currentCamera,
847
+ viewport,
848
+ scale: scene.scale(),
849
+ boundingBox: scene.boundingBox(),
850
+ frame,
851
+ depthBuffer,
852
+ })
853
+ : undefined;
854
+ await ((_a = this.currentCamera) === null || _a === void 0 ? void 0 : _a.render());
855
+ }
856
+ }
857
+ }
858
+
859
+ class FlyToPositionKeyInteraction {
860
+ constructor(stream, configProvider, imageScaleProvider, sceneProvider) {
861
+ this.stream = stream;
862
+ this.configProvider = configProvider;
863
+ this.imageScaleProvider = imageScaleProvider;
864
+ this.sceneProvider = sceneProvider;
865
+ }
866
+ predicate(e) {
867
+ return e.altKey && e.shiftKey;
868
+ }
869
+ async fn(e) {
870
+ var _a, _b;
871
+ const scale = this.imageScaleProvider();
872
+ const hitResult = await this.stream.hitItems({
873
+ point: bundle_esm.point.scale(e.position, (scale === null || scale === void 0 ? void 0 : scale.x) || 1, (scale === null || scale === void 0 ? void 0 : scale.y) || 1),
874
+ }, true);
875
+ if (((_a = hitResult.hitItems) === null || _a === void 0 ? void 0 : _a.hits) != null &&
876
+ hitResult.hitItems.hits.length > 0 &&
877
+ hitResult.hitItems.hits[0].hitPoint != null) {
878
+ const camera = this.sceneProvider().camera();
879
+ const hit = hitResult.hitItems.hits[0];
880
+ if (hit.hitPoint != null &&
881
+ hit.hitPoint.x != null &&
882
+ hit.hitPoint.y != null &&
883
+ hit.hitPoint.z != null) {
884
+ await this.stream.flyTo({
885
+ camera: camera
886
+ .update({
887
+ lookAt: bundle_esm.vector3.create(hit.hitPoint.x, hit.hitPoint.y, hit.hitPoint.z),
888
+ })
889
+ .toFrameCamera(),
890
+ animation: {
891
+ duration: streamAttributes.toProtoDuration(this.configProvider().animation.durationMs),
892
+ },
893
+ });
894
+ }
895
+ else {
896
+ console.debug(`No hit position found for fly to position [position={x: ${e.position.x}, y: ${e.position.y}}, hit-id={${(_b = hit.itemId) === null || _b === void 0 ? void 0 : _b.hex}}]`);
897
+ }
898
+ }
899
+ else {
900
+ console.debug(`No hit results found for fly to position [position={x: ${e.position.x}, y: ${e.position.y}}]`);
901
+ }
902
+ }
903
+ }
904
+
743
905
  const SCROLL_WHEEL_DELTA_PERCENTAGES = [0.2, 0.15, 0.25, 0.25, 0.15];
744
906
  const DEFAULT_FONT_SIZE = 16;
745
907
  const DEFAULT_LINE_HEIGHT = 1.2;
@@ -1221,7 +1383,8 @@ class MultiTouchInteractionHandler {
1221
1383
  (_b = this.interactionApi) === null || _b === void 0 ? void 0 : _b.zoomCamera(zoom);
1222
1384
  (_c = this.interactionApi) === null || _c === void 0 ? void 0 : _c.panCameraByDelta(delta);
1223
1385
  // Setting a minimum angle to prevent wobbling
1224
- if (Math.abs(angle) > 0.2) {
1386
+ console.log(Math.abs(angle));
1387
+ if (Math.abs(angle) > 0.5) {
1225
1388
  (_d = this.interactionApi) === null || _d === void 0 ? void 0 : _d.twistCamera(angle);
1226
1389
  }
1227
1390
  }
@@ -2272,6 +2435,11 @@ let Viewer = class {
2272
2435
  * the viewer. Enabled by default.
2273
2436
  */
2274
2437
  this.cameraControls = true;
2438
+ /**
2439
+ * The type of camera model to represent the scene with. Can be either
2440
+ * `perspective` or `orthographic`, and defaults to `perspective`.
2441
+ */
2442
+ this.cameraType = 'perspective';
2275
2443
  /**
2276
2444
  * Enables or disables the default keyboard shortcut interactions provided by
2277
2445
  * the viewer. Enabled by default, requires `cameraControls` being enabled.
@@ -2561,6 +2729,11 @@ let Viewer = class {
2561
2729
  (_b = this.baseInteractionHandler) === null || _b === void 0 ? void 0 : _b.setPrimaryInteractionType('rotate');
2562
2730
  }
2563
2731
  }
2732
+ handleCameraTypeChanged(updatedCameraType, previousCameraType) {
2733
+ if (updatedCameraType !== previousCameraType) {
2734
+ this.updateCameraType();
2735
+ }
2736
+ }
2564
2737
  /**
2565
2738
  * @ignore
2566
2739
  */
@@ -2807,7 +2980,9 @@ let Viewer = class {
2807
2980
  this.frame !== frame) {
2808
2981
  const canvas = this.canvasElement.getContext('2d');
2809
2982
  if (canvas != null) {
2983
+ const previousFrame = this.frame;
2810
2984
  this.frame = frame;
2985
+ this.updateInteractionApi(previousFrame);
2811
2986
  const data = {
2812
2987
  canvas,
2813
2988
  canvasDimensions,
@@ -2843,7 +3018,9 @@ let Viewer = class {
2843
3018
  if (this.stream == null) {
2844
3019
  throw new scene.ComponentInitializationError('Cannot create interaction API. Component has not been initialized.');
2845
3020
  }
2846
- return new InteractionApi(this.stream, this.stateMap.cursorManager, () => this.getResolvedConfig().interactions, () => this.createScene(), () => this.frame, () => this.viewport, this.tap, this.doubletap, this.longpress, this.interactionStarted, this.interactionFinished);
3021
+ return this.frame == null || this.frame.scene.camera.isPerspective()
3022
+ ? new InteractionApiPerspective(this.stream, this.stateMap.cursorManager, () => this.getResolvedConfig().interactions, () => this.createScene(), () => this.frame, () => this.viewport, this.tap, this.doubletap, this.longpress, this.interactionStarted, this.interactionFinished)
3023
+ : new InteractionApiOrthographic(this.stream, this.stateMap.cursorManager, () => this.getResolvedConfig().interactions, () => this.createScene(), () => this.frame, () => this.viewport, this.tap, this.doubletap, this.longpress, this.interactionStarted, this.interactionFinished);
2847
3024
  }
2848
3025
  handleCursorChanged() {
2849
3026
  window.requestAnimationFrame(() => {
@@ -2903,6 +3080,35 @@ let Viewer = class {
2903
3080
  var _a;
2904
3081
  (_a = this.stream) === null || _a === void 0 ? void 0 : _a.update({ streamAttributes: this.getStreamAttributes() });
2905
3082
  }
3083
+ updateInteractionApi(previousFrame) {
3084
+ if (previousFrame != null && this.frame != null) {
3085
+ const hasChangedFromPerspective = previousFrame.scene.camera.isPerspective() &&
3086
+ this.frame.scene.camera.isOrthographic();
3087
+ const hasChangedFromOrthographic = previousFrame.scene.camera.isOrthographic() &&
3088
+ this.frame.scene.camera.isPerspective();
3089
+ if (hasChangedFromPerspective || hasChangedFromOrthographic) {
3090
+ this.interactionApi = this.createInteractionApi();
3091
+ this.interactionHandlers.forEach((handler) => this.initializeInteractionHandler(handler));
3092
+ }
3093
+ }
3094
+ }
3095
+ updateCameraType() {
3096
+ var _a, _b;
3097
+ if (this.frame != null) {
3098
+ if (this.cameraType === 'orthographic' &&
3099
+ this.frame.scene.camera.isPerspective()) {
3100
+ (_a = this.stream) === null || _a === void 0 ? void 0 : _a.replaceCamera({
3101
+ camera: streamAttributes.toProtobuf(streamAttributes.toOrthographic(this.frame.scene.camera, this.frame.scene.boundingBox)),
3102
+ });
3103
+ }
3104
+ else if (this.cameraType === 'perspective' &&
3105
+ this.frame.scene.camera.isOrthographic()) {
3106
+ (_b = this.stream) === null || _b === void 0 ? void 0 : _b.replaceCamera({
3107
+ camera: streamAttributes.toProtobuf(streamAttributes.toPerspective(this.frame.scene.camera)),
3108
+ });
3109
+ }
3110
+ }
3111
+ }
2906
3112
  getDepthBufferStreamAttributesValue() {
2907
3113
  var _a;
2908
3114
  const depthBuffer = (_a = this.depthBuffers) !== null && _a !== void 0 ? _a : (this.rotateAroundTapPoint ? 'final' : undefined);
@@ -2943,6 +3149,7 @@ let Viewer = class {
2943
3149
  static get watchers() { return {
2944
3150
  "src": ["handleSrcChanged"],
2945
3151
  "rotateAroundTapPoint": ["handleRotateAboutTapPointChanged"],
3152
+ "cameraType": ["handleCameraTypeChanged"],
2946
3153
  "depthBuffers": ["handleDepthBuffersChanged"],
2947
3154
  "experimentalGhostingOpacity": ["handleExperimentalGhostingOpacityChanged"],
2948
3155
  "featureLines": ["handleFeatureLinesChanged"],
@@ -74,5 +74,5 @@ const patchDynamicImport = (base, orgScriptElm) => {
74
74
 
75
75
  patchBrowser().then(options => {
76
76
  appGlobals.globalScripts();
77
- return index.bootstrapLazy([["vertex-viewer-default-toolbar.cjs",[[1,"vertex-viewer-default-toolbar",{"viewer":[16],"placement":[1],"direction":[1],"animationsDisabled":[4,"animations-disabled"],"animationMs":[2,"animation-ms"]}]]],["vertex-scene-tree.cjs",[[1,"vertex-scene-tree",{"overScanCount":[2,"over-scan-count"],"viewerSelector":[1,"viewer-selector"],"viewer":[1040],"rowData":[16],"config":[16],"configEnv":[1,"config-env"],"controller":[1040],"filterOnMetadata":[1028,"filter-on-metadata"],"metadataKeys":[16],"rows":[32],"totalRows":[32],"stateMap":[32],"connectionErrorDetails":[32],"attemptingRetry":[32],"invalidateRows":[64],"scrollToIndex":[64],"scrollToItem":[64],"expandAll":[64],"collapseAll":[64],"expandItem":[64],"collapseItem":[64],"toggleExpandItem":[64],"toggleItemVisibility":[64],"hideItem":[64],"showItem":[64],"selectItem":[64],"deselectItem":[64],"getRowAtIndex":[64],"getRowForEvent":[64],"getRowAtClientY":[64],"filterItems":[64],"fetchMetadataKeys":[64]},[[0,"search","handleSearch"]]]]],["vertex-viewer-measurement-tool.cjs",[[1,"vertex-viewer-measurement-tool",{"distanceTemplateId":[1,"distance-template-id"],"tool":[1],"units":[1],"fractionalDigits":[2,"fractional-digits"],"disabled":[4],"viewer":[16],"isMeasuring":[1540,"is-measuring"],"snapDistance":[2,"snap-distance"],"stateMap":[32]}]]],["vertex-viewer-markup.cjs",[[1,"vertex-viewer-markup",{"arrowTemplateId":[1,"arrow-template-id"],"circleTemplateId":[1,"circle-template-id"],"freeformTemplateId":[1,"freeform-template-id"],"tool":[1],"disabled":[4],"viewer":[16],"selectedMarkupId":[1025,"selected-markup-id"],"selectNew":[4,"select-new"],"toSelectMarkupId":[32],"pointerDownPosition":[32],"addMarkup":[64],"removeMarkup":[64],"getMarkupElements":[64],"getMarkupElement":[64]},[[0,"markupEnd","handleMarkupEnd"],[1,"pointerdown","handleMarkupPointerDown"]]]]],["vertex-viewer-markup-tool.cjs",[[1,"vertex-viewer-markup-tool",{"arrowTemplateId":[1,"arrow-template-id"],"circleTemplateId":[1,"circle-template-id"],"freeformTemplateId":[1,"freeform-template-id"],"tool":[1],"disabled":[4],"viewer":[16],"stateMap":[32],"reset":[64]}]]],["vertex-viewer-measurements.cjs",[[1,"vertex-viewer-measurements",{"distanceTemplateId":[1,"distance-template-id"],"tool":[1],"units":[1],"fractionalDigits":[2,"fractional-digits"],"disabled":[4],"viewer":[16],"selectedMeasurementId":[1025,"selected-measurement-id"],"snapDistance":[2,"snap-distance"],"showAxisReferenceLines":[4,"show-axis-reference-lines"],"measurementModel":[16],"addMeasurement":[64],"removeMeasurement":[64],"getMeasurementElement":[64],"getMeasurementElements":[64]},[[0,"measureEnd","handleMeasureEnd"],[1,"pointerdown","handleMeasurementPointerDown"]]]]],["vertex-viewer-view-cube.cjs",[[1,"vertex-viewer-view-cube",{"xPositiveLabel":[1,"x-positive-label"],"xNegativeLabel":[1,"x-negative-label"],"yPositiveLabel":[1,"y-positive-label"],"yNegativeLabel":[1,"y-negative-label"],"zPositiveLabel":[1,"z-positive-label"],"zNegativeLabel":[1,"z-negative-label"],"standardViewsOff":[4,"standard-views-off"],"animationDuration":[2,"animation-duration"],"triadOff":[4,"triad-off"],"worldOrientation":[1040],"camera":[1040],"viewer":[16],"boxLength":[32],"triadPosition":[32]}]]],["vertex-viewer-measurement-precise.cjs",[[1,"vertex-viewer-measurement-precise",{"measurementModel":[16],"measurementOverlays":[16],"measurementController":[1040],"measurableEntityTypes":[16],"viewer":[16],"configEnv":[1,"config-env"],"config":[16],"overlays":[32]}]]],["vertex-scene-tree-table-cell.cjs",[[1,"vertex-scene-tree-table-cell",{"node":[16],"tree":[16],"value":[1],"placeholder":[1],"hoveredNodeId":[1,"hovered-node-id"],"expandToggle":[4,"expand-toggle"],"visibilityToggle":[4,"visibility-toggle"],"interactionsDisabled":[4,"interactions-disabled"],"recurseParentSelectionDisabled":[4,"recurse-parent-selection-disabled"]}]]],["vertex-scene-tree-table-column.cjs",[[1,"vertex-scene-tree-table-column",{"initialWidth":[2,"initial-width"],"minWidth":[2,"min-width"],"maxWidth":[2,"max-width"]}]]],["vertex-scene-tree-table-header.cjs",[[1,"vertex-scene-tree-table-header"]]],["vertex-scene-tree-table-resize-divider.cjs",[[1,"vertex-scene-tree-table-resize-divider",{"dragging":[32]}]]],["vertex-scene-tree-toolbar-group.cjs",[[1,"vertex-scene-tree-toolbar-group"]]],["vertex-viewer.cjs",[[1,"vertex-viewer",{"src":[1],"clientId":[1,"client-id"],"deviceId":[1,"device-id"],"config":[1],"configEnv":[1,"config-env"],"resolvedConfig":[1040],"cameraControls":[4,"camera-controls"],"keyboardControls":[4,"keyboard-controls"],"rotateAroundTapPoint":[4,"rotate-around-tap-point"],"token":[1025],"depthBuffers":[1,"depth-buffers"],"experimentalGhostingOpacity":[2,"experimental-ghosting-opacity"],"featureLines":[16],"featureHighlighting":[16],"featureMaps":[1,"feature-maps"],"selectionMaterial":[1,"selection-material"],"resizeDebounce":[2,"resize-debounce"],"frame":[1040],"stream":[1040],"stencilBuffer":[1040],"viewport":[1040],"dimensions":[32],"hostDimensions":[32],"errorMessage":[32],"cursor":[32],"stateMap":[32],"dispatchFrameDrawn":[64],"registerInteractionHandler":[64],"registerTapKeyInteraction":[64],"getInteractionTarget":[64],"addCursor":[64],"getInteractionHandlers":[64],"getBaseInteractionHandler":[64],"getJwt":[64],"load":[64],"unload":[64],"scene":[64],"isSceneReady":[64]},[[0,"tap","handleTapEvent"]]]]],["vertex-viewer-measurement-details.cjs",[[1,"vertex-viewer-measurement-details",{"measurementModel":[16],"measurementOverlays":[16],"measurementOutcome":[1040],"distanceUnits":[1,"distance-units"],"angleUnits":[1,"angle-units"],"fractionalDigits":[2,"fractional-digits"],"distanceFormatter":[16],"angleFormatter":[16],"areaFormatter":[16],"resultTypes":[16],"overlay":[32],"distanceMeasurementUnits":[32],"angleMeasurementUnits":[32],"areaMeasurementUnits":[32]}]]],["vertex-viewer-measurement-distance.cjs",[[1,"vertex-viewer-measurement-distance",{"start":[1040],"startJson":[1,"start-json"],"end":[1040],"endJson":[1,"end-json"],"distance":[1026],"showAxisReferenceLines":[4,"show-axis-reference-lines"],"snapDistance":[2,"snap-distance"],"units":[1],"fractionalDigits":[2,"fractional-digits"],"labelFormatter":[16],"anchorLabelOffset":[2,"anchor-label-offset"],"lineCapLength":[2,"line-cap-length"],"mode":[513],"interactingAnchor":[1537,"interacting-anchor"],"invalid":[1540],"camera":[16],"hitProvider":[16],"indicatorPt":[1040],"viewer":[16],"measurementModel":[16],"viewport":[32],"elementBounds":[32],"interactionCount":[32],"internalCamera":[32],"invalidateStateCounter":[32],"stateMap":[32],"measurementUnits":[32],"computeElementMetrics":[64]}]]],["vertex-scene-tree-search_3.cjs",[[1,"vertex-scene-tree-search",{"debounce":[2],"disabled":[4],"placeholder":[1],"value":[1025],"focused":[32],"setFocus":[64]}],[1,"vertex-scene-tree-table-layout",{"tree":[16],"controller":[16],"rows":[16],"totalRows":[2,"total-rows"],"rowHeight":[1026,"row-height"],"overScanCount":[2,"over-scan-count"],"rowData":[16],"layoutOffset":[1026,"layout-offset"],"scrollOffset":[1026,"scroll-offset"],"layoutHeight":[1026,"layout-height"],"layoutWidth":[1026,"layout-width"],"viewportStartIndex":[1026,"viewport-start-index"],"viewportEndIndex":[1026,"viewport-end-index"],"columnGridLayout":[32],"columnGridFixedLayout":[32],"hoveredNodeId":[32],"isComputingCellHeight":[32],"lastDividerPointerPosition":[32],"resizingColumnIndex":[32],"stateMap":[32],"scrollToPosition":[64]}],[1,"vertex-scene-tree-toolbar"]]],["vertex-viewer-button_3.cjs",[[1,"vertex-viewer-toolbar",{"placement":[1],"direction":[1]}],[1,"vertex-viewer-button"],[1,"vertex-viewer-toolbar-group",{"direction":[1]}]]],["vertex-viewer-dom-element_3.cjs",[[1,"vertex-viewer-dom-element",{"position":[1040],"positionJson":[1,"position"],"rotation":[1040],"rotationJson":[1,"rotation"],"quaternion":[1040],"quaternionJson":[1,"quaternion"],"scale":[1040],"scaleJson":[1,"scale"],"matrix":[1040],"occlusionOff":[4,"occlusion-off"],"occluded":[516],"billboardOff":[4,"billboard-off"],"interactionsOff":[516,"interactions-off"]}],[1,"vertex-viewer-dom-group",{"position":[1040],"positionJson":[1,"position"],"rotation":[1040],"rotationJson":[1,"rotation"],"quaternion":[1040],"quaternionJson":[1,"quaternion"],"scale":[1040],"scaleJson":[1,"scale"],"matrix":[1040]}],[1,"vertex-viewer-dom-renderer",{"drawMode":[1,"draw-mode"],"viewer":[16],"camera":[1040],"depthBuffer":[1040],"viewport":[32],"invalidateFrameCounter":[32]},[[0,"propertyChange","handlePropertyChange"]]]]],["vertex-viewer-icon.cjs",[[1,"vertex-viewer-icon",{"name":[1],"size":[1]}]]],["vertex-viewer-layer.cjs",[[1,"vertex-viewer-layer",{"stretchOff":[516,"stretch-off"]}]]],["vertex-viewer-markup-arrow_3.cjs",[[1,"vertex-viewer-markup-arrow",{"start":[1040],"startJson":[1,"start"],"end":[1040],"endJson":[1,"end"],"mode":[513],"viewer":[16],"elementBounds":[32],"editAnchor":[32],"dispose":[64]}],[1,"vertex-viewer-markup-circle",{"bounds":[1040],"boundsJson":[1,"bounds"],"mode":[513],"viewer":[16],"elementBounds":[32],"startPosition":[32],"editAnchor":[32],"resizeBounds":[32],"dispose":[64]}],[1,"vertex-viewer-markup-freeform",{"points":[1040],"pointsJson":[1,"points"],"bounds":[1040],"boundsJson":[1,"bounds"],"mode":[513],"viewer":[16],"elementBounds":[32],"resizeStartPosition":[32],"editAnchor":[32],"resizeBounds":[32],"resizePoints":[32],"screenPoints":[32],"dispose":[64]}]]],["vertex-viewer-measurement-line_2.cjs",[[1,"vertex-viewer-measurement-overlays",{"measurementOverlays":[16],"camera":[1040],"viewer":[16],"overlays":[32]}],[1,"vertex-viewer-measurement-line",{"start":[16],"end":[16],"capLength":[2,"cap-length"],"pointerEvents":[1,"pointer-events"]}]]]], options);
77
+ return index.bootstrapLazy([["vertex-viewer-default-toolbar.cjs",[[1,"vertex-viewer-default-toolbar",{"viewer":[16],"placement":[1],"direction":[1],"animationsDisabled":[4,"animations-disabled"],"animationMs":[2,"animation-ms"]}]]],["vertex-scene-tree.cjs",[[1,"vertex-scene-tree",{"overScanCount":[2,"over-scan-count"],"viewerSelector":[1,"viewer-selector"],"viewer":[1040],"rowData":[16],"config":[16],"configEnv":[1,"config-env"],"controller":[1040],"filterOnMetadata":[1028,"filter-on-metadata"],"metadataKeys":[16],"rows":[32],"totalRows":[32],"stateMap":[32],"connectionErrorDetails":[32],"attemptingRetry":[32],"invalidateRows":[64],"scrollToIndex":[64],"scrollToItem":[64],"expandAll":[64],"collapseAll":[64],"expandItem":[64],"collapseItem":[64],"toggleExpandItem":[64],"toggleItemVisibility":[64],"hideItem":[64],"showItem":[64],"selectItem":[64],"deselectItem":[64],"getRowAtIndex":[64],"getRowForEvent":[64],"getRowAtClientY":[64],"filterItems":[64],"fetchMetadataKeys":[64]},[[0,"search","handleSearch"]]]]],["vertex-viewer-measurement-tool.cjs",[[1,"vertex-viewer-measurement-tool",{"distanceTemplateId":[1,"distance-template-id"],"tool":[1],"units":[1],"fractionalDigits":[2,"fractional-digits"],"disabled":[4],"viewer":[16],"isMeasuring":[1540,"is-measuring"],"snapDistance":[2,"snap-distance"],"stateMap":[32]}]]],["vertex-viewer-markup.cjs",[[1,"vertex-viewer-markup",{"arrowTemplateId":[1,"arrow-template-id"],"circleTemplateId":[1,"circle-template-id"],"freeformTemplateId":[1,"freeform-template-id"],"tool":[1],"disabled":[4],"viewer":[16],"selectedMarkupId":[1025,"selected-markup-id"],"selectNew":[4,"select-new"],"toSelectMarkupId":[32],"pointerDownPosition":[32],"addMarkup":[64],"removeMarkup":[64],"getMarkupElements":[64],"getMarkupElement":[64]},[[0,"markupEnd","handleMarkupEnd"],[1,"pointerdown","handleMarkupPointerDown"]]]]],["vertex-viewer-markup-tool.cjs",[[1,"vertex-viewer-markup-tool",{"arrowTemplateId":[1,"arrow-template-id"],"circleTemplateId":[1,"circle-template-id"],"freeformTemplateId":[1,"freeform-template-id"],"tool":[1],"disabled":[4],"viewer":[16],"stateMap":[32],"reset":[64]}]]],["vertex-viewer-measurements.cjs",[[1,"vertex-viewer-measurements",{"distanceTemplateId":[1,"distance-template-id"],"tool":[1],"units":[1],"fractionalDigits":[2,"fractional-digits"],"disabled":[4],"viewer":[16],"selectedMeasurementId":[1025,"selected-measurement-id"],"snapDistance":[2,"snap-distance"],"showAxisReferenceLines":[4,"show-axis-reference-lines"],"measurementModel":[16],"addMeasurement":[64],"removeMeasurement":[64],"getMeasurementElement":[64],"getMeasurementElements":[64]},[[0,"measureEnd","handleMeasureEnd"],[1,"pointerdown","handleMeasurementPointerDown"]]]]],["vertex-viewer-view-cube.cjs",[[1,"vertex-viewer-view-cube",{"xPositiveLabel":[1,"x-positive-label"],"xNegativeLabel":[1,"x-negative-label"],"yPositiveLabel":[1,"y-positive-label"],"yNegativeLabel":[1,"y-negative-label"],"zPositiveLabel":[1,"z-positive-label"],"zNegativeLabel":[1,"z-negative-label"],"standardViewsOff":[4,"standard-views-off"],"animationDuration":[2,"animation-duration"],"triadOff":[4,"triad-off"],"worldOrientation":[1040],"camera":[1040],"viewer":[16],"boxLength":[32],"triadPosition":[32]}]]],["vertex-viewer-measurement-precise.cjs",[[1,"vertex-viewer-measurement-precise",{"measurementModel":[16],"measurementOverlays":[16],"measurementController":[1040],"measurableEntityTypes":[16],"viewer":[16],"configEnv":[1,"config-env"],"config":[16],"overlays":[32]}]]],["vertex-scene-tree-table-cell.cjs",[[1,"vertex-scene-tree-table-cell",{"node":[16],"tree":[16],"value":[1],"placeholder":[1],"hoveredNodeId":[1,"hovered-node-id"],"expandToggle":[4,"expand-toggle"],"visibilityToggle":[4,"visibility-toggle"],"interactionsDisabled":[4,"interactions-disabled"],"recurseParentSelectionDisabled":[4,"recurse-parent-selection-disabled"]}]]],["vertex-scene-tree-table-column.cjs",[[1,"vertex-scene-tree-table-column",{"initialWidth":[2,"initial-width"],"minWidth":[2,"min-width"],"maxWidth":[2,"max-width"]}]]],["vertex-scene-tree-table-header.cjs",[[1,"vertex-scene-tree-table-header"]]],["vertex-scene-tree-table-resize-divider.cjs",[[1,"vertex-scene-tree-table-resize-divider",{"dragging":[32]}]]],["vertex-scene-tree-toolbar-group.cjs",[[1,"vertex-scene-tree-toolbar-group"]]],["vertex-viewer.cjs",[[1,"vertex-viewer",{"src":[1],"clientId":[1,"client-id"],"deviceId":[1,"device-id"],"config":[1],"configEnv":[1,"config-env"],"resolvedConfig":[1040],"cameraControls":[4,"camera-controls"],"cameraType":[1,"camera-type"],"keyboardControls":[4,"keyboard-controls"],"rotateAroundTapPoint":[4,"rotate-around-tap-point"],"token":[1025],"depthBuffers":[1,"depth-buffers"],"experimentalGhostingOpacity":[2,"experimental-ghosting-opacity"],"featureLines":[16],"featureHighlighting":[16],"featureMaps":[1,"feature-maps"],"selectionMaterial":[1,"selection-material"],"resizeDebounce":[2,"resize-debounce"],"frame":[1040],"stream":[1040],"stencilBuffer":[1040],"viewport":[1040],"dimensions":[32],"hostDimensions":[32],"errorMessage":[32],"cursor":[32],"stateMap":[32],"dispatchFrameDrawn":[64],"registerInteractionHandler":[64],"registerTapKeyInteraction":[64],"getInteractionTarget":[64],"addCursor":[64],"getInteractionHandlers":[64],"getBaseInteractionHandler":[64],"getJwt":[64],"load":[64],"unload":[64],"scene":[64],"isSceneReady":[64]},[[0,"tap","handleTapEvent"]]]]],["vertex-viewer-measurement-details.cjs",[[1,"vertex-viewer-measurement-details",{"measurementModel":[16],"measurementOverlays":[16],"measurementOutcome":[1040],"distanceUnits":[1,"distance-units"],"angleUnits":[1,"angle-units"],"fractionalDigits":[2,"fractional-digits"],"distanceFormatter":[16],"angleFormatter":[16],"areaFormatter":[16],"resultTypes":[16],"overlay":[32],"distanceMeasurementUnits":[32],"angleMeasurementUnits":[32],"areaMeasurementUnits":[32]}]]],["vertex-viewer-measurement-distance.cjs",[[1,"vertex-viewer-measurement-distance",{"start":[1040],"startJson":[1,"start-json"],"end":[1040],"endJson":[1,"end-json"],"distance":[1026],"showAxisReferenceLines":[4,"show-axis-reference-lines"],"snapDistance":[2,"snap-distance"],"units":[1],"fractionalDigits":[2,"fractional-digits"],"labelFormatter":[16],"anchorLabelOffset":[2,"anchor-label-offset"],"lineCapLength":[2,"line-cap-length"],"mode":[513],"interactingAnchor":[1537,"interacting-anchor"],"invalid":[1540],"camera":[16],"hitProvider":[16],"indicatorPt":[1040],"viewer":[16],"measurementModel":[16],"viewport":[32],"elementBounds":[32],"interactionCount":[32],"internalCamera":[32],"invalidateStateCounter":[32],"stateMap":[32],"measurementUnits":[32],"computeElementMetrics":[64]}]]],["vertex-scene-tree-search_3.cjs",[[1,"vertex-scene-tree-search",{"debounce":[2],"disabled":[4],"placeholder":[1],"value":[1025],"focused":[32],"setFocus":[64]}],[1,"vertex-scene-tree-table-layout",{"tree":[16],"controller":[16],"rows":[16],"totalRows":[2,"total-rows"],"rowHeight":[1026,"row-height"],"overScanCount":[2,"over-scan-count"],"rowData":[16],"layoutOffset":[1026,"layout-offset"],"scrollOffset":[1026,"scroll-offset"],"layoutHeight":[1026,"layout-height"],"layoutWidth":[1026,"layout-width"],"viewportStartIndex":[1026,"viewport-start-index"],"viewportEndIndex":[1026,"viewport-end-index"],"columnGridLayout":[32],"columnGridFixedLayout":[32],"hoveredNodeId":[32],"isComputingCellHeight":[32],"lastDividerPointerPosition":[32],"resizingColumnIndex":[32],"stateMap":[32],"scrollToPosition":[64]}],[1,"vertex-scene-tree-toolbar"]]],["vertex-viewer-button_3.cjs",[[1,"vertex-viewer-toolbar",{"placement":[1],"direction":[1]}],[1,"vertex-viewer-button"],[1,"vertex-viewer-toolbar-group",{"direction":[1]}]]],["vertex-viewer-dom-element_3.cjs",[[1,"vertex-viewer-dom-element",{"position":[1040],"positionJson":[1,"position"],"rotation":[1040],"rotationJson":[1,"rotation"],"quaternion":[1040],"quaternionJson":[1,"quaternion"],"scale":[1040],"scaleJson":[1,"scale"],"matrix":[1040],"occlusionOff":[4,"occlusion-off"],"occluded":[516],"billboardOff":[4,"billboard-off"],"interactionsOff":[516,"interactions-off"]}],[1,"vertex-viewer-dom-group",{"position":[1040],"positionJson":[1,"position"],"rotation":[1040],"rotationJson":[1,"rotation"],"quaternion":[1040],"quaternionJson":[1,"quaternion"],"scale":[1040],"scaleJson":[1,"scale"],"matrix":[1040]}],[1,"vertex-viewer-dom-renderer",{"drawMode":[1,"draw-mode"],"viewer":[16],"camera":[1040],"depthBuffer":[1040],"viewport":[32],"invalidateFrameCounter":[32]},[[0,"propertyChange","handlePropertyChange"]]]]],["vertex-viewer-icon.cjs",[[1,"vertex-viewer-icon",{"name":[1],"size":[1]}]]],["vertex-viewer-layer.cjs",[[1,"vertex-viewer-layer",{"stretchOff":[516,"stretch-off"]}]]],["vertex-viewer-markup-arrow_3.cjs",[[1,"vertex-viewer-markup-arrow",{"start":[1040],"startJson":[1,"start"],"end":[1040],"endJson":[1,"end"],"mode":[513],"viewer":[16],"elementBounds":[32],"editAnchor":[32],"dispose":[64]}],[1,"vertex-viewer-markup-circle",{"bounds":[1040],"boundsJson":[1,"bounds"],"mode":[513],"viewer":[16],"elementBounds":[32],"startPosition":[32],"editAnchor":[32],"resizeBounds":[32],"dispose":[64]}],[1,"vertex-viewer-markup-freeform",{"points":[1040],"pointsJson":[1,"points"],"bounds":[1040],"boundsJson":[1,"bounds"],"mode":[513],"viewer":[16],"elementBounds":[32],"resizeStartPosition":[32],"editAnchor":[32],"resizeBounds":[32],"resizePoints":[32],"screenPoints":[32],"dispose":[64]}]]],["vertex-viewer-measurement-line_2.cjs",[[1,"vertex-viewer-measurement-overlays",{"measurementOverlays":[16],"camera":[1040],"viewer":[16],"overlays":[32]}],[1,"vertex-viewer-measurement-line",{"start":[16],"end":[16],"capLength":[2,"cap-length"],"pointerEvents":[1,"pointer-events"]}]]]], options);
78
78
  });
@@ -3,7 +3,7 @@
3
3
  */
4
4
  'use strict';
5
5
 
6
- const bundle_esm = require('./bundle.esm-dc0a8361.js');
6
+ const bundle_esm = require('./bundle.esm-618a5fe9.js');
7
7
 
8
8
  /**
9
9
  * A `Viewport` represents the drawing area in the viewer.
@@ -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.
@@ -89,11 +89,11 @@ button {
89
89
  display: flex;
90
90
  align-items: center;
91
91
  justify-content: center;
92
- visibility: hidden;
93
92
  width: 24px;
94
93
  height: 24px;
95
94
  }
96
95
 
96
+ :host(:not([is-hovered]):not([is-partial]):not([is-hidden])) .visibility-btn,
97
97
  :host([is-hidden]) .visibility-btn,
98
98
  :host([is-partial]) .visibility-btn,
99
99
  :host([is-hovered]) .visibility-btn {