@vertexvis/viewer 1.0.2-canary.3 → 1.0.2-canary.4

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 (501) hide show
  1. package/dist/cjs/config-20ozv4y8.js.map +1 -1
  2. package/dist/cjs/controller-BhcNbaX_.js.map +1 -1
  3. package/dist/cjs/controller-CSwG6gbQ.js.map +1 -1
  4. package/dist/cjs/cursors-BZmDRtaZ.js.map +1 -1
  5. package/dist/cjs/dom-BBil4aN3.js.map +1 -1
  6. package/dist/cjs/dom-CvGkFQon.js.map +1 -1
  7. package/dist/cjs/entities-D6kgGria.js.map +1 -1
  8. package/dist/cjs/geometry_pb-BTko2Wi0.js.map +1 -1
  9. package/dist/cjs/grpc-BsWFEUrc.js.map +1 -1
  10. package/dist/cjs/index.cjs.js.map +1 -1
  11. package/dist/cjs/model-C9WvOKYT.js.map +1 -1
  12. package/dist/cjs/model-D17EQTIh.js.map +1 -1
  13. package/dist/cjs/model-DAB4oD5n.js.map +1 -1
  14. package/dist/cjs/model-DkXCzhs_.js.map +1 -1
  15. package/dist/cjs/multiElementInteractionHandler-BHvRKVIp.js.map +1 -1
  16. package/dist/cjs/overlays-B-06bUbI.js.map +1 -1
  17. package/dist/cjs/queries-Da9I-xMf.js.map +1 -1
  18. package/dist/cjs/regl-component-HhKCyGQ3.js.map +1 -1
  19. package/dist/cjs/representation_pb-CrCGjlyP.js.map +1 -1
  20. package/dist/cjs/results-1wRRZiYG.js.map +1 -1
  21. package/dist/cjs/row-Cet6xXup.js.map +1 -1
  22. package/dist/cjs/stencil-Hsr_8Chs.js.map +1 -1
  23. package/dist/cjs/streamAttributes-D_J-W8-2.js.map +1 -1
  24. package/dist/cjs/templates-DvjgjnlO.js.map +1 -1
  25. package/dist/cjs/util-DIJSIQXH.js.map +1 -1
  26. package/dist/cjs/utils-CibrnHQ4.js.map +1 -1
  27. package/dist/cjs/utils-D8MbXbwO.js.map +1 -1
  28. package/dist/cjs/utils-qErVs2Vt.js.map +1 -1
  29. package/dist/cjs/vertex-scene-tree-notification-banner_4.cjs.entry.js +6 -8
  30. package/dist/cjs/vertex-scene-tree-notification-banner_4.cjs.entry.js.map +1 -1
  31. package/dist/cjs/vertex-scene-tree-table-cell.cjs.entry.js +1 -1
  32. package/dist/cjs/vertex-scene-tree-table-cell.cjs.entry.js.map +1 -1
  33. package/dist/cjs/vertex-scene-tree.cjs.entry.js +2 -2
  34. package/dist/cjs/vertex-scene-tree.cjs.entry.js.map +1 -1
  35. package/dist/cjs/vertex-viewer-box-query-tool.cjs.entry.js +2 -2
  36. package/dist/cjs/vertex-viewer-box-query-tool.cjs.entry.js.map +1 -1
  37. package/dist/cjs/vertex-viewer-dom-element_2.cjs.entry.js +1 -1
  38. package/dist/cjs/vertex-viewer-dom-element_2.cjs.entry.js.map +1 -1
  39. package/dist/cjs/vertex-viewer-dom-group.cjs.entry.js +1 -1
  40. package/dist/cjs/vertex-viewer-dom-group.cjs.entry.js.map +1 -1
  41. package/dist/cjs/vertex-viewer-hit-result-indicator.cjs.entry.js +1 -1
  42. package/dist/cjs/vertex-viewer-hit-result-indicator.cjs.entry.js.map +1 -1
  43. package/dist/cjs/vertex-viewer-icon.cjs.entry.js.map +1 -1
  44. package/dist/cjs/vertex-viewer-markup-arrow_3.cjs.entry.js.map +1 -1
  45. package/dist/cjs/vertex-viewer-markup-tool.cjs.entry.js.map +1 -1
  46. package/dist/cjs/vertex-viewer-markup.cjs.entry.js +1 -1
  47. package/dist/cjs/vertex-viewer-markup.cjs.entry.js.map +1 -1
  48. package/dist/cjs/vertex-viewer-measurement-details.cjs.entry.js.map +1 -1
  49. package/dist/cjs/vertex-viewer-measurement-distance.cjs.entry.js.map +1 -1
  50. package/dist/cjs/vertex-viewer-measurement-line_2.cjs.entry.js +2 -2
  51. package/dist/cjs/vertex-viewer-measurement-line_2.cjs.entry.js.map +1 -1
  52. package/dist/cjs/vertex-viewer-measurement-precise.cjs.entry.js.map +1 -1
  53. package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js +2 -2
  54. package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js.map +1 -1
  55. package/dist/cjs/vertex-viewer-pin-label_2.cjs.entry.js.map +1 -1
  56. package/dist/cjs/vertex-viewer-pin-tool.cjs.entry.js +1 -1
  57. package/dist/cjs/vertex-viewer-pin-tool.cjs.entry.js.map +1 -1
  58. package/dist/cjs/vertex-viewer-teleport-tool.cjs.entry.js.map +1 -1
  59. package/dist/cjs/vertex-viewer-transform-widget.cjs.entry.js +4 -5
  60. package/dist/cjs/vertex-viewer-transform-widget.cjs.entry.js.map +1 -1
  61. package/dist/cjs/vertex-viewer-view-cube.cjs.entry.js +1 -1
  62. package/dist/cjs/vertex-viewer-view-cube.cjs.entry.js.map +1 -1
  63. package/dist/cjs/vertex-viewer-walk-mode-tool.cjs.entry.js.map +1 -1
  64. package/dist/cjs/vertex-viewer.cjs.entry.js +9 -5
  65. package/dist/cjs/vertex-viewer.cjs.entry.js.map +1 -1
  66. package/dist/cjs/viewport-CG1VYkIU.js.map +1 -1
  67. package/dist/collection/components/scene-tree/errors.js.map +1 -1
  68. package/dist/collection/components/scene-tree/lib/controller.js.map +1 -1
  69. package/dist/collection/components/scene-tree/lib/dom.js.map +1 -1
  70. package/dist/collection/components/scene-tree/lib/errors.js.map +1 -1
  71. package/dist/collection/components/scene-tree/lib/grpc.js.map +1 -1
  72. package/dist/collection/components/scene-tree/lib/handlers.js.map +1 -1
  73. package/dist/collection/components/scene-tree/lib/row.js.map +1 -1
  74. package/dist/collection/components/scene-tree/lib/viewer-ops.js.map +1 -1
  75. package/dist/collection/components/scene-tree/scene-tree.js +2 -2
  76. package/dist/collection/components/scene-tree/scene-tree.js.map +1 -1
  77. package/dist/collection/components/scene-tree-search/scene-tree-search.js.map +1 -1
  78. package/dist/collection/components/scene-tree-table-cell/scene-tree-table-cell.js +1 -1
  79. package/dist/collection/components/scene-tree-table-cell/scene-tree-table-cell.js.map +1 -1
  80. package/dist/collection/components/scene-tree-table-cell/utils.js.map +1 -1
  81. package/dist/collection/components/scene-tree-table-layout/lib/dom.js.map +1 -1
  82. package/dist/collection/components/scene-tree-table-layout/lib/window.js.map +1 -1
  83. package/dist/collection/components/scene-tree-table-layout/scene-tree-table-layout.js +5 -5
  84. package/dist/collection/components/scene-tree-table-layout/scene-tree-table-layout.js.map +1 -1
  85. package/dist/collection/components/viewer/utils.js.map +1 -1
  86. package/dist/collection/components/viewer/viewer.js +9 -5
  87. package/dist/collection/components/viewer/viewer.js.map +1 -1
  88. package/dist/collection/components/viewer-box-query-tool/viewer-box-query-tool.js +2 -2
  89. package/dist/collection/components/viewer-box-query-tool/viewer-box-query-tool.js.map +1 -1
  90. package/dist/collection/components/viewer-dom-element/utils.js.map +1 -1
  91. package/dist/collection/components/viewer-dom-element/viewer-dom-element.js +1 -1
  92. package/dist/collection/components/viewer-dom-element/viewer-dom-element.js.map +1 -1
  93. package/dist/collection/components/viewer-dom-group/utils.js.map +1 -1
  94. package/dist/collection/components/viewer-dom-group/viewer-dom-group.js +1 -1
  95. package/dist/collection/components/viewer-dom-group/viewer-dom-group.js.map +1 -1
  96. package/dist/collection/components/viewer-dom-renderer/renderer2d.js.map +1 -1
  97. package/dist/collection/components/viewer-dom-renderer/renderer3d.js.map +1 -1
  98. package/dist/collection/components/viewer-dom-renderer/viewer-dom-renderer.js.map +1 -1
  99. package/dist/collection/components/viewer-hit-result-indicator/lib/dom.js.map +1 -1
  100. package/dist/collection/components/viewer-hit-result-indicator/lib/indicator.js.map +1 -1
  101. package/dist/collection/components/viewer-hit-result-indicator/lib/plane.js.map +1 -1
  102. package/dist/collection/components/viewer-hit-result-indicator/lib/point.js.map +1 -1
  103. package/dist/collection/components/viewer-hit-result-indicator/viewer-hit-result-indicator.js +1 -1
  104. package/dist/collection/components/viewer-hit-result-indicator/viewer-hit-result-indicator.js.map +1 -1
  105. package/dist/collection/components/viewer-icon/viewer-icon.js.map +1 -1
  106. package/dist/collection/components/viewer-markup/markup-utils.js.map +1 -1
  107. package/dist/collection/components/viewer-markup/viewer-markup-components.js.map +1 -1
  108. package/dist/collection/components/viewer-markup/viewer-markup.js +1 -1
  109. package/dist/collection/components/viewer-markup/viewer-markup.js.map +1 -1
  110. package/dist/collection/components/viewer-markup-arrow/interactions.js.map +1 -1
  111. package/dist/collection/components/viewer-markup-arrow/utils.js.map +1 -1
  112. package/dist/collection/components/viewer-markup-arrow/viewer-markup-arrow-components.js.map +1 -1
  113. package/dist/collection/components/viewer-markup-arrow/viewer-markup-arrow.js.map +1 -1
  114. package/dist/collection/components/viewer-markup-circle/interactions.js.map +1 -1
  115. package/dist/collection/components/viewer-markup-circle/utils.js.map +1 -1
  116. package/dist/collection/components/viewer-markup-circle/viewer-markup-circle.js.map +1 -1
  117. package/dist/collection/components/viewer-markup-freeform/interactions.js.map +1 -1
  118. package/dist/collection/components/viewer-markup-freeform/utils.js.map +1 -1
  119. package/dist/collection/components/viewer-markup-freeform/viewer-markup-freeform.js.map +1 -1
  120. package/dist/collection/components/viewer-markup-tool/viewer-markup-tool.js.map +1 -1
  121. package/dist/collection/components/viewer-measurement-details/viewer-measurement-details.js.map +1 -1
  122. package/dist/collection/components/viewer-measurement-distance/hitTest.js.map +1 -1
  123. package/dist/collection/components/viewer-measurement-distance/interactions.js.map +1 -1
  124. package/dist/collection/components/viewer-measurement-distance/utils.js.map +1 -1
  125. package/dist/collection/components/viewer-measurement-distance/viewer-measurement-distance.js.map +1 -1
  126. package/dist/collection/components/viewer-measurement-line/viewer-measurement-line.js +1 -1
  127. package/dist/collection/components/viewer-measurement-line/viewer-measurement-line.js.map +1 -1
  128. package/dist/collection/components/viewer-measurement-overlays/viewer-measurement-overlays.js +1 -1
  129. package/dist/collection/components/viewer-measurement-overlays/viewer-measurement-overlays.js.map +1 -1
  130. package/dist/collection/components/viewer-measurement-precise/viewer-measurement-precise.js.map +1 -1
  131. package/dist/collection/components/viewer-pin-group/utils.js.map +1 -1
  132. package/dist/collection/components/viewer-pin-group/viewer-pin-group.js +2 -2
  133. package/dist/collection/components/viewer-pin-group/viewer-pin-group.js.map +1 -1
  134. package/dist/collection/components/viewer-pin-label/viewer-pin-label.js.map +1 -1
  135. package/dist/collection/components/viewer-pin-tool/utils.js.map +1 -1
  136. package/dist/collection/components/viewer-pin-tool/viewer-pin-tool.js +1 -1
  137. package/dist/collection/components/viewer-pin-tool/viewer-pin-tool.js.map +1 -1
  138. package/dist/collection/components/viewer-teleport-tool/viewer-teleport-tool.js.map +1 -1
  139. package/dist/collection/components/viewer-transform-widget/util.js +1 -2
  140. package/dist/collection/components/viewer-transform-widget/util.js.map +1 -1
  141. package/dist/collection/components/viewer-transform-widget/viewer-transform-widget-components.js.map +1 -1
  142. package/dist/collection/components/viewer-transform-widget/viewer-transform-widget.js +3 -3
  143. package/dist/collection/components/viewer-transform-widget/viewer-transform-widget.js.map +1 -1
  144. package/dist/collection/components/viewer-transform-widget/widget.js.map +1 -1
  145. package/dist/collection/components/viewer-view-cube/viewer-view-cube.js +1 -1
  146. package/dist/collection/components/viewer-view-cube/viewer-view-cube.js.map +1 -1
  147. package/dist/collection/components/viewer-walk-mode-tool/viewer-walk-mode-tool.js.map +1 -1
  148. package/dist/collection/lib/annotations/controller.js.map +1 -1
  149. package/dist/collection/lib/canvases/controller.js.map +1 -1
  150. package/dist/collection/lib/canvases/mapper.js.map +1 -1
  151. package/dist/collection/lib/config.js.map +1 -1
  152. package/dist/collection/lib/cursors.js.map +1 -1
  153. package/dist/collection/lib/dom.js.map +1 -1
  154. package/dist/collection/lib/grpc.js.map +1 -1
  155. package/dist/collection/lib/interactions/baseInteractionHandler.js.map +1 -1
  156. package/dist/collection/lib/interactions/flyToPartKeyInteraction.js.map +1 -1
  157. package/dist/collection/lib/interactions/flyToPositionKeyInteraction.js.map +1 -1
  158. package/dist/collection/lib/interactions/interactionApi.js.map +1 -1
  159. package/dist/collection/lib/interactions/interactionApiOrthographic.js.map +1 -1
  160. package/dist/collection/lib/interactions/interactionApiPerspective.js.map +1 -1
  161. package/dist/collection/lib/interactions/mouseInteractionHandler.js.map +1 -1
  162. package/dist/collection/lib/interactions/mouseInteractions.js.map +1 -1
  163. package/dist/collection/lib/interactions/multiElementInteractionHandler.js.map +1 -1
  164. package/dist/collection/lib/interactions/multiPointerInteractionHandler.js.map +1 -1
  165. package/dist/collection/lib/interactions/multiTouchInteractionHandler.js.map +1 -1
  166. package/dist/collection/lib/interactions/pointerInteractionHandler.js.map +1 -1
  167. package/dist/collection/lib/interactions/tapInteractionHandler.js.map +1 -1
  168. package/dist/collection/lib/interactions/touchInteractionHandler.js.map +1 -1
  169. package/dist/collection/lib/keyBinding.js.map +1 -1
  170. package/dist/collection/lib/mappers/annotation.js.map +1 -1
  171. package/dist/collection/lib/mappers/camera.js.map +1 -1
  172. package/dist/collection/lib/mappers/color.js.map +1 -1
  173. package/dist/collection/lib/mappers/colorMaterial.js.map +1 -1
  174. package/dist/collection/lib/mappers/corePb.js.map +1 -1
  175. package/dist/collection/lib/mappers/corePbJs.js.map +1 -1
  176. package/dist/collection/lib/mappers/frameStreaming.js.map +1 -1
  177. package/dist/collection/lib/mappers/geometry.js.map +1 -1
  178. package/dist/collection/lib/mappers/material.js.map +1 -1
  179. package/dist/collection/lib/mappers/pagination.js.map +1 -1
  180. package/dist/collection/lib/mappers/scalar.js.map +1 -1
  181. package/dist/collection/lib/mappers/streamAttributes.js.map +1 -1
  182. package/dist/collection/lib/markup/interactions.js.map +1 -1
  183. package/dist/collection/lib/measurement/controller.js.map +1 -1
  184. package/dist/collection/lib/measurement/entities.js.map +1 -1
  185. package/dist/collection/lib/measurement/interactions.js.map +1 -1
  186. package/dist/collection/lib/measurement/mapper.js.map +1 -1
  187. package/dist/collection/lib/measurement/model.js.map +1 -1
  188. package/dist/collection/lib/measurement/overlays.js.map +1 -1
  189. package/dist/collection/lib/measurement/results.js.map +1 -1
  190. package/dist/collection/lib/meters.js.map +1 -1
  191. package/dist/collection/lib/model-views/controller.js.map +1 -1
  192. package/dist/collection/lib/model-views/mapper.js.map +1 -1
  193. package/dist/collection/lib/pins/controller.js.map +1 -1
  194. package/dist/collection/lib/pins/interactions.js.map +1 -1
  195. package/dist/collection/lib/pmi/controller.js.map +1 -1
  196. package/dist/collection/lib/pmi/mapper.js.map +1 -1
  197. package/dist/collection/lib/rendering/canvas.js.map +1 -1
  198. package/dist/collection/lib/rendering/imageLoaders.js.map +1 -1
  199. package/dist/collection/lib/rendering/matrices.js.map +1 -1
  200. package/dist/collection/lib/rendering/timing.js.map +1 -1
  201. package/dist/collection/lib/rendering/utils.js.map +1 -1
  202. package/dist/collection/lib/rendering/vectors.js.map +1 -1
  203. package/dist/collection/lib/scene-items/controller.js.map +1 -1
  204. package/dist/collection/lib/scene-items/mapper.js.map +1 -1
  205. package/dist/collection/lib/scenes/camera.js.map +1 -1
  206. package/dist/collection/lib/scenes/cameraRenderResult.js.map +1 -1
  207. package/dist/collection/lib/scenes/colorMaterial.js.map +1 -1
  208. package/dist/collection/lib/scenes/crossSectioner.js.map +1 -1
  209. package/dist/collection/lib/scenes/mapper.js.map +1 -1
  210. package/dist/collection/lib/scenes/operations.js.map +1 -1
  211. package/dist/collection/lib/scenes/queries.js.map +1 -1
  212. package/dist/collection/lib/scenes/raycaster.js.map +1 -1
  213. package/dist/collection/lib/scenes/scene.js.map +1 -1
  214. package/dist/collection/lib/scenes/sceneOperationExecuteResult.js.map +1 -1
  215. package/dist/collection/lib/scenes/sceneViewStateLoader.js.map +1 -1
  216. package/dist/collection/lib/stencil.js.map +1 -1
  217. package/dist/collection/lib/storage.js.map +1 -1
  218. package/dist/collection/lib/stream/dispatcher.js.map +1 -1
  219. package/dist/collection/lib/stream/stream.js.map +1 -1
  220. package/dist/collection/lib/stream/utils.js.map +1 -1
  221. package/dist/collection/lib/teleportation/interactions.js.map +1 -1
  222. package/dist/collection/lib/templates.js.map +1 -1
  223. package/dist/collection/lib/token.js.map +1 -1
  224. package/dist/collection/lib/transforms/axis-lines.js.map +1 -1
  225. package/dist/collection/lib/transforms/axis-rotation.js.map +1 -1
  226. package/dist/collection/lib/transforms/axis-translation.js.map +1 -1
  227. package/dist/collection/lib/transforms/controller.js.map +1 -1
  228. package/dist/collection/lib/transforms/drawable.js.map +1 -1
  229. package/dist/collection/lib/transforms/hits.js.map +1 -1
  230. package/dist/collection/lib/transforms/line.js.map +1 -1
  231. package/dist/collection/lib/transforms/mesh.js.map +1 -1
  232. package/dist/collection/lib/transforms/shape.js.map +1 -1
  233. package/dist/collection/lib/transforms/transformation-delta.js.map +1 -1
  234. package/dist/collection/lib/transforms/util.js.map +1 -1
  235. package/dist/collection/lib/types/clippingPlanes.js.map +1 -1
  236. package/dist/collection/lib/types/depthBuffer.js.map +1 -1
  237. package/dist/collection/lib/types/featureMap.js.map +1 -1
  238. package/dist/collection/lib/types/flags.js.map +1 -1
  239. package/dist/collection/lib/types/frame.js.map +1 -1
  240. package/dist/collection/lib/types/frameCamera.js.map +1 -1
  241. package/dist/collection/lib/types/loadableResource.js.map +1 -1
  242. package/dist/collection/lib/types/orientation.js.map +1 -1
  243. package/dist/collection/lib/types/sceneViewStateIdentifier.js.map +1 -1
  244. package/dist/collection/lib/types/standardView.js.map +1 -1
  245. package/dist/collection/lib/types/stencilBuffer.js.map +1 -1
  246. package/dist/collection/lib/types/synchronizedClock.js.map +1 -1
  247. package/dist/collection/lib/types/viewport.js.map +1 -1
  248. package/dist/collection/lib/visibilityObserver.js.map +1 -1
  249. package/dist/collection/lib/volume-intersection/controller.js.map +1 -1
  250. package/dist/collection/lib/volume-intersection/interactions.js.map +1 -1
  251. package/dist/collection/lib/volume-intersection/model.js.map +1 -1
  252. package/dist/collection/lib/walk-mode/controller.js.map +1 -1
  253. package/dist/collection/lib/walk-mode/interactions.js.map +1 -1
  254. package/dist/collection/lib/walk-mode/model.js.map +1 -1
  255. package/dist/collection/lib/webgl/regl-component.js.map +1 -1
  256. package/dist/collection/testing/annotations.js.map +1 -1
  257. package/dist/collection/testing/canvases.js.map +1 -1
  258. package/dist/collection/testing/colors.js.map +1 -1
  259. package/dist/collection/testing/eventually.js.map +1 -1
  260. package/dist/collection/testing/fixtures.js.map +1 -1
  261. package/dist/collection/testing/grpc.js +3 -9
  262. package/dist/collection/testing/grpc.js.map +1 -1
  263. package/dist/collection/testing/modelViews.js.map +1 -1
  264. package/dist/collection/testing/pmi.js.map +1 -1
  265. package/dist/collection/testing/random.js.map +1 -1
  266. package/dist/collection/testing/resizeObserver.js.map +1 -1
  267. package/dist/collection/testing/scene-items-helper.js.map +1 -1
  268. package/dist/collection/testing/sceneTree.js.map +1 -1
  269. package/dist/collection/testing/viewer.js.map +1 -1
  270. package/dist/collection/testing/webgl.js.map +1 -1
  271. package/dist/components/index.js.map +1 -1
  272. package/dist/components/{p-St4ctu2K.js → p-3-bKfpqr.js} +2 -2
  273. package/dist/components/{p-St4ctu2K.js.map → p-3-bKfpqr.js.map} +1 -1
  274. package/dist/components/p-3DqRAYgO.js.map +1 -1
  275. package/dist/components/p-B-ToCp8-.js.map +1 -1
  276. package/dist/components/p-B156bTbY.js +5 -0
  277. package/dist/components/p-B156bTbY.js.map +1 -0
  278. package/dist/components/p-B9R0QWr4.js.map +1 -1
  279. package/dist/components/p-BCOD9yfw.js.map +1 -1
  280. package/dist/components/p-BHAaIoH5.js.map +1 -1
  281. package/dist/components/{p-Doltf1wO.js → p-BOJJZ1cN.js} +2 -2
  282. package/dist/components/p-BOJJZ1cN.js.map +1 -0
  283. package/dist/components/p-BkHp-aAR.js.map +1 -1
  284. package/dist/components/p-Bkm6H5uq.js.map +1 -1
  285. package/dist/components/p-C-VWDW9n.js.map +1 -1
  286. package/dist/components/p-C79PxobX.js.map +1 -1
  287. package/dist/components/p-CAugdB_8.js.map +1 -1
  288. package/dist/components/p-CEzVEgdQ.js.map +1 -1
  289. package/dist/components/p-CGCJ5hbJ.js.map +1 -1
  290. package/dist/components/p-COlcifvm.js.map +1 -1
  291. package/dist/components/p-CXTH3zrN.js.map +1 -1
  292. package/dist/components/p-CZCXdo3t.js.map +1 -1
  293. package/dist/components/p-Cd7kap5W.js.map +1 -1
  294. package/dist/components/p-CiSHWNC4.js.map +1 -1
  295. package/dist/components/p-CjG1fMh1.js.map +1 -1
  296. package/dist/components/p-CkjXRDNL.js.map +1 -1
  297. package/dist/components/p-D0KZu516.js.map +1 -1
  298. package/dist/components/p-D12q-fpW.js.map +1 -1
  299. package/dist/components/p-D33gVA2W.js.map +1 -1
  300. package/dist/components/p-DC86ZXai.js.map +1 -1
  301. package/dist/components/{p-B80hfIq6.js → p-DF4kEsJU.js} +2 -2
  302. package/dist/components/p-DF4kEsJU.js.map +1 -0
  303. package/dist/components/p-DRh4_Z-g.js.map +1 -1
  304. package/dist/components/p-DRnMrHWY.js.map +1 -1
  305. package/dist/components/{p-b0ZzPHz8.js → p-DUC59SSO.js} +2 -2
  306. package/dist/components/p-DUC59SSO.js.map +1 -0
  307. package/dist/components/p-DVW2WZTq.js.map +1 -1
  308. package/dist/components/p-DZI8pnGz.js.map +1 -1
  309. package/dist/components/p-Dbz9yUqC.js.map +1 -1
  310. package/dist/components/p-Yfi0i5Kj.js.map +1 -1
  311. package/dist/components/p-abSJ29r7.js.map +1 -1
  312. package/dist/components/p-ahjMltGJ.js.map +1 -1
  313. package/dist/components/p-bal2RLiw.js.map +1 -1
  314. package/dist/components/{p-BopQW1sA.js → p-oK38ynrd.js} +2 -2
  315. package/dist/components/p-oK38ynrd.js.map +1 -0
  316. package/dist/components/vertex-scene-tree-table-cell.js +1 -1
  317. package/dist/components/vertex-scene-tree-table-cell.js.map +1 -1
  318. package/dist/components/vertex-scene-tree-table-layout.js +1 -1
  319. package/dist/components/vertex-scene-tree.js +1 -1
  320. package/dist/components/vertex-scene-tree.js.map +1 -1
  321. package/dist/components/vertex-viewer-box-query-tool.js +1 -1
  322. package/dist/components/vertex-viewer-box-query-tool.js.map +1 -1
  323. package/dist/components/vertex-viewer-dom-element.js +1 -1
  324. package/dist/components/vertex-viewer-dom-group.js +1 -1
  325. package/dist/components/vertex-viewer-hit-result-indicator.js +1 -1
  326. package/dist/components/vertex-viewer-hit-result-indicator.js.map +1 -1
  327. package/dist/components/vertex-viewer-markup-tool.js.map +1 -1
  328. package/dist/components/vertex-viewer-markup.js +1 -1
  329. package/dist/components/vertex-viewer-markup.js.map +1 -1
  330. package/dist/components/vertex-viewer-measurement-details.js.map +1 -1
  331. package/dist/components/vertex-viewer-measurement-distance.js +1 -1
  332. package/dist/components/vertex-viewer-measurement-distance.js.map +1 -1
  333. package/dist/components/vertex-viewer-measurement-line.js +1 -1
  334. package/dist/components/vertex-viewer-measurement-overlays.js +1 -1
  335. package/dist/components/vertex-viewer-measurement-precise.js +1 -1
  336. package/dist/components/vertex-viewer-measurement-precise.js.map +1 -1
  337. package/dist/components/vertex-viewer-pin-group.js +1 -1
  338. package/dist/components/vertex-viewer-pin-tool.js +1 -1
  339. package/dist/components/vertex-viewer-pin-tool.js.map +1 -1
  340. package/dist/components/vertex-viewer-transform-widget.js +1 -1
  341. package/dist/components/vertex-viewer-transform-widget.js.map +1 -1
  342. package/dist/components/vertex-viewer-view-cube.js +1 -1
  343. package/dist/components/vertex-viewer-view-cube.js.map +1 -1
  344. package/dist/components/vertex-viewer-walk-mode-tool.js.map +1 -1
  345. package/dist/components/vertex-viewer.js +1 -1
  346. package/dist/components/vertex-viewer.js.map +1 -1
  347. package/dist/esm/config-lglER3mU.js.map +1 -1
  348. package/dist/esm/controller-BMWGs-I6.js.map +1 -1
  349. package/dist/esm/controller-Iymb_J2R.js.map +1 -1
  350. package/dist/esm/cursors-BbBDEutb.js.map +1 -1
  351. package/dist/esm/dom-B3m2VjbN.js.map +1 -1
  352. package/dist/esm/dom-DX6pEG54.js.map +1 -1
  353. package/dist/esm/entities-zRken6VS.js.map +1 -1
  354. package/dist/esm/geometry_pb-BiZRfctN.js.map +1 -1
  355. package/dist/esm/grpc-CZAYqbTu.js.map +1 -1
  356. package/dist/esm/index.js.map +1 -1
  357. package/dist/esm/model-BYW5YIye.js.map +1 -1
  358. package/dist/esm/model-CLtwOS0o.js.map +1 -1
  359. package/dist/esm/model-D0EJdHmW.js.map +1 -1
  360. package/dist/esm/model-DHJ5aE4y.js.map +1 -1
  361. package/dist/esm/multiElementInteractionHandler-DwjL-r55.js.map +1 -1
  362. package/dist/esm/overlays-BE1oqniA.js.map +1 -1
  363. package/dist/esm/queries-DEzCmbTD.js.map +1 -1
  364. package/dist/esm/regl-component-DmkowWhg.js.map +1 -1
  365. package/dist/esm/representation_pb-g4f0WC4k.js.map +1 -1
  366. package/dist/esm/results-CFB6nKu8.js.map +1 -1
  367. package/dist/esm/row-CiSHWNC4.js.map +1 -1
  368. package/dist/esm/stencil-BV-7pO4q.js.map +1 -1
  369. package/dist/esm/streamAttributes-Cp8PEH9A.js.map +1 -1
  370. package/dist/esm/templates-DRh4_Z-g.js.map +1 -1
  371. package/dist/esm/util-BCZZYmp4.js.map +1 -1
  372. package/dist/esm/utils-BvZ9-fs0.js.map +1 -1
  373. package/dist/esm/utils-DC86ZXai.js.map +1 -1
  374. package/dist/esm/utils-D_pIldrS.js.map +1 -1
  375. package/dist/esm/vertex-scene-tree-notification-banner_4.entry.js +6 -8
  376. package/dist/esm/vertex-scene-tree-notification-banner_4.entry.js.map +1 -1
  377. package/dist/esm/vertex-scene-tree-table-cell.entry.js +1 -1
  378. package/dist/esm/vertex-scene-tree-table-cell.entry.js.map +1 -1
  379. package/dist/esm/vertex-scene-tree.entry.js +2 -2
  380. package/dist/esm/vertex-scene-tree.entry.js.map +1 -1
  381. package/dist/esm/vertex-viewer-box-query-tool.entry.js +2 -2
  382. package/dist/esm/vertex-viewer-box-query-tool.entry.js.map +1 -1
  383. package/dist/esm/vertex-viewer-dom-element_2.entry.js +1 -1
  384. package/dist/esm/vertex-viewer-dom-element_2.entry.js.map +1 -1
  385. package/dist/esm/vertex-viewer-dom-group.entry.js +1 -1
  386. package/dist/esm/vertex-viewer-dom-group.entry.js.map +1 -1
  387. package/dist/esm/vertex-viewer-hit-result-indicator.entry.js +1 -1
  388. package/dist/esm/vertex-viewer-hit-result-indicator.entry.js.map +1 -1
  389. package/dist/esm/vertex-viewer-icon.entry.js.map +1 -1
  390. package/dist/esm/vertex-viewer-markup-arrow_3.entry.js.map +1 -1
  391. package/dist/esm/vertex-viewer-markup-tool.entry.js.map +1 -1
  392. package/dist/esm/vertex-viewer-markup.entry.js +1 -1
  393. package/dist/esm/vertex-viewer-markup.entry.js.map +1 -1
  394. package/dist/esm/vertex-viewer-measurement-details.entry.js.map +1 -1
  395. package/dist/esm/vertex-viewer-measurement-distance.entry.js.map +1 -1
  396. package/dist/esm/vertex-viewer-measurement-line_2.entry.js +2 -2
  397. package/dist/esm/vertex-viewer-measurement-line_2.entry.js.map +1 -1
  398. package/dist/esm/vertex-viewer-measurement-precise.entry.js.map +1 -1
  399. package/dist/esm/vertex-viewer-pin-group.entry.js +2 -2
  400. package/dist/esm/vertex-viewer-pin-group.entry.js.map +1 -1
  401. package/dist/esm/vertex-viewer-pin-label_2.entry.js.map +1 -1
  402. package/dist/esm/vertex-viewer-pin-tool.entry.js +1 -1
  403. package/dist/esm/vertex-viewer-pin-tool.entry.js.map +1 -1
  404. package/dist/esm/vertex-viewer-teleport-tool.entry.js.map +1 -1
  405. package/dist/esm/vertex-viewer-transform-widget.entry.js +4 -5
  406. package/dist/esm/vertex-viewer-transform-widget.entry.js.map +1 -1
  407. package/dist/esm/vertex-viewer-view-cube.entry.js +1 -1
  408. package/dist/esm/vertex-viewer-view-cube.entry.js.map +1 -1
  409. package/dist/esm/vertex-viewer-walk-mode-tool.entry.js.map +1 -1
  410. package/dist/esm/vertex-viewer.entry.js +9 -5
  411. package/dist/esm/vertex-viewer.entry.js.map +1 -1
  412. package/dist/esm/viewport-C8WQZxvx.js.map +1 -1
  413. package/dist/types/regl-shape.d.ts +1 -1
  414. package/dist/viewer/index.esm.js.map +1 -1
  415. package/dist/viewer/{p-eac63070.entry.js → p-051b5154.entry.js} +2 -2
  416. package/dist/viewer/p-051b5154.entry.js.map +1 -0
  417. package/dist/viewer/{p-3d3a7eeb.entry.js → p-0984c51f.entry.js} +2 -2
  418. package/dist/viewer/{p-3d3a7eeb.entry.js.map → p-0984c51f.entry.js.map} +1 -1
  419. package/dist/viewer/{p-864f40c7.entry.js → p-11cf755a.entry.js} +2 -2
  420. package/dist/viewer/p-11cf755a.entry.js.map +1 -0
  421. package/dist/viewer/{p-29d14611.entry.js → p-16775f7d.entry.js} +2 -2
  422. package/dist/viewer/p-16775f7d.entry.js.map +1 -0
  423. package/dist/viewer/{p-5a85cae5.entry.js → p-1eb636f8.entry.js} +2 -2
  424. package/dist/viewer/p-1eb636f8.entry.js.map +1 -0
  425. package/dist/viewer/{p-e993f300.entry.js → p-228d1d43.entry.js} +2 -2
  426. package/dist/viewer/p-228d1d43.entry.js.map +1 -0
  427. package/dist/viewer/p-33f44cc1.entry.js.map +1 -1
  428. package/dist/viewer/{p-3300d3dc.entry.js → p-35601c85.entry.js} +2 -2
  429. package/dist/viewer/p-35601c85.entry.js.map +1 -0
  430. package/dist/viewer/p-47766566.entry.js.map +1 -1
  431. package/dist/viewer/p-6e3a6bbd.entry.js.map +1 -1
  432. package/dist/viewer/p-7f388b45.entry.js.map +1 -1
  433. package/dist/viewer/p-89544066.entry.js.map +1 -1
  434. package/dist/viewer/{p-07b99ac9.entry.js → p-8c369777.entry.js} +2 -2
  435. package/dist/viewer/p-8c369777.entry.js.map +1 -0
  436. package/dist/viewer/{p-e59983dc.entry.js → p-9835c5e2.entry.js} +2 -2
  437. package/dist/viewer/p-9835c5e2.entry.js.map +1 -0
  438. package/dist/viewer/{p-aa95e21a.entry.js → p-9d8ff406.entry.js} +2 -2
  439. package/dist/viewer/p-9d8ff406.entry.js.map +1 -0
  440. package/dist/viewer/p-BDvACHun.js.map +1 -1
  441. package/dist/viewer/p-BIkuvTVH.js.map +1 -1
  442. package/dist/viewer/p-BRPkbTVP.js.map +1 -1
  443. package/dist/viewer/p-BsBIynwj.js.map +1 -1
  444. package/dist/viewer/p-BxtKMwBH.js.map +1 -1
  445. package/dist/viewer/p-C4y4Noe-.js.map +1 -1
  446. package/dist/viewer/p-C6KrfydC.js.map +1 -1
  447. package/dist/viewer/p-C7dYsPFU.js.map +1 -1
  448. package/dist/viewer/p-C9Cqbq6H.js.map +1 -1
  449. package/dist/viewer/p-CVWO4w6b.js.map +1 -1
  450. package/dist/viewer/p-ChqXy0cG.js.map +1 -1
  451. package/dist/viewer/p-CiSHWNC4.js.map +1 -1
  452. package/dist/viewer/p-CjG1fMh1.js.map +1 -1
  453. package/dist/viewer/p-Cs5KOvOQ.js.map +1 -1
  454. package/dist/viewer/p-CyGlYje2.js.map +1 -1
  455. package/dist/viewer/p-D6eJC1q4.js.map +1 -1
  456. package/dist/viewer/p-DC86ZXai.js.map +1 -1
  457. package/dist/viewer/p-DRh4_Z-g.js.map +1 -1
  458. package/dist/viewer/p-DUX5FvBC.js.map +1 -1
  459. package/dist/viewer/p-DX6pEG54.js.map +1 -1
  460. package/dist/viewer/p-D_ixWHO7.js.map +1 -1
  461. package/dist/viewer/p-DacE-wPp.js.map +1 -1
  462. package/dist/viewer/p-Dp56p_jX.js.map +1 -1
  463. package/dist/viewer/p-EsKoKfmx.js.map +1 -1
  464. package/dist/viewer/p-F8e15or2.js.map +1 -1
  465. package/dist/viewer/p-Jfxh0jq9.js.map +1 -1
  466. package/dist/viewer/p-WPRMWirY.js.map +1 -1
  467. package/dist/viewer/p-_93RRNxT.js.map +1 -1
  468. package/dist/viewer/p-a8a81cba.entry.js +5 -0
  469. package/dist/viewer/p-a8a81cba.entry.js.map +1 -0
  470. package/dist/viewer/p-a9282481.entry.js.map +1 -1
  471. package/dist/viewer/{p-63f4f702.entry.js → p-c7e62d66.entry.js} +2 -2
  472. package/dist/viewer/p-c7e62d66.entry.js.map +1 -0
  473. package/dist/viewer/p-d37e647b.entry.js.map +1 -1
  474. package/dist/viewer/{p-302f2078.entry.js → p-d9fe788f.entry.js} +2 -2
  475. package/dist/viewer/p-d9fe788f.entry.js.map +1 -0
  476. package/dist/viewer/p-e9b83dae.entry.js.map +1 -1
  477. package/dist/viewer/{p-70f3629d.entry.js → p-f271dc4a.entry.js} +2 -2
  478. package/dist/viewer/p-f271dc4a.entry.js.map +1 -0
  479. package/dist/viewer/p-f65c0769.entry.js.map +1 -1
  480. package/dist/viewer/viewer.esm.js +1 -1
  481. package/package.json +7 -7
  482. package/dist/components/p-B80hfIq6.js.map +0 -1
  483. package/dist/components/p-BopQW1sA.js.map +0 -1
  484. package/dist/components/p-DNtS2F8J.js +0 -5
  485. package/dist/components/p-DNtS2F8J.js.map +0 -1
  486. package/dist/components/p-Doltf1wO.js.map +0 -1
  487. package/dist/components/p-b0ZzPHz8.js.map +0 -1
  488. package/dist/viewer/p-07b99ac9.entry.js.map +0 -1
  489. package/dist/viewer/p-29d14611.entry.js.map +0 -1
  490. package/dist/viewer/p-302f2078.entry.js.map +0 -1
  491. package/dist/viewer/p-3300d3dc.entry.js.map +0 -1
  492. package/dist/viewer/p-5a85cae5.entry.js.map +0 -1
  493. package/dist/viewer/p-60c915e3.entry.js +0 -5
  494. package/dist/viewer/p-60c915e3.entry.js.map +0 -1
  495. package/dist/viewer/p-63f4f702.entry.js.map +0 -1
  496. package/dist/viewer/p-70f3629d.entry.js.map +0 -1
  497. package/dist/viewer/p-864f40c7.entry.js.map +0 -1
  498. package/dist/viewer/p-aa95e21a.entry.js.map +0 -1
  499. package/dist/viewer/p-e59983dc.entry.js.map +0 -1
  500. package/dist/viewer/p-e993f300.entry.js.map +0 -1
  501. package/dist/viewer/p-eac63070.entry.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"standardView.js","sourceRoot":"","sources":["../../../../../src/lib/types/standardView.ts"],"names":[],"mappings":"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","sourcesContent":["import { Matrix4, Vector3 } from '@vertexvis/geometry';\n\n/**\n * A `StandardView` represents common view orientations for a camera.\n */\nexport class StandardView {\n /**\n * A standard view that positions the camera facing the front of the scene.\n */\n public static FRONT = new StandardView(Vector3.back(), Vector3.up());\n\n /**\n * A standard view that positions the camera facing the right of the scene.\n */\n public static RIGHT = new StandardView(Vector3.right(), Vector3.up());\n\n /**\n * A standard view that positions the camera facing the left of the scene.\n */\n public static LEFT = new StandardView(Vector3.left(), Vector3.up());\n\n /**\n * A standard view that positions the camera facing the back of the scene.\n */\n public static BACK = new StandardView(Vector3.forward(), Vector3.up());\n\n /**\n * A standard view that positions the camera facing the top of the scene.\n */\n public static TOP = new StandardView(Vector3.up(), Vector3.forward());\n\n /**\n * A standard view that positions the camera facing the bottom of the scene.\n */\n public static BOTTOM = new StandardView(Vector3.down(), Vector3.back());\n\n /**\n * A standard view that positions the camera facing the top-front-right of the\n * scene.\n */\n public static TOP_FRONT_RIGHT = new StandardView(\n Vector3.add(Vector3.back(), Vector3.up(), Vector3.left()),\n Vector3.up()\n );\n\n /**\n * A standard view that positions the camera facing the top-front-left of the\n * scene.\n */\n public static TOP_FRONT_LEFT = new StandardView(\n Vector3.add(Vector3.back(), Vector3.up(), Vector3.right()),\n Vector3.up()\n );\n\n /**\n * A standard view that positions the camera facing the bottom-front-right of\n * the scene.\n */\n public static BOTTOM_FRONT_RIGHT = new StandardView(\n Vector3.add(Vector3.back(), Vector3.down(), Vector3.left()),\n Vector3.up()\n );\n\n /**\n * A standard view that positions the camera facing the bottom-front-left of\n * the scene.\n */\n public static BOTTOM_FRONT_LEFT = new StandardView(\n Vector3.add(Vector3.back(), Vector3.down(), Vector3.right()),\n Vector3.up()\n );\n\n /**\n * A standard view that positions the camera facing the top-back-left of the\n * scene.\n */\n public static TOP_BACK_LEFT = new StandardView(\n Vector3.add(Vector3.forward(), Vector3.up(), Vector3.right()),\n Vector3.up()\n );\n\n /**\n * A standard view that positions the camera facing the top-back-right of the\n * scene.\n */\n public static TOP_BACK_RIGHT = new StandardView(\n Vector3.add(Vector3.forward(), Vector3.up(), Vector3.left()),\n Vector3.up()\n );\n\n /**\n * A standard view that positions the camera facing the bottom-back-left of\n * the scene.\n */\n public static BOTTOM_BACK_LEFT = new StandardView(\n Vector3.add(Vector3.forward(), Vector3.down(), Vector3.right()),\n Vector3.up()\n );\n\n /**\n * A standard view that positions the camera facing the bottom-back-right of\n * the scene.\n */\n public static BOTTOM_BACK_RIGHT = new StandardView(\n Vector3.add(Vector3.forward(), Vector3.down(), Vector3.left()),\n Vector3.up()\n );\n\n /**\n * A standard view that positions the camera facing the top-front of the\n * scene.\n */\n public static TOP_FRONT = new StandardView(\n Vector3.add(Vector3.back(), Vector3.up()),\n Vector3.up()\n );\n\n /**\n * A standard view that positions the camera facing the bottom-front of the\n * scene.\n */\n public static BOTTOM_FRONT = new StandardView(\n Vector3.add(Vector3.back(), Vector3.down()),\n Vector3.up()\n );\n\n /**\n * A standard view that positions the camera facing the front-right of the\n * scene.\n */\n public static FRONT_RIGHT = new StandardView(\n Vector3.add(Vector3.back(), Vector3.left()),\n Vector3.up()\n );\n\n /**\n * A standard view that positions the camera facing the front-left of the\n * scene.\n */\n public static FRONT_LEFT = new StandardView(\n Vector3.add(Vector3.back(), Vector3.right()),\n Vector3.up()\n );\n\n /**\n * A standard view that positions the camera facing the top-back of the scene.\n */\n public static TOP_BACK = new StandardView(\n Vector3.add(Vector3.forward(), Vector3.up()),\n Vector3.up()\n );\n\n /**\n * A standard view that positions the camera facing the bottom-back of the\n * scene.\n */\n public static BOTTOM_BACK = new StandardView(\n Vector3.add(Vector3.forward(), Vector3.down()),\n Vector3.up()\n );\n\n /**\n * A standard view that positions the camera facing the back-left of the\n * scene.\n */\n public static BACK_LEFT = new StandardView(\n Vector3.add(Vector3.forward(), Vector3.right()),\n Vector3.up()\n );\n\n /**\n * A standard view that positions the camera facing the back-right of the\n * scene.\n */\n public static BACK_RIGHT = new StandardView(\n Vector3.add(Vector3.forward(), Vector3.left()),\n Vector3.up()\n );\n\n /**\n * A standard view that positions the camera facing the top-left of the scene.\n */\n public static TOP_LEFT = new StandardView(\n Vector3.add(Vector3.up(), Vector3.right()),\n Vector3.up()\n );\n\n /**\n * A standard view that positions the camera facing the top-right of the\n * scene.\n */\n public static TOP_RIGHT = new StandardView(\n Vector3.add(Vector3.up(), Vector3.left()),\n Vector3.up()\n );\n\n /**\n * A standard view that positions the camera facing the bottom-left of the\n * scene.\n */\n public static BOTTOM_LEFT = new StandardView(\n Vector3.add(Vector3.down(), Vector3.right()),\n Vector3.up()\n );\n\n /**\n * A standard view that positions the camera facing the bottom-right of the\n * scene.\n */\n public static BOTTOM_RIGHT = new StandardView(\n Vector3.add(Vector3.down(), Vector3.left()),\n Vector3.up()\n );\n\n public constructor(\n /**\n * The position vector of the standard view.\n */\n public readonly position: Vector3.Vector3,\n\n /**\n * The up vector of the standard view.\n */\n public readonly up: Vector3.Vector3\n ) {}\n\n /**\n * Returns a new standard view where the position and up vectors are\n * transformed with the given matrix.\n *\n * @param matrix A matrix.\n * @returns A new standard view.\n */\n public transformMatrix(matrix: Matrix4.Matrix4): StandardView {\n const newPosition = Vector3.transformMatrix(this.position, matrix);\n const newUp = Vector3.transformMatrix(this.up, matrix);\n return new StandardView(newPosition, newUp);\n }\n}\n"]}
1
+ {"version":3,"file":"standardView.js","sourceRoot":"","sources":["../../../../../src/lib/types/standardView.ts"],"names":[],"mappings":"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","sourcesContent":["import { Matrix4, Vector3 } from '@vertexvis/geometry';\n\n/**\n * A `StandardView` represents common view orientations for a camera.\n */\nexport class StandardView {\n /**\n * A standard view that positions the camera facing the front of the scene.\n */\n public static FRONT = new StandardView(Vector3.back(), Vector3.up());\n\n /**\n * A standard view that positions the camera facing the right of the scene.\n */\n public static RIGHT = new StandardView(Vector3.right(), Vector3.up());\n\n /**\n * A standard view that positions the camera facing the left of the scene.\n */\n public static LEFT = new StandardView(Vector3.left(), Vector3.up());\n\n /**\n * A standard view that positions the camera facing the back of the scene.\n */\n public static BACK = new StandardView(Vector3.forward(), Vector3.up());\n\n /**\n * A standard view that positions the camera facing the top of the scene.\n */\n public static TOP = new StandardView(Vector3.up(), Vector3.forward());\n\n /**\n * A standard view that positions the camera facing the bottom of the scene.\n */\n public static BOTTOM = new StandardView(Vector3.down(), Vector3.back());\n\n /**\n * A standard view that positions the camera facing the top-front-right of the\n * scene.\n */\n public static TOP_FRONT_RIGHT = new StandardView(\n Vector3.add(Vector3.back(), Vector3.up(), Vector3.left()),\n Vector3.up(),\n );\n\n /**\n * A standard view that positions the camera facing the top-front-left of the\n * scene.\n */\n public static TOP_FRONT_LEFT = new StandardView(\n Vector3.add(Vector3.back(), Vector3.up(), Vector3.right()),\n Vector3.up(),\n );\n\n /**\n * A standard view that positions the camera facing the bottom-front-right of\n * the scene.\n */\n public static BOTTOM_FRONT_RIGHT = new StandardView(\n Vector3.add(Vector3.back(), Vector3.down(), Vector3.left()),\n Vector3.up(),\n );\n\n /**\n * A standard view that positions the camera facing the bottom-front-left of\n * the scene.\n */\n public static BOTTOM_FRONT_LEFT = new StandardView(\n Vector3.add(Vector3.back(), Vector3.down(), Vector3.right()),\n Vector3.up(),\n );\n\n /**\n * A standard view that positions the camera facing the top-back-left of the\n * scene.\n */\n public static TOP_BACK_LEFT = new StandardView(\n Vector3.add(Vector3.forward(), Vector3.up(), Vector3.right()),\n Vector3.up(),\n );\n\n /**\n * A standard view that positions the camera facing the top-back-right of the\n * scene.\n */\n public static TOP_BACK_RIGHT = new StandardView(\n Vector3.add(Vector3.forward(), Vector3.up(), Vector3.left()),\n Vector3.up(),\n );\n\n /**\n * A standard view that positions the camera facing the bottom-back-left of\n * the scene.\n */\n public static BOTTOM_BACK_LEFT = new StandardView(\n Vector3.add(Vector3.forward(), Vector3.down(), Vector3.right()),\n Vector3.up(),\n );\n\n /**\n * A standard view that positions the camera facing the bottom-back-right of\n * the scene.\n */\n public static BOTTOM_BACK_RIGHT = new StandardView(\n Vector3.add(Vector3.forward(), Vector3.down(), Vector3.left()),\n Vector3.up(),\n );\n\n /**\n * A standard view that positions the camera facing the top-front of the\n * scene.\n */\n public static TOP_FRONT = new StandardView(\n Vector3.add(Vector3.back(), Vector3.up()),\n Vector3.up(),\n );\n\n /**\n * A standard view that positions the camera facing the bottom-front of the\n * scene.\n */\n public static BOTTOM_FRONT = new StandardView(\n Vector3.add(Vector3.back(), Vector3.down()),\n Vector3.up(),\n );\n\n /**\n * A standard view that positions the camera facing the front-right of the\n * scene.\n */\n public static FRONT_RIGHT = new StandardView(\n Vector3.add(Vector3.back(), Vector3.left()),\n Vector3.up(),\n );\n\n /**\n * A standard view that positions the camera facing the front-left of the\n * scene.\n */\n public static FRONT_LEFT = new StandardView(\n Vector3.add(Vector3.back(), Vector3.right()),\n Vector3.up(),\n );\n\n /**\n * A standard view that positions the camera facing the top-back of the scene.\n */\n public static TOP_BACK = new StandardView(\n Vector3.add(Vector3.forward(), Vector3.up()),\n Vector3.up(),\n );\n\n /**\n * A standard view that positions the camera facing the bottom-back of the\n * scene.\n */\n public static BOTTOM_BACK = new StandardView(\n Vector3.add(Vector3.forward(), Vector3.down()),\n Vector3.up(),\n );\n\n /**\n * A standard view that positions the camera facing the back-left of the\n * scene.\n */\n public static BACK_LEFT = new StandardView(\n Vector3.add(Vector3.forward(), Vector3.right()),\n Vector3.up(),\n );\n\n /**\n * A standard view that positions the camera facing the back-right of the\n * scene.\n */\n public static BACK_RIGHT = new StandardView(\n Vector3.add(Vector3.forward(), Vector3.left()),\n Vector3.up(),\n );\n\n /**\n * A standard view that positions the camera facing the top-left of the scene.\n */\n public static TOP_LEFT = new StandardView(\n Vector3.add(Vector3.up(), Vector3.right()),\n Vector3.up(),\n );\n\n /**\n * A standard view that positions the camera facing the top-right of the\n * scene.\n */\n public static TOP_RIGHT = new StandardView(\n Vector3.add(Vector3.up(), Vector3.left()),\n Vector3.up(),\n );\n\n /**\n * A standard view that positions the camera facing the bottom-left of the\n * scene.\n */\n public static BOTTOM_LEFT = new StandardView(\n Vector3.add(Vector3.down(), Vector3.right()),\n Vector3.up(),\n );\n\n /**\n * A standard view that positions the camera facing the bottom-right of the\n * scene.\n */\n public static BOTTOM_RIGHT = new StandardView(\n Vector3.add(Vector3.down(), Vector3.left()),\n Vector3.up(),\n );\n\n public constructor(\n /**\n * The position vector of the standard view.\n */\n public readonly position: Vector3.Vector3,\n\n /**\n * The up vector of the standard view.\n */\n public readonly up: Vector3.Vector3,\n ) {}\n\n /**\n * Returns a new standard view where the position and up vectors are\n * transformed with the given matrix.\n *\n * @param matrix A matrix.\n * @returns A new standard view.\n */\n public transformMatrix(matrix: Matrix4.Matrix4): StandardView {\n const newPosition = Vector3.transformMatrix(this.position, matrix);\n const newUp = Vector3.transformMatrix(this.up, matrix);\n return new StandardView(newPosition, newUp);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"stencilBuffer.js","sourceRoot":"","sources":["../../../../../src/lib/types/stencilBuffer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Point } from '@vertexvis/geometry';\nimport type { DecodedPng } from 'fast-png';\n\nimport { decodePng } from '../../workers/png-decoder-pool';\nimport { fromPbStencilBufferOrThrow } from '../mappers';\nimport { DepthBuffer } from './depthBuffer';\nimport { FrameImageLike } from './frame';\nimport { ImageAttributesLike } from './frame';\n\n/**\n * A value that represents if a pixel does not contain a stencil value.\n */\nexport const STENCIL_BUFFER_EMPTY_VALUE = 0;\n\n/**\n * A value that represents if a pixel contains a feature.\n */\nexport const STENCIL_BUFFER_FEATURE_VALUE = 255;\n\nfunction asBlobPart(bytes: Uint8Array): ArrayBuffer {\n const copy = new Uint8Array(bytes.byteLength);\n copy.set(bytes);\n return copy.buffer;\n}\n\n/**\n * The `StencilBufferManager` manages the stencil buffer state for the viewer.\n * Stencil buffers are represented as images and contain additional information\n * related to the rendered frame. Examples of information contained within a\n * stencil buffer include: cross section and feature edge positions.\n *\n * This class contains methods for fetching a stencil buffer for the currently\n * rendered frame, as well as helpers that components can use to get an\n * up-to-date stencil buffer after any interactions are performed.\n */\nexport class StencilBufferManager {\n private pendingStencilBuffer?: Promise<StencilBuffer | undefined>;\n private pendingInteractionFinished?: Promise<void>;\n private pendingInteractionFinishedResolver?: () => void;\n\n /**\n * Constructs a new stencil buffer manager.\n *\n * **Note:** This class is only intended to be constructed by a viewer.\n *\n * @param viewer The viewer for this manager.\n */\n public constructor(private viewer: HTMLVertexViewerElement) {\n viewer.addEventListener(\n 'interactionStarted',\n this.handleInteractionStarted\n );\n viewer.addEventListener(\n 'interactionFinished',\n this.handleInteractionFinished\n );\n viewer.addEventListener('frameReceived', () => {\n this.invalidateStencilBuffer();\n });\n }\n\n /**\n * Fetches a stencil buffer for the last rendered frame. Returns `undefined`\n * if the last frame does not have stencil information.\n */\n public async fetch(): Promise<StencilBuffer | undefined> {\n const isReady = await this.viewer.isSceneReady();\n const scene = isReady ? await this.viewer.scene() : undefined;\n const hasStencil =\n scene != null\n ? scene.crossSectioning().current().sectionPlanes.length > 0 ||\n this.viewer.featureLines != null\n : false;\n const camera = this.viewer.frame?.scene.camera;\n\n if (hasStencil && this.viewer.stream != null && camera != null) {\n const res = await this.viewer.stream.getStencilBuffer({\n includeDepthBuffer: true,\n });\n const {\n stencilBuffer: sBytes,\n depthBuffer: dBytes,\n imageAttributes,\n } = fromPbStencilBufferOrThrow(res);\n\n const [stencilPng, depthPng] = await Promise.all([\n decodePng(new Uint8Array(sBytes)),\n decodePng(new Uint8Array(dBytes)),\n ]);\n\n return StencilBuffer.fromPng(\n stencilPng,\n imageAttributes,\n sBytes,\n DepthBuffer.fromPng(depthPng, camera, imageAttributes)\n );\n } else return undefined;\n }\n\n /**\n * Returns a promise that resolves with the last generated stencil buffer, or\n * fetches a new stencil buffer if the frame has changed since the last\n * stencil buffer was fetched. Because the stencil buffer is cached by the\n * manager, this method can be called multiple times without performing a\n * network request.\n *\n * @see {@link StencilBufferManager.latestAfterInteraction} to wait for\n * requesting a stencil buffer after an interaction has finished.\n */\n public latest(): Promise<StencilBuffer | undefined> {\n if (this.pendingStencilBuffer == null) {\n this.pendingStencilBuffer = this.fetch();\n }\n return this.pendingStencilBuffer;\n }\n\n /**\n * Returns a promise that resolves with the latest stencil buffer, once any\n * interaction is being performed. If no interaction is being performed, then\n * the promise will resolve immediately with the latest stencil buffer.\n *\n * This method is useful for components to fetch the most up-to-date stencil\n * buffer. Because the stencil buffer is cached by the manager, components can\n * call this method multiple times without performing a network request.\n *\n * @see {@link StencilBufferManager.latest} - used internally by this method.\n */\n public async latestAfterInteraction(): Promise<StencilBuffer | undefined> {\n await this.pendingInteractionFinished;\n return this.latest();\n }\n\n private handleInteractionStarted = (): void => {\n this.invalidateStencilBuffer();\n\n this.pendingInteractionFinished = new Promise((resolve) => {\n this.pendingInteractionFinishedResolver = resolve;\n });\n };\n\n private handleInteractionFinished = (): void => {\n this.pendingInteractionFinishedResolver?.();\n this.pendingInteractionFinished = undefined;\n this.pendingInteractionFinishedResolver = undefined;\n };\n\n private invalidateStencilBuffer = (): void => {\n this.pendingStencilBuffer = undefined;\n };\n}\n\n/**\n * Represents a stencil buffer that is managed by `StencilBufferManager`.\n *\n * @see {@link StencilBufferManager} for fetching a stencil buffer.\n */\nexport class StencilBuffer implements FrameImageLike {\n /**\n * Constructor.\n *\n * @param imageAttr The attributes of the stencil image.\n * @param imageBytes The original bytes for the image of the stencil buffer.\n * @param pixelBytes The PNG pixel data of the stencil buffer.\n * @param imageChannels The number of color channels.\n * @param depthBuffer The depth buffer associated with this stencil buffer.\n */\n public constructor(\n public readonly imageAttr: ImageAttributesLike,\n public readonly imageBytes: Uint8Array,\n public readonly pixelBytes: Uint8Array,\n public readonly imageChannels: number,\n public readonly depthBuffer: DepthBuffer\n ) {}\n\n /**\n * Constructs a new stencil buffer from a decoded PNG.\n *\n * @param png The decoded PNG.\n * @param imageAttr The attributes of the stencil image.\n * * @param imageBytes The original bytes for the image of the stencil buffer.\n * @param depthBuffer The depth buffer associated with this stencil buffer.\n */\n public static fromPng(\n png: Pick<DecodedPng, 'data' | 'channels'>,\n imageAttr: ImageAttributesLike,\n imageBytes: Uint8Array,\n depthBuffer: DepthBuffer\n ): StencilBuffer {\n if (!(png.data instanceof Uint8Array)) {\n throw new Error('Expected stencil PNG to have depth of 8-bit');\n } else if (png.channels !== 1) {\n throw new Error('Expected stencil PNG to have 1 color channel');\n } else {\n return new StencilBuffer(\n imageAttr,\n imageBytes,\n png.data,\n png.channels,\n depthBuffer\n );\n }\n }\n\n /**\n * Returns the color at the given frame position.\n *\n * @param pt A position within the frame.\n * @returns A color at the given position, or `undefined` if the color matches\n * the stencil buffer's empty color.\n * @see {@link Viewport.transformPointToFrame} to convert a viewport position\n * to frame position.\n */\n public getValue(pt: Point.Point): number {\n const { width, height } = this.imageAttr.imageRect;\n const offset = Point.subtract(pt, this.imageAttr.imageRect);\n const scale = 1 / this.imageAttr.imageScale;\n const pixel = Point.scale(offset, scale, scale);\n\n if (pixel.x >= 0 && pixel.y >= 0 && pixel.x < width && pixel.y < height) {\n const index = Math.floor(pixel.x) + Math.floor(pixel.y) * width;\n const value = this.pixelBytes[index];\n return value;\n } else return 0;\n }\n\n /**\n * Performs a hit test of the given point. Returns `true` if the point hits a\n * pixel in the stencil.\n *\n * @param pt A point within the stencil's frame.\n * @returns `true` if the point hits a pixel in the stencil, `false`\n * otherwise.\n */\n public hitTest(pt: Point.Point): boolean {\n return this.getValue(pt) !== STENCIL_BUFFER_EMPTY_VALUE;\n }\n\n /**\n * Returns the colored pixel nearest to the given `pt`. This method is useful\n * for performing snapping operations. An optional predicate can be provided\n * to filter the pixels that are evaluated.\n *\n * @param pt A position within the frame.\n * @param radius The radius around `pt` to evaluate.\n * @param predicate An optional predicate. If unspecified, any non-black\n * pixels are considered.\n * @returns A point within radius that matches the given predicate.\n * @see {@link Viewport.transformPointToFrame} to convert a viewport position\n * to frame position.\n */\n public snapToNearestPixel(\n pt: Point.Point,\n radius: number,\n predicate: (value: number) => boolean = () => true\n ): Point.Point {\n const diameter = radius * 2;\n const topLeft = Point.create(pt.x - radius, pt.y - radius);\n\n const pixels: Point.Point[] = [];\n\n for (let i = 0; i < diameter * diameter; i++) {\n const x = i % diameter;\n const y = Math.floor(i / diameter);\n const pixel = Point.add(topLeft, { x, y });\n\n if (Point.distance(pixel, pt) <= radius) {\n const value = this.getValue(pixel);\n if (value === STENCIL_BUFFER_FEATURE_VALUE && predicate(value)) {\n pixels.push(pixel);\n }\n }\n }\n\n const sorted = pixels.sort(\n (a, b) => Point.distance(a, pt) - Point.distance(b, pt)\n );\n const closest = sorted[0];\n return closest != null\n ? Point.create(Math.floor(closest.x) + 0.5, Math.floor(closest.y) + 0.5)\n : pt;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nasync function debugStencilBuffer(imageBytes: Uint8Array): Promise<void> {\n const blob = new Blob([asBlobPart(imageBytes)]);\n const bitmap = await createImageBitmap(blob);\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n\n canvas.width = bitmap.width;\n canvas.height = bitmap.height;\n\n context?.drawImage(bitmap, 0, 0);\n\n console.log(canvas.toDataURL());\n}\n"]}
1
+ {"version":3,"file":"stencilBuffer.js","sourceRoot":"","sources":["../../../../../src/lib/types/stencilBuffer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Point } from '@vertexvis/geometry';\nimport type { DecodedPng } from 'fast-png';\n\nimport { decodePng } from '../../workers/png-decoder-pool';\nimport { fromPbStencilBufferOrThrow } from '../mappers';\nimport { DepthBuffer } from './depthBuffer';\nimport { FrameImageLike } from './frame';\nimport { ImageAttributesLike } from './frame';\n\n/**\n * A value that represents if a pixel does not contain a stencil value.\n */\nexport const STENCIL_BUFFER_EMPTY_VALUE = 0;\n\n/**\n * A value that represents if a pixel contains a feature.\n */\nexport const STENCIL_BUFFER_FEATURE_VALUE = 255;\n\nfunction asBlobPart(bytes: Uint8Array): ArrayBuffer {\n const copy = new Uint8Array(bytes.byteLength);\n copy.set(bytes);\n return copy.buffer;\n}\n\n/**\n * The `StencilBufferManager` manages the stencil buffer state for the viewer.\n * Stencil buffers are represented as images and contain additional information\n * related to the rendered frame. Examples of information contained within a\n * stencil buffer include: cross section and feature edge positions.\n *\n * This class contains methods for fetching a stencil buffer for the currently\n * rendered frame, as well as helpers that components can use to get an\n * up-to-date stencil buffer after any interactions are performed.\n */\nexport class StencilBufferManager {\n private pendingStencilBuffer?: Promise<StencilBuffer | undefined>;\n private pendingInteractionFinished?: Promise<void>;\n private pendingInteractionFinishedResolver?: () => void;\n\n /**\n * Constructs a new stencil buffer manager.\n *\n * **Note:** This class is only intended to be constructed by a viewer.\n *\n * @param viewer The viewer for this manager.\n */\n public constructor(private viewer: HTMLVertexViewerElement) {\n viewer.addEventListener(\n 'interactionStarted',\n this.handleInteractionStarted,\n );\n viewer.addEventListener(\n 'interactionFinished',\n this.handleInteractionFinished,\n );\n viewer.addEventListener('frameReceived', () => {\n this.invalidateStencilBuffer();\n });\n }\n\n /**\n * Fetches a stencil buffer for the last rendered frame. Returns `undefined`\n * if the last frame does not have stencil information.\n */\n public async fetch(): Promise<StencilBuffer | undefined> {\n const isReady = await this.viewer.isSceneReady();\n const scene = isReady ? await this.viewer.scene() : undefined;\n const hasStencil =\n scene != null\n ? scene.crossSectioning().current().sectionPlanes.length > 0 ||\n this.viewer.featureLines != null\n : false;\n const camera = this.viewer.frame?.scene.camera;\n\n if (hasStencil && this.viewer.stream != null && camera != null) {\n const res = await this.viewer.stream.getStencilBuffer({\n includeDepthBuffer: true,\n });\n const {\n stencilBuffer: sBytes,\n depthBuffer: dBytes,\n imageAttributes,\n } = fromPbStencilBufferOrThrow(res);\n\n const [stencilPng, depthPng] = await Promise.all([\n decodePng(new Uint8Array(sBytes)),\n decodePng(new Uint8Array(dBytes)),\n ]);\n\n return StencilBuffer.fromPng(\n stencilPng,\n imageAttributes,\n sBytes,\n DepthBuffer.fromPng(depthPng, camera, imageAttributes),\n );\n } else return undefined;\n }\n\n /**\n * Returns a promise that resolves with the last generated stencil buffer, or\n * fetches a new stencil buffer if the frame has changed since the last\n * stencil buffer was fetched. Because the stencil buffer is cached by the\n * manager, this method can be called multiple times without performing a\n * network request.\n *\n * @see {@link StencilBufferManager.latestAfterInteraction} to wait for\n * requesting a stencil buffer after an interaction has finished.\n */\n public latest(): Promise<StencilBuffer | undefined> {\n if (this.pendingStencilBuffer == null) {\n this.pendingStencilBuffer = this.fetch();\n }\n return this.pendingStencilBuffer;\n }\n\n /**\n * Returns a promise that resolves with the latest stencil buffer, once any\n * interaction is being performed. If no interaction is being performed, then\n * the promise will resolve immediately with the latest stencil buffer.\n *\n * This method is useful for components to fetch the most up-to-date stencil\n * buffer. Because the stencil buffer is cached by the manager, components can\n * call this method multiple times without performing a network request.\n *\n * @see {@link StencilBufferManager.latest} - used internally by this method.\n */\n public async latestAfterInteraction(): Promise<StencilBuffer | undefined> {\n await this.pendingInteractionFinished;\n return this.latest();\n }\n\n private handleInteractionStarted = (): void => {\n this.invalidateStencilBuffer();\n\n this.pendingInteractionFinished = new Promise((resolve) => {\n this.pendingInteractionFinishedResolver = resolve;\n });\n };\n\n private handleInteractionFinished = (): void => {\n this.pendingInteractionFinishedResolver?.();\n this.pendingInteractionFinished = undefined;\n this.pendingInteractionFinishedResolver = undefined;\n };\n\n private invalidateStencilBuffer = (): void => {\n this.pendingStencilBuffer = undefined;\n };\n}\n\n/**\n * Represents a stencil buffer that is managed by `StencilBufferManager`.\n *\n * @see {@link StencilBufferManager} for fetching a stencil buffer.\n */\nexport class StencilBuffer implements FrameImageLike {\n /**\n * Constructor.\n *\n * @param imageAttr The attributes of the stencil image.\n * @param imageBytes The original bytes for the image of the stencil buffer.\n * @param pixelBytes The PNG pixel data of the stencil buffer.\n * @param imageChannels The number of color channels.\n * @param depthBuffer The depth buffer associated with this stencil buffer.\n */\n public constructor(\n public readonly imageAttr: ImageAttributesLike,\n public readonly imageBytes: Uint8Array,\n public readonly pixelBytes: Uint8Array,\n public readonly imageChannels: number,\n public readonly depthBuffer: DepthBuffer,\n ) {}\n\n /**\n * Constructs a new stencil buffer from a decoded PNG.\n *\n * @param png The decoded PNG.\n * @param imageAttr The attributes of the stencil image.\n * * @param imageBytes The original bytes for the image of the stencil buffer.\n * @param depthBuffer The depth buffer associated with this stencil buffer.\n */\n public static fromPng(\n png: Pick<DecodedPng, 'data' | 'channels'>,\n imageAttr: ImageAttributesLike,\n imageBytes: Uint8Array,\n depthBuffer: DepthBuffer,\n ): StencilBuffer {\n if (!(png.data instanceof Uint8Array)) {\n throw new Error('Expected stencil PNG to have depth of 8-bit');\n } else if (png.channels !== 1) {\n throw new Error('Expected stencil PNG to have 1 color channel');\n } else {\n return new StencilBuffer(\n imageAttr,\n imageBytes,\n png.data,\n png.channels,\n depthBuffer,\n );\n }\n }\n\n /**\n * Returns the color at the given frame position.\n *\n * @param pt A position within the frame.\n * @returns A color at the given position, or `undefined` if the color matches\n * the stencil buffer's empty color.\n * @see {@link Viewport.transformPointToFrame} to convert a viewport position\n * to frame position.\n */\n public getValue(pt: Point.Point): number {\n const { width, height } = this.imageAttr.imageRect;\n const offset = Point.subtract(pt, this.imageAttr.imageRect);\n const scale = 1 / this.imageAttr.imageScale;\n const pixel = Point.scale(offset, scale, scale);\n\n if (pixel.x >= 0 && pixel.y >= 0 && pixel.x < width && pixel.y < height) {\n const index = Math.floor(pixel.x) + Math.floor(pixel.y) * width;\n const value = this.pixelBytes[index];\n return value;\n } else return 0;\n }\n\n /**\n * Performs a hit test of the given point. Returns `true` if the point hits a\n * pixel in the stencil.\n *\n * @param pt A point within the stencil's frame.\n * @returns `true` if the point hits a pixel in the stencil, `false`\n * otherwise.\n */\n public hitTest(pt: Point.Point): boolean {\n return this.getValue(pt) !== STENCIL_BUFFER_EMPTY_VALUE;\n }\n\n /**\n * Returns the colored pixel nearest to the given `pt`. This method is useful\n * for performing snapping operations. An optional predicate can be provided\n * to filter the pixels that are evaluated.\n *\n * @param pt A position within the frame.\n * @param radius The radius around `pt` to evaluate.\n * @param predicate An optional predicate. If unspecified, any non-black\n * pixels are considered.\n * @returns A point within radius that matches the given predicate.\n * @see {@link Viewport.transformPointToFrame} to convert a viewport position\n * to frame position.\n */\n public snapToNearestPixel(\n pt: Point.Point,\n radius: number,\n predicate: (value: number) => boolean = () => true,\n ): Point.Point {\n const diameter = radius * 2;\n const topLeft = Point.create(pt.x - radius, pt.y - radius);\n\n const pixels: Point.Point[] = [];\n\n for (let i = 0; i < diameter * diameter; i++) {\n const x = i % diameter;\n const y = Math.floor(i / diameter);\n const pixel = Point.add(topLeft, { x, y });\n\n if (Point.distance(pixel, pt) <= radius) {\n const value = this.getValue(pixel);\n if (value === STENCIL_BUFFER_FEATURE_VALUE && predicate(value)) {\n pixels.push(pixel);\n }\n }\n }\n\n const sorted = pixels.sort(\n (a, b) => Point.distance(a, pt) - Point.distance(b, pt),\n );\n const closest = sorted[0];\n return closest != null\n ? Point.create(Math.floor(closest.x) + 0.5, Math.floor(closest.y) + 0.5)\n : pt;\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nasync function debugStencilBuffer(imageBytes: Uint8Array): Promise<void> {\n const blob = new Blob([asBlobPart(imageBytes)]);\n const bitmap = await createImageBitmap(blob);\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n\n canvas.width = bitmap.width;\n canvas.height = bitmap.height;\n\n context?.drawImage(bitmap, 0, 0);\n\n console.log(canvas.toDataURL());\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"synchronizedClock.js","sourceRoot":"","sources":["../../../../../src/lib/types/synchronizedClock.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAO,iBAAiB;IAC5B,YACkB,eAAqB,EACrB,iBAAiB,IAAI,IAAI,EAAE;QAD3B,oBAAe,GAAf,eAAe,CAAM;QACrB,mBAAc,GAAd,cAAc,CAAa;IAC1C,CAAC;IAEJ;;OAEG;IACI,WAAW;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7D,CAAC;IAkBD;;;;OAIG;IACI,SAAS,CAAC,wBAA6C;QAC5D,MAAM,UAAU,GACd,OAAO,wBAAwB,KAAK,QAAQ;YAC1C,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,wBAAwB,CAAC;YACpE,CAAC,CAAC,wBAAwB,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IACzD,CAAC;IAED;;;;OAIG;IACI,YAAY,CAAC,YAAkB,IAAI,IAAI,EAAE;QAC9C,OAAO,IAAI,CAAC,QAAQ,CAClB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,EACpC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAC3B,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,SAAS;QACd,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1C,CAAC;IAiBD;;;;OAIG;IACI,UAAU,CAAC,uBAA4C;QAC5D,MAAM,SAAS,GACb,OAAO,uBAAuB,KAAK,QAAQ;YACzC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,uBAAuB,CAAC;YACnE,CAAC,CAAC,uBAAuB,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAEO,WAAW,CAAC,KAAW,EAAE,QAAsB;QACrD,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAEO,QAAQ,CAAC,KAAW,EAAE,GAAS;QACrC,OAAO,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;IACzC,CAAC;IAEO,QAAQ;QACd,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9B,CAAC;CACF","sourcesContent":["type Milliseconds = number;\n\n/**\n * A `SynchronizedClock` allows for approximating the time on a remote machine.\n *\n * During initialization, a known time of the remote host must be supplied. Once\n * the remote time is known, this class can approximate the time on the remote\n * machine from a date or duration.\n *\n * @example\n * ```\n * const knownRemoteTime = await getRemoteTime();\n * const clock = new SynchronizedClock(knownRemoteTime);\n *\n * const localDate = new Date();\n * const serverTime = clock.remoteTime(localDate);\n *\n * const remoteDate = await getRemoteTime();\n * const localTime = clock.localTime(remoteDate);\n *\n * const currentRemoteTime = clock.remoteNow();\n * ```\n */\nexport class SynchronizedClock {\n public constructor(\n public readonly knownRemoteTime: Date,\n public readonly knownLocalTime = new Date()\n ) {}\n\n /**\n * Computes an offset duration from when this clock was instantiated.\n */\n public localOffset(): Milliseconds {\n return this.duration(this.knownLocalTime, this.localNow());\n }\n\n /**\n * Approximates the local time from a timestamp originating from the remote\n * machine.\n *\n * @param remoteTime A remote timestamp.\n */\n public localTime(remoteTime: Date): Date;\n\n /**\n * Approximates the local from an offset duration originating from the remote\n * machine's last known time.\n *\n * @param remoteDurationInMs A remote duration, in milliseconds.\n */\n public localTime(remoteDurationInMs: Milliseconds): Date;\n\n /**\n * Approximates the local time from a remote timestamp or duration.\n *\n * @param remoteTimeOrDurationInMs A remote timestamp or duration.\n */\n public localTime(remoteTimeOrDurationInMs: Milliseconds | Date): Date {\n const remoteTime =\n typeof remoteTimeOrDurationInMs === 'number'\n ? new Date(this.knownLocalTime.getTime() + remoteTimeOrDurationInMs)\n : remoteTimeOrDurationInMs;\n const duration = this.duration(this.knownRemoteTime, remoteTime);\n return this.addDuration(this.knownLocalTime, duration);\n }\n\n /**\n * Approximates an offset duration on the remote machine.\n *\n * @param localTime A local timestamp. Defaults to the current local time.\n */\n public remoteOffset(localTime: Date = new Date()): Milliseconds {\n return this.duration(\n this.remoteTime(this.knownLocalTime),\n this.remoteTime(localTime)\n );\n }\n\n /**\n * Approximates the current time on the remote machine.\n */\n public remoteNow(): Date {\n return this.remoteTime(this.localNow());\n }\n\n /**\n * Approximates the remote time from a local timestamp.\n *\n * @param localTime A local timestamp.\n */\n public remoteTime(localTime: Date): Date;\n\n /**\n * Approximates the remote time from a local offset duration.\n *\n * @param localDurationInMs A local offset, in milliseconds.\n * @see #localOffset\n */\n public remoteTime(localDurationInMs: Milliseconds): Date;\n\n /**\n * Approximates the remote time from either a local timestamp or duration.\n *\n * @param localTimeOrDurationInMs A local timestamp or duration.\n */\n public remoteTime(localTimeOrDurationInMs: Milliseconds | Date): Date {\n const localTime =\n typeof localTimeOrDurationInMs === 'number'\n ? new Date(this.knownLocalTime.getTime() + localTimeOrDurationInMs)\n : localTimeOrDurationInMs;\n const duration = this.duration(this.knownLocalTime, localTime);\n return this.addDuration(this.knownRemoteTime, duration);\n }\n\n private addDuration(start: Date, duration: Milliseconds): Date {\n return new Date(start.getTime() + duration);\n }\n\n private duration(start: Date, end: Date): Milliseconds {\n return end.getTime() - start.getTime();\n }\n\n private localNow(): Date {\n return new Date(Date.now());\n }\n}\n"]}
1
+ {"version":3,"file":"synchronizedClock.js","sourceRoot":"","sources":["../../../../../src/lib/types/synchronizedClock.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,OAAO,iBAAiB;IAC5B,YACkB,eAAqB,EACrB,iBAAiB,IAAI,IAAI,EAAE;QAD3B,oBAAe,GAAf,eAAe,CAAM;QACrB,mBAAc,GAAd,cAAc,CAAa;IAC1C,CAAC;IAEJ;;OAEG;IACI,WAAW;QAChB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7D,CAAC;IAkBD;;;;OAIG;IACI,SAAS,CAAC,wBAA6C;QAC5D,MAAM,UAAU,GACd,OAAO,wBAAwB,KAAK,QAAQ;YAC1C,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,wBAAwB,CAAC;YACpE,CAAC,CAAC,wBAAwB,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IACzD,CAAC;IAED;;;;OAIG;IACI,YAAY,CAAC,YAAkB,IAAI,IAAI,EAAE;QAC9C,OAAO,IAAI,CAAC,QAAQ,CAClB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,EACpC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAC3B,CAAC;IACJ,CAAC;IAED;;OAEG;IACI,SAAS;QACd,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC1C,CAAC;IAiBD;;;;OAIG;IACI,UAAU,CAAC,uBAA4C;QAC5D,MAAM,SAAS,GACb,OAAO,uBAAuB,KAAK,QAAQ;YACzC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,uBAAuB,CAAC;YACnE,CAAC,CAAC,uBAAuB,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IAC1D,CAAC;IAEO,WAAW,CAAC,KAAW,EAAE,QAAsB;QACrD,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAEO,QAAQ,CAAC,KAAW,EAAE,GAAS;QACrC,OAAO,GAAG,CAAC,OAAO,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;IACzC,CAAC;IAEO,QAAQ;QACd,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC9B,CAAC;CACF","sourcesContent":["type Milliseconds = number;\n\n/**\n * A `SynchronizedClock` allows for approximating the time on a remote machine.\n *\n * During initialization, a known time of the remote host must be supplied. Once\n * the remote time is known, this class can approximate the time on the remote\n * machine from a date or duration.\n *\n * @example\n * ```\n * const knownRemoteTime = await getRemoteTime();\n * const clock = new SynchronizedClock(knownRemoteTime);\n *\n * const localDate = new Date();\n * const serverTime = clock.remoteTime(localDate);\n *\n * const remoteDate = await getRemoteTime();\n * const localTime = clock.localTime(remoteDate);\n *\n * const currentRemoteTime = clock.remoteNow();\n * ```\n */\nexport class SynchronizedClock {\n public constructor(\n public readonly knownRemoteTime: Date,\n public readonly knownLocalTime = new Date(),\n ) {}\n\n /**\n * Computes an offset duration from when this clock was instantiated.\n */\n public localOffset(): Milliseconds {\n return this.duration(this.knownLocalTime, this.localNow());\n }\n\n /**\n * Approximates the local time from a timestamp originating from the remote\n * machine.\n *\n * @param remoteTime A remote timestamp.\n */\n public localTime(remoteTime: Date): Date;\n\n /**\n * Approximates the local from an offset duration originating from the remote\n * machine's last known time.\n *\n * @param remoteDurationInMs A remote duration, in milliseconds.\n */\n public localTime(remoteDurationInMs: Milliseconds): Date;\n\n /**\n * Approximates the local time from a remote timestamp or duration.\n *\n * @param remoteTimeOrDurationInMs A remote timestamp or duration.\n */\n public localTime(remoteTimeOrDurationInMs: Milliseconds | Date): Date {\n const remoteTime =\n typeof remoteTimeOrDurationInMs === 'number'\n ? new Date(this.knownLocalTime.getTime() + remoteTimeOrDurationInMs)\n : remoteTimeOrDurationInMs;\n const duration = this.duration(this.knownRemoteTime, remoteTime);\n return this.addDuration(this.knownLocalTime, duration);\n }\n\n /**\n * Approximates an offset duration on the remote machine.\n *\n * @param localTime A local timestamp. Defaults to the current local time.\n */\n public remoteOffset(localTime: Date = new Date()): Milliseconds {\n return this.duration(\n this.remoteTime(this.knownLocalTime),\n this.remoteTime(localTime),\n );\n }\n\n /**\n * Approximates the current time on the remote machine.\n */\n public remoteNow(): Date {\n return this.remoteTime(this.localNow());\n }\n\n /**\n * Approximates the remote time from a local timestamp.\n *\n * @param localTime A local timestamp.\n */\n public remoteTime(localTime: Date): Date;\n\n /**\n * Approximates the remote time from a local offset duration.\n *\n * @param localDurationInMs A local offset, in milliseconds.\n * @see #localOffset\n */\n public remoteTime(localDurationInMs: Milliseconds): Date;\n\n /**\n * Approximates the remote time from either a local timestamp or duration.\n *\n * @param localTimeOrDurationInMs A local timestamp or duration.\n */\n public remoteTime(localTimeOrDurationInMs: Milliseconds | Date): Date {\n const localTime =\n typeof localTimeOrDurationInMs === 'number'\n ? new Date(this.knownLocalTime.getTime() + localTimeOrDurationInMs)\n : localTimeOrDurationInMs;\n const duration = this.duration(this.knownLocalTime, localTime);\n return this.addDuration(this.knownRemoteTime, duration);\n }\n\n private addDuration(start: Date, duration: Milliseconds): Date {\n return new Date(start.getTime() + duration);\n }\n\n private duration(start: Date, end: Date): Milliseconds {\n return end.getTime() - start.getTime();\n }\n\n private localNow(): Date {\n return new Date(Date.now());\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"viewport.js","sourceRoot":"","sources":["../../../../../src/lib/types/viewport.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Dimensions,\n Matrix4,\n Point,\n Ray,\n Rectangle,\n Vector3,\n} from '@vertexvis/geometry';\n\nimport { DepthBuffer } from './depthBuffer';\nimport type { FrameCameraBase, FrameImageLike } from './frame';\n\n/**\n * A `Viewport` represents the drawing area in the viewer.\n *\n * When a frame is received from the rendering pipeline, it might not be the\n * same dimensions of the viewport because of an interactive frame or because of\n * bandwidth limitations or other performance reasons.\n *\n * The viewport contains methods to scale an image to the viewport, as well as\n * translate 2D coordinates between the viewport and the frame.\n */\nexport class Viewport implements Dimensions.Dimensions {\n /**\n * The center point of the viewport.\n */\n public readonly center: Point.Point;\n\n public constructor(\n /**\n * The width of the viewport.\n */\n public readonly width: number,\n\n /**\n * The height of the viewport.\n */\n public readonly height: number\n ) {\n this.center = Dimensions.center(this.dimensions);\n }\n\n /**\n * Returns a new viewport with the given dimensions.\n * @param dimensions The dimensions of the viewport\n * @returns A new viewport.\n */\n public static fromDimensions(dimensions: Dimensions.Dimensions): Viewport {\n return new Viewport(dimensions.width, dimensions.height);\n }\n\n /**\n * Transforms a normalized device coordinate to a 2D point within the\n * viewport.\n *\n * @param ndc A 2D point in NDC.\n * @returns A 2D point in the coordinate space of the viewport.\n */\n public transformNdcPointToViewport(ndc: Point.Point): Point.Point {\n return Point.create(\n ndc.x * this.center.x + this.center.x,\n -ndc.y * this.center.y + this.center.y\n );\n }\n\n /**\n * Transforms a normalized device coordinate to a 2D point within the\n * viewport.\n *\n * @param ndc A 3D point in NDC.\n * @returns A 2D point in the coordinate space of the viewport.\n */\n public transformVectorToViewport(ndc: Vector3.Vector3): Point.Point {\n return this.transformNdcPointToViewport(ndc);\n }\n\n /**\n * Transforms a world point to 2D point in viewport space.\n *\n * @param worldPt The world point to transform.\n * @param projectionViewMatrix The projection matrix to transform a 3D point to 2D point.\n * @returns A point in viewport space.\n */\n public transformWorldToViewport(\n worldPt: Vector3.Vector3,\n projectionViewMatrix: Matrix4.Matrix4\n ): Point.Point {\n const ndc = Vector3.transformMatrix(worldPt, projectionViewMatrix);\n return this.transformVectorToViewport(ndc);\n }\n\n public transformPointToViewport(\n pt: Point.Point,\n image: FrameImageLike\n ): Point.Point {\n const { x: scaleX, y: scaleY } = this.calculateFrameScale(image);\n return Point.scale(pt, 1 * scaleX, 1 * scaleY);\n }\n\n /**\n * Transforms a point in viewport coordinate space to a point in a frame's\n * coordinate space.\n *\n * @param pt A point in viewport coordinate space.\n * @param image An image of a frame.\n * @returns A point in the coordinate space of the frame.\n */\n public transformPointToFrame(\n pt: Point.Point,\n image: FrameImageLike\n ): Point.Point {\n const { x: scaleX, y: scaleY } = this.calculateFrameScale(image);\n return Point.scale(pt, 1 / scaleX, 1 / scaleY);\n }\n\n /**\n * Transforms a point in viewport coordinates to a point in world space\n * coordinates. This method expects a depth buffer in order to compute a value\n * for the Z axis.\n *\n * @param pt A point in viewport coordinates.\n * @param depthBuffer A depth buffer for computing the Z axis.\n * @param fallbackNormalizedDepth A fallback value if the depth is the max\n * depth value, or cannot be determined.\n * @returns\n */\n public transformPointToWorldSpace(\n pt: Point.Point,\n depthBuffer: DepthBuffer,\n fallbackNormalizedDepth?: number\n ): Vector3.Vector3 {\n const depthPt = this.transformPointToFrame(pt, depthBuffer);\n const ray = this.transformPointToRay(pt, depthBuffer, depthBuffer.camera);\n return depthBuffer.getWorldPoint(depthPt, ray, fallbackNormalizedDepth);\n }\n\n /**\n * Transforms a point in viewport coordinates to a ray.\n *\n * For perspective cameras, the returned ray will have an\n * origin that is at the position of the camera with a direction\n * that is pointing into world space away from the camera.\n *\n * For orthographic cameras, the returned ray will have an\n * origin that is at the world point of viewport coordinate\n * with a direction that is pointing into world space away\n * from the camera.\n *\n * @param pt A point in viewport coordinates.\n * @param image An image of a frame.\n * @param camera A camera used to determine orientation of the scene.\n * @returns A ray\n */\n public transformPointToRay(\n pt: Point.Point,\n image: FrameImageLike,\n camera: FrameCameraBase\n ): Ray.Ray {\n const ndc = this.transformScreenPointToNdc(pt, image);\n\n // Calculate the ray depending on the camera type\n if (camera.isPerspective()) {\n const origin = Vector3.fromMatrixPosition(camera.worldMatrix);\n const lookAtPoint = Vector3.transformNdcToWorldSpace(\n Vector3.create(ndc.x, ndc.y, 0.5),\n camera.worldMatrix,\n camera.projectionMatrixInverse\n );\n const direction = Vector3.normalize(\n Vector3.subtract(lookAtPoint, origin)\n );\n return Ray.create({ origin, direction });\n } else {\n const origin = Vector3.transformNdcToWorldSpace(\n Vector3.create(ndc.x, ndc.y, 0),\n camera.worldMatrix,\n camera.projectionMatrixInverse\n );\n return Ray.create({\n origin,\n direction: Vector3.normalize(camera.viewVector),\n });\n }\n }\n\n /**\n * Maps a screen point to normalized device coordinates (NDC). A screen point\n * at 0,0 represents the top-left of the viewport.\n *\n * @param screenPt A screen point.\n */\n public transformScreenPointToNdc(\n screenPt: Point.Point,\n image: FrameImageLike\n ): Point.Point {\n const framePt = this.transformPointToFrame(screenPt, image);\n return Point.create(\n (framePt.x / image.imageAttr.frameDimensions.width) * 2 - 1,\n -(framePt.y / image.imageAttr.frameDimensions.height) * 2 + 1\n );\n }\n\n /**\n * Computes a rectangle that is scaled correctly to be drawn within the\n * viewport.\n *\n * @param image The image to be drawn.\n * @param imageDimensions The dimensions of the received image.\n * @returns A rectangle.\n */\n public calculateDrawRect(image: FrameImageLike): Rectangle.Rectangle {\n const { x: scaleX, y: scaleY } = this.calculateFrameScale(image);\n return Rectangle.scale(image.imageAttr.imageRect, scaleX, scaleY);\n }\n\n private calculateFrameScale(image: FrameImageLike): Point.Point {\n const { frameDimensions: dimensions } = image.imageAttr;\n\n const imageRect = Rectangle.fromDimensions(dimensions);\n const viewport = Rectangle.fromDimensions(this.dimensions);\n const fit = Rectangle.containFit(viewport, imageRect);\n\n const scaleX = fit.width / imageRect.width;\n const scaleY = fit.height / imageRect.height;\n\n return Point.create(scaleX, scaleY);\n }\n\n public get dimensions(): Dimensions.Dimensions {\n return Dimensions.create(this.width, this.height);\n }\n}\n"]}
1
+ {"version":3,"file":"viewport.js","sourceRoot":"","sources":["../../../../../src/lib/types/viewport.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Dimensions,\n Matrix4,\n Point,\n Ray,\n Rectangle,\n Vector3,\n} from '@vertexvis/geometry';\n\nimport { DepthBuffer } from './depthBuffer';\nimport type { FrameCameraBase, FrameImageLike } from './frame';\n\n/**\n * A `Viewport` represents the drawing area in the viewer.\n *\n * When a frame is received from the rendering pipeline, it might not be the\n * same dimensions of the viewport because of an interactive frame or because of\n * bandwidth limitations or other performance reasons.\n *\n * The viewport contains methods to scale an image to the viewport, as well as\n * translate 2D coordinates between the viewport and the frame.\n */\nexport class Viewport implements Dimensions.Dimensions {\n /**\n * The center point of the viewport.\n */\n public readonly center: Point.Point;\n\n public constructor(\n /**\n * The width of the viewport.\n */\n public readonly width: number,\n\n /**\n * The height of the viewport.\n */\n public readonly height: number,\n ) {\n this.center = Dimensions.center(this.dimensions);\n }\n\n /**\n * Returns a new viewport with the given dimensions.\n * @param dimensions The dimensions of the viewport\n * @returns A new viewport.\n */\n public static fromDimensions(dimensions: Dimensions.Dimensions): Viewport {\n return new Viewport(dimensions.width, dimensions.height);\n }\n\n /**\n * Transforms a normalized device coordinate to a 2D point within the\n * viewport.\n *\n * @param ndc A 2D point in NDC.\n * @returns A 2D point in the coordinate space of the viewport.\n */\n public transformNdcPointToViewport(ndc: Point.Point): Point.Point {\n return Point.create(\n ndc.x * this.center.x + this.center.x,\n -ndc.y * this.center.y + this.center.y,\n );\n }\n\n /**\n * Transforms a normalized device coordinate to a 2D point within the\n * viewport.\n *\n * @param ndc A 3D point in NDC.\n * @returns A 2D point in the coordinate space of the viewport.\n */\n public transformVectorToViewport(ndc: Vector3.Vector3): Point.Point {\n return this.transformNdcPointToViewport(ndc);\n }\n\n /**\n * Transforms a world point to 2D point in viewport space.\n *\n * @param worldPt The world point to transform.\n * @param projectionViewMatrix The projection matrix to transform a 3D point to 2D point.\n * @returns A point in viewport space.\n */\n public transformWorldToViewport(\n worldPt: Vector3.Vector3,\n projectionViewMatrix: Matrix4.Matrix4,\n ): Point.Point {\n const ndc = Vector3.transformMatrix(worldPt, projectionViewMatrix);\n return this.transformVectorToViewport(ndc);\n }\n\n public transformPointToViewport(\n pt: Point.Point,\n image: FrameImageLike,\n ): Point.Point {\n const { x: scaleX, y: scaleY } = this.calculateFrameScale(image);\n return Point.scale(pt, 1 * scaleX, 1 * scaleY);\n }\n\n /**\n * Transforms a point in viewport coordinate space to a point in a frame's\n * coordinate space.\n *\n * @param pt A point in viewport coordinate space.\n * @param image An image of a frame.\n * @returns A point in the coordinate space of the frame.\n */\n public transformPointToFrame(\n pt: Point.Point,\n image: FrameImageLike,\n ): Point.Point {\n const { x: scaleX, y: scaleY } = this.calculateFrameScale(image);\n return Point.scale(pt, 1 / scaleX, 1 / scaleY);\n }\n\n /**\n * Transforms a point in viewport coordinates to a point in world space\n * coordinates. This method expects a depth buffer in order to compute a value\n * for the Z axis.\n *\n * @param pt A point in viewport coordinates.\n * @param depthBuffer A depth buffer for computing the Z axis.\n * @param fallbackNormalizedDepth A fallback value if the depth is the max\n * depth value, or cannot be determined.\n * @returns\n */\n public transformPointToWorldSpace(\n pt: Point.Point,\n depthBuffer: DepthBuffer,\n fallbackNormalizedDepth?: number,\n ): Vector3.Vector3 {\n const depthPt = this.transformPointToFrame(pt, depthBuffer);\n const ray = this.transformPointToRay(pt, depthBuffer, depthBuffer.camera);\n return depthBuffer.getWorldPoint(depthPt, ray, fallbackNormalizedDepth);\n }\n\n /**\n * Transforms a point in viewport coordinates to a ray.\n *\n * For perspective cameras, the returned ray will have an\n * origin that is at the position of the camera with a direction\n * that is pointing into world space away from the camera.\n *\n * For orthographic cameras, the returned ray will have an\n * origin that is at the world point of viewport coordinate\n * with a direction that is pointing into world space away\n * from the camera.\n *\n * @param pt A point in viewport coordinates.\n * @param image An image of a frame.\n * @param camera A camera used to determine orientation of the scene.\n * @returns A ray\n */\n public transformPointToRay(\n pt: Point.Point,\n image: FrameImageLike,\n camera: FrameCameraBase,\n ): Ray.Ray {\n const ndc = this.transformScreenPointToNdc(pt, image);\n\n // Calculate the ray depending on the camera type\n if (camera.isPerspective()) {\n const origin = Vector3.fromMatrixPosition(camera.worldMatrix);\n const lookAtPoint = Vector3.transformNdcToWorldSpace(\n Vector3.create(ndc.x, ndc.y, 0.5),\n camera.worldMatrix,\n camera.projectionMatrixInverse,\n );\n const direction = Vector3.normalize(\n Vector3.subtract(lookAtPoint, origin),\n );\n return Ray.create({ origin, direction });\n } else {\n const origin = Vector3.transformNdcToWorldSpace(\n Vector3.create(ndc.x, ndc.y, 0),\n camera.worldMatrix,\n camera.projectionMatrixInverse,\n );\n return Ray.create({\n origin,\n direction: Vector3.normalize(camera.viewVector),\n });\n }\n }\n\n /**\n * Maps a screen point to normalized device coordinates (NDC). A screen point\n * at 0,0 represents the top-left of the viewport.\n *\n * @param screenPt A screen point.\n */\n public transformScreenPointToNdc(\n screenPt: Point.Point,\n image: FrameImageLike,\n ): Point.Point {\n const framePt = this.transformPointToFrame(screenPt, image);\n return Point.create(\n (framePt.x / image.imageAttr.frameDimensions.width) * 2 - 1,\n -(framePt.y / image.imageAttr.frameDimensions.height) * 2 + 1,\n );\n }\n\n /**\n * Computes a rectangle that is scaled correctly to be drawn within the\n * viewport.\n *\n * @param image The image to be drawn.\n * @param imageDimensions The dimensions of the received image.\n * @returns A rectangle.\n */\n public calculateDrawRect(image: FrameImageLike): Rectangle.Rectangle {\n const { x: scaleX, y: scaleY } = this.calculateFrameScale(image);\n return Rectangle.scale(image.imageAttr.imageRect, scaleX, scaleY);\n }\n\n private calculateFrameScale(image: FrameImageLike): Point.Point {\n const { frameDimensions: dimensions } = image.imageAttr;\n\n const imageRect = Rectangle.fromDimensions(dimensions);\n const viewport = Rectangle.fromDimensions(this.dimensions);\n const fit = Rectangle.containFit(viewport, imageRect);\n\n const scaleX = fit.width / imageRect.width;\n const scaleY = fit.height / imageRect.height;\n\n return Point.create(scaleX, scaleY);\n }\n\n public get dimensions(): Dimensions.Dimensions {\n return Dimensions.create(this.width, this.height);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"visibilityObserver.js","sourceRoot":"","sources":["../../../../src/lib/visibilityObserver.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,kBAAkB;IAK7B,YACU,QAAoD;QAApD,aAAQ,GAAR,QAAQ,CAA4C;QAE5D,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEjE,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAC9B,CAAC;IAEM,SAAS,CAAC,OAAoB;QACnC,IAAI,iBAAiB,IAAI,OAAO,EAAE,CAAC;YACjC,OAAO,OAAO,CAAC,eAAe,CAAC;gBAC7B,kBAAkB,EAAE,IAAI;gBACxB,eAAe,EAAE,IAAI;aACtB,CAAC,CAAC;QACL,CAAC;QAED,2DAA2D;QAC3D,4DAA4D;QAC5D,oBAAoB;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,OAAO,CAAC,OAAoB;QACjC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;QAE7B,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAEM,SAAS;QACd,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;IACjC,CAAC;IAEM,UAAU;QACf,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAC9B,CAAC;IAEO,sBAAsB,CAAC,OAA2B;QACxD,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACnE,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE;gBACxB,UAAU,EAAE,IAAI;gBAChB,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC;aAC9C,CAAC,CAAC;YAEH,IAAI,CAAC,iBAAiB,GAAG,CAAC,GAAG,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;YAC/D,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAEO,sBAAsB;QAC5B,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAEO,oBAAoB,CAAC,OAAqB;QAChD,MAAM,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEjE,OAAO,CAAC,KAAK,CAAC,wCAAwC,OAAO,IAAI,CAAC,CAAC;QAEnE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;CACF","sourcesContent":["export class VisibilityObserver {\n private targetElement?: HTMLElement;\n\n private mutationObservers: MutationObserver[];\n\n public constructor(\n private callback: (visible: boolean) => void | Promise<void>\n ) {\n this.handleVisibilityChange = this.handleVisibilityChange.bind(this);\n this.emitVisibilityChange = this.emitVisibilityChange.bind(this);\n\n this.mutationObservers = [];\n }\n\n public isVisible(element: HTMLElement): boolean {\n if ('checkVisibility' in element) {\n return element.checkVisibility({\n visibilityProperty: true,\n opacityProperty: true,\n });\n }\n\n // In the case that checkVisibility is not available for an\n // element, just return true rather than checking the entire\n // parent structure.\n return true;\n }\n\n public observe(element: HTMLElement): void {\n this.targetElement = element;\n\n this.watchElementVisibility(element);\n }\n\n public unobserve(): void {\n if (this.targetElement != null) {\n this.mutationObservers.forEach((obs) => obs.disconnect());\n this.mutationObservers = [];\n }\n\n this.targetElement = undefined;\n }\n\n public disconnect(): void {\n this.mutationObservers.forEach((obs) => obs.disconnect());\n this.mutationObservers = [];\n }\n\n private watchElementVisibility(element: HTMLElement | null): void {\n if (element != null) {\n const observer = new MutationObserver(this.handleVisibilityChange);\n observer.observe(element, {\n attributes: true,\n attributeFilter: ['style', 'class', 'hidden'],\n });\n\n this.mutationObservers = [...this.mutationObservers, observer];\n this.watchElementVisibility(element.parentElement);\n }\n }\n\n private handleVisibilityChange(): void {\n if (this.targetElement != null) {\n this.emitVisibilityChange(this.targetElement);\n }\n }\n\n private emitVisibilityChange(element?: HTMLElement): void {\n const visible = element != null ? this.isVisible(element) : true;\n\n console.debug(`Detected visibility change [visible={${visible}}]`);\n\n this.callback(visible);\n }\n}\n"]}
1
+ {"version":3,"file":"visibilityObserver.js","sourceRoot":"","sources":["../../../../src/lib/visibilityObserver.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,kBAAkB;IAK7B,YACU,QAAoD;QAApD,aAAQ,GAAR,QAAQ,CAA4C;QAE5D,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEjE,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAC9B,CAAC;IAEM,SAAS,CAAC,OAAoB;QACnC,IAAI,iBAAiB,IAAI,OAAO,EAAE,CAAC;YACjC,OAAO,OAAO,CAAC,eAAe,CAAC;gBAC7B,kBAAkB,EAAE,IAAI;gBACxB,eAAe,EAAE,IAAI;aACtB,CAAC,CAAC;QACL,CAAC;QAED,2DAA2D;QAC3D,4DAA4D;QAC5D,oBAAoB;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,OAAO,CAAC,OAAoB;QACjC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;QAE7B,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAEM,SAAS;QACd,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;IACjC,CAAC;IAEM,UAAU;QACf,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAC9B,CAAC;IAEO,sBAAsB,CAAC,OAA2B;QACxD,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACnE,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE;gBACxB,UAAU,EAAE,IAAI;gBAChB,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC;aAC9C,CAAC,CAAC;YAEH,IAAI,CAAC,iBAAiB,GAAG,CAAC,GAAG,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;YAC/D,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAEO,sBAAsB;QAC5B,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAEO,oBAAoB,CAAC,OAAqB;QAChD,MAAM,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAEjE,OAAO,CAAC,KAAK,CAAC,wCAAwC,OAAO,IAAI,CAAC,CAAC;QAEnE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;CACF","sourcesContent":["export class VisibilityObserver {\n private targetElement?: HTMLElement;\n\n private mutationObservers: MutationObserver[];\n\n public constructor(\n private callback: (visible: boolean) => void | Promise<void>,\n ) {\n this.handleVisibilityChange = this.handleVisibilityChange.bind(this);\n this.emitVisibilityChange = this.emitVisibilityChange.bind(this);\n\n this.mutationObservers = [];\n }\n\n public isVisible(element: HTMLElement): boolean {\n if ('checkVisibility' in element) {\n return element.checkVisibility({\n visibilityProperty: true,\n opacityProperty: true,\n });\n }\n\n // In the case that checkVisibility is not available for an\n // element, just return true rather than checking the entire\n // parent structure.\n return true;\n }\n\n public observe(element: HTMLElement): void {\n this.targetElement = element;\n\n this.watchElementVisibility(element);\n }\n\n public unobserve(): void {\n if (this.targetElement != null) {\n this.mutationObservers.forEach((obs) => obs.disconnect());\n this.mutationObservers = [];\n }\n\n this.targetElement = undefined;\n }\n\n public disconnect(): void {\n this.mutationObservers.forEach((obs) => obs.disconnect());\n this.mutationObservers = [];\n }\n\n private watchElementVisibility(element: HTMLElement | null): void {\n if (element != null) {\n const observer = new MutationObserver(this.handleVisibilityChange);\n observer.observe(element, {\n attributes: true,\n attributeFilter: ['style', 'class', 'hidden'],\n });\n\n this.mutationObservers = [...this.mutationObservers, observer];\n this.watchElementVisibility(element.parentElement);\n }\n }\n\n private handleVisibilityChange(): void {\n if (this.targetElement != null) {\n this.emitVisibilityChange(this.targetElement);\n }\n }\n\n private emitVisibilityChange(element?: HTMLElement): void {\n const visible = element != null ? this.isVisible(element) : true;\n\n console.debug(`Detected visibility change [visible={${visible}}]`);\n\n this.callback(visible);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../../../src/lib/volume-intersection/controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { Point } from '@vertexvis/geometry';\nimport { StreamRequestError } from '@vertexvis/stream-api';\nimport { Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\nimport {\n PmiAnnotationOperationsBuilder,\n SceneItemOperationsBuilder,\n TerminalItemOperationBuilder,\n} from '../scenes';\nimport { SceneElementQueryExecutor } from '../scenes/queries';\nimport { VolumeIntersectionQueryModel } from './model';\n\nexport type OperationTransform = (\n builder: SceneItemOperationsBuilder\n) => TerminalItemOperationBuilder;\nexport type AdditionalTransform = (\n executor: SceneElementQueryExecutor\n) => TerminalItemOperationBuilder;\n\nexport interface CompleteExecutionDetails {\n aborted: boolean;\n}\n\nexport class VolumeIntersectionQueryController {\n private previousViewerCameraControls?: boolean;\n private operationTransform: OperationTransform;\n private additionalTransforms: AdditionalTransform[] = [];\n private operationInFlight = false;\n private operationAborted = false;\n\n private executeStarted = new EventDispatcher<void>();\n private executeComplete = new EventDispatcher<CompleteExecutionDetails>();\n private executeAborted = new EventDispatcher<StreamRequestError>();\n\n public constructor(\n private model: VolumeIntersectionQueryModel,\n private viewer: HTMLVertexViewerElement\n ) {\n this.additionalTransforms = [\n (op) => op.items.where((q) => q.all()).deselect(),\n ];\n this.operationTransform = (builder) => builder.select();\n }\n\n public setStartPoint(point: Point.Point): void {\n this.previousViewerCameraControls = this.viewer.cameraControls;\n this.viewer.cameraControls = false;\n\n this.model.setStartPoint(point);\n }\n\n public setEndPoint(point: Point.Point): void {\n this.model.setEndPoint(point);\n }\n\n /**\n * Updates the operation that will be applied based on the volume intersection\n * query. Defaults to `(builder) => builder.select()`, which will select any\n * of the results of the query.\n */\n public setOperationTransform(operationTransform: OperationTransform): void {\n this.operationTransform = operationTransform;\n }\n\n /**\n * Updates any additional operations that should be performed independent of\n * the volume intersection query. This can be used to perform an operation on\n * the entirety of the scene prior to the operation on the result of the\n * volume intersection query.\n * Defaults to `[(op) => op.items.where((q) => q.all()).deselect()]`, which will\n * clear any prior selection before the default selection.\n */\n public setAdditionalTransforms(\n additionalTransforms: AdditionalTransform[]\n ): void {\n this.additionalTransforms = additionalTransforms;\n }\n\n public onExecuteStarted(listener: Listener<void>): Disposable {\n return this.executeStarted.on(listener);\n }\n\n public onExecuteComplete(\n listener: Listener<CompleteExecutionDetails>\n ): Disposable {\n return this.executeComplete.on(listener);\n }\n\n public onExecuteAborted(listener: Listener<StreamRequestError>): Disposable {\n return this.executeAborted.on(listener);\n }\n\n public async execute(): Promise<void> {\n const screenBounds = this.model.getScreenBounds();\n const type = this.model.getType();\n\n if (screenBounds != null && !this.operationInFlight) {\n this.model.complete();\n\n try {\n this.operationInFlight = true;\n this.executeStarted.emit();\n\n const additionalTransforms = (\n op: SceneElementQueryExecutor\n ): Array<SceneItemOperationsBuilder | PmiAnnotationOperationsBuilder> =>\n this.additionalTransforms.map((t) => t(op)).flat();\n const operationTransforms = (\n op: SceneElementQueryExecutor\n ): Array<SceneItemOperationsBuilder | PmiAnnotationOperationsBuilder> =>\n [\n this.operationTransform(\n op.items.where((q) =>\n q.withVolumeIntersection(screenBounds, type === 'exclusive')\n )\n ),\n ].flat();\n\n const scene = await this.viewer.scene();\n await scene\n .elements((op) => [\n ...additionalTransforms(op),\n ...operationTransforms(op),\n ])\n .execute({\n skipAwaitCorrelatedFrame: true,\n });\n } catch (e) {\n if (\n e instanceof StreamRequestError &&\n e.summary?.toLocaleLowerCase().includes('operation aborted')\n ) {\n this.executeAborted.emit(e);\n this.operationAborted = true;\n } else {\n console.error('Failed to perform volume intersection query', e);\n throw e;\n }\n } finally {\n this.viewer.cameraControls = this.previousViewerCameraControls ?? true;\n this.previousViewerCameraControls = undefined;\n this.operationInFlight = false;\n this.executeComplete.emit({\n aborted: this.operationAborted,\n });\n this.operationAborted = false;\n }\n } else if (this.operationInFlight) {\n this.model.cancel();\n\n throw new Error(\n `Unable to perform volume intersection query as there is already one in-flight.`\n );\n } else {\n this.model.cancel();\n\n this.viewer.cameraControls = this.previousViewerCameraControls ?? true;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../../../src/lib/volume-intersection/controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { Point } from '@vertexvis/geometry';\nimport { StreamRequestError } from '@vertexvis/stream-api';\nimport { Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\nimport {\n PmiAnnotationOperationsBuilder,\n SceneItemOperationsBuilder,\n TerminalItemOperationBuilder,\n} from '../scenes';\nimport { SceneElementQueryExecutor } from '../scenes/queries';\nimport { VolumeIntersectionQueryModel } from './model';\n\nexport type OperationTransform = (\n builder: SceneItemOperationsBuilder,\n) => TerminalItemOperationBuilder;\nexport type AdditionalTransform = (\n executor: SceneElementQueryExecutor,\n) => TerminalItemOperationBuilder;\n\nexport interface CompleteExecutionDetails {\n aborted: boolean;\n}\n\nexport class VolumeIntersectionQueryController {\n private previousViewerCameraControls?: boolean;\n private operationTransform: OperationTransform;\n private additionalTransforms: AdditionalTransform[] = [];\n private operationInFlight = false;\n private operationAborted = false;\n\n private executeStarted = new EventDispatcher<void>();\n private executeComplete = new EventDispatcher<CompleteExecutionDetails>();\n private executeAborted = new EventDispatcher<StreamRequestError>();\n\n public constructor(\n private model: VolumeIntersectionQueryModel,\n private viewer: HTMLVertexViewerElement,\n ) {\n this.additionalTransforms = [\n (op) => op.items.where((q) => q.all()).deselect(),\n ];\n this.operationTransform = (builder) => builder.select();\n }\n\n public setStartPoint(point: Point.Point): void {\n this.previousViewerCameraControls = this.viewer.cameraControls;\n this.viewer.cameraControls = false;\n\n this.model.setStartPoint(point);\n }\n\n public setEndPoint(point: Point.Point): void {\n this.model.setEndPoint(point);\n }\n\n /**\n * Updates the operation that will be applied based on the volume intersection\n * query. Defaults to `(builder) => builder.select()`, which will select any\n * of the results of the query.\n */\n public setOperationTransform(operationTransform: OperationTransform): void {\n this.operationTransform = operationTransform;\n }\n\n /**\n * Updates any additional operations that should be performed independent of\n * the volume intersection query. This can be used to perform an operation on\n * the entirety of the scene prior to the operation on the result of the\n * volume intersection query.\n * Defaults to `[(op) => op.items.where((q) => q.all()).deselect()]`, which will\n * clear any prior selection before the default selection.\n */\n public setAdditionalTransforms(\n additionalTransforms: AdditionalTransform[],\n ): void {\n this.additionalTransforms = additionalTransforms;\n }\n\n public onExecuteStarted(listener: Listener<void>): Disposable {\n return this.executeStarted.on(listener);\n }\n\n public onExecuteComplete(\n listener: Listener<CompleteExecutionDetails>,\n ): Disposable {\n return this.executeComplete.on(listener);\n }\n\n public onExecuteAborted(listener: Listener<StreamRequestError>): Disposable {\n return this.executeAborted.on(listener);\n }\n\n public async execute(): Promise<void> {\n const screenBounds = this.model.getScreenBounds();\n const type = this.model.getType();\n\n if (screenBounds != null && !this.operationInFlight) {\n this.model.complete();\n\n try {\n this.operationInFlight = true;\n this.executeStarted.emit();\n\n const additionalTransforms = (\n op: SceneElementQueryExecutor,\n ): Array<SceneItemOperationsBuilder | PmiAnnotationOperationsBuilder> =>\n this.additionalTransforms.map((t) => t(op)).flat();\n const operationTransforms = (\n op: SceneElementQueryExecutor,\n ): Array<SceneItemOperationsBuilder | PmiAnnotationOperationsBuilder> =>\n [\n this.operationTransform(\n op.items.where((q) =>\n q.withVolumeIntersection(screenBounds, type === 'exclusive'),\n ),\n ),\n ].flat();\n\n const scene = await this.viewer.scene();\n await scene\n .elements((op) => [\n ...additionalTransforms(op),\n ...operationTransforms(op),\n ])\n .execute({\n skipAwaitCorrelatedFrame: true,\n });\n } catch (e) {\n if (\n e instanceof StreamRequestError &&\n e.summary?.toLocaleLowerCase().includes('operation aborted')\n ) {\n this.executeAborted.emit(e);\n this.operationAborted = true;\n } else {\n console.error('Failed to perform volume intersection query', e);\n throw e;\n }\n } finally {\n this.viewer.cameraControls = this.previousViewerCameraControls ?? true;\n this.previousViewerCameraControls = undefined;\n this.operationInFlight = false;\n this.executeComplete.emit({\n aborted: this.operationAborted,\n });\n this.operationAborted = false;\n }\n } else if (this.operationInFlight) {\n this.model.cancel();\n\n throw new Error(\n `Unable to perform volume intersection query as there is already one in-flight.`,\n );\n } else {\n this.model.cancel();\n\n this.viewer.cameraControls = this.previousViewerCameraControls ?? true;\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"interactions.js","sourceRoot":"","sources":["../../../../../src/lib/volume-intersection/interactions.ts"],"names":[],"mappings":"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","sourcesContent":["import { Disposable } from '@vertexvis/utils';\n\nimport { boxQueryCursor } from '../cursors';\nimport { getMouseClientPosition } from '../dom';\nimport { InteractionApi } from '../interactions';\nimport { InteractionHandler } from '../interactions/interactionHandler';\nimport { VolumeIntersectionQueryController } from './controller';\n\nexport class VolumeIntersectionQueryInteractionHandler implements InteractionHandler {\n private element?: HTMLElement;\n private api?: InteractionApi;\n private isInteracting?: boolean;\n private enabled?: boolean;\n private elementBounds?: DOMRect;\n private crosshairCursorDisposable?: Disposable;\n private waitCursorDisposable?: Disposable;\n\n public constructor(private controller: VolumeIntersectionQueryController) {\n this.handleDragBegin = this.handleDragBegin.bind(this);\n this.handleDrag = this.handleDrag.bind(this);\n this.handleDragEnd = this.handleDragEnd.bind(this);\n\n this.enabled = true;\n }\n\n public initialize(element: HTMLElement, api: InteractionApi): void {\n this.element = element;\n this.api = api;\n\n this.element.addEventListener('pointerdown', this.handleDragBegin);\n this.addCrosshairCursor();\n }\n\n public dispose(): void {\n this.element?.removeEventListener('pointerdown', this.handleDragBegin);\n window.removeEventListener('pointermove', this.handleDrag);\n window.removeEventListener('pointerup', this.handleDragEnd);\n this.crosshairCursorDisposable?.dispose();\n this.waitCursorDisposable?.dispose();\n\n this.element = undefined;\n this.api = undefined;\n this.enabled = true;\n }\n\n public disable(): void {\n this.enabled = false;\n }\n\n public enable(): void {\n this.enabled = true;\n }\n\n private handleDragBegin(event: PointerEvent): void {\n if (\n this.enabled &&\n this.isPrimaryMouseButtonClick(event) &&\n !this.isInteracting\n ) {\n this.elementBounds = this.element?.getBoundingClientRect();\n this.isInteracting = true;\n this.controller.setStartPoint(\n getMouseClientPosition(event, this.elementBounds)\n );\n\n window.addEventListener('pointermove', this.handleDrag);\n window.addEventListener('pointerup', this.handleDragEnd);\n }\n }\n\n private handleDrag(event: PointerEvent): void {\n if (this.enabled) {\n this.controller.setEndPoint(\n getMouseClientPosition(event, this.elementBounds)\n );\n }\n }\n\n private async handleDragEnd(): Promise<void> {\n this.isInteracting = false;\n\n window.removeEventListener('pointermove', this.handleDrag);\n window.removeEventListener('pointerup', this.handleDragEnd);\n\n this.crosshairCursorDisposable?.dispose();\n if (this.enabled) {\n this.addWaitCursor();\n try {\n await this.controller.execute();\n } finally {\n this.waitCursorDisposable?.dispose();\n this.addCrosshairCursor();\n }\n }\n }\n\n private isPrimaryMouseButtonClick(event: PointerEvent): boolean {\n return event.buttons === 1;\n }\n\n private addCrosshairCursor(): void {\n this.crosshairCursorDisposable?.dispose();\n this.crosshairCursorDisposable = this.api?.addCursor(boxQueryCursor);\n }\n\n private addWaitCursor(): void {\n this.waitCursorDisposable?.dispose();\n this.waitCursorDisposable = this.api?.addCursor('wait');\n }\n}\n"]}
1
+ {"version":3,"file":"interactions.js","sourceRoot":"","sources":["../../../../../src/lib/volume-intersection/interactions.ts"],"names":[],"mappings":"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","sourcesContent":["import { Disposable } from '@vertexvis/utils';\n\nimport { boxQueryCursor } from '../cursors';\nimport { getMouseClientPosition } from '../dom';\nimport { InteractionApi } from '../interactions';\nimport { InteractionHandler } from '../interactions/interactionHandler';\nimport { VolumeIntersectionQueryController } from './controller';\n\nexport class VolumeIntersectionQueryInteractionHandler implements InteractionHandler {\n private element?: HTMLElement;\n private api?: InteractionApi;\n private isInteracting?: boolean;\n private enabled?: boolean;\n private elementBounds?: DOMRect;\n private crosshairCursorDisposable?: Disposable;\n private waitCursorDisposable?: Disposable;\n\n public constructor(private controller: VolumeIntersectionQueryController) {\n this.handleDragBegin = this.handleDragBegin.bind(this);\n this.handleDrag = this.handleDrag.bind(this);\n this.handleDragEnd = this.handleDragEnd.bind(this);\n\n this.enabled = true;\n }\n\n public initialize(element: HTMLElement, api: InteractionApi): void {\n this.element = element;\n this.api = api;\n\n this.element.addEventListener('pointerdown', this.handleDragBegin);\n this.addCrosshairCursor();\n }\n\n public dispose(): void {\n this.element?.removeEventListener('pointerdown', this.handleDragBegin);\n window.removeEventListener('pointermove', this.handleDrag);\n window.removeEventListener('pointerup', this.handleDragEnd);\n this.crosshairCursorDisposable?.dispose();\n this.waitCursorDisposable?.dispose();\n\n this.element = undefined;\n this.api = undefined;\n this.enabled = true;\n }\n\n public disable(): void {\n this.enabled = false;\n }\n\n public enable(): void {\n this.enabled = true;\n }\n\n private handleDragBegin(event: PointerEvent): void {\n if (\n this.enabled &&\n this.isPrimaryMouseButtonClick(event) &&\n !this.isInteracting\n ) {\n this.elementBounds = this.element?.getBoundingClientRect();\n this.isInteracting = true;\n this.controller.setStartPoint(\n getMouseClientPosition(event, this.elementBounds),\n );\n\n window.addEventListener('pointermove', this.handleDrag);\n window.addEventListener('pointerup', this.handleDragEnd);\n }\n }\n\n private handleDrag(event: PointerEvent): void {\n if (this.enabled) {\n this.controller.setEndPoint(\n getMouseClientPosition(event, this.elementBounds),\n );\n }\n }\n\n private async handleDragEnd(): Promise<void> {\n this.isInteracting = false;\n\n window.removeEventListener('pointermove', this.handleDrag);\n window.removeEventListener('pointerup', this.handleDragEnd);\n\n this.crosshairCursorDisposable?.dispose();\n if (this.enabled) {\n this.addWaitCursor();\n try {\n await this.controller.execute();\n } finally {\n this.waitCursorDisposable?.dispose();\n this.addCrosshairCursor();\n }\n }\n }\n\n private isPrimaryMouseButtonClick(event: PointerEvent): boolean {\n return event.buttons === 1;\n }\n\n private addCrosshairCursor(): void {\n this.crosshairCursorDisposable?.dispose();\n this.crosshairCursorDisposable = this.api?.addCursor(boxQueryCursor);\n }\n\n private addWaitCursor(): void {\n this.waitCursorDisposable?.dispose();\n this.waitCursorDisposable = this.api?.addCursor('wait');\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../../../src/lib/volume-intersection/model.ts"],"names":[],"mappings":"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","sourcesContent":["import { Point, Rectangle } from '@vertexvis/geometry';\nimport { Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\nimport { VolumeIntersectionQueryMode } from '../../components/viewer-box-query-tool/types';\n\nexport type QueryType = 'inclusive' | 'exclusive';\n\nexport interface VolumeIntersectionQueryDetails {\n screenBounds: Rectangle.Rectangle;\n type: QueryType;\n}\n\nexport class VolumeIntersectionQueryModel {\n private startPoint?: Point.Point;\n private endPoint?: Point.Point;\n private type?: QueryType;\n\n private dragStarted = new EventDispatcher<void>();\n private dragComplete = new EventDispatcher<VolumeIntersectionQueryDetails>();\n private dragCancelled = new EventDispatcher<void>();\n\n private screenBoundsChanged = new EventDispatcher<\n VolumeIntersectionQueryDetails | undefined\n >();\n\n public constructor(private mode?: VolumeIntersectionQueryMode) {}\n\n public setStartPoint(point: Point.Point): void {\n this.startPoint = point;\n\n this.dragStarted.emit();\n }\n\n public setEndPoint(point: Point.Point): void {\n if (\n this.startPoint != null &&\n Point.distance(this.startPoint, point) >= 2\n ) {\n this.endPoint = point;\n\n this.updateQueryType();\n this.screenBoundsChanged.emit(this.getQueryDetails());\n }\n }\n\n public setMode(mode?: VolumeIntersectionQueryMode): void {\n this.mode = mode;\n }\n\n public complete(): void {\n if (this.startPoint != null && this.endPoint != null) {\n this.screenBoundsChanged.emit(undefined);\n this.dragComplete.emit(this.getQueryDetails());\n this.reset();\n }\n }\n\n public cancel(): void {\n this.screenBoundsChanged.emit(undefined);\n this.dragCancelled.emit();\n this.reset();\n }\n\n public reset(): void {\n this.startPoint = undefined;\n this.endPoint = undefined;\n this.type = undefined;\n }\n\n public getScreenBounds(): Rectangle.Rectangle | undefined {\n return this.startPoint != null && this.endPoint != null\n ? Rectangle.fromPoints(this.startPoint, this.endPoint)\n : undefined;\n }\n\n public getType(): QueryType | undefined {\n return this.type;\n }\n\n public onScreenBoundsChanged(\n listener: Listener<VolumeIntersectionQueryDetails | undefined>\n ): Disposable {\n return this.screenBoundsChanged.on(listener);\n }\n\n public onDragStarted(listener: Listener<void>): Disposable {\n return this.dragStarted.on(listener);\n }\n\n public onDragComplete(\n listener: Listener<VolumeIntersectionQueryDetails>\n ): Disposable {\n return this.dragComplete.on(listener);\n }\n\n public onDragCancelled(listener: Listener<void>): Disposable {\n return this.dragCancelled.on(listener);\n }\n\n private getQueryDetails(): VolumeIntersectionQueryDetails {\n if (this.startPoint != null && this.endPoint != null && this.type != null) {\n return {\n screenBounds: Rectangle.fromPoints(this.startPoint, this.endPoint),\n type: this.type,\n };\n } else {\n throw new Error(\n 'Failed to create query details, the start and end points must be set.'\n );\n }\n }\n\n private updateQueryType(): void {\n if (this.startPoint != null && this.endPoint != null) {\n const directionalType =\n Point.subtract(this.endPoint, this.startPoint).x > 0\n ? 'exclusive'\n : 'inclusive';\n\n this.type = this.mode ?? directionalType;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../../../src/lib/volume-intersection/model.ts"],"names":[],"mappings":"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","sourcesContent":["import { Point, Rectangle } from '@vertexvis/geometry';\nimport { Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\nimport { VolumeIntersectionQueryMode } from '../../components/viewer-box-query-tool/types';\n\nexport type QueryType = 'inclusive' | 'exclusive';\n\nexport interface VolumeIntersectionQueryDetails {\n screenBounds: Rectangle.Rectangle;\n type: QueryType;\n}\n\nexport class VolumeIntersectionQueryModel {\n private startPoint?: Point.Point;\n private endPoint?: Point.Point;\n private type?: QueryType;\n\n private dragStarted = new EventDispatcher<void>();\n private dragComplete = new EventDispatcher<VolumeIntersectionQueryDetails>();\n private dragCancelled = new EventDispatcher<void>();\n\n private screenBoundsChanged = new EventDispatcher<\n VolumeIntersectionQueryDetails | undefined\n >();\n\n public constructor(private mode?: VolumeIntersectionQueryMode) {}\n\n public setStartPoint(point: Point.Point): void {\n this.startPoint = point;\n\n this.dragStarted.emit();\n }\n\n public setEndPoint(point: Point.Point): void {\n if (\n this.startPoint != null &&\n Point.distance(this.startPoint, point) >= 2\n ) {\n this.endPoint = point;\n\n this.updateQueryType();\n this.screenBoundsChanged.emit(this.getQueryDetails());\n }\n }\n\n public setMode(mode?: VolumeIntersectionQueryMode): void {\n this.mode = mode;\n }\n\n public complete(): void {\n if (this.startPoint != null && this.endPoint != null) {\n this.screenBoundsChanged.emit(undefined);\n this.dragComplete.emit(this.getQueryDetails());\n this.reset();\n }\n }\n\n public cancel(): void {\n this.screenBoundsChanged.emit(undefined);\n this.dragCancelled.emit();\n this.reset();\n }\n\n public reset(): void {\n this.startPoint = undefined;\n this.endPoint = undefined;\n this.type = undefined;\n }\n\n public getScreenBounds(): Rectangle.Rectangle | undefined {\n return this.startPoint != null && this.endPoint != null\n ? Rectangle.fromPoints(this.startPoint, this.endPoint)\n : undefined;\n }\n\n public getType(): QueryType | undefined {\n return this.type;\n }\n\n public onScreenBoundsChanged(\n listener: Listener<VolumeIntersectionQueryDetails | undefined>,\n ): Disposable {\n return this.screenBoundsChanged.on(listener);\n }\n\n public onDragStarted(listener: Listener<void>): Disposable {\n return this.dragStarted.on(listener);\n }\n\n public onDragComplete(\n listener: Listener<VolumeIntersectionQueryDetails>,\n ): Disposable {\n return this.dragComplete.on(listener);\n }\n\n public onDragCancelled(listener: Listener<void>): Disposable {\n return this.dragCancelled.on(listener);\n }\n\n private getQueryDetails(): VolumeIntersectionQueryDetails {\n if (this.startPoint != null && this.endPoint != null && this.type != null) {\n return {\n screenBounds: Rectangle.fromPoints(this.startPoint, this.endPoint),\n type: this.type,\n };\n } else {\n throw new Error(\n 'Failed to create query details, the start and end points must be set.',\n );\n }\n }\n\n private updateQueryType(): void {\n if (this.startPoint != null && this.endPoint != null) {\n const directionalType =\n Point.subtract(this.endPoint, this.startPoint).x > 0\n ? 'exclusive'\n : 'inclusive';\n\n this.type = this.mode ?? directionalType;\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../../../src/lib/walk-mode/controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { Disposable } from '@vertexvis/utils';\n\nimport { KeyBinding } from '../keyBinding';\nimport {\n ViewerTeleportMode,\n ViewerWalkModeConfiguration,\n ViewerWalkModeOperation,\n WalkModeModel,\n} from './model';\n\nexport class WalkModeController {\n private excludeTagNames: Array<string> = [\n 'VERTEX-SCENE-TREE',\n 'VERTEX-SCENE-TREE-SEARCH',\n 'VERTEX-VIEWER-PIN-TOOL',\n 'INPUT',\n 'TEXTAREA',\n ];\n\n private excludePredicates: Array<(el: Element) => boolean> = [];\n\n public constructor(private model: WalkModeModel) {\n this.updateModelExclusions();\n }\n\n /**\n * @internal\n */\n public updateModel(model: WalkModeModel): void {\n this.model = model;\n }\n\n /**\n * Sets whether downstream walk mode interaction handlers are enabled.\n * Setting this value to `false` will remove all event listeners for\n * the interactions, and setting this value to `true` will add or\n * re-add the event listeners.\n */\n public setEnabled(enabled: boolean): void {\n this.model.setEnabled(enabled);\n }\n\n /**\n * Sets the `ViewerTeleportMode` to be used with a `<vertex-viewer-teleport-tool>`.\n */\n public setTeleportMode(mode?: ViewerTeleportMode): void {\n this.model.setTeleportMode(mode);\n }\n\n /**\n * Updates the configuration for downstream walk mode interaction handlers.\n *\n * `teleportHeightPercentage` - percentage used for fine-tuning the distance to offset\n * the camera from a surface when performing a `teleport-and-align`. This percentage is\n * used alongside the shortest side of the visible bounding box to determine how far to\n * place the camera from the surface that has been hit, with a larger percentage placing\n * the camera further from the surface and vice-versa. Defaults to 11.75%.\n *\n * `teleportDistancePercentage` - percentage used for fine-tuning the distance moved per\n * click with the `teleport-toward` mode. This percentage is used alongside the longest\n * side of the visible bounding box to determine how far to move the camera's position\n * with each click, with a larger percentage moving the camera further and vice-versa.\n * Defaults to 2%.\n *\n * `teleportCollisionDistance` - distance used alongside the `teleportCollisionPercentage`\n * to determine whether a click with the `teleport-toward` mode would cause a \"collision\",\n * or would pass through the point clicked. If such a collision would occur, the camera is\n * instead placed this distance back from the point clicked once, then allowed to pass\n * through the point on subsequent clicks. Note that this will not apply if clicks occur\n * in quick succession without setting the `depthBuffers` property on the `<vertex-viewer>`\n * to `all` frames. Defaults to `1000`.\n *\n * `keyboardWalkSpeed` - speed to move the camera when performing keyboard-based\n * walk interactions. A larger number here will result in a faster walk speed through\n * the model and vice-versa. Defaults to `5`.\n *\n * `keyboardPivotDegrees` - number of degrees to move the camera when performing\n * keyboard-based pivot interactions. Defaults to `1`.\n *\n * `keyboardRepeatIntervalMs` - number of milliseconds to repeat keyboard-based interactions.\n * this value is multiplicative with the `keyboardWalkSpeed` and `keyboardPivotDegrees`, and\n * lower numbers will result in faster movement and vice-versa. Defaults to `25`.\n *\n */\n public updateConfiguration(\n configuration: Partial<ViewerWalkModeConfiguration>\n ): void {\n const existing = this.model.getConfiguration();\n\n this.model.setConfiguration({\n ...existing,\n ...configuration,\n });\n }\n\n /**\n * Adds a custom keybinding for a specific walk operation. This will append to the\n * existing set of keybindings to allow for multiple keybindings for a specific\n * operation. To replace the defaults, see `replaceKeyBinding`.\n */\n public addKeyBinding(\n operation: ViewerWalkModeOperation,\n ...keys: string[]\n ): void {\n this.model.addKeyBinding(operation, new KeyBinding(...keys));\n }\n\n /**\n * Adds a custom keybinding for a specific walk operation. This will replace any\n * existing keybindings to allow for overriding the default behavior.\n *\n * @example\n * ```\n * const walkModeTool = document.querySelector('vertex-viewer-walk-mode-tool');\n *\n * // Remove keybinding for the `PIVOT_UP` operation\n * walkModeTool.controller.replaceKeyBinding('PIVOT_UP');\n *\n * // Replace keybinding for `WALK_FORWARD` with `ArrowUp` instead of `w`\n * walkModeTool.controller.replaceKeyBinding('WALK_FORWARD', 'ArrowUp');\n * ```\n */\n public replaceKeyBinding(\n operation: ViewerWalkModeOperation,\n ...keys: string[]\n ): void {\n this.model.replaceKeyBinding(operation, new KeyBinding(...keys));\n }\n\n /**\n * Adds an exclusion for specific elements when responding to keyboard\n * events. This is useful when there are other elements on screen that\n * require keyboard interaction and the walk mode handlers should not\n * respond to the keyboard events. Can be either a element's `tagName`\n * or a predicate. Returns a `Disposable` that can be used to remove the\n * exclusion.\n *\n * Default `tagName` exclusions:\n * 'VERTEX-SCENE-TREE'\n * 'VERTEX-SCENE-TREE-SEARCH'\n * 'VERTEX-VIEWER-PIN-TOOL'\n * 'INPUT'\n * 'TEXTAREA'\n */\n public excludeElement(predicate: (el: Element) => boolean): Disposable;\n public excludeElement(tagName: string): Disposable;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public excludeElement(...args: any[]): Disposable {\n if (typeof args[0] === 'string') {\n this.excludeTagNames = [...this.excludeTagNames, args[0]];\n\n this.updateModelExclusions();\n\n return {\n dispose: () => {\n this.excludeTagNames = this.excludeTagNames.filter(\n (tn) => tn !== args[0]\n );\n },\n };\n } else {\n this.excludePredicates = [...this.excludePredicates, args[0]];\n\n this.updateModelExclusions();\n\n return {\n dispose: () => {\n this.excludePredicates = this.excludePredicates.filter(\n (tn) => tn !== args[0]\n );\n },\n };\n }\n }\n\n private updateModelExclusions(): void {\n this.model.setExcludedPredicate(\n (el) =>\n this.excludeTagNames.some((tn) => tn === el.tagName) ||\n this.excludePredicates.some((p) => p(el))\n );\n }\n}\n"]}
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../../../src/lib/walk-mode/controller.ts"],"names":[],"mappings":"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","sourcesContent":["import { Disposable } from '@vertexvis/utils';\n\nimport { KeyBinding } from '../keyBinding';\nimport {\n ViewerTeleportMode,\n ViewerWalkModeConfiguration,\n ViewerWalkModeOperation,\n WalkModeModel,\n} from './model';\n\nexport class WalkModeController {\n private excludeTagNames: Array<string> = [\n 'VERTEX-SCENE-TREE',\n 'VERTEX-SCENE-TREE-SEARCH',\n 'VERTEX-VIEWER-PIN-TOOL',\n 'INPUT',\n 'TEXTAREA',\n ];\n\n private excludePredicates: Array<(el: Element) => boolean> = [];\n\n public constructor(private model: WalkModeModel) {\n this.updateModelExclusions();\n }\n\n /**\n * @internal\n */\n public updateModel(model: WalkModeModel): void {\n this.model = model;\n }\n\n /**\n * Sets whether downstream walk mode interaction handlers are enabled.\n * Setting this value to `false` will remove all event listeners for\n * the interactions, and setting this value to `true` will add or\n * re-add the event listeners.\n */\n public setEnabled(enabled: boolean): void {\n this.model.setEnabled(enabled);\n }\n\n /**\n * Sets the `ViewerTeleportMode` to be used with a `<vertex-viewer-teleport-tool>`.\n */\n public setTeleportMode(mode?: ViewerTeleportMode): void {\n this.model.setTeleportMode(mode);\n }\n\n /**\n * Updates the configuration for downstream walk mode interaction handlers.\n *\n * `teleportHeightPercentage` - percentage used for fine-tuning the distance to offset\n * the camera from a surface when performing a `teleport-and-align`. This percentage is\n * used alongside the shortest side of the visible bounding box to determine how far to\n * place the camera from the surface that has been hit, with a larger percentage placing\n * the camera further from the surface and vice-versa. Defaults to 11.75%.\n *\n * `teleportDistancePercentage` - percentage used for fine-tuning the distance moved per\n * click with the `teleport-toward` mode. This percentage is used alongside the longest\n * side of the visible bounding box to determine how far to move the camera's position\n * with each click, with a larger percentage moving the camera further and vice-versa.\n * Defaults to 2%.\n *\n * `teleportCollisionDistance` - distance used alongside the `teleportCollisionPercentage`\n * to determine whether a click with the `teleport-toward` mode would cause a \"collision\",\n * or would pass through the point clicked. If such a collision would occur, the camera is\n * instead placed this distance back from the point clicked once, then allowed to pass\n * through the point on subsequent clicks. Note that this will not apply if clicks occur\n * in quick succession without setting the `depthBuffers` property on the `<vertex-viewer>`\n * to `all` frames. Defaults to `1000`.\n *\n * `keyboardWalkSpeed` - speed to move the camera when performing keyboard-based\n * walk interactions. A larger number here will result in a faster walk speed through\n * the model and vice-versa. Defaults to `5`.\n *\n * `keyboardPivotDegrees` - number of degrees to move the camera when performing\n * keyboard-based pivot interactions. Defaults to `1`.\n *\n * `keyboardRepeatIntervalMs` - number of milliseconds to repeat keyboard-based interactions.\n * this value is multiplicative with the `keyboardWalkSpeed` and `keyboardPivotDegrees`, and\n * lower numbers will result in faster movement and vice-versa. Defaults to `25`.\n *\n */\n public updateConfiguration(\n configuration: Partial<ViewerWalkModeConfiguration>,\n ): void {\n const existing = this.model.getConfiguration();\n\n this.model.setConfiguration({\n ...existing,\n ...configuration,\n });\n }\n\n /**\n * Adds a custom keybinding for a specific walk operation. This will append to the\n * existing set of keybindings to allow for multiple keybindings for a specific\n * operation. To replace the defaults, see `replaceKeyBinding`.\n */\n public addKeyBinding(\n operation: ViewerWalkModeOperation,\n ...keys: string[]\n ): void {\n this.model.addKeyBinding(operation, new KeyBinding(...keys));\n }\n\n /**\n * Adds a custom keybinding for a specific walk operation. This will replace any\n * existing keybindings to allow for overriding the default behavior.\n *\n * @example\n * ```\n * const walkModeTool = document.querySelector('vertex-viewer-walk-mode-tool');\n *\n * // Remove keybinding for the `PIVOT_UP` operation\n * walkModeTool.controller.replaceKeyBinding('PIVOT_UP');\n *\n * // Replace keybinding for `WALK_FORWARD` with `ArrowUp` instead of `w`\n * walkModeTool.controller.replaceKeyBinding('WALK_FORWARD', 'ArrowUp');\n * ```\n */\n public replaceKeyBinding(\n operation: ViewerWalkModeOperation,\n ...keys: string[]\n ): void {\n this.model.replaceKeyBinding(operation, new KeyBinding(...keys));\n }\n\n /**\n * Adds an exclusion for specific elements when responding to keyboard\n * events. This is useful when there are other elements on screen that\n * require keyboard interaction and the walk mode handlers should not\n * respond to the keyboard events. Can be either a element's `tagName`\n * or a predicate. Returns a `Disposable` that can be used to remove the\n * exclusion.\n *\n * Default `tagName` exclusions:\n * 'VERTEX-SCENE-TREE'\n * 'VERTEX-SCENE-TREE-SEARCH'\n * 'VERTEX-VIEWER-PIN-TOOL'\n * 'INPUT'\n * 'TEXTAREA'\n */\n public excludeElement(predicate: (el: Element) => boolean): Disposable;\n public excludeElement(tagName: string): Disposable;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public excludeElement(...args: any[]): Disposable {\n if (typeof args[0] === 'string') {\n this.excludeTagNames = [...this.excludeTagNames, args[0]];\n\n this.updateModelExclusions();\n\n return {\n dispose: () => {\n this.excludeTagNames = this.excludeTagNames.filter(\n (tn) => tn !== args[0],\n );\n },\n };\n } else {\n this.excludePredicates = [...this.excludePredicates, args[0]];\n\n this.updateModelExclusions();\n\n return {\n dispose: () => {\n this.excludePredicates = this.excludePredicates.filter(\n (tn) => tn !== args[0],\n );\n },\n };\n }\n }\n\n private updateModelExclusions(): void {\n this.model.setExcludedPredicate(\n (el) =>\n this.excludeTagNames.some((tn) => tn === el.tagName) ||\n this.excludePredicates.some((p) => p(el)),\n );\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"interactions.js","sourceRoot":"","sources":["../../../../../src/lib/walk-mode/interactions.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3 } from '@vertexvis/geometry';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { InteractionApiPerspective, InteractionHandler } from '../interactions';\nimport { targetIsElement } from './dom';\nimport { ViewerWalkModeOperation, WalkModeModel } from './model';\n\nexport class WalkInteractionHandler implements InteractionHandler {\n private api?: InteractionApiPerspective;\n\n private interval?: NodeJS.Timeout;\n private pressed: Record<string, boolean> = {};\n private handlers: Record<ViewerWalkModeOperation, VoidFunction>;\n\n private enabledChangeDisposable?: Disposable;\n private keyBindingsChangeDisposable?: Disposable;\n private configurationChangeDisposable?: Disposable;\n\n public constructor(private model: WalkModeModel) {\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleKeyUp = this.handleKeyUp.bind(this);\n this.handleEnabledChange = this.handleEnabledChange.bind(this);\n this.restartInteraction = this.restartInteraction.bind(this);\n this.updateCamera = this.updateCamera.bind(this);\n\n this.handlers = {\n [ViewerWalkModeOperation.MOVE_DOWN]: this.moveDown.bind(this),\n [ViewerWalkModeOperation.MOVE_UP]: this.moveUp.bind(this),\n [ViewerWalkModeOperation.PIVOT_DOWN]: this.pivotDown.bind(this),\n [ViewerWalkModeOperation.PIVOT_LEFT]: this.pivotLeft.bind(this),\n [ViewerWalkModeOperation.PIVOT_RIGHT]: this.pivotRight.bind(this),\n [ViewerWalkModeOperation.PIVOT_UP]: this.pivotUp.bind(this),\n [ViewerWalkModeOperation.WALK_BACKWARD]: this.walkBackward.bind(this),\n [ViewerWalkModeOperation.WALK_FORWARD]: this.walkForward.bind(this),\n [ViewerWalkModeOperation.WALK_LEFT]: this.walkLeft.bind(this),\n [ViewerWalkModeOperation.WALK_RIGHT]: this.walkRight.bind(this),\n };\n\n this.enabledChangeDisposable = this.model.onEnabledChange(\n this.handleEnabledChange\n );\n this.keyBindingsChangeDisposable = this.model.onKeyBindingsChange(\n this.restartInteraction\n );\n this.configurationChangeDisposable = this.model.onConfigurationChange(\n this.restartInteraction\n );\n }\n\n public dispose(): void {\n this.disable();\n this.enabledChangeDisposable?.dispose();\n this.keyBindingsChangeDisposable?.dispose();\n this.configurationChangeDisposable?.dispose();\n\n window.removeEventListener('keydown', this.handleKeyDown);\n window.removeEventListener('keyup', this.handleKeyUp);\n }\n\n public initialize(_: HTMLElement, api: InteractionApiPerspective): void {\n this.api = api;\n\n this.handleEnabledChange(this.model.getEnabled());\n }\n\n public enable(): void {\n this.disable();\n\n window.addEventListener('keydown', this.handleKeyDown);\n window.addEventListener('keyup', this.handleKeyUp);\n }\n\n public disable(): void {\n window.removeEventListener('keydown', this.handleKeyDown);\n window.removeEventListener('keyup', this.handleKeyUp);\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n const key = event.key.toLowerCase();\n\n const exclude =\n targetIsElement(event.target) &&\n this.model.isElementExcluded(event.target);\n\n if (!event.repeat && !exclude) {\n this.pressed = { ...this.pressed, [key]: true };\n\n this.tryBeginInteraction();\n }\n }\n\n private handleKeyUp = async (event: KeyboardEvent): Promise<void> => {\n const key = event.key.toLocaleLowerCase();\n\n this.pressed = Object.keys(this.pressed)\n .filter((k) => k !== key)\n .reduce((pressed, k) => ({ ...pressed, [k]: true }), {});\n\n if (Object.keys(this.pressed).length === 0 && this.interval != null) {\n this.endInteraction();\n }\n };\n\n private handleEnabledChange(enabled: boolean): void {\n if (enabled) {\n this.enable();\n } else {\n this.disable();\n }\n }\n\n private restartInteraction(): void {\n this.clearInterval();\n this.tryBeginInteraction();\n }\n\n private tryBeginInteraction(): void {\n if (Object.keys(this.pressed).length > 0 && this.someOperationMatches()) {\n this.beginInteraction();\n }\n }\n\n private beginInteraction(): void {\n if (!this.api?.isInteracting()) {\n this.api?.beginInteraction();\n }\n\n if (this.interval == null) {\n this.interval = setInterval(\n this.updateCamera,\n this.model.getKeyboardRepeatInterval()\n );\n }\n }\n\n private endInteraction = async (): Promise<void> => {\n this.clearInterval();\n await this.api?.endInteraction();\n };\n\n private clearInterval(): void {\n if (this.interval != null) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n }\n\n private updateCamera(): void {\n Object.keys(this.handlers).forEach((key) => {\n const op = key as ViewerWalkModeOperation;\n\n if (this.model.operationMatches(op, this.pressed)) {\n this.handlers[op]();\n }\n });\n }\n\n private someOperationMatches(): boolean {\n return Object.keys(this.handlers).some((op) =>\n this.model.operationMatches(op as ViewerWalkModeOperation, this.pressed)\n );\n }\n\n private pivotLeft(): void {\n this.api?.pivotCamera(0, this.model.getKeyboardPivotDegrees());\n }\n\n private pivotRight(): void {\n this.api?.pivotCamera(0, -this.model.getKeyboardPivotDegrees());\n }\n\n private pivotUp(): void {\n this.api?.pivotCamera(-this.model.getKeyboardPivotDegrees(), 0);\n }\n\n private pivotDown(): void {\n this.api?.pivotCamera(this.model.getKeyboardPivotDegrees(), 0);\n }\n\n private walkForward(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.forward()));\n }\n\n private walkBackward(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.back()));\n }\n\n private walkLeft(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.left()));\n }\n\n private walkRight(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.right()));\n }\n\n private moveUp(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.down()));\n }\n\n private moveDown(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.up()));\n }\n\n private relativeWalkSpeed(): number {\n return this.model.getKeyboardWalkSpeed() / 500;\n }\n}\n"]}
1
+ {"version":3,"file":"interactions.js","sourceRoot":"","sources":["../../../../../src/lib/walk-mode/interactions.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3 } from '@vertexvis/geometry';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { InteractionApiPerspective, InteractionHandler } from '../interactions';\nimport { targetIsElement } from './dom';\nimport { ViewerWalkModeOperation, WalkModeModel } from './model';\n\nexport class WalkInteractionHandler implements InteractionHandler {\n private api?: InteractionApiPerspective;\n\n private interval?: NodeJS.Timeout;\n private pressed: Record<string, boolean> = {};\n private handlers: Record<ViewerWalkModeOperation, VoidFunction>;\n\n private enabledChangeDisposable?: Disposable;\n private keyBindingsChangeDisposable?: Disposable;\n private configurationChangeDisposable?: Disposable;\n\n public constructor(private model: WalkModeModel) {\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleKeyUp = this.handleKeyUp.bind(this);\n this.handleEnabledChange = this.handleEnabledChange.bind(this);\n this.restartInteraction = this.restartInteraction.bind(this);\n this.updateCamera = this.updateCamera.bind(this);\n\n this.handlers = {\n [ViewerWalkModeOperation.MOVE_DOWN]: this.moveDown.bind(this),\n [ViewerWalkModeOperation.MOVE_UP]: this.moveUp.bind(this),\n [ViewerWalkModeOperation.PIVOT_DOWN]: this.pivotDown.bind(this),\n [ViewerWalkModeOperation.PIVOT_LEFT]: this.pivotLeft.bind(this),\n [ViewerWalkModeOperation.PIVOT_RIGHT]: this.pivotRight.bind(this),\n [ViewerWalkModeOperation.PIVOT_UP]: this.pivotUp.bind(this),\n [ViewerWalkModeOperation.WALK_BACKWARD]: this.walkBackward.bind(this),\n [ViewerWalkModeOperation.WALK_FORWARD]: this.walkForward.bind(this),\n [ViewerWalkModeOperation.WALK_LEFT]: this.walkLeft.bind(this),\n [ViewerWalkModeOperation.WALK_RIGHT]: this.walkRight.bind(this),\n };\n\n this.enabledChangeDisposable = this.model.onEnabledChange(\n this.handleEnabledChange,\n );\n this.keyBindingsChangeDisposable = this.model.onKeyBindingsChange(\n this.restartInteraction,\n );\n this.configurationChangeDisposable = this.model.onConfigurationChange(\n this.restartInteraction,\n );\n }\n\n public dispose(): void {\n this.disable();\n this.enabledChangeDisposable?.dispose();\n this.keyBindingsChangeDisposable?.dispose();\n this.configurationChangeDisposable?.dispose();\n\n window.removeEventListener('keydown', this.handleKeyDown);\n window.removeEventListener('keyup', this.handleKeyUp);\n }\n\n public initialize(_: HTMLElement, api: InteractionApiPerspective): void {\n this.api = api;\n\n this.handleEnabledChange(this.model.getEnabled());\n }\n\n public enable(): void {\n this.disable();\n\n window.addEventListener('keydown', this.handleKeyDown);\n window.addEventListener('keyup', this.handleKeyUp);\n }\n\n public disable(): void {\n window.removeEventListener('keydown', this.handleKeyDown);\n window.removeEventListener('keyup', this.handleKeyUp);\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n const key = event.key.toLowerCase();\n\n const exclude =\n targetIsElement(event.target) &&\n this.model.isElementExcluded(event.target);\n\n if (!event.repeat && !exclude) {\n this.pressed = { ...this.pressed, [key]: true };\n\n this.tryBeginInteraction();\n }\n }\n\n private handleKeyUp = async (event: KeyboardEvent): Promise<void> => {\n const key = event.key.toLocaleLowerCase();\n\n this.pressed = Object.keys(this.pressed)\n .filter((k) => k !== key)\n .reduce((pressed, k) => ({ ...pressed, [k]: true }), {});\n\n if (Object.keys(this.pressed).length === 0 && this.interval != null) {\n this.endInteraction();\n }\n };\n\n private handleEnabledChange(enabled: boolean): void {\n if (enabled) {\n this.enable();\n } else {\n this.disable();\n }\n }\n\n private restartInteraction(): void {\n this.clearInterval();\n this.tryBeginInteraction();\n }\n\n private tryBeginInteraction(): void {\n if (Object.keys(this.pressed).length > 0 && this.someOperationMatches()) {\n this.beginInteraction();\n }\n }\n\n private beginInteraction(): void {\n if (!this.api?.isInteracting()) {\n this.api?.beginInteraction();\n }\n\n if (this.interval == null) {\n this.interval = setInterval(\n this.updateCamera,\n this.model.getKeyboardRepeatInterval(),\n );\n }\n }\n\n private endInteraction = async (): Promise<void> => {\n this.clearInterval();\n await this.api?.endInteraction();\n };\n\n private clearInterval(): void {\n if (this.interval != null) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n }\n\n private updateCamera(): void {\n Object.keys(this.handlers).forEach((key) => {\n const op = key as ViewerWalkModeOperation;\n\n if (this.model.operationMatches(op, this.pressed)) {\n this.handlers[op]();\n }\n });\n }\n\n private someOperationMatches(): boolean {\n return Object.keys(this.handlers).some((op) =>\n this.model.operationMatches(op as ViewerWalkModeOperation, this.pressed),\n );\n }\n\n private pivotLeft(): void {\n this.api?.pivotCamera(0, this.model.getKeyboardPivotDegrees());\n }\n\n private pivotRight(): void {\n this.api?.pivotCamera(0, -this.model.getKeyboardPivotDegrees());\n }\n\n private pivotUp(): void {\n this.api?.pivotCamera(-this.model.getKeyboardPivotDegrees(), 0);\n }\n\n private pivotDown(): void {\n this.api?.pivotCamera(this.model.getKeyboardPivotDegrees(), 0);\n }\n\n private walkForward(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.forward()));\n }\n\n private walkBackward(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.back()));\n }\n\n private walkLeft(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.left()));\n }\n\n private walkRight(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.right()));\n }\n\n private moveUp(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.down()));\n }\n\n private moveDown(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.up()));\n }\n\n private relativeWalkSpeed(): number {\n return this.model.getKeyboardWalkSpeed() / 500;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../../../src/lib/walk-mode/model.ts"],"names":[],"mappings":"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","sourcesContent":["import { Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\nimport { KeyBinding } from '../keyBinding';\n\nexport interface ViewerWalkModeConfiguration {\n teleportHeightPercentage: number;\n teleportDistancePercentage: number;\n teleportCollisionDistance: number;\n keyboardWalkSpeed: number;\n keyboardPivotDegrees: number;\n keyboardRepeatIntervalMs: number;\n}\n\nexport type ViewerTeleportMode =\n | 'teleport'\n | 'teleport-and-align'\n | 'teleport-toward';\n\nexport enum ViewerWalkModeOperation {\n 'MOVE_DOWN' = 'MOVE_DOWN',\n 'MOVE_UP' = 'MOVE_UP',\n 'PIVOT_DOWN' = 'PIVOT_DOWN',\n 'PIVOT_LEFT' = 'PIVOT_LEFT',\n 'PIVOT_RIGHT' = 'PIVOT_RIGHT',\n 'PIVOT_UP' = 'PIVOT_UP',\n 'WALK_BACKWARD' = 'WALK_BACKWARD',\n 'WALK_FORWARD' = 'WALK_FORWARD',\n 'WALK_LEFT' = 'WALK_LEFT',\n 'WALK_RIGHT' = 'WALK_RIGHT',\n}\n\nexport type ViewerWalkModeKeyBindings = Record<\n ViewerWalkModeOperation,\n KeyBinding[]\n>;\n\nexport class WalkModeModel {\n private keyBindings: ViewerWalkModeKeyBindings = {\n [ViewerWalkModeOperation.MOVE_DOWN]: [\n new KeyBinding('PageDown', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.MOVE_UP]: [\n new KeyBinding('PageUp', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.PIVOT_DOWN]: [\n new KeyBinding('ArrowDown', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.PIVOT_LEFT]: [\n new KeyBinding('ArrowLeft', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.PIVOT_RIGHT]: [\n new KeyBinding('ArrowRight', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.PIVOT_UP]: [\n new KeyBinding('ArrowUp', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.WALK_BACKWARD]: [new KeyBinding('s')],\n [ViewerWalkModeOperation.WALK_FORWARD]: [new KeyBinding('w')],\n [ViewerWalkModeOperation.WALK_LEFT]: [new KeyBinding('a')],\n [ViewerWalkModeOperation.WALK_RIGHT]: [new KeyBinding('d')],\n };\n\n private configuration: ViewerWalkModeConfiguration = {\n teleportHeightPercentage: 11.75,\n teleportDistancePercentage: 2,\n teleportCollisionDistance: 1000,\n keyboardWalkSpeed: 5,\n keyboardPivotDegrees: 1,\n keyboardRepeatIntervalMs: 25,\n };\n\n private excludedPredicate?: (el: Element) => boolean;\n\n private enabled = true;\n private teleportMode?: ViewerTeleportMode;\n\n private enabledChanged: EventDispatcher<boolean> = new EventDispatcher();\n\n private teleportModeChanged: EventDispatcher<ViewerTeleportMode | undefined> =\n new EventDispatcher<ViewerTeleportMode | undefined>();\n\n private configurationChanged: EventDispatcher<ViewerWalkModeConfiguration> =\n new EventDispatcher<ViewerWalkModeConfiguration>();\n\n private keyBindingsChanged: EventDispatcher<ViewerWalkModeKeyBindings> =\n new EventDispatcher<ViewerWalkModeKeyBindings>();\n\n public setEnabled(enabled: boolean): void {\n this.enabled = enabled;\n this.enabledChanged.emit(enabled);\n }\n\n public setTeleportMode(mode?: ViewerTeleportMode): void {\n this.teleportMode = mode;\n this.teleportModeChanged.emit(mode);\n }\n\n public setConfiguration(configuration: ViewerWalkModeConfiguration): void {\n this.configuration = configuration;\n this.configurationChanged.emit(configuration);\n }\n\n public addKeyBinding(\n operation: ViewerWalkModeOperation,\n keyBinding: KeyBinding\n ): void {\n this.keyBindings[operation] = [...this.keyBindings[operation], keyBinding];\n this.keyBindingsChanged.emit(this.keyBindings);\n }\n\n public replaceKeyBinding(\n operation: ViewerWalkModeOperation,\n keyBinding: KeyBinding\n ): void {\n this.keyBindings[operation] = [keyBinding];\n this.keyBindingsChanged.emit(this.keyBindings);\n }\n\n public setExcludedPredicate(predicate: (el: Element) => boolean): void {\n this.excludedPredicate = predicate;\n }\n\n public getEnabled(): boolean {\n return this.enabled;\n }\n\n public getTeleportMode(): ViewerTeleportMode | undefined {\n return this.teleportMode;\n }\n\n public getTeleportHeightPercentage(): number {\n return this.configuration.teleportHeightPercentage;\n }\n\n public getKeyboardWalkSpeed(): number {\n return this.configuration.keyboardWalkSpeed;\n }\n\n public getKeyboardPivotDegrees(): number {\n return this.configuration.keyboardPivotDegrees;\n }\n\n public getKeyboardRepeatInterval(): number {\n return this.configuration.keyboardRepeatIntervalMs;\n }\n\n public getConfiguration(): ViewerWalkModeConfiguration {\n return this.configuration;\n }\n\n public getKeyBindings(): ViewerWalkModeKeyBindings {\n return this.keyBindings;\n }\n\n public operationMatches(\n operation: ViewerWalkModeOperation,\n state: Record<string, boolean>\n ): boolean {\n return this.keyBindings[operation].some((binding) =>\n binding.matches(state)\n );\n }\n\n public isElementExcluded(el: Element): boolean {\n return !!this.excludedPredicate?.(el);\n }\n\n public onEnabledChange(listener: Listener<boolean>): Disposable {\n return this.enabledChanged.on(listener);\n }\n\n public onTeleportModeChange(\n listener: Listener<ViewerTeleportMode | undefined>\n ): Disposable {\n return this.teleportModeChanged.on(listener);\n }\n\n public onConfigurationChange(\n listener: Listener<ViewerWalkModeConfiguration>\n ): Disposable {\n return this.configurationChanged.on(listener);\n }\n\n public onKeyBindingsChange(\n listener: Listener<ViewerWalkModeKeyBindings>\n ): Disposable {\n return this.keyBindingsChanged.on(listener);\n }\n}\n"]}
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../../../src/lib/walk-mode/model.ts"],"names":[],"mappings":"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","sourcesContent":["import { Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\nimport { KeyBinding } from '../keyBinding';\n\nexport interface ViewerWalkModeConfiguration {\n teleportHeightPercentage: number;\n teleportDistancePercentage: number;\n teleportCollisionDistance: number;\n keyboardWalkSpeed: number;\n keyboardPivotDegrees: number;\n keyboardRepeatIntervalMs: number;\n}\n\nexport type ViewerTeleportMode =\n | 'teleport'\n | 'teleport-and-align'\n | 'teleport-toward';\n\nexport enum ViewerWalkModeOperation {\n 'MOVE_DOWN' = 'MOVE_DOWN',\n 'MOVE_UP' = 'MOVE_UP',\n 'PIVOT_DOWN' = 'PIVOT_DOWN',\n 'PIVOT_LEFT' = 'PIVOT_LEFT',\n 'PIVOT_RIGHT' = 'PIVOT_RIGHT',\n 'PIVOT_UP' = 'PIVOT_UP',\n 'WALK_BACKWARD' = 'WALK_BACKWARD',\n 'WALK_FORWARD' = 'WALK_FORWARD',\n 'WALK_LEFT' = 'WALK_LEFT',\n 'WALK_RIGHT' = 'WALK_RIGHT',\n}\n\nexport type ViewerWalkModeKeyBindings = Record<\n ViewerWalkModeOperation,\n KeyBinding[]\n>;\n\nexport class WalkModeModel {\n private keyBindings: ViewerWalkModeKeyBindings = {\n [ViewerWalkModeOperation.MOVE_DOWN]: [\n new KeyBinding('PageDown', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.MOVE_UP]: [\n new KeyBinding('PageUp', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.PIVOT_DOWN]: [\n new KeyBinding('ArrowDown', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.PIVOT_LEFT]: [\n new KeyBinding('ArrowLeft', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.PIVOT_RIGHT]: [\n new KeyBinding('ArrowRight', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.PIVOT_UP]: [\n new KeyBinding('ArrowUp', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.WALK_BACKWARD]: [new KeyBinding('s')],\n [ViewerWalkModeOperation.WALK_FORWARD]: [new KeyBinding('w')],\n [ViewerWalkModeOperation.WALK_LEFT]: [new KeyBinding('a')],\n [ViewerWalkModeOperation.WALK_RIGHT]: [new KeyBinding('d')],\n };\n\n private configuration: ViewerWalkModeConfiguration = {\n teleportHeightPercentage: 11.75,\n teleportDistancePercentage: 2,\n teleportCollisionDistance: 1000,\n keyboardWalkSpeed: 5,\n keyboardPivotDegrees: 1,\n keyboardRepeatIntervalMs: 25,\n };\n\n private excludedPredicate?: (el: Element) => boolean;\n\n private enabled = true;\n private teleportMode?: ViewerTeleportMode;\n\n private enabledChanged: EventDispatcher<boolean> = new EventDispatcher();\n\n private teleportModeChanged: EventDispatcher<ViewerTeleportMode | undefined> =\n new EventDispatcher<ViewerTeleportMode | undefined>();\n\n private configurationChanged: EventDispatcher<ViewerWalkModeConfiguration> =\n new EventDispatcher<ViewerWalkModeConfiguration>();\n\n private keyBindingsChanged: EventDispatcher<ViewerWalkModeKeyBindings> =\n new EventDispatcher<ViewerWalkModeKeyBindings>();\n\n public setEnabled(enabled: boolean): void {\n this.enabled = enabled;\n this.enabledChanged.emit(enabled);\n }\n\n public setTeleportMode(mode?: ViewerTeleportMode): void {\n this.teleportMode = mode;\n this.teleportModeChanged.emit(mode);\n }\n\n public setConfiguration(configuration: ViewerWalkModeConfiguration): void {\n this.configuration = configuration;\n this.configurationChanged.emit(configuration);\n }\n\n public addKeyBinding(\n operation: ViewerWalkModeOperation,\n keyBinding: KeyBinding,\n ): void {\n this.keyBindings[operation] = [...this.keyBindings[operation], keyBinding];\n this.keyBindingsChanged.emit(this.keyBindings);\n }\n\n public replaceKeyBinding(\n operation: ViewerWalkModeOperation,\n keyBinding: KeyBinding,\n ): void {\n this.keyBindings[operation] = [keyBinding];\n this.keyBindingsChanged.emit(this.keyBindings);\n }\n\n public setExcludedPredicate(predicate: (el: Element) => boolean): void {\n this.excludedPredicate = predicate;\n }\n\n public getEnabled(): boolean {\n return this.enabled;\n }\n\n public getTeleportMode(): ViewerTeleportMode | undefined {\n return this.teleportMode;\n }\n\n public getTeleportHeightPercentage(): number {\n return this.configuration.teleportHeightPercentage;\n }\n\n public getKeyboardWalkSpeed(): number {\n return this.configuration.keyboardWalkSpeed;\n }\n\n public getKeyboardPivotDegrees(): number {\n return this.configuration.keyboardPivotDegrees;\n }\n\n public getKeyboardRepeatInterval(): number {\n return this.configuration.keyboardRepeatIntervalMs;\n }\n\n public getConfiguration(): ViewerWalkModeConfiguration {\n return this.configuration;\n }\n\n public getKeyBindings(): ViewerWalkModeKeyBindings {\n return this.keyBindings;\n }\n\n public operationMatches(\n operation: ViewerWalkModeOperation,\n state: Record<string, boolean>,\n ): boolean {\n return this.keyBindings[operation].some((binding) =>\n binding.matches(state),\n );\n }\n\n public isElementExcluded(el: Element): boolean {\n return !!this.excludedPredicate?.(el);\n }\n\n public onEnabledChange(listener: Listener<boolean>): Disposable {\n return this.enabledChanged.on(listener);\n }\n\n public onTeleportModeChange(\n listener: Listener<ViewerTeleportMode | undefined>,\n ): Disposable {\n return this.teleportModeChanged.on(listener);\n }\n\n public onConfigurationChange(\n listener: Listener<ViewerWalkModeConfiguration>,\n ): Disposable {\n return this.configurationChanged.on(listener);\n }\n\n public onKeyBindingsChange(\n listener: Listener<ViewerWalkModeKeyBindings>,\n ): Disposable {\n return this.keyBindingsChanged.on(listener);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"regl-component.js","sourceRoot":"","sources":["../../../../../src/lib/webgl/regl-component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3 } from '@vertexvis/geometry';\nimport { Disposable } from '@vertexvis/utils';\nimport regl from 'regl';\n\nimport { Drawable } from '../transforms/drawable';\nimport { Frame, Viewport } from '../types';\n\n// Scalar that is used in combination with a perspective camera's\n// components to determine the relative size of the meshes.\n// This attempts to keep the widget approximately the same\n// size as zooming occurs.\nexport const DEFAULT_PERSPECTIVE_MESH_SCALAR = 0.005;\n\n// Scalar that is used in combination with an orthographic camera's\n// components to determine the relative size of the meshes.\n// This attempts to keep the widget approximately the same\n// size as zooming occurs.\nexport const DEFAULT_ORTHOGRAPHIC_MESH_SCALAR = 0.00625;\n\n// Scalar that is used to increase the relative triangle size\n// in viewers with a small area. This attempts to keep the widget\n// approximately the same size for all viewing window sizes.\nexport const TRIANGLE_SIZE_CANVAS_AREA_ADJUSTMENT_NUMERATOR = 1580000;\n\n// Scalar that is used to increase the relative triangle size\n// in viewers with a small area. This attempts to keep the widget\n// approximately the same size for all viewing window sizes.\nexport const TRIANGLE_SIZE_CANVAS_AREA_ADJUSTMENT_DENOMINATOR = 520000;\n\n// Scalar that is used to increase the relative triangle size\n// in viewers with a small height. This attempts to keep the widget\n// approximately the same size for all viewing window sizes.\nexport const TRIANGLE_SIZE_CANVAS_HEIGHT_ADJUSTMENT_NUMERATOR = 950;\n\n// Scalar that is used to increase the relative triangle size\n// in viewers with a small height. This attempts to keep the widget\n// approximately the same size for all viewing window sizes.\nexport const TRIANGLE_SIZE_CANVAS_HEIGHT_ADJUSTMENT_DENOMINATOR = 45;\n\nexport abstract class ReglComponent implements Disposable {\n protected reglCommand?: regl.Regl;\n protected reglFrameDisposable?: regl.Cancellable;\n\n protected availableElements: Drawable[] = [];\n protected drawableElements: Drawable[] = [];\n\n protected frame?: Frame;\n protected viewport: Viewport;\n\n public constructor(protected canvasElement: HTMLCanvasElement) {\n this.viewport = new Viewport(canvasElement.width, canvasElement.height);\n }\n\n public dispose(): void {\n this.reglFrameDisposable?.cancel();\n }\n\n public updateFrame(frame: Frame, redraw = true): void {\n this.frame = frame;\n\n if (redraw) {\n this.updateAndDraw();\n }\n }\n\n public updateDimensions(canvasElement: HTMLCanvasElement): void {\n this.viewport = new Viewport(canvasElement.width, canvasElement.height);\n\n this.createOrUpdateElements();\n }\n\n public updateAndDraw(): void {\n if (this.frame != null && this.hasData()) {\n this.createOrUpdateElements();\n this.sortMeshes(this.frame, ...this.availableElements);\n this.draw();\n }\n }\n\n /**\n * @internal - visible for testing\n */\n public getDrawableElements(): Drawable[] {\n return this.drawableElements;\n }\n\n protected draw(): void {\n if (this.reglFrameDisposable == null) {\n this.reglFrameDisposable = this.reglCommand?.frame(() => {\n this.drawableElements.forEach((el) =>\n el?.draw({\n fill: el.fillColor,\n opacity: !!el.disabled ? 0.2 : 1,\n })\n );\n });\n }\n }\n\n protected clear(): void {\n this.reglCommand?.clear({\n color: [0, 0, 0, 0],\n });\n }\n\n protected sortMeshes(\n frame: Frame,\n ...drawableElements: Array<Drawable | undefined>\n ): void {\n const compare = (d1: Drawable, d2: Drawable): number =>\n d1.points.shortestDistanceFrom(frame.scene.camera.position) -\n d2.points.shortestDistanceFrom(frame.scene.camera.position);\n\n // Reverse sorted elements to draw the closest element last.\n // This causes it to appear above any other element.\n this.drawableElements = (\n drawableElements.filter((el) => el != null) as Drawable[]\n )\n .filter((el) => el.points.valid)\n .sort(compare)\n .reverse();\n }\n\n protected computeTriangleSize(\n position: Vector3.Vector3,\n frame: Frame\n ): number {\n const baseTriangleSize = frame.scene.camera.isOrthographic()\n ? frame.scene.camera.fovHeight * DEFAULT_ORTHOGRAPHIC_MESH_SCALAR\n : Vector3.magnitude(\n Vector3.subtract(position, frame.scene.camera.position)\n ) * DEFAULT_PERSPECTIVE_MESH_SCALAR;\n\n // Increase the triangle size for small viewers\n const canvasArea = this.canvasElement.height * this.canvasElement.width;\n const canvasAreaAdjustment =\n TRIANGLE_SIZE_CANVAS_AREA_ADJUSTMENT_NUMERATOR /\n (canvasArea + TRIANGLE_SIZE_CANVAS_AREA_ADJUSTMENT_DENOMINATOR);\n\n // Increase the triangle size for viewers with a small height and large width\n const canvasHeightAdjustment =\n this.canvasElement.height < 650\n ? TRIANGLE_SIZE_CANVAS_HEIGHT_ADJUSTMENT_NUMERATOR /\n (this.canvasElement.height +\n TRIANGLE_SIZE_CANVAS_HEIGHT_ADJUSTMENT_DENOMINATOR)\n : 1;\n\n const sizeAdjustment = Math.max(\n canvasAreaAdjustment,\n canvasHeightAdjustment,\n 1\n );\n\n return baseTriangleSize * sizeAdjustment;\n }\n\n protected abstract createOrUpdateElements(): void;\n\n protected abstract hasData(): boolean;\n}\n"]}
1
+ {"version":3,"file":"regl-component.js","sourceRoot":"","sources":["../../../../../src/lib/webgl/regl-component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAK9C,OAAO,EAAS,QAAQ,EAAE,MAAM,UAAU,CAAC;AAE3C,iEAAiE;AACjE,2DAA2D;AAC3D,0DAA0D;AAC1D,0BAA0B;AAC1B,MAAM,CAAC,MAAM,+BAA+B,GAAG,KAAK,CAAC;AAErD,mEAAmE;AACnE,2DAA2D;AAC3D,0DAA0D;AAC1D,0BAA0B;AAC1B,MAAM,CAAC,MAAM,gCAAgC,GAAG,OAAO,CAAC;AAExD,6DAA6D;AAC7D,iEAAiE;AACjE,4DAA4D;AAC5D,MAAM,CAAC,MAAM,8CAA8C,GAAG,OAAO,CAAC;AAEtE,6DAA6D;AAC7D,iEAAiE;AACjE,4DAA4D;AAC5D,MAAM,CAAC,MAAM,gDAAgD,GAAG,MAAM,CAAC;AAEvE,6DAA6D;AAC7D,mEAAmE;AACnE,4DAA4D;AAC5D,MAAM,CAAC,MAAM,gDAAgD,GAAG,GAAG,CAAC;AAEpE,6DAA6D;AAC7D,mEAAmE;AACnE,4DAA4D;AAC5D,MAAM,CAAC,MAAM,kDAAkD,GAAG,EAAE,CAAC;AAErE,MAAM,OAAgB,aAAa;IAUjC,YAA6B,aAAgC;QAAhC,kBAAa,GAAb,aAAa,CAAmB;QANnD,sBAAiB,GAAe,EAAE,CAAC;QACnC,qBAAgB,GAAe,EAAE,CAAC;QAM1C,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC1E,CAAC;IAEM,OAAO;;QACZ,MAAA,IAAI,CAAC,mBAAmB,0CAAE,MAAM,EAAE,CAAC;IACrC,CAAC;IAEM,WAAW,CAAC,KAAY,EAAE,MAAM,GAAG,IAAI;QAC5C,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QAEnB,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IAEM,gBAAgB,CAAC,aAAgC;QACtD,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAExE,IAAI,CAAC,sBAAsB,EAAE,CAAC;IAChC,CAAC;IAEM,aAAa;QAClB,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACvD,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACI,mBAAmB;QACxB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IAC/B,CAAC;IAES,IAAI;;QACZ,IAAI,IAAI,CAAC,mBAAmB,IAAI,IAAI,EAAE,CAAC;YACrC,IAAI,CAAC,mBAAmB,GAAG,MAAA,IAAI,CAAC,WAAW,0CAAE,KAAK,CAAC,GAAG,EAAE;gBACtD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CACnC,EAAE,aAAF,EAAE,uBAAF,EAAE,CAAE,IAAI,CAAC;oBACP,IAAI,EAAE,EAAE,CAAC,SAAS;oBAClB,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;iBACjC,CAAC,CACH,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAES,KAAK;;QACb,MAAA,IAAI,CAAC,WAAW,0CAAE,KAAK,CAAC;YACtB,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SACpB,CAAC,CAAC;IACL,CAAC;IAES,UAAU,CAClB,KAAY,EACZ,GAAG,gBAA6C;QAEhD,MAAM,OAAO,GAAG,CAAC,EAAY,EAAE,EAAY,EAAU,EAAE,CACrD,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC3D,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE9D,4DAA4D;QAC5D,oDAAoD;QACpD,IAAI,CAAC,gBAAgB,GACnB,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,IAAI,CAC3C;aACE,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;aAC/B,IAAI,CAAC,OAAO,CAAC;aACb,OAAO,EAAE,CAAC;IACf,CAAC;IAES,mBAAmB,CAC3B,QAAyB,EACzB,KAAY;QAEZ,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE;YAC1D,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,GAAG,gCAAgC;YACjE,CAAC,CAAC,OAAO,CAAC,SAAS,CACf,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CACxD,GAAG,+BAA+B,CAAC;QAExC,+CAA+C;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QACxE,MAAM,oBAAoB,GACxB,8CAA8C;YAC9C,CAAC,UAAU,GAAG,gDAAgD,CAAC,CAAC;QAElE,6EAA6E;QAC7E,MAAM,sBAAsB,GAC1B,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,GAAG;YAC7B,CAAC,CAAC,gDAAgD;gBAChD,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM;oBACxB,kDAAkD,CAAC;YACvD,CAAC,CAAC,CAAC,CAAC;QAER,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAC7B,oBAAoB,EACpB,sBAAsB,EACtB,CAAC,CACF,CAAC;QAEF,OAAO,gBAAgB,GAAG,cAAc,CAAC;IAC3C,CAAC;CAKF","sourcesContent":["import { Vector3 } from '@vertexvis/geometry';\nimport { Disposable } from '@vertexvis/utils';\nimport regl from 'regl';\n\nimport { Drawable } from '../transforms/drawable';\nimport { Frame, Viewport } from '../types';\n\n// Scalar that is used in combination with a perspective camera's\n// components to determine the relative size of the meshes.\n// This attempts to keep the widget approximately the same\n// size as zooming occurs.\nexport const DEFAULT_PERSPECTIVE_MESH_SCALAR = 0.005;\n\n// Scalar that is used in combination with an orthographic camera's\n// components to determine the relative size of the meshes.\n// This attempts to keep the widget approximately the same\n// size as zooming occurs.\nexport const DEFAULT_ORTHOGRAPHIC_MESH_SCALAR = 0.00625;\n\n// Scalar that is used to increase the relative triangle size\n// in viewers with a small area. This attempts to keep the widget\n// approximately the same size for all viewing window sizes.\nexport const TRIANGLE_SIZE_CANVAS_AREA_ADJUSTMENT_NUMERATOR = 1580000;\n\n// Scalar that is used to increase the relative triangle size\n// in viewers with a small area. This attempts to keep the widget\n// approximately the same size for all viewing window sizes.\nexport const TRIANGLE_SIZE_CANVAS_AREA_ADJUSTMENT_DENOMINATOR = 520000;\n\n// Scalar that is used to increase the relative triangle size\n// in viewers with a small height. This attempts to keep the widget\n// approximately the same size for all viewing window sizes.\nexport const TRIANGLE_SIZE_CANVAS_HEIGHT_ADJUSTMENT_NUMERATOR = 950;\n\n// Scalar that is used to increase the relative triangle size\n// in viewers with a small height. This attempts to keep the widget\n// approximately the same size for all viewing window sizes.\nexport const TRIANGLE_SIZE_CANVAS_HEIGHT_ADJUSTMENT_DENOMINATOR = 45;\n\nexport abstract class ReglComponent implements Disposable {\n protected reglCommand?: regl.Regl;\n protected reglFrameDisposable?: regl.Cancellable;\n\n protected availableElements: Drawable[] = [];\n protected drawableElements: Drawable[] = [];\n\n protected frame?: Frame;\n protected viewport: Viewport;\n\n public constructor(protected canvasElement: HTMLCanvasElement) {\n this.viewport = new Viewport(canvasElement.width, canvasElement.height);\n }\n\n public dispose(): void {\n this.reglFrameDisposable?.cancel();\n }\n\n public updateFrame(frame: Frame, redraw = true): void {\n this.frame = frame;\n\n if (redraw) {\n this.updateAndDraw();\n }\n }\n\n public updateDimensions(canvasElement: HTMLCanvasElement): void {\n this.viewport = new Viewport(canvasElement.width, canvasElement.height);\n\n this.createOrUpdateElements();\n }\n\n public updateAndDraw(): void {\n if (this.frame != null && this.hasData()) {\n this.createOrUpdateElements();\n this.sortMeshes(this.frame, ...this.availableElements);\n this.draw();\n }\n }\n\n /**\n * @internal - visible for testing\n */\n public getDrawableElements(): Drawable[] {\n return this.drawableElements;\n }\n\n protected draw(): void {\n if (this.reglFrameDisposable == null) {\n this.reglFrameDisposable = this.reglCommand?.frame(() => {\n this.drawableElements.forEach((el) =>\n el?.draw({\n fill: el.fillColor,\n opacity: !!el.disabled ? 0.2 : 1,\n }),\n );\n });\n }\n }\n\n protected clear(): void {\n this.reglCommand?.clear({\n color: [0, 0, 0, 0],\n });\n }\n\n protected sortMeshes(\n frame: Frame,\n ...drawableElements: Array<Drawable | undefined>\n ): void {\n const compare = (d1: Drawable, d2: Drawable): number =>\n d1.points.shortestDistanceFrom(frame.scene.camera.position) -\n d2.points.shortestDistanceFrom(frame.scene.camera.position);\n\n // Reverse sorted elements to draw the closest element last.\n // This causes it to appear above any other element.\n this.drawableElements = (\n drawableElements.filter((el) => el != null) as Drawable[]\n )\n .filter((el) => el.points.valid)\n .sort(compare)\n .reverse();\n }\n\n protected computeTriangleSize(\n position: Vector3.Vector3,\n frame: Frame,\n ): number {\n const baseTriangleSize = frame.scene.camera.isOrthographic()\n ? frame.scene.camera.fovHeight * DEFAULT_ORTHOGRAPHIC_MESH_SCALAR\n : Vector3.magnitude(\n Vector3.subtract(position, frame.scene.camera.position),\n ) * DEFAULT_PERSPECTIVE_MESH_SCALAR;\n\n // Increase the triangle size for small viewers\n const canvasArea = this.canvasElement.height * this.canvasElement.width;\n const canvasAreaAdjustment =\n TRIANGLE_SIZE_CANVAS_AREA_ADJUSTMENT_NUMERATOR /\n (canvasArea + TRIANGLE_SIZE_CANVAS_AREA_ADJUSTMENT_DENOMINATOR);\n\n // Increase the triangle size for viewers with a small height and large width\n const canvasHeightAdjustment =\n this.canvasElement.height < 650\n ? TRIANGLE_SIZE_CANVAS_HEIGHT_ADJUSTMENT_NUMERATOR /\n (this.canvasElement.height +\n TRIANGLE_SIZE_CANVAS_HEIGHT_ADJUSTMENT_DENOMINATOR)\n : 1;\n\n const sizeAdjustment = Math.max(\n canvasAreaAdjustment,\n canvasHeightAdjustment,\n 1,\n );\n\n return baseTriangleSize * sizeAdjustment;\n }\n\n protected abstract createOrUpdateElements(): void;\n\n protected abstract hasData(): boolean;\n}\n"]}