@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
@@ -2,15 +2,15 @@
2
2
  * Copyright (c) 2022 Vertex Software LLC. All rights reserved.
3
3
  */
4
4
  import { r as registerInstance, c as createEvent, h, H as Host, g as getElement } from './index-10c1495a.js';
5
- import { p as point, v as vector3, i as angle, h as plane, r as ray, b as boundingBox, o as matrix2, d as dimensions } from './bundle.esm-d899b2d5.js';
6
- import { h as fromPbStencilBufferOrThrow, i as decodePng, j as DepthBuffer, t as toProtoDuration, E as EntityType, p as protoToDate, k as toPbStreamAttributes, l as toPbRGBi, S as StreamApi, m as StreamRequestError, n as fromPbFrameOrThrow, o as fromPbStartStreamResponseOrThrow, q as fromPbReconnectResponseOrThrow, r as fromPbSyncTimeResponseOrThrow, s as currentDateAsProtoTimestamp, u as fromPbRefreshTokenResponseOrThrow, W as WebSocketClientImpl } from './streamAttributes-d623bb60.js';
7
- import { E as EventDispatcher, m as mapper, c as color, o as objects, u as uri, a as async, b as uuid } from './browser.esm-59e914f6.js';
5
+ import { p as point, v as vector3, h as angle, j as plane, r as ray, b as boundingBox, q as matrix2, d as dimensions } from './bundle.esm-8ceccb91.js';
6
+ import { l as fromPbStencilBufferOrThrow, m as decodePng, n as DepthBuffer, t as toProtoDuration, E as EntityType, p as protoToDate, o as toPbStreamAttributes, q as toPbRGBi, S as StreamApi, r as StreamRequestError, s as fromPbFrameOrThrow, u as fromPbStartStreamResponseOrThrow, x as fromPbReconnectResponseOrThrow, y as fromPbSyncTimeResponseOrThrow, z as currentDateAsProtoTimestamp, B as fromPbRefreshTokenResponseOrThrow, W as WebSocketClientImpl, g as toProtobuf, C as toOrthographic, G as toPerspective } from './streamAttributes-d0b384b3.js';
7
+ import { E as EventDispatcher, m as mapper, c as color, o as objects, u as uri, a as async, b as uuid } from './browser.esm-e72d80ad.js';
8
8
  import { c as classnames } from './index-455380d0.js';
9
- import { p as parseConfig } from './config-604c644e.js';
10
- import { C as CursorManager } from './cursors-a7ec4adb.js';
11
- import { g as getMouseClientPosition, c as cssCursor } from './dom-780d25be.js';
12
- import { I as ImageLoadError, f as fromUrn, C as CustomError, W as WebsocketConnectionError, a as SynchronizedClock, b as SceneRenderError, d as defaultSelectionMaterial, V as ViewerInitializationError, e as InteractionHandlerError, g as ComponentInitializationError, h as IllegalStateError, i as fromHex, S as Scene } from './scene-2c2460d5.js';
13
- import { V as Viewport } from './viewport-01c886ea.js';
9
+ import { p as parseConfig } from './config-fb7cd8ff.js';
10
+ import { C as CursorManager } from './cursors-fc2deed7.js';
11
+ import { g as getMouseClientPosition, c as cssCursor } from './dom-2cd18856.js';
12
+ import { I as ImageLoadError, f as fromUrn, C as CustomError, W as WebsocketConnectionError, a as SynchronizedClock, b as SceneRenderError, d as defaultSelectionMaterial, V as ViewerInitializationError, e as InteractionHandlerError, g as ComponentInitializationError, h as IllegalStateError, i as fromHex, S as Scene } from './scene-2bfcce74.js';
13
+ import { V as Viewport } from './viewport-5cc7b128.js';
14
14
  import './_commonjsHelpers-9943807e.js';
15
15
 
16
16
  /**
@@ -269,52 +269,6 @@ class FlyToPartKeyInteraction {
269
269
  }
270
270
  }
271
271
 
272
- class FlyToPositionKeyInteraction {
273
- constructor(stream, configProvider, imageScaleProvider, sceneProvider) {
274
- this.stream = stream;
275
- this.configProvider = configProvider;
276
- this.imageScaleProvider = imageScaleProvider;
277
- this.sceneProvider = sceneProvider;
278
- }
279
- predicate(e) {
280
- return e.altKey && e.shiftKey;
281
- }
282
- async fn(e) {
283
- var _a, _b;
284
- const scale = this.imageScaleProvider();
285
- const hitResult = await this.stream.hitItems({
286
- point: point.scale(e.position, (scale === null || scale === void 0 ? void 0 : scale.x) || 1, (scale === null || scale === void 0 ? void 0 : scale.y) || 1),
287
- }, true);
288
- if (((_a = hitResult.hitItems) === null || _a === void 0 ? void 0 : _a.hits) != null &&
289
- hitResult.hitItems.hits.length > 0 &&
290
- hitResult.hitItems.hits[0].hitPoint != null) {
291
- const camera = this.sceneProvider().camera();
292
- const hit = hitResult.hitItems.hits[0];
293
- if (hit.hitPoint != null &&
294
- hit.hitPoint.x != null &&
295
- hit.hitPoint.y != null &&
296
- hit.hitPoint.z != null) {
297
- await this.stream.flyTo({
298
- camera: camera
299
- .update({
300
- lookAt: vector3.create(hit.hitPoint.x, hit.hitPoint.y, hit.hitPoint.z),
301
- })
302
- .toFrameCamera(),
303
- animation: {
304
- duration: toProtoDuration(this.configProvider().animation.durationMs),
305
- },
306
- });
307
- }
308
- else {
309
- 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}}]`);
310
- }
311
- }
312
- else {
313
- console.debug(`No hit results found for fly to position [position={x: ${e.position.x}, y: ${e.position.y}}]`);
314
- }
315
- }
316
- }
317
-
318
272
  /**
319
273
  * The `InteractionApi` provides methods that API developers can use to modify
320
274
  * the internal state of an interaction.
@@ -522,27 +476,6 @@ class InteractionApi {
522
476
  return camera;
523
477
  });
524
478
  }
525
- /**
526
- * Performs a pan operation of the scene's camera, and requests a new image
527
- * for the updated scene.
528
- *
529
- * @param delta A position delta `{x, y}` in the 2D coordinate space of the
530
- * viewer.
531
- */
532
- async panCameraByDelta(delta) {
533
- return this.transformCamera(({ camera, viewport }) => {
534
- const vv = camera.viewVector();
535
- const u = vector3.normalize(camera.up);
536
- const v = vector3.normalize(vv);
537
- const d = vector3.magnitude(vv) * Math.tan(camera.fovY);
538
- const epsilonX = (delta.x * d) / viewport.width;
539
- const epsilonY = (delta.y / viewport.width) * d;
540
- const xvec = vector3.cross(u, v);
541
- const yvec = vector3.cross(v, xvec);
542
- const offset = vector3.add(vector3.scale(epsilonX, xvec), vector3.scale(epsilonY, yvec));
543
- return camera.moveBy(offset);
544
- });
545
- }
546
479
  /**
547
480
  * Performs a view all operation for the scene's bounding box, and requests a
548
481
  * new image for the updated scene.
@@ -601,8 +534,8 @@ class InteractionApi {
601
534
  return updated.update({
602
535
  // Scale the lookAt point to the same length as the distance to the
603
536
  // center of the bounding box to maintain zoom and pan behavior.
604
- lookAt: vector3.add(vector3.scale(camera.distanceToBoundingBoxCenter() /
605
- vector3.magnitude(updated.viewVector()), updated.viewVector()), updated.position),
537
+ lookAt: vector3.add(vector3.scale(Math.abs(camera.signedDistanceToBoundingBoxCenter()) /
538
+ vector3.magnitude(updated.viewVector), updated.viewVector), updated.position),
606
539
  });
607
540
  });
608
541
  }
@@ -615,7 +548,7 @@ class InteractionApi {
615
548
  */
616
549
  async zoomCamera(delta) {
617
550
  return this.transformCamera(({ camera, viewport }) => {
618
- const vv = camera.viewVector();
551
+ const vv = camera.viewVector;
619
552
  const v = vector3.normalize(vv);
620
553
  const distance = vector3.magnitude(vv);
621
554
  const epsilon = (3 * distance * delta) / viewport.height;
@@ -736,6 +669,235 @@ class InteractionApi {
736
669
  }
737
670
  }
738
671
 
672
+ class InteractionApiOrthographic extends InteractionApi {
673
+ constructor(stream, cursors, getConfig, getScene, getFrame, getViewport, tapEmitter, doubleTapEmitter, longPressEmitter, interactionStartedEmitter, interactionFinishedEmitter) {
674
+ super(stream, cursors, getConfig, getScene, getFrame, getViewport, tapEmitter, doubleTapEmitter, longPressEmitter, interactionStartedEmitter, interactionFinishedEmitter);
675
+ }
676
+ /**
677
+ * Performs a pan operation of the scene's camera, and requests a new image
678
+ * for the updated scene.
679
+ *
680
+ * @param delta A position delta `{x, y}` in the 2D coordinate space of the
681
+ * viewer.
682
+ */
683
+ async panCameraByDelta(delta) {
684
+ return this.transformCamera(({ camera, viewport }) => {
685
+ const viewVector = camera.viewVector;
686
+ const normalizedUpVector = vector3.normalize(camera.up);
687
+ const normalizedViewVector = vector3.normalize(viewVector);
688
+ const d = vector3.magnitude(viewVector) * Math.tan(camera.fovHeight);
689
+ const epsilonX = (delta.x * d) / viewport.width;
690
+ const epsilonY = (delta.y / viewport.width) * d;
691
+ const xvec = vector3.cross(normalizedUpVector, normalizedViewVector);
692
+ const yvec = vector3.cross(normalizedViewVector, xvec);
693
+ const offset = vector3.add(vector3.scale(epsilonX, xvec), vector3.scale(epsilonY, yvec));
694
+ return camera.moveBy(offset);
695
+ });
696
+ }
697
+ /**
698
+ * Moves the camera's position and look at to the given screen coordinate.
699
+ *
700
+ * If the screen coordinate intersects with an object, the camera will track
701
+ * the hit point so the mouse position is always under the mouse.
702
+ *
703
+ * If the screen coordinate doesn't intersect with an object, then ???.
704
+ *
705
+ * @param screenPt A point in screen coordinates.
706
+ */
707
+ async panCameraToScreenPoint(screenPt) {
708
+ return this.transformCamera(({ camera, frame, viewport }) => {
709
+ // Capture the starting state of the pan.
710
+ if (this.panData == null) {
711
+ const startingCamera = camera.toFrameCamera();
712
+ const direction = startingCamera.direction;
713
+ const ray$1 = viewport.transformPointToOrthographicRay(screenPt, frame.image, startingCamera);
714
+ const hitPlane = plane.fromNormalAndCoplanarPoint(direction, camera.lookAt);
715
+ const hitPt = ray.intersectPlane(ray$1, hitPlane);
716
+ if (hitPt == null) {
717
+ console.warn('Cannot determine fallback for pan. Ray does not intersect plane.');
718
+ return camera;
719
+ }
720
+ this.panData = { hitPt, hitPlane, startingCamera };
721
+ }
722
+ if (this.panData != null) {
723
+ const { hitPt, hitPlane, startingCamera } = this.panData;
724
+ // Use a ray that originates at the screen and intersects with the hit
725
+ // plane to determine the move distance.
726
+ const ray$1 = viewport.transformPointToOrthographicRay(screenPt, frame.image, startingCamera);
727
+ const movePt = ray.intersectPlane(ray$1, hitPlane);
728
+ if (movePt != null) {
729
+ const delta = vector3.subtract(hitPt, movePt);
730
+ return camera.update({
731
+ lookAt: vector3.add(startingCamera.lookAt, delta),
732
+ });
733
+ }
734
+ }
735
+ return camera;
736
+ });
737
+ }
738
+ async zoomCameraToPoint(point$1, delta) {
739
+ return this.transformCamera(({ camera, viewport, frame, depthBuffer }) => {
740
+ if (this.orthographicZoomData == null ||
741
+ point.distance(point$1, this.orthographicZoomData.startingScreenPt) > 2) {
742
+ const frameCam = camera.toFrameCamera();
743
+ const dir = frameCam.direction;
744
+ const ray$1 = viewport.transformPointToOrthographicRay(point$1, frame.image, frameCam);
745
+ const fallbackPlane = plane.fromNormalAndCoplanarPoint(dir, frameCam.lookAt);
746
+ const fallbackPt = ray.intersectPlane(ray$1, fallbackPlane);
747
+ if (fallbackPt == null) {
748
+ console.warn('Cannot determine fallback point for zoom. Ray does not intersect plane.');
749
+ return camera;
750
+ }
751
+ const hitPt = depthBuffer != null
752
+ ? this.getWorldPoint(point$1, depthBuffer, fallbackPt)
753
+ : fallbackPt;
754
+ const hitPlane = plane.fromNormalAndCoplanarPoint(dir, hitPt);
755
+ this.orthographicZoomData = {
756
+ hitPt,
757
+ hitPlane,
758
+ startingScreenPt: point$1,
759
+ };
760
+ }
761
+ if (this.orthographicZoomData != null) {
762
+ const { hitPt, hitPlane } = this.orthographicZoomData;
763
+ const relativeDelta = 2 * (camera.fovHeight / viewport.height) * delta;
764
+ const fovHeight = Math.max(1, camera.fovHeight - relativeDelta);
765
+ const projectedLookAt = plane.projectPoint(hitPlane, camera.lookAt);
766
+ const diff = vector3.scale((camera.fovHeight - fovHeight) / camera.fovHeight, vector3.subtract(hitPt, projectedLookAt));
767
+ return camera.update({
768
+ lookAt: vector3.add(camera.lookAt, diff),
769
+ fovHeight: Math.max(1, camera.fovHeight - relativeDelta),
770
+ });
771
+ }
772
+ return camera;
773
+ });
774
+ }
775
+ getWorldPoint(point, depthBuffer, fallbackPoint) {
776
+ const viewport = this.getViewport();
777
+ const framePt = viewport.transformPointToFrame(point, depthBuffer);
778
+ const hasDepth = depthBuffer.hitTest(framePt);
779
+ return hasDepth
780
+ ? viewport.transformPointToOrthographicWorldSpace(point, depthBuffer)
781
+ : fallbackPoint;
782
+ }
783
+ async transformCamera(t) {
784
+ var _a;
785
+ if (this.isInteracting()) {
786
+ const scene = this.getScene();
787
+ const viewport = this.getViewport();
788
+ const frame = this.getFrame();
789
+ const depthBuffer = await (frame === null || frame === void 0 ? void 0 : frame.depthBuffer());
790
+ this.currentCamera =
791
+ this.currentCamera != null && viewport != null && frame != null
792
+ ? t({
793
+ camera: this.currentCamera,
794
+ viewport,
795
+ scale: scene.scale(),
796
+ boundingBox: scene.boundingBox(),
797
+ frame,
798
+ depthBuffer,
799
+ })
800
+ : undefined;
801
+ await ((_a = this.currentCamera) === null || _a === void 0 ? void 0 : _a.render());
802
+ }
803
+ }
804
+ }
805
+
806
+ class InteractionApiPerspective extends InteractionApi {
807
+ constructor(stream, cursors, getConfig, getScene, getFrame, getViewport, tapEmitter, doubleTapEmitter, longPressEmitter, interactionStartedEmitter, interactionFinishedEmitter) {
808
+ super(stream, cursors, getConfig, getScene, getFrame, getViewport, tapEmitter, doubleTapEmitter, longPressEmitter, interactionStartedEmitter, interactionFinishedEmitter);
809
+ }
810
+ /**
811
+ * Performs a pan operation of the scene's camera, and requests a new image
812
+ * for the updated scene.
813
+ *
814
+ * @param delta A position delta `{x, y}` in the 2D coordinate space of the
815
+ * viewer.
816
+ */
817
+ async panCameraByDelta(delta) {
818
+ return this.transformCamera(({ camera, viewport }) => {
819
+ var _a;
820
+ const vv = camera.viewVector;
821
+ const u = vector3.normalize(camera.up);
822
+ const v = vector3.normalize(vv);
823
+ const d = vector3.magnitude(vv) * Math.tan((_a = camera.fovY) !== null && _a !== void 0 ? _a : 45);
824
+ const epsilonX = (delta.x * d) / viewport.width;
825
+ const epsilonY = (delta.y / viewport.width) * d;
826
+ const xvec = vector3.cross(u, v);
827
+ const yvec = vector3.cross(v, xvec);
828
+ const offset = vector3.add(vector3.scale(epsilonX, xvec), vector3.scale(epsilonY, yvec));
829
+ return camera.moveBy(offset);
830
+ });
831
+ }
832
+ async transformCamera(t) {
833
+ var _a;
834
+ if (this.isInteracting()) {
835
+ const scene = this.getScene();
836
+ const viewport = this.getViewport();
837
+ const frame = this.getFrame();
838
+ const depthBuffer = await (frame === null || frame === void 0 ? void 0 : frame.depthBuffer());
839
+ this.currentCamera =
840
+ this.currentCamera != null && viewport != null && frame != null
841
+ ? t({
842
+ camera: this.currentCamera,
843
+ viewport,
844
+ scale: scene.scale(),
845
+ boundingBox: scene.boundingBox(),
846
+ frame,
847
+ depthBuffer,
848
+ })
849
+ : undefined;
850
+ await ((_a = this.currentCamera) === null || _a === void 0 ? void 0 : _a.render());
851
+ }
852
+ }
853
+ }
854
+
855
+ class FlyToPositionKeyInteraction {
856
+ constructor(stream, configProvider, imageScaleProvider, sceneProvider) {
857
+ this.stream = stream;
858
+ this.configProvider = configProvider;
859
+ this.imageScaleProvider = imageScaleProvider;
860
+ this.sceneProvider = sceneProvider;
861
+ }
862
+ predicate(e) {
863
+ return e.altKey && e.shiftKey;
864
+ }
865
+ async fn(e) {
866
+ var _a, _b;
867
+ const scale = this.imageScaleProvider();
868
+ const hitResult = await this.stream.hitItems({
869
+ point: point.scale(e.position, (scale === null || scale === void 0 ? void 0 : scale.x) || 1, (scale === null || scale === void 0 ? void 0 : scale.y) || 1),
870
+ }, true);
871
+ if (((_a = hitResult.hitItems) === null || _a === void 0 ? void 0 : _a.hits) != null &&
872
+ hitResult.hitItems.hits.length > 0 &&
873
+ hitResult.hitItems.hits[0].hitPoint != null) {
874
+ const camera = this.sceneProvider().camera();
875
+ const hit = hitResult.hitItems.hits[0];
876
+ if (hit.hitPoint != null &&
877
+ hit.hitPoint.x != null &&
878
+ hit.hitPoint.y != null &&
879
+ hit.hitPoint.z != null) {
880
+ await this.stream.flyTo({
881
+ camera: camera
882
+ .update({
883
+ lookAt: vector3.create(hit.hitPoint.x, hit.hitPoint.y, hit.hitPoint.z),
884
+ })
885
+ .toFrameCamera(),
886
+ animation: {
887
+ duration: toProtoDuration(this.configProvider().animation.durationMs),
888
+ },
889
+ });
890
+ }
891
+ else {
892
+ 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}}]`);
893
+ }
894
+ }
895
+ else {
896
+ console.debug(`No hit results found for fly to position [position={x: ${e.position.x}, y: ${e.position.y}}]`);
897
+ }
898
+ }
899
+ }
900
+
739
901
  const SCROLL_WHEEL_DELTA_PERCENTAGES = [0.2, 0.15, 0.25, 0.25, 0.15];
740
902
  const DEFAULT_FONT_SIZE = 16;
741
903
  const DEFAULT_LINE_HEIGHT = 1.2;
@@ -1217,7 +1379,8 @@ class MultiTouchInteractionHandler {
1217
1379
  (_b = this.interactionApi) === null || _b === void 0 ? void 0 : _b.zoomCamera(zoom);
1218
1380
  (_c = this.interactionApi) === null || _c === void 0 ? void 0 : _c.panCameraByDelta(delta);
1219
1381
  // Setting a minimum angle to prevent wobbling
1220
- if (Math.abs(angle$1) > 0.2) {
1382
+ console.log(Math.abs(angle$1));
1383
+ if (Math.abs(angle$1) > 0.5) {
1221
1384
  (_d = this.interactionApi) === null || _d === void 0 ? void 0 : _d.twistCamera(angle$1);
1222
1385
  }
1223
1386
  }
@@ -2268,6 +2431,11 @@ let Viewer = class {
2268
2431
  * the viewer. Enabled by default.
2269
2432
  */
2270
2433
  this.cameraControls = true;
2434
+ /**
2435
+ * The type of camera model to represent the scene with. Can be either
2436
+ * `perspective` or `orthographic`, and defaults to `perspective`.
2437
+ */
2438
+ this.cameraType = 'perspective';
2271
2439
  /**
2272
2440
  * Enables or disables the default keyboard shortcut interactions provided by
2273
2441
  * the viewer. Enabled by default, requires `cameraControls` being enabled.
@@ -2557,6 +2725,11 @@ let Viewer = class {
2557
2725
  (_b = this.baseInteractionHandler) === null || _b === void 0 ? void 0 : _b.setPrimaryInteractionType('rotate');
2558
2726
  }
2559
2727
  }
2728
+ handleCameraTypeChanged(updatedCameraType, previousCameraType) {
2729
+ if (updatedCameraType !== previousCameraType) {
2730
+ this.updateCameraType();
2731
+ }
2732
+ }
2560
2733
  /**
2561
2734
  * @ignore
2562
2735
  */
@@ -2803,7 +2976,9 @@ let Viewer = class {
2803
2976
  this.frame !== frame) {
2804
2977
  const canvas = this.canvasElement.getContext('2d');
2805
2978
  if (canvas != null) {
2979
+ const previousFrame = this.frame;
2806
2980
  this.frame = frame;
2981
+ this.updateInteractionApi(previousFrame);
2807
2982
  const data = {
2808
2983
  canvas,
2809
2984
  canvasDimensions,
@@ -2839,7 +3014,9 @@ let Viewer = class {
2839
3014
  if (this.stream == null) {
2840
3015
  throw new ComponentInitializationError('Cannot create interaction API. Component has not been initialized.');
2841
3016
  }
2842
- 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);
3017
+ return this.frame == null || this.frame.scene.camera.isPerspective()
3018
+ ? 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)
3019
+ : 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);
2843
3020
  }
2844
3021
  handleCursorChanged() {
2845
3022
  window.requestAnimationFrame(() => {
@@ -2899,6 +3076,35 @@ let Viewer = class {
2899
3076
  var _a;
2900
3077
  (_a = this.stream) === null || _a === void 0 ? void 0 : _a.update({ streamAttributes: this.getStreamAttributes() });
2901
3078
  }
3079
+ updateInteractionApi(previousFrame) {
3080
+ if (previousFrame != null && this.frame != null) {
3081
+ const hasChangedFromPerspective = previousFrame.scene.camera.isPerspective() &&
3082
+ this.frame.scene.camera.isOrthographic();
3083
+ const hasChangedFromOrthographic = previousFrame.scene.camera.isOrthographic() &&
3084
+ this.frame.scene.camera.isPerspective();
3085
+ if (hasChangedFromPerspective || hasChangedFromOrthographic) {
3086
+ this.interactionApi = this.createInteractionApi();
3087
+ this.interactionHandlers.forEach((handler) => this.initializeInteractionHandler(handler));
3088
+ }
3089
+ }
3090
+ }
3091
+ updateCameraType() {
3092
+ var _a, _b;
3093
+ if (this.frame != null) {
3094
+ if (this.cameraType === 'orthographic' &&
3095
+ this.frame.scene.camera.isPerspective()) {
3096
+ (_a = this.stream) === null || _a === void 0 ? void 0 : _a.replaceCamera({
3097
+ camera: toProtobuf(toOrthographic(this.frame.scene.camera, this.frame.scene.boundingBox)),
3098
+ });
3099
+ }
3100
+ else if (this.cameraType === 'perspective' &&
3101
+ this.frame.scene.camera.isOrthographic()) {
3102
+ (_b = this.stream) === null || _b === void 0 ? void 0 : _b.replaceCamera({
3103
+ camera: toProtobuf(toPerspective(this.frame.scene.camera)),
3104
+ });
3105
+ }
3106
+ }
3107
+ }
2902
3108
  getDepthBufferStreamAttributesValue() {
2903
3109
  var _a;
2904
3110
  const depthBuffer = (_a = this.depthBuffers) !== null && _a !== void 0 ? _a : (this.rotateAroundTapPoint ? 'final' : undefined);
@@ -2939,6 +3145,7 @@ let Viewer = class {
2939
3145
  static get watchers() { return {
2940
3146
  "src": ["handleSrcChanged"],
2941
3147
  "rotateAroundTapPoint": ["handleRotateAboutTapPointChanged"],
3148
+ "cameraType": ["handleCameraTypeChanged"],
2942
3149
  "depthBuffers": ["handleDepthBuffersChanged"],
2943
3150
  "experimentalGhostingOpacity": ["handleExperimentalGhostingOpacityChanged"],
2944
3151
  "featureLines": ["handleFeatureLinesChanged"],
@@ -72,5 +72,5 @@ const patchDynamicImport = (base, orgScriptElm) => {
72
72
 
73
73
  patchBrowser().then(options => {
74
74
  globalScripts();
75
- return bootstrapLazy([["vertex-viewer-default-toolbar",[[1,"vertex-viewer-default-toolbar",{"viewer":[16],"placement":[1],"direction":[1],"animationsDisabled":[4,"animations-disabled"],"animationMs":[2,"animation-ms"]}]]],["vertex-scene-tree",[[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",[[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",[[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",[[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",[[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",[[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",[[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",[[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",[[1,"vertex-scene-tree-table-column",{"initialWidth":[2,"initial-width"],"minWidth":[2,"min-width"],"maxWidth":[2,"max-width"]}]]],["vertex-scene-tree-table-header",[[1,"vertex-scene-tree-table-header"]]],["vertex-scene-tree-table-resize-divider",[[1,"vertex-scene-tree-table-resize-divider",{"dragging":[32]}]]],["vertex-scene-tree-toolbar-group",[[1,"vertex-scene-tree-toolbar-group"]]],["vertex-viewer",[[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",[[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",[[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",[[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",[[1,"vertex-viewer-toolbar",{"placement":[1],"direction":[1]}],[1,"vertex-viewer-button"],[1,"vertex-viewer-toolbar-group",{"direction":[1]}]]],["vertex-viewer-dom-element_3",[[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",[[1,"vertex-viewer-icon",{"name":[1],"size":[1]}]]],["vertex-viewer-layer",[[1,"vertex-viewer-layer",{"stretchOff":[516,"stretch-off"]}]]],["vertex-viewer-markup-arrow_3",[[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",[[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);
75
+ return bootstrapLazy([["vertex-viewer-default-toolbar",[[1,"vertex-viewer-default-toolbar",{"viewer":[16],"placement":[1],"direction":[1],"animationsDisabled":[4,"animations-disabled"],"animationMs":[2,"animation-ms"]}]]],["vertex-scene-tree",[[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",[[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",[[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",[[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",[[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",[[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",[[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",[[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",[[1,"vertex-scene-tree-table-column",{"initialWidth":[2,"initial-width"],"minWidth":[2,"min-width"],"maxWidth":[2,"max-width"]}]]],["vertex-scene-tree-table-header",[[1,"vertex-scene-tree-table-header"]]],["vertex-scene-tree-table-resize-divider",[[1,"vertex-scene-tree-table-resize-divider",{"dragging":[32]}]]],["vertex-scene-tree-toolbar-group",[[1,"vertex-scene-tree-toolbar-group"]]],["vertex-viewer",[[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",[[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",[[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",[[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",[[1,"vertex-viewer-toolbar",{"placement":[1],"direction":[1]}],[1,"vertex-viewer-button"],[1,"vertex-viewer-toolbar-group",{"direction":[1]}]]],["vertex-viewer-dom-element_3",[[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",[[1,"vertex-viewer-icon",{"name":[1],"size":[1]}]]],["vertex-viewer-layer",[[1,"vertex-viewer-layer",{"stretchOff":[516,"stretch-off"]}]]],["vertex-viewer-markup-arrow_3",[[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",[[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);
76
76
  });
@@ -1,7 +1,7 @@
1
1
  /**!
2
2
  * Copyright (c) 2022 Vertex Software LLC. All rights reserved.
3
3
  */
4
- import { d as dimensions, p as point, v as vector3, r as ray, g as rectangle } from './bundle.esm-d899b2d5.js';
4
+ import { d as dimensions, p as point, v as vector3, r as ray, i as rectangle } from './bundle.esm-8ceccb91.js';
5
5
 
6
6
  /**
7
7
  * A `Viewport` represents the drawing area in the viewer.
@@ -73,7 +73,7 @@ class Viewport {
73
73
  return point.scale(pt, 1 / scaleX, 1 / scaleY);
74
74
  }
75
75
  /**
76
- * Transforms a point in viewport coordinates to a point in world space
76
+ * Transforms a point in viewport coordinates to a point in perspective world space
77
77
  * coordinates. This method expects a depth buffer in order to compute a value
78
78
  * for the Z axis.
79
79
  *
@@ -88,6 +88,21 @@ class Viewport {
88
88
  const ray = this.transformPointToRay(pt, depthBuffer, depthBuffer.camera);
89
89
  return depthBuffer.getWorldPoint(depthPt, ray, fallbackNormalizedDepth);
90
90
  }
91
+ /**
92
+ * Transforms a point in viewport coordinates to a point in orthographic world space
93
+ * coordinates. This method expects a depth buffer in order to compute a value
94
+ * for the Z axis.
95
+ *
96
+ * @param pt A point in viewport coordinates.
97
+ * @param depthBuffer A depth buffer for computing the Z axis.
98
+ * @param fallbackNormalizedDepth A fallback value if the depth is the max
99
+ * depth value, or cannot be determined.
100
+ */
101
+ transformPointToOrthographicWorldSpace(pt, depthBuffer, fallbackNormalizedDepth) {
102
+ const depthPt = this.transformPointToFrame(pt, depthBuffer);
103
+ const ray = this.transformPointToOrthographicRay(pt, depthBuffer, depthBuffer.camera);
104
+ return depthBuffer.getOrthographicWorldPoint(depthPt, ray, fallbackNormalizedDepth);
105
+ }
91
106
  /**
92
107
  * Transforms a point in viewport coordinates to a ray. The returned ray will
93
108
  * have an origin that is at the position of the camera with a direction that
@@ -105,6 +120,23 @@ class Viewport {
105
120
  const direction = vector3.normalize(vector3.subtract(world, origin));
106
121
  return ray.create({ origin, direction });
107
122
  }
123
+ /**
124
+ * Transforms a point in viewport coordinates to a ray. The returned ray will
125
+ * have an origin that is at the world point of viewport coordinate with a direction that
126
+ * is pointing into world space away from the camera.
127
+ *
128
+ * @param pt A point in viewport coordinates.
129
+ * @param image An image of a frame.
130
+ * @param camera A camera used to determine orientation of the scene.
131
+ */
132
+ transformPointToOrthographicRay(pt, image, camera) {
133
+ const ndc = this.transformScreenPointToNdc(pt, image);
134
+ const world = vector3.transformNdcToWorldSpace(vector3.create(ndc.x, ndc.y, 0.5), camera.worldMatrix, camera.projectionMatrixInverse);
135
+ return ray.create({
136
+ origin: world,
137
+ direction: vector3.normalize(camera.viewVector),
138
+ });
139
+ }
108
140
  /**
109
141
  * Maps a screen point to normalized device coordinates (NDC). A screen point
110
142
  * at 0,0 represents the top-left of the viewport.
@@ -2,7 +2,7 @@ import { EventEmitter, h } from '../../stencil-public-runtime';
2
2
  import { Node } from '@vertexvis/scene-tree-protos/scenetree/protos/domain_pb';
3
3
  export interface SceneTreeTableCellEventDetails {
4
4
  node?: Node.AsObject;
5
- originalEvent: PointerEvent;
5
+ originalEvent: PointerEvent | TouchEvent;
6
6
  }
7
7
  export declare class SceneTreeTableCell {
8
8
  /**
@@ -69,6 +69,11 @@ export declare class Viewer {
69
69
  * the viewer. Enabled by default.
70
70
  */
71
71
  cameraControls: boolean;
72
+ /**
73
+ * The type of camera model to represent the scene with. Can be either
74
+ * `perspective` or `orthographic`, and defaults to `perspective`.
75
+ */
76
+ cameraType: 'perspective' | 'orthographic';
72
77
  /**
73
78
  * Enables or disables the default keyboard shortcut interactions provided by
74
79
  * the viewer. Enabled by default, requires `cameraControls` being enabled.
@@ -372,6 +377,7 @@ export declare class Viewer {
372
377
  * @ignore
373
378
  */
374
379
  protected handleRotateAboutTapPointChanged(): void;
380
+ protected handleCameraTypeChanged(updatedCameraType: string, previousCameraType: string): void;
375
381
  /**
376
382
  * @ignore
377
383
  */
@@ -456,6 +462,8 @@ export declare class Viewer {
456
462
  private getStreamAttributes;
457
463
  private updateCanvasDimensions;
458
464
  private updateStreamAttributes;
465
+ private updateInteractionApi;
466
+ private updateCameraType;
459
467
  private getDepthBufferStreamAttributesValue;
460
468
  private updateResolvedConfig;
461
469
  private getResolvedConfig;
@@ -1,6 +1,6 @@
1
1
  import { FunctionalComponent } from '../../stencil-public-runtime';
2
2
  import { Matrix4 } from '@vertexvis/geometry';
3
3
  import { DepthBuffer, Viewport } from '../../lib/types';
4
- import { FramePerspectiveCamera } from '../../lib/types/frame';
4
+ import { FrameCameraWithMatrices } from '../../lib/types/frame';
5
5
  export declare const Renderer2d: FunctionalComponent;
6
- export declare function update2d(hostEl: HTMLElement, parentWorldMatrix: Matrix4.Matrix4, viewport: Viewport, camera: FramePerspectiveCamera, depthBuffer: DepthBuffer | undefined): void;
6
+ export declare function update2d(hostEl: HTMLElement, parentWorldMatrix: Matrix4.Matrix4, viewport: Viewport, camera: FrameCameraWithMatrices, depthBuffer: DepthBuffer | undefined): void;
@@ -1,11 +1,11 @@
1
1
  import { FunctionalComponent } from '../../stencil-public-runtime';
2
2
  import { Matrix4 } from '@vertexvis/geometry';
3
3
  import { DepthBuffer, Viewport } from '../../lib/types';
4
- import { FramePerspectiveCamera } from '../../lib/types/frame';
4
+ import { FrameCameraWithMatrices } from '../../lib/types/frame';
5
5
  interface Props {
6
- camera: FramePerspectiveCamera;
6
+ camera: FrameCameraWithMatrices;
7
7
  viewport: Viewport;
8
8
  }
9
9
  export declare const Renderer3d: FunctionalComponent<Props>;
10
- export declare function update3d(element: HTMLElement, parentWorldMatrix: Matrix4.Matrix4, viewport: Viewport, camera: FramePerspectiveCamera, depthBuffer: DepthBuffer | undefined): void;
10
+ export declare function update3d(element: HTMLElement, parentWorldMatrix: Matrix4.Matrix4, viewport: Viewport, camera: FrameCameraWithMatrices, depthBuffer: DepthBuffer | undefined): void;
11
11
  export {};