@vertexvis/viewer 1.0.2-canary.2 → 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.
- package/dist/cjs/config-20ozv4y8.js.map +1 -1
- package/dist/cjs/controller-BhcNbaX_.js.map +1 -1
- package/dist/cjs/controller-CSwG6gbQ.js.map +1 -1
- package/dist/cjs/cursors-BZmDRtaZ.js.map +1 -1
- package/dist/cjs/dom-BBil4aN3.js.map +1 -1
- package/dist/cjs/dom-CvGkFQon.js.map +1 -1
- package/dist/cjs/entities-D6kgGria.js.map +1 -1
- package/dist/cjs/geometry_pb-BTko2Wi0.js.map +1 -1
- package/dist/cjs/grpc-BsWFEUrc.js.map +1 -1
- package/dist/cjs/index.cjs.js.map +1 -1
- package/dist/cjs/model-C9WvOKYT.js.map +1 -1
- package/dist/cjs/model-D17EQTIh.js.map +1 -1
- package/dist/cjs/model-DAB4oD5n.js.map +1 -1
- package/dist/cjs/model-DkXCzhs_.js.map +1 -1
- package/dist/cjs/multiElementInteractionHandler-BHvRKVIp.js.map +1 -1
- package/dist/cjs/overlays-B-06bUbI.js.map +1 -1
- package/dist/cjs/queries-Da9I-xMf.js.map +1 -1
- package/dist/cjs/regl-component-HhKCyGQ3.js.map +1 -1
- package/dist/cjs/representation_pb-CrCGjlyP.js.map +1 -1
- package/dist/cjs/results-1wRRZiYG.js.map +1 -1
- package/dist/cjs/row-Cet6xXup.js.map +1 -1
- package/dist/cjs/stencil-Hsr_8Chs.js.map +1 -1
- package/dist/cjs/streamAttributes-D_J-W8-2.js.map +1 -1
- package/dist/cjs/templates-DvjgjnlO.js.map +1 -1
- package/dist/cjs/util-DIJSIQXH.js.map +1 -1
- package/dist/cjs/utils-CibrnHQ4.js.map +1 -1
- package/dist/cjs/utils-D8MbXbwO.js.map +1 -1
- package/dist/cjs/utils-qErVs2Vt.js.map +1 -1
- package/dist/cjs/vertex-scene-tree-notification-banner_4.cjs.entry.js +6 -8
- package/dist/cjs/vertex-scene-tree-notification-banner_4.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-scene-tree-table-cell.cjs.entry.js +1 -1
- package/dist/cjs/vertex-scene-tree-table-cell.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-scene-tree.cjs.entry.js +2 -2
- package/dist/cjs/vertex-scene-tree.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer-box-query-tool.cjs.entry.js +2 -2
- package/dist/cjs/vertex-viewer-box-query-tool.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer-dom-element_2.cjs.entry.js +1 -1
- package/dist/cjs/vertex-viewer-dom-element_2.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer-dom-group.cjs.entry.js +1 -1
- package/dist/cjs/vertex-viewer-dom-group.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer-hit-result-indicator.cjs.entry.js +1 -1
- package/dist/cjs/vertex-viewer-hit-result-indicator.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer-icon.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer-markup-arrow_3.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer-markup-tool.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer-markup.cjs.entry.js +1 -1
- package/dist/cjs/vertex-viewer-markup.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer-measurement-details.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer-measurement-distance.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer-measurement-line_2.cjs.entry.js +2 -2
- package/dist/cjs/vertex-viewer-measurement-line_2.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer-measurement-precise.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js +2 -2
- package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer-pin-label_2.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer-pin-tool.cjs.entry.js +1 -1
- package/dist/cjs/vertex-viewer-pin-tool.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer-teleport-tool.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer-transform-widget.cjs.entry.js +4 -5
- package/dist/cjs/vertex-viewer-transform-widget.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer-view-cube.cjs.entry.js +1 -1
- package/dist/cjs/vertex-viewer-view-cube.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer-walk-mode-tool.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-viewer.cjs.entry.js +9 -5
- package/dist/cjs/vertex-viewer.cjs.entry.js.map +1 -1
- package/dist/cjs/viewport-CG1VYkIU.js.map +1 -1
- package/dist/collection/components/scene-tree/errors.js.map +1 -1
- package/dist/collection/components/scene-tree/lib/controller.js.map +1 -1
- package/dist/collection/components/scene-tree/lib/dom.js.map +1 -1
- package/dist/collection/components/scene-tree/lib/errors.js.map +1 -1
- package/dist/collection/components/scene-tree/lib/grpc.js.map +1 -1
- package/dist/collection/components/scene-tree/lib/handlers.js.map +1 -1
- package/dist/collection/components/scene-tree/lib/row.js.map +1 -1
- package/dist/collection/components/scene-tree/lib/viewer-ops.js.map +1 -1
- package/dist/collection/components/scene-tree/scene-tree.js +2 -2
- package/dist/collection/components/scene-tree/scene-tree.js.map +1 -1
- package/dist/collection/components/scene-tree-search/scene-tree-search.js.map +1 -1
- package/dist/collection/components/scene-tree-table-cell/scene-tree-table-cell.js +1 -1
- package/dist/collection/components/scene-tree-table-cell/scene-tree-table-cell.js.map +1 -1
- package/dist/collection/components/scene-tree-table-cell/utils.js.map +1 -1
- package/dist/collection/components/scene-tree-table-layout/lib/dom.js.map +1 -1
- package/dist/collection/components/scene-tree-table-layout/lib/window.js.map +1 -1
- package/dist/collection/components/scene-tree-table-layout/scene-tree-table-layout.js +5 -5
- package/dist/collection/components/scene-tree-table-layout/scene-tree-table-layout.js.map +1 -1
- package/dist/collection/components/viewer/utils.js.map +1 -1
- package/dist/collection/components/viewer/viewer.js +9 -5
- package/dist/collection/components/viewer/viewer.js.map +1 -1
- package/dist/collection/components/viewer-box-query-tool/viewer-box-query-tool.js +2 -2
- package/dist/collection/components/viewer-box-query-tool/viewer-box-query-tool.js.map +1 -1
- package/dist/collection/components/viewer-dom-element/utils.js.map +1 -1
- package/dist/collection/components/viewer-dom-element/viewer-dom-element.js +1 -1
- package/dist/collection/components/viewer-dom-element/viewer-dom-element.js.map +1 -1
- package/dist/collection/components/viewer-dom-group/utils.js.map +1 -1
- package/dist/collection/components/viewer-dom-group/viewer-dom-group.js +1 -1
- package/dist/collection/components/viewer-dom-group/viewer-dom-group.js.map +1 -1
- package/dist/collection/components/viewer-dom-renderer/renderer2d.js.map +1 -1
- package/dist/collection/components/viewer-dom-renderer/renderer3d.js.map +1 -1
- package/dist/collection/components/viewer-dom-renderer/viewer-dom-renderer.js.map +1 -1
- package/dist/collection/components/viewer-hit-result-indicator/lib/dom.js.map +1 -1
- package/dist/collection/components/viewer-hit-result-indicator/lib/indicator.js.map +1 -1
- package/dist/collection/components/viewer-hit-result-indicator/lib/plane.js.map +1 -1
- package/dist/collection/components/viewer-hit-result-indicator/lib/point.js.map +1 -1
- package/dist/collection/components/viewer-hit-result-indicator/viewer-hit-result-indicator.js +1 -1
- package/dist/collection/components/viewer-hit-result-indicator/viewer-hit-result-indicator.js.map +1 -1
- package/dist/collection/components/viewer-icon/viewer-icon.js.map +1 -1
- package/dist/collection/components/viewer-markup/markup-utils.js.map +1 -1
- package/dist/collection/components/viewer-markup/viewer-markup-components.js.map +1 -1
- package/dist/collection/components/viewer-markup/viewer-markup.js +1 -1
- package/dist/collection/components/viewer-markup/viewer-markup.js.map +1 -1
- package/dist/collection/components/viewer-markup-arrow/interactions.js.map +1 -1
- package/dist/collection/components/viewer-markup-arrow/utils.js.map +1 -1
- package/dist/collection/components/viewer-markup-arrow/viewer-markup-arrow-components.js.map +1 -1
- package/dist/collection/components/viewer-markup-arrow/viewer-markup-arrow.js.map +1 -1
- package/dist/collection/components/viewer-markup-circle/interactions.js.map +1 -1
- package/dist/collection/components/viewer-markup-circle/utils.js.map +1 -1
- package/dist/collection/components/viewer-markup-circle/viewer-markup-circle.js.map +1 -1
- package/dist/collection/components/viewer-markup-freeform/interactions.js.map +1 -1
- package/dist/collection/components/viewer-markup-freeform/utils.js.map +1 -1
- package/dist/collection/components/viewer-markup-freeform/viewer-markup-freeform.js.map +1 -1
- package/dist/collection/components/viewer-markup-tool/viewer-markup-tool.js.map +1 -1
- package/dist/collection/components/viewer-measurement-details/viewer-measurement-details.js.map +1 -1
- package/dist/collection/components/viewer-measurement-distance/hitTest.js.map +1 -1
- package/dist/collection/components/viewer-measurement-distance/interactions.js.map +1 -1
- package/dist/collection/components/viewer-measurement-distance/utils.js.map +1 -1
- package/dist/collection/components/viewer-measurement-distance/viewer-measurement-distance.js.map +1 -1
- package/dist/collection/components/viewer-measurement-line/viewer-measurement-line.js +1 -1
- package/dist/collection/components/viewer-measurement-line/viewer-measurement-line.js.map +1 -1
- package/dist/collection/components/viewer-measurement-overlays/viewer-measurement-overlays.js +1 -1
- package/dist/collection/components/viewer-measurement-overlays/viewer-measurement-overlays.js.map +1 -1
- package/dist/collection/components/viewer-measurement-precise/viewer-measurement-precise.js.map +1 -1
- package/dist/collection/components/viewer-pin-group/utils.js.map +1 -1
- package/dist/collection/components/viewer-pin-group/viewer-pin-group.js +2 -2
- package/dist/collection/components/viewer-pin-group/viewer-pin-group.js.map +1 -1
- package/dist/collection/components/viewer-pin-label/viewer-pin-label.js.map +1 -1
- package/dist/collection/components/viewer-pin-tool/utils.js.map +1 -1
- package/dist/collection/components/viewer-pin-tool/viewer-pin-tool.js +1 -1
- package/dist/collection/components/viewer-pin-tool/viewer-pin-tool.js.map +1 -1
- package/dist/collection/components/viewer-teleport-tool/viewer-teleport-tool.js.map +1 -1
- package/dist/collection/components/viewer-transform-widget/util.js +1 -2
- package/dist/collection/components/viewer-transform-widget/util.js.map +1 -1
- package/dist/collection/components/viewer-transform-widget/viewer-transform-widget-components.js.map +1 -1
- package/dist/collection/components/viewer-transform-widget/viewer-transform-widget.js +3 -3
- package/dist/collection/components/viewer-transform-widget/viewer-transform-widget.js.map +1 -1
- package/dist/collection/components/viewer-transform-widget/widget.js.map +1 -1
- package/dist/collection/components/viewer-view-cube/viewer-view-cube.js +1 -1
- package/dist/collection/components/viewer-view-cube/viewer-view-cube.js.map +1 -1
- package/dist/collection/components/viewer-walk-mode-tool/viewer-walk-mode-tool.js.map +1 -1
- package/dist/collection/lib/annotations/controller.js.map +1 -1
- package/dist/collection/lib/canvases/controller.js.map +1 -1
- package/dist/collection/lib/canvases/mapper.js.map +1 -1
- package/dist/collection/lib/config.js.map +1 -1
- package/dist/collection/lib/cursors.js.map +1 -1
- package/dist/collection/lib/dom.js.map +1 -1
- package/dist/collection/lib/grpc.js.map +1 -1
- package/dist/collection/lib/interactions/baseInteractionHandler.js.map +1 -1
- package/dist/collection/lib/interactions/flyToPartKeyInteraction.js.map +1 -1
- package/dist/collection/lib/interactions/flyToPositionKeyInteraction.js.map +1 -1
- package/dist/collection/lib/interactions/interactionApi.js.map +1 -1
- package/dist/collection/lib/interactions/interactionApiOrthographic.js.map +1 -1
- package/dist/collection/lib/interactions/interactionApiPerspective.js.map +1 -1
- package/dist/collection/lib/interactions/mouseInteractionHandler.js.map +1 -1
- package/dist/collection/lib/interactions/mouseInteractions.js.map +1 -1
- package/dist/collection/lib/interactions/multiElementInteractionHandler.js.map +1 -1
- package/dist/collection/lib/interactions/multiPointerInteractionHandler.js.map +1 -1
- package/dist/collection/lib/interactions/multiTouchInteractionHandler.js.map +1 -1
- package/dist/collection/lib/interactions/pointerInteractionHandler.js.map +1 -1
- package/dist/collection/lib/interactions/tapInteractionHandler.js.map +1 -1
- package/dist/collection/lib/interactions/touchInteractionHandler.js.map +1 -1
- package/dist/collection/lib/keyBinding.js.map +1 -1
- package/dist/collection/lib/mappers/annotation.js.map +1 -1
- package/dist/collection/lib/mappers/camera.js.map +1 -1
- package/dist/collection/lib/mappers/color.js.map +1 -1
- package/dist/collection/lib/mappers/colorMaterial.js.map +1 -1
- package/dist/collection/lib/mappers/corePb.js.map +1 -1
- package/dist/collection/lib/mappers/corePbJs.js.map +1 -1
- package/dist/collection/lib/mappers/frameStreaming.js.map +1 -1
- package/dist/collection/lib/mappers/geometry.js.map +1 -1
- package/dist/collection/lib/mappers/material.js.map +1 -1
- package/dist/collection/lib/mappers/pagination.js.map +1 -1
- package/dist/collection/lib/mappers/scalar.js.map +1 -1
- package/dist/collection/lib/mappers/streamAttributes.js.map +1 -1
- package/dist/collection/lib/markup/interactions.js.map +1 -1
- package/dist/collection/lib/measurement/controller.js.map +1 -1
- package/dist/collection/lib/measurement/entities.js.map +1 -1
- package/dist/collection/lib/measurement/interactions.js.map +1 -1
- package/dist/collection/lib/measurement/mapper.js.map +1 -1
- package/dist/collection/lib/measurement/model.js.map +1 -1
- package/dist/collection/lib/measurement/overlays.js.map +1 -1
- package/dist/collection/lib/measurement/results.js.map +1 -1
- package/dist/collection/lib/meters.js.map +1 -1
- package/dist/collection/lib/model-views/controller.js.map +1 -1
- package/dist/collection/lib/model-views/mapper.js.map +1 -1
- package/dist/collection/lib/pins/controller.js.map +1 -1
- package/dist/collection/lib/pins/interactions.js.map +1 -1
- package/dist/collection/lib/pmi/controller.js.map +1 -1
- package/dist/collection/lib/pmi/mapper.js.map +1 -1
- package/dist/collection/lib/rendering/canvas.js.map +1 -1
- package/dist/collection/lib/rendering/imageLoaders.js.map +1 -1
- package/dist/collection/lib/rendering/matrices.js.map +1 -1
- package/dist/collection/lib/rendering/timing.js.map +1 -1
- package/dist/collection/lib/rendering/utils.js.map +1 -1
- package/dist/collection/lib/rendering/vectors.js.map +1 -1
- package/dist/collection/lib/scene-items/controller.js.map +1 -1
- package/dist/collection/lib/scene-items/mapper.js.map +1 -1
- package/dist/collection/lib/scenes/camera.js.map +1 -1
- package/dist/collection/lib/scenes/cameraRenderResult.js.map +1 -1
- package/dist/collection/lib/scenes/colorMaterial.js.map +1 -1
- package/dist/collection/lib/scenes/crossSectioner.js.map +1 -1
- package/dist/collection/lib/scenes/mapper.js.map +1 -1
- package/dist/collection/lib/scenes/operations.js.map +1 -1
- package/dist/collection/lib/scenes/queries.js.map +1 -1
- package/dist/collection/lib/scenes/raycaster.js.map +1 -1
- package/dist/collection/lib/scenes/scene.js.map +1 -1
- package/dist/collection/lib/scenes/sceneOperationExecuteResult.js.map +1 -1
- package/dist/collection/lib/scenes/sceneViewStateLoader.js.map +1 -1
- package/dist/collection/lib/stencil.js.map +1 -1
- package/dist/collection/lib/storage.js.map +1 -1
- package/dist/collection/lib/stream/dispatcher.js.map +1 -1
- package/dist/collection/lib/stream/stream.js.map +1 -1
- package/dist/collection/lib/stream/utils.js.map +1 -1
- package/dist/collection/lib/teleportation/interactions.js.map +1 -1
- package/dist/collection/lib/templates.js.map +1 -1
- package/dist/collection/lib/token.js.map +1 -1
- package/dist/collection/lib/transforms/axis-lines.js.map +1 -1
- package/dist/collection/lib/transforms/axis-rotation.js.map +1 -1
- package/dist/collection/lib/transforms/axis-translation.js.map +1 -1
- package/dist/collection/lib/transforms/controller.js.map +1 -1
- package/dist/collection/lib/transforms/drawable.js.map +1 -1
- package/dist/collection/lib/transforms/hits.js.map +1 -1
- package/dist/collection/lib/transforms/line.js.map +1 -1
- package/dist/collection/lib/transforms/mesh.js.map +1 -1
- package/dist/collection/lib/transforms/shape.js.map +1 -1
- package/dist/collection/lib/transforms/transformation-delta.js.map +1 -1
- package/dist/collection/lib/transforms/util.js.map +1 -1
- package/dist/collection/lib/types/clippingPlanes.js.map +1 -1
- package/dist/collection/lib/types/depthBuffer.js.map +1 -1
- package/dist/collection/lib/types/featureMap.js.map +1 -1
- package/dist/collection/lib/types/flags.js.map +1 -1
- package/dist/collection/lib/types/frame.js.map +1 -1
- package/dist/collection/lib/types/frameCamera.js.map +1 -1
- package/dist/collection/lib/types/loadableResource.js.map +1 -1
- package/dist/collection/lib/types/orientation.js.map +1 -1
- package/dist/collection/lib/types/sceneViewStateIdentifier.js.map +1 -1
- package/dist/collection/lib/types/standardView.js.map +1 -1
- package/dist/collection/lib/types/stencilBuffer.js.map +1 -1
- package/dist/collection/lib/types/synchronizedClock.js.map +1 -1
- package/dist/collection/lib/types/viewport.js.map +1 -1
- package/dist/collection/lib/visibilityObserver.js.map +1 -1
- package/dist/collection/lib/volume-intersection/controller.js.map +1 -1
- package/dist/collection/lib/volume-intersection/interactions.js.map +1 -1
- package/dist/collection/lib/volume-intersection/model.js.map +1 -1
- package/dist/collection/lib/walk-mode/controller.js.map +1 -1
- package/dist/collection/lib/walk-mode/interactions.js.map +1 -1
- package/dist/collection/lib/walk-mode/model.js.map +1 -1
- package/dist/collection/lib/webgl/regl-component.js.map +1 -1
- package/dist/collection/testing/annotations.js.map +1 -1
- package/dist/collection/testing/canvases.js.map +1 -1
- package/dist/collection/testing/colors.js.map +1 -1
- package/dist/collection/testing/eventually.js.map +1 -1
- package/dist/collection/testing/fixtures.js.map +1 -1
- package/dist/collection/testing/grpc.js +3 -9
- package/dist/collection/testing/grpc.js.map +1 -1
- package/dist/collection/testing/modelViews.js.map +1 -1
- package/dist/collection/testing/pmi.js.map +1 -1
- package/dist/collection/testing/random.js.map +1 -1
- package/dist/collection/testing/resizeObserver.js.map +1 -1
- package/dist/collection/testing/scene-items-helper.js.map +1 -1
- package/dist/collection/testing/sceneTree.js.map +1 -1
- package/dist/collection/testing/viewer.js.map +1 -1
- package/dist/collection/testing/webgl.js.map +1 -1
- package/dist/components/index.js.map +1 -1
- package/dist/components/{p-St4ctu2K.js → p-3-bKfpqr.js} +2 -2
- package/dist/components/{p-St4ctu2K.js.map → p-3-bKfpqr.js.map} +1 -1
- package/dist/components/p-3DqRAYgO.js.map +1 -1
- package/dist/components/p-B-ToCp8-.js.map +1 -1
- package/dist/components/p-B156bTbY.js +5 -0
- package/dist/components/p-B156bTbY.js.map +1 -0
- package/dist/components/p-B9R0QWr4.js.map +1 -1
- package/dist/components/p-BCOD9yfw.js.map +1 -1
- package/dist/components/p-BHAaIoH5.js.map +1 -1
- package/dist/components/{p-Doltf1wO.js → p-BOJJZ1cN.js} +2 -2
- package/dist/components/p-BOJJZ1cN.js.map +1 -0
- package/dist/components/p-BkHp-aAR.js.map +1 -1
- package/dist/components/p-Bkm6H5uq.js.map +1 -1
- package/dist/components/p-C-VWDW9n.js.map +1 -1
- package/dist/components/p-C79PxobX.js.map +1 -1
- package/dist/components/p-CAugdB_8.js.map +1 -1
- package/dist/components/p-CEzVEgdQ.js.map +1 -1
- package/dist/components/p-CGCJ5hbJ.js.map +1 -1
- package/dist/components/p-COlcifvm.js.map +1 -1
- package/dist/components/p-CXTH3zrN.js.map +1 -1
- package/dist/components/p-CZCXdo3t.js.map +1 -1
- package/dist/components/p-Cd7kap5W.js.map +1 -1
- package/dist/components/p-CiSHWNC4.js.map +1 -1
- package/dist/components/p-CjG1fMh1.js.map +1 -1
- package/dist/components/p-CkjXRDNL.js.map +1 -1
- package/dist/components/p-D0KZu516.js.map +1 -1
- package/dist/components/p-D12q-fpW.js.map +1 -1
- package/dist/components/p-D33gVA2W.js.map +1 -1
- package/dist/components/p-DC86ZXai.js.map +1 -1
- package/dist/components/{p-B80hfIq6.js → p-DF4kEsJU.js} +2 -2
- package/dist/components/p-DF4kEsJU.js.map +1 -0
- package/dist/components/p-DRh4_Z-g.js.map +1 -1
- package/dist/components/p-DRnMrHWY.js.map +1 -1
- package/dist/components/{p-b0ZzPHz8.js → p-DUC59SSO.js} +2 -2
- package/dist/components/p-DUC59SSO.js.map +1 -0
- package/dist/components/p-DVW2WZTq.js.map +1 -1
- package/dist/components/p-DZI8pnGz.js.map +1 -1
- package/dist/components/p-Dbz9yUqC.js.map +1 -1
- package/dist/components/p-Yfi0i5Kj.js.map +1 -1
- package/dist/components/p-abSJ29r7.js.map +1 -1
- package/dist/components/p-ahjMltGJ.js.map +1 -1
- package/dist/components/p-bal2RLiw.js.map +1 -1
- package/dist/components/{p-BopQW1sA.js → p-oK38ynrd.js} +2 -2
- package/dist/components/p-oK38ynrd.js.map +1 -0
- package/dist/components/vertex-scene-tree-table-cell.js +1 -1
- package/dist/components/vertex-scene-tree-table-cell.js.map +1 -1
- package/dist/components/vertex-scene-tree-table-layout.js +1 -1
- package/dist/components/vertex-scene-tree.js +1 -1
- package/dist/components/vertex-scene-tree.js.map +1 -1
- package/dist/components/vertex-viewer-box-query-tool.js +1 -1
- package/dist/components/vertex-viewer-box-query-tool.js.map +1 -1
- package/dist/components/vertex-viewer-dom-element.js +1 -1
- package/dist/components/vertex-viewer-dom-group.js +1 -1
- package/dist/components/vertex-viewer-hit-result-indicator.js +1 -1
- package/dist/components/vertex-viewer-hit-result-indicator.js.map +1 -1
- package/dist/components/vertex-viewer-markup-tool.js.map +1 -1
- package/dist/components/vertex-viewer-markup.js +1 -1
- package/dist/components/vertex-viewer-markup.js.map +1 -1
- package/dist/components/vertex-viewer-measurement-details.js.map +1 -1
- package/dist/components/vertex-viewer-measurement-distance.js +1 -1
- package/dist/components/vertex-viewer-measurement-distance.js.map +1 -1
- package/dist/components/vertex-viewer-measurement-line.js +1 -1
- package/dist/components/vertex-viewer-measurement-overlays.js +1 -1
- package/dist/components/vertex-viewer-measurement-precise.js +1 -1
- package/dist/components/vertex-viewer-measurement-precise.js.map +1 -1
- package/dist/components/vertex-viewer-pin-group.js +1 -1
- package/dist/components/vertex-viewer-pin-tool.js +1 -1
- package/dist/components/vertex-viewer-pin-tool.js.map +1 -1
- package/dist/components/vertex-viewer-transform-widget.js +1 -1
- package/dist/components/vertex-viewer-transform-widget.js.map +1 -1
- package/dist/components/vertex-viewer-view-cube.js +1 -1
- package/dist/components/vertex-viewer-view-cube.js.map +1 -1
- package/dist/components/vertex-viewer-walk-mode-tool.js.map +1 -1
- package/dist/components/vertex-viewer.js +1 -1
- package/dist/components/vertex-viewer.js.map +1 -1
- package/dist/esm/config-lglER3mU.js.map +1 -1
- package/dist/esm/controller-BMWGs-I6.js.map +1 -1
- package/dist/esm/controller-Iymb_J2R.js.map +1 -1
- package/dist/esm/cursors-BbBDEutb.js.map +1 -1
- package/dist/esm/dom-B3m2VjbN.js.map +1 -1
- package/dist/esm/dom-DX6pEG54.js.map +1 -1
- package/dist/esm/entities-zRken6VS.js.map +1 -1
- package/dist/esm/geometry_pb-BiZRfctN.js.map +1 -1
- package/dist/esm/grpc-CZAYqbTu.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/model-BYW5YIye.js.map +1 -1
- package/dist/esm/model-CLtwOS0o.js.map +1 -1
- package/dist/esm/model-D0EJdHmW.js.map +1 -1
- package/dist/esm/model-DHJ5aE4y.js.map +1 -1
- package/dist/esm/multiElementInteractionHandler-DwjL-r55.js.map +1 -1
- package/dist/esm/overlays-BE1oqniA.js.map +1 -1
- package/dist/esm/queries-DEzCmbTD.js.map +1 -1
- package/dist/esm/regl-component-DmkowWhg.js.map +1 -1
- package/dist/esm/representation_pb-g4f0WC4k.js.map +1 -1
- package/dist/esm/results-CFB6nKu8.js.map +1 -1
- package/dist/esm/row-CiSHWNC4.js.map +1 -1
- package/dist/esm/stencil-BV-7pO4q.js.map +1 -1
- package/dist/esm/streamAttributes-Cp8PEH9A.js.map +1 -1
- package/dist/esm/templates-DRh4_Z-g.js.map +1 -1
- package/dist/esm/util-BCZZYmp4.js.map +1 -1
- package/dist/esm/utils-BvZ9-fs0.js.map +1 -1
- package/dist/esm/utils-DC86ZXai.js.map +1 -1
- package/dist/esm/utils-D_pIldrS.js.map +1 -1
- package/dist/esm/vertex-scene-tree-notification-banner_4.entry.js +6 -8
- package/dist/esm/vertex-scene-tree-notification-banner_4.entry.js.map +1 -1
- package/dist/esm/vertex-scene-tree-table-cell.entry.js +1 -1
- package/dist/esm/vertex-scene-tree-table-cell.entry.js.map +1 -1
- package/dist/esm/vertex-scene-tree.entry.js +2 -2
- package/dist/esm/vertex-scene-tree.entry.js.map +1 -1
- package/dist/esm/vertex-viewer-box-query-tool.entry.js +2 -2
- package/dist/esm/vertex-viewer-box-query-tool.entry.js.map +1 -1
- package/dist/esm/vertex-viewer-dom-element_2.entry.js +1 -1
- package/dist/esm/vertex-viewer-dom-element_2.entry.js.map +1 -1
- package/dist/esm/vertex-viewer-dom-group.entry.js +1 -1
- package/dist/esm/vertex-viewer-dom-group.entry.js.map +1 -1
- package/dist/esm/vertex-viewer-hit-result-indicator.entry.js +1 -1
- package/dist/esm/vertex-viewer-hit-result-indicator.entry.js.map +1 -1
- package/dist/esm/vertex-viewer-icon.entry.js.map +1 -1
- package/dist/esm/vertex-viewer-markup-arrow_3.entry.js.map +1 -1
- package/dist/esm/vertex-viewer-markup-tool.entry.js.map +1 -1
- package/dist/esm/vertex-viewer-markup.entry.js +1 -1
- package/dist/esm/vertex-viewer-markup.entry.js.map +1 -1
- package/dist/esm/vertex-viewer-measurement-details.entry.js.map +1 -1
- package/dist/esm/vertex-viewer-measurement-distance.entry.js.map +1 -1
- package/dist/esm/vertex-viewer-measurement-line_2.entry.js +2 -2
- package/dist/esm/vertex-viewer-measurement-line_2.entry.js.map +1 -1
- package/dist/esm/vertex-viewer-measurement-precise.entry.js.map +1 -1
- package/dist/esm/vertex-viewer-pin-group.entry.js +2 -2
- package/dist/esm/vertex-viewer-pin-group.entry.js.map +1 -1
- package/dist/esm/vertex-viewer-pin-label_2.entry.js.map +1 -1
- package/dist/esm/vertex-viewer-pin-tool.entry.js +1 -1
- package/dist/esm/vertex-viewer-pin-tool.entry.js.map +1 -1
- package/dist/esm/vertex-viewer-teleport-tool.entry.js.map +1 -1
- package/dist/esm/vertex-viewer-transform-widget.entry.js +4 -5
- package/dist/esm/vertex-viewer-transform-widget.entry.js.map +1 -1
- package/dist/esm/vertex-viewer-view-cube.entry.js +1 -1
- package/dist/esm/vertex-viewer-view-cube.entry.js.map +1 -1
- package/dist/esm/vertex-viewer-walk-mode-tool.entry.js.map +1 -1
- package/dist/esm/vertex-viewer.entry.js +9 -5
- package/dist/esm/vertex-viewer.entry.js.map +1 -1
- package/dist/esm/viewport-C8WQZxvx.js.map +1 -1
- package/dist/types/regl-shape.d.ts +1 -1
- package/dist/viewer/index.esm.js.map +1 -1
- package/dist/viewer/{p-eac63070.entry.js → p-051b5154.entry.js} +2 -2
- package/dist/viewer/p-051b5154.entry.js.map +1 -0
- package/dist/viewer/{p-3d3a7eeb.entry.js → p-0984c51f.entry.js} +2 -2
- package/dist/viewer/{p-3d3a7eeb.entry.js.map → p-0984c51f.entry.js.map} +1 -1
- package/dist/viewer/{p-864f40c7.entry.js → p-11cf755a.entry.js} +2 -2
- package/dist/viewer/p-11cf755a.entry.js.map +1 -0
- package/dist/viewer/{p-29d14611.entry.js → p-16775f7d.entry.js} +2 -2
- package/dist/viewer/p-16775f7d.entry.js.map +1 -0
- package/dist/viewer/{p-5a85cae5.entry.js → p-1eb636f8.entry.js} +2 -2
- package/dist/viewer/p-1eb636f8.entry.js.map +1 -0
- package/dist/viewer/{p-e993f300.entry.js → p-228d1d43.entry.js} +2 -2
- package/dist/viewer/p-228d1d43.entry.js.map +1 -0
- package/dist/viewer/p-33f44cc1.entry.js.map +1 -1
- package/dist/viewer/{p-3300d3dc.entry.js → p-35601c85.entry.js} +2 -2
- package/dist/viewer/p-35601c85.entry.js.map +1 -0
- package/dist/viewer/p-47766566.entry.js.map +1 -1
- package/dist/viewer/p-6e3a6bbd.entry.js.map +1 -1
- package/dist/viewer/p-7f388b45.entry.js.map +1 -1
- package/dist/viewer/p-89544066.entry.js.map +1 -1
- package/dist/viewer/{p-07b99ac9.entry.js → p-8c369777.entry.js} +2 -2
- package/dist/viewer/p-8c369777.entry.js.map +1 -0
- package/dist/viewer/{p-e59983dc.entry.js → p-9835c5e2.entry.js} +2 -2
- package/dist/viewer/p-9835c5e2.entry.js.map +1 -0
- package/dist/viewer/{p-aa95e21a.entry.js → p-9d8ff406.entry.js} +2 -2
- package/dist/viewer/p-9d8ff406.entry.js.map +1 -0
- package/dist/viewer/p-BDvACHun.js.map +1 -1
- package/dist/viewer/p-BIkuvTVH.js.map +1 -1
- package/dist/viewer/p-BRPkbTVP.js.map +1 -1
- package/dist/viewer/p-BsBIynwj.js.map +1 -1
- package/dist/viewer/p-BxtKMwBH.js.map +1 -1
- package/dist/viewer/p-C4y4Noe-.js.map +1 -1
- package/dist/viewer/p-C6KrfydC.js.map +1 -1
- package/dist/viewer/p-C7dYsPFU.js.map +1 -1
- package/dist/viewer/p-C9Cqbq6H.js.map +1 -1
- package/dist/viewer/p-CVWO4w6b.js.map +1 -1
- package/dist/viewer/p-ChqXy0cG.js.map +1 -1
- package/dist/viewer/p-CiSHWNC4.js.map +1 -1
- package/dist/viewer/p-CjG1fMh1.js.map +1 -1
- package/dist/viewer/p-Cs5KOvOQ.js.map +1 -1
- package/dist/viewer/p-CyGlYje2.js.map +1 -1
- package/dist/viewer/p-D6eJC1q4.js.map +1 -1
- package/dist/viewer/p-DC86ZXai.js.map +1 -1
- package/dist/viewer/p-DRh4_Z-g.js.map +1 -1
- package/dist/viewer/p-DUX5FvBC.js.map +1 -1
- package/dist/viewer/p-DX6pEG54.js.map +1 -1
- package/dist/viewer/p-D_ixWHO7.js.map +1 -1
- package/dist/viewer/p-DacE-wPp.js.map +1 -1
- package/dist/viewer/p-Dp56p_jX.js.map +1 -1
- package/dist/viewer/p-EsKoKfmx.js.map +1 -1
- package/dist/viewer/p-F8e15or2.js.map +1 -1
- package/dist/viewer/p-Jfxh0jq9.js.map +1 -1
- package/dist/viewer/p-WPRMWirY.js.map +1 -1
- package/dist/viewer/p-_93RRNxT.js.map +1 -1
- package/dist/viewer/p-a8a81cba.entry.js +5 -0
- package/dist/viewer/p-a8a81cba.entry.js.map +1 -0
- package/dist/viewer/p-a9282481.entry.js.map +1 -1
- package/dist/viewer/{p-63f4f702.entry.js → p-c7e62d66.entry.js} +2 -2
- package/dist/viewer/p-c7e62d66.entry.js.map +1 -0
- package/dist/viewer/p-d37e647b.entry.js.map +1 -1
- package/dist/viewer/{p-302f2078.entry.js → p-d9fe788f.entry.js} +2 -2
- package/dist/viewer/p-d9fe788f.entry.js.map +1 -0
- package/dist/viewer/p-e9b83dae.entry.js.map +1 -1
- package/dist/viewer/{p-70f3629d.entry.js → p-f271dc4a.entry.js} +2 -2
- package/dist/viewer/p-f271dc4a.entry.js.map +1 -0
- package/dist/viewer/p-f65c0769.entry.js.map +1 -1
- package/dist/viewer/viewer.esm.js +1 -1
- package/package.json +7 -7
- package/dist/components/p-B80hfIq6.js.map +0 -1
- package/dist/components/p-BopQW1sA.js.map +0 -1
- package/dist/components/p-DNtS2F8J.js +0 -5
- package/dist/components/p-DNtS2F8J.js.map +0 -1
- package/dist/components/p-Doltf1wO.js.map +0 -1
- package/dist/components/p-b0ZzPHz8.js.map +0 -1
- package/dist/viewer/p-07b99ac9.entry.js.map +0 -1
- package/dist/viewer/p-29d14611.entry.js.map +0 -1
- package/dist/viewer/p-302f2078.entry.js.map +0 -1
- package/dist/viewer/p-3300d3dc.entry.js.map +0 -1
- package/dist/viewer/p-5a85cae5.entry.js.map +0 -1
- package/dist/viewer/p-60c915e3.entry.js +0 -5
- package/dist/viewer/p-60c915e3.entry.js.map +0 -1
- package/dist/viewer/p-63f4f702.entry.js.map +0 -1
- package/dist/viewer/p-70f3629d.entry.js.map +0 -1
- package/dist/viewer/p-864f40c7.entry.js.map +0 -1
- package/dist/viewer/p-aa95e21a.entry.js.map +0 -1
- package/dist/viewer/p-e59983dc.entry.js.map +0 -1
- package/dist/viewer/p-e993f300.entry.js.map +0 -1
- package/dist/viewer/p-eac63070.entry.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller-Iymb_J2R.js","sources":["src/lib/transforms/controller.ts"],"sourcesContent":["import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { Matrix4, Vector3 } from '@vertexvis/geometry';\nimport { StreamApi } from '@vertexvis/stream-api';\n\nexport class TransformController {\n private isTransforming = false;\n private previousDelta?: Matrix4.Matrix4;\n private currentDelta: Matrix4.Matrix4 = Matrix4.makeIdentity();\n private endDebounceTimeout?: NodeJS.Timeout;\n\n public constructor(private stream: StreamApi) {}\n\n public async dispose(): Promise<void> {\n if (this.isTransforming) {\n this.endTransform();\n }\n }\n\n public async beginTransform(\n delta: Matrix4.Matrix4 = Matrix4.makeIdentity()
|
|
1
|
+
{"version":3,"file":"controller-Iymb_J2R.js","sources":["src/lib/transforms/controller.ts"],"sourcesContent":["import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { Matrix4, Vector3 } from '@vertexvis/geometry';\nimport { StreamApi } from '@vertexvis/stream-api';\n\nexport class TransformController {\n private isTransforming = false;\n private previousDelta?: Matrix4.Matrix4;\n private currentDelta: Matrix4.Matrix4 = Matrix4.makeIdentity();\n private endDebounceTimeout?: NodeJS.Timeout;\n\n public constructor(private stream: StreamApi) {}\n\n public async dispose(): Promise<void> {\n if (this.isTransforming) {\n this.endTransform();\n }\n }\n\n public async beginTransform(\n delta: Matrix4.Matrix4 = Matrix4.makeIdentity(),\n ): Promise<void> {\n this.clearEndInteractionTimeout();\n\n if (!this.isTransforming) {\n this.currentDelta = delta;\n this.isTransforming = true;\n\n console.debug('Beginning transform interaction');\n\n await this.stream.beginInteraction({\n transform: {\n delta: this.toDeltaTransform(delta),\n },\n });\n }\n }\n\n public async updateTransform(delta: Matrix4.Matrix4): Promise<void> {\n this.currentDelta = delta;\n\n await this.stream.updateInteraction({\n transform: {\n delta: this.toDeltaTransform(this.currentDelta, true),\n },\n });\n }\n\n public async updateTranslation(delta: Vector3.Vector3): Promise<void> {\n this.currentDelta = Matrix4.makeTranslation(delta);\n\n await this.stream.updateInteraction({\n transform: {\n delta: this.toDeltaTransform(this.currentDelta),\n },\n });\n }\n\n public getCurrentDelta(): Matrix4.Matrix4 | undefined {\n return this.currentDelta;\n }\n\n public async endTransform(): Promise<void> {\n if (this.isTransforming) {\n await this.endInteraction();\n }\n }\n\n public async endTransformDebounced(\n startCallback?: VoidFunction,\n endCallback?: VoidFunction,\n ): Promise<void> {\n if (this.isTransforming) {\n this.restartEndInteractionTimeout(startCallback, endCallback);\n }\n }\n\n public clearTransform(): void {\n this.currentDelta = Matrix4.makeIdentity();\n this.previousDelta = undefined;\n this.endTransform();\n }\n\n public async EXPERIMENTAL_undoTransform(): Promise<\n Matrix4.Matrix4 | undefined\n > {\n if (this.previousDelta != null) {\n const undoDelta = Matrix4.invert(this.previousDelta);\n\n console.debug(`Undo of previous transform [delta-applied=${undoDelta}]`);\n\n await this.beginTransform();\n await this.updateTransform(Matrix4.invert(this.previousDelta));\n await this.endTransform();\n\n this.previousDelta = undefined;\n\n return undoDelta;\n } else {\n console.debug('No previous transform to undo.');\n }\n }\n\n private async endInteraction(): Promise<void> {\n console.debug(`Ending transform interaction [delta=${this.currentDelta}]`);\n\n this.clearEndInteractionTimeout();\n\n this.previousDelta = this.currentDelta;\n await this.stream.endInteraction({\n transform: {\n delta: this.toDeltaTransform(this.currentDelta),\n },\n });\n this.isTransforming = false;\n this.currentDelta = Matrix4.makeIdentity();\n }\n\n private restartEndInteractionTimeout(\n startCallback?: VoidFunction,\n endCallback?: VoidFunction,\n ): void {\n this.clearEndInteractionTimeout();\n\n this.endDebounceTimeout = setTimeout(async () => {\n startCallback?.();\n await this.endInteraction();\n endCallback?.();\n }, 500);\n }\n\n private clearEndInteractionTimeout(): void {\n if (this.endDebounceTimeout != null) {\n clearTimeout(this.endDebounceTimeout);\n this.endDebounceTimeout = undefined;\n }\n }\n\n private toDeltaTransform(\n delta: Matrix4.Matrix4,\n columnMajor = false,\n ): vertexvis.protobuf.core.IAffineMatrix4f {\n const asObject = Matrix4.toObject(delta);\n\n // TODO: update this to pass a single order for the\n // transform matrix after work in https://vertexvis.atlassian.net/browse/PLAT-1582\n const basisX = columnMajor\n ? {\n x: asObject.m11,\n y: asObject.m21,\n z: asObject.m31,\n }\n : {\n x: asObject.m11,\n y: asObject.m12,\n z: asObject.m13,\n };\n const basisY = columnMajor\n ? {\n x: asObject.m12,\n y: asObject.m22,\n z: asObject.m32,\n }\n : {\n x: asObject.m21,\n y: asObject.m22,\n z: asObject.m23,\n };\n const basisZ = columnMajor\n ? {\n x: asObject.m13,\n y: asObject.m23,\n z: asObject.m33,\n }\n : {\n x: asObject.m31,\n y: asObject.m32,\n z: asObject.m33,\n };\n\n return {\n basisX,\n basisY,\n basisZ,\n xlate: {\n x: asObject.m14,\n y: asObject.m24,\n z: asObject.m34,\n },\n scale: asObject.m44,\n };\n }\n}\n"],"names":["Matrix4"],"mappings":";;;;;MAIa,mBAAmB,CAAA;AAM9B,IAAA,WAAA,CAA2B,MAAiB,EAAA;AAAjB,QAAA,IAAA,CAAA,MAAM,GAAN,MAAM;AALzB,QAAA,IAAA,CAAA,cAAc,GAAG,KAAK;AAEtB,QAAA,IAAA,CAAA,YAAY,GAAoBA,OAAO,CAAC,YAAY,EAAE;;AAKvD,IAAA,MAAM,OAAO,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI,CAAC,YAAY,EAAE;;;IAIhB,MAAM,cAAc,CACzB,QAAyBA,OAAO,CAAC,YAAY,EAAE,EAAA;QAE/C,IAAI,CAAC,0BAA0B,EAAE;AAEjC,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACxB,YAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AACzB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAE1B,YAAA,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC;AAEhD,YAAA,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC;AACjC,gBAAA,SAAS,EAAE;AACT,oBAAA,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;AACpC,iBAAA;AACF,aAAA,CAAC;;;IAIC,MAAM,eAAe,CAAC,KAAsB,EAAA;AACjD,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;AAEzB,QAAA,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;AAClC,YAAA,SAAS,EAAE;gBACT,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC;AACtD,aAAA;AACF,SAAA,CAAC;;IAGG,MAAM,iBAAiB,CAAC,KAAsB,EAAA;QACnD,IAAI,CAAC,YAAY,GAAGA,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC;AAElD,QAAA,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;AAClC,YAAA,SAAS,EAAE;gBACT,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC;AAChD,aAAA;AACF,SAAA,CAAC;;IAGG,eAAe,GAAA;QACpB,OAAO,IAAI,CAAC,YAAY;;AAGnB,IAAA,MAAM,YAAY,GAAA;AACvB,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,MAAM,IAAI,CAAC,cAAc,EAAE;;;AAIxB,IAAA,MAAM,qBAAqB,CAChC,aAA4B,EAC5B,WAA0B,EAAA;AAE1B,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,IAAI,CAAC,4BAA4B,CAAC,aAAa,EAAE,WAAW,CAAC;;;IAI1D,cAAc,GAAA;AACnB,QAAA,IAAI,CAAC,YAAY,GAAGA,OAAO,CAAC,YAAY,EAAE;AAC1C,QAAA,IAAI,CAAC,aAAa,GAAG,SAAS;QAC9B,IAAI,CAAC,YAAY,EAAE;;AAGd,IAAA,MAAM,0BAA0B,GAAA;AAGrC,QAAA,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE;YAC9B,MAAM,SAAS,GAAGA,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;AAEpD,YAAA,OAAO,CAAC,KAAK,CAAC,6CAA6C,SAAS,CAAA,CAAA,CAAG,CAAC;AAExE,YAAA,MAAM,IAAI,CAAC,cAAc,EAAE;AAC3B,YAAA,MAAM,IAAI,CAAC,eAAe,CAACA,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAC9D,YAAA,MAAM,IAAI,CAAC,YAAY,EAAE;AAEzB,YAAA,IAAI,CAAC,aAAa,GAAG,SAAS;AAE9B,YAAA,OAAO,SAAS;;aACX;AACL,YAAA,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC;;;AAI3C,IAAA,MAAM,cAAc,GAAA;QAC1B,OAAO,CAAC,KAAK,CAAC,CAAA,oCAAA,EAAuC,IAAI,CAAC,YAAY,CAAA,CAAA,CAAG,CAAC;QAE1E,IAAI,CAAC,0BAA0B,EAAE;AAEjC,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY;AACtC,QAAA,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;AAC/B,YAAA,SAAS,EAAE;gBACT,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC;AAChD,aAAA;AACF,SAAA,CAAC;AACF,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,QAAA,IAAI,CAAC,YAAY,GAAGA,OAAO,CAAC,YAAY,EAAE;;IAGpC,4BAA4B,CAClC,aAA4B,EAC5B,WAA0B,EAAA;QAE1B,IAAI,CAAC,0BAA0B,EAAE;AAEjC,QAAA,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAC,YAAW;AAC9C,YAAA,aAAa,KAAA,IAAA,IAAb,aAAa,KAAA,MAAA,GAAA,MAAA,GAAb,aAAa,EAAI;AACjB,YAAA,MAAM,IAAI,CAAC,cAAc,EAAE;AAC3B,YAAA,WAAW,KAAA,IAAA,IAAX,WAAW,KAAA,MAAA,GAAA,MAAA,GAAX,WAAW,EAAI;SAChB,EAAE,GAAG,CAAC;;IAGD,0BAA0B,GAAA;AAChC,QAAA,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,EAAE;AACnC,YAAA,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC;AACrC,YAAA,IAAI,CAAC,kBAAkB,GAAG,SAAS;;;AAI/B,IAAA,gBAAgB,CACtB,KAAsB,EACtB,WAAW,GAAG,KAAK,EAAA;QAEnB,MAAM,QAAQ,GAAGA,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;;;QAIxC,MAAM,MAAM,GAAG;AACb,cAAE;gBACE,CAAC,EAAE,QAAQ,CAAC,GAAG;gBACf,CAAC,EAAE,QAAQ,CAAC,GAAG;gBACf,CAAC,EAAE,QAAQ,CAAC,GAAG;AAChB;AACH,cAAE;gBACE,CAAC,EAAE,QAAQ,CAAC,GAAG;gBACf,CAAC,EAAE,QAAQ,CAAC,GAAG;gBACf,CAAC,EAAE,QAAQ,CAAC,GAAG;aAChB;QACL,MAAM,MAAM,GAAG;AACb,cAAE;gBACE,CAAC,EAAE,QAAQ,CAAC,GAAG;gBACf,CAAC,EAAE,QAAQ,CAAC,GAAG;gBACf,CAAC,EAAE,QAAQ,CAAC,GAAG;AAChB;AACH,cAAE;gBACE,CAAC,EAAE,QAAQ,CAAC,GAAG;gBACf,CAAC,EAAE,QAAQ,CAAC,GAAG;gBACf,CAAC,EAAE,QAAQ,CAAC,GAAG;aAChB;QACL,MAAM,MAAM,GAAG;AACb,cAAE;gBACE,CAAC,EAAE,QAAQ,CAAC,GAAG;gBACf,CAAC,EAAE,QAAQ,CAAC,GAAG;gBACf,CAAC,EAAE,QAAQ,CAAC,GAAG;AAChB;AACH,cAAE;gBACE,CAAC,EAAE,QAAQ,CAAC,GAAG;gBACf,CAAC,EAAE,QAAQ,CAAC,GAAG;gBACf,CAAC,EAAE,QAAQ,CAAC,GAAG;aAChB;QAEL,OAAO;YACL,MAAM;YACN,MAAM;YACN,MAAM;AACN,YAAA,KAAK,EAAE;gBACL,CAAC,EAAE,QAAQ,CAAC,GAAG;gBACf,CAAC,EAAE,QAAQ,CAAC,GAAG;gBACf,CAAC,EAAE,QAAQ,CAAC,GAAG;AAChB,aAAA;YACD,KAAK,EAAE,QAAQ,CAAC,GAAG;SACpB;;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursors-BbBDEutb.js","sources":["src/lib/cursors.ts"],"sourcesContent":["import { Disposable, EventDispatcher } from '@vertexvis/utils';\n\n/**\n * Represents a built-in [browser CSS\n * cursor](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor).\n */\nexport type CssCursor =\n | 'auto'\n | 'default'\n | 'none'\n | 'context-menu'\n | 'help'\n | 'pointer'\n | 'progress'\n | 'wait'\n | 'cell'\n | 'crosshair'\n | 'text'\n | 'vertical-text'\n | 'alias'\n | 'copy'\n | 'move'\n | 'no-drop'\n | 'not-allowed'\n | 'grab'\n | 'grabbing'\n | 'all-scroll'\n | 'col-resize'\n | 'row-resize'\n | 'n-resize'\n | 'e-resize'\n | 's-resize'\n | 'w-resize'\n | 'ne-resize'\n | 'nw-resize'\n | 'se-resize'\n | 'sw-resize'\n | 'ew-resize'\n | 'ns-resize'\n | 'nesw-resize'\n | 'nwse-resize'\n | 'zoom-in'\n | 'zoom-out'\n | string;\n\n/**\n * Represents a custom cursor that points to an image file and offset.\n */\nexport interface CustomCursor {\n url: string;\n offsetX?: number;\n offsetY?: number;\n}\n\n/**\n * Represents all possible cursor types.\n */\nexport type Cursor = CssCursor | CustomCursor;\n\ninterface CursorInstance extends Disposable {\n id: number;\n cursor: Cursor;\n priority: number;\n}\n\n/**\n * The cursor manager maintains a prioritized list of cursors for the viewer.\n *\n * Cursors with the highest priority will be considered active, where the most\n * recently added cursor will take precedence if there are multiple cursors with\n * the same priority.\n */\nexport class CursorManager {\n /**\n * A constant representing the lowest priority cursors.\n */\n public static readonly LOW_PRIORITY = 0;\n\n /**\n * A constant representing a priority between `LOW_PRIORITY` and\n * `HIGH_PRIORITY`.\n */\n public static readonly NORMAL_PRIORITY = 10;\n\n /**\n * A constant representing the high priority cursors.\n */\n public static readonly HIGH_PRIORITY = 20;\n\n /**\n * An event dispatcher that emits an event when a cursor is added or removed.\n *\n * @see {@link CursorManager.add} to add a cursor.\n * @see {@link CursorManager.getActiveCursor} to query the current cursor.\n */\n public readonly onChanged = new EventDispatcher<void>();\n\n private cursors: CursorInstance[] = [];\n\n private nextId = 0;\n\n /**\n * Adds a cursor to the cursor manager, and returns an identifier that can be\n * used to remove the cursor.\n *\n * @param cursor The cursor to add.\n * @param priority The priority of the cursor. Higher values have higher\n * \tpriority over lower values.\n * @returns An identifier for the cursor.\n * @see {@link CursorManager.getActiveCursor} to query the current cursor.\n */\n public add(\n cursor: Cursor,\n priority = CursorManager.NORMAL_PRIORITY\n ): Disposable {\n // Ensure a duplicate cursor will not be added to the cursor manager.\n // If a matching cursor exists, delete it before proceeding.\n // Note that deleting the old cursor and adding the new one results in the\n // new cursor taking precedent over other existing cursors with the same priority.\n const duplicateCursor = this.getExistingDuplicateCursor(cursor, priority);\n if (duplicateCursor != null) {\n this.remove(duplicateCursor.id);\n }\n\n const id = ++this.nextId;\n const instance = { id, cursor, priority, dispose: () => this.remove(id) };\n this.cursors.push(instance);\n this.onChanged.emit();\n return instance;\n }\n\n /**\n * Removes a cursor with the given ID, if it exists.\n *\n * @param cursorId The ID of the cursor to remove.\n */\n private remove(cursorId: number): void {\n const index = this.cursors.findIndex(({ id }) => id === cursorId);\n if (index >= 0) {\n this.cursors.splice(index, 1);\n this.onChanged.emit();\n }\n }\n\n /**\n * Checks to see if an existing cursor matches the provided cursor and priority level.\n * The matching cursor is returned if found.\n *\n * @param cursorToCheck The cursor to check for duplicates against.\n * @param priorityToCheck The priority level to check for duplicates against.\n */\n private getExistingDuplicateCursor(\n cursorToCheck: Cursor,\n priorityToCheck: number\n ): CursorInstance | undefined {\n return this.cursors.find(\n (cursor) =>\n cursor.cursor === cursorToCheck && cursor.priority === priorityToCheck\n );\n }\n\n /**\n * Returns the active cursor based on priority and insertion order.\n *\n * @see {@link CursorManager.add} to add a cursor.\n */\n public getActiveCursor(): Cursor | undefined {\n const sorted = this.cursors\n .concat()\n .reverse()\n .sort((a, b) => b.priority - a.priority);\n\n return sorted[0]?.cursor;\n }\n}\n\n// CSS SVG images need to be URL encoded: https://yoksel.github.io/url-encoder/\n\nexport const measurementCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M21.5 8h-19a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h19a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5zm-.5 6H3V9h3v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2z' stroke='%23fff' stroke-width='1.25' stroke-opacity='0.5' stroke-miterlimit='10' shape-rendering='crispEdges'/%3E%3Cpath d='M21.5 8h-19a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h19a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5zm-.5 6H3V9h3v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2z' shape-rendering='crispEdges'/%3E%3C/svg%3E\",\n offsetX: -24,\n offsetY: -24,\n};\n\nexport const measurementWithArrowCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg id='icons' xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bstroke:%23fff;stroke-miterlimit:10;stroke-width:2px;%7D.cls-2%7Bfill:%23fff;%7D.cls-2,.cls-3%7Bfill-rule:evenodd;%7D%3C/style%3E%3C/defs%3E%3Cpath class='cls-1' d='M27.46,21h-19a.5.5,0,0,0-.5.5v6a.5.5,0,0,0,.5.5h19a.5.5,0,0,0,.5-.5v-6A.5.5,0,0,0,27.46,21ZM27,27H9V22h3v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2Z'/%3E%3Cpath d='M27.46,21h-19a.5.5,0,0,0-.5.5v6a.5.5,0,0,0,.5.5h19a.5.5,0,0,0,.5-.5v-6A.5.5,0,0,0,27.46,21ZM27,27H9V22h3v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2Z'/%3E%3Cpath class='cls-2' d='M1,17V1L12.59,12.62H5.81l-.41.12Z'/%3E%3Cpath class='cls-2' d='M10.08,17.69l-3.6,1.53L1.8,8.14,5.48,6.58Z'/%3E%3Cpath class='cls-3' d='M8.75,17l-1.84.77-3.1-7.37,1.84-.78Z'/%3E%3Cpath class='cls-3' d='M2,3.41V14.6l3-2.87.43-.14h4.76Z'/%3E%3C/svg%3E\",\n offsetX: -30,\n offsetY: -30,\n};\n\nexport const pinCursor = {\n url: \"data:image/svg+xml,%3Csvg width='36px' height='36px' viewBox='0 0 24 24' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cdefs%3E%3Cpath d='M12,2 C7.581722,2 4,5.581722 4,10 C4.00435812,11.7714969 4.41127263,13.5188357 5.19,15.11 C6.15517666,17.0237439 7.49502409,18.7240579 9.13,20.11 C9.86916736,20.7592093 10.6620019,21.3446357 11.5,21.86 L12,22.14 L12.5,21.86 C13.8750156,21.0120029 15.1296156,19.9827599 16.23,18.8 C17.2698142,17.7023203 18.1394508,16.4551671 18.81,15.1 C19.5872532,13.5118707 19.9941287,11.7681184 20,10 C20,5.581722 16.418278,2 12,2 Z M12,13 C10.3431458,13 9,11.6568542 9,10 C9,8.34314575 10.3431458,7 12,7 C13.6568542,7 15,8.34314575 15,10 C15,10.7956495 14.6839295,11.5587112 14.1213203,12.1213203 C13.5587112,12.6839295 12.7956495,13 12,13 Z' id='path-1'%3E%3C/path%3E%3C/defs%3E%3Cg id='icons/pin-filled' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E%3Cmask id='mask-2' fill='white'%3E%3Cuse xlink:href='%23path-1'%3E%3C/use%3E%3C/mask%3E%3Cuse id='Shape' stroke='%23FAFAFA' fill='%23BDBDBD' fill-rule='nonzero' xlink:href='%23path-1'%3E%3C/use%3E%3C/g%3E%3C/svg%3E\",\n offsetX: 17,\n offsetY: 32,\n};\n\nexport const labelPinCursor = {\n url: \"data:image/svg+xml,%3Csvg width='36px' height='36px' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 16 24' %3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill:none;%7D.cls-2%7Bfill:%23616161;%7D.cls-3%7Bclip-path:url(%23clip-path);%7D%3C/style%3E%3CclipPath id='clip-path'%3E%3Ccircle cx='-576.76' cy='-107.26' r='4'/%3E%3C/clipPath%3E%3C/defs%3E%3Cpath d='M8,16H8a.48.48,0,0,1-.42-.23L5.75,13H3.51A1.5,1.5,0,0,1,2,11.5v-8A1.5,1.5,0,0,1,3.51,2h9A1.51,1.51,0,0,1,14,3.5v8a1.5,1.5,0,0,1-1.5,1.5H10.22L8.39,15.81A.5.5,0,0,1,8,16ZM3.51,3a.5.5,0,0,0-.5.5v8a.5.5,0,0,0,.5.5H6a.5.5,0,0,1,.42.23L8,14.61l1.55-2.38A.5.5,0,0,1,10,12h2.56a.5.5,0,0,0,.5-.5v-8a.51.51,0,0,0-.5-.5Z'/%3E%3Ccircle cx='8.01' cy='20' r='2'/%3E%3C/svg%3E%0A\",\n offsetX: 17,\n offsetY: 29,\n};\n\nexport const boxQueryCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg id='icons' xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bstroke:%23fff;stroke-miterlimit:10;stroke-width:2px;%7D.cls-2%7Bfill:%23fff;%7D.cls-2,.cls-3%7Bfill-rule:evenodd;%7D%3C/style%3E%3C/defs%3E%3Cpath class='cls-2' d='M1.25,17V1L12.59,12.62H5.81l-.41.12Z'/%3E%3Cpath class='cls-2' d='M10.33,17.69l-3.6,1.53L1.8,8.14,5.48,6.58Z'/%3E %3Cpath class='cls-3' d='M9,17l-1.84.77-3.1-7.37,1.84-.78Z'/%3E%3Cpath class='cls-3' d='M2.25,3.41V14.6l3-2.87.43-.14h4.76Z'/%3E%3Cpath class='cls-1' d='M21.36,22.5H15.5V16.64a.5.5,0,0,0-1,0V22.5H8.64a.5.5,0,0,0,0,1H14.5v5.86a.5.5,0,0,0,1,0V23.5h5.86a.5.5,0,0,0,0-1Z' /%3E %3Cpath d='M21.36,22.5H15.5V16.64a.5.5,0,0,0-1,0V22.5H8.64a.5.5,0,0,0,0,1H14.5v5.86a.5.5,0,0,0,1,0V23.5h5.86a.5.5,0,0,0,0-1Z' /%3E%3C/svg%3E\",\n offsetX: -30,\n offsetY: -30,\n};\n"],"names":[],"mappings":";;;;;AAiEA;;;;;;AAMG;MACU,aAAa,CAAA;AAA1B,IAAA,WAAA,GAAA;AAiBE;;;;;AAKG;AACa,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,eAAe,EAAQ;AAE/C,QAAA,IAAA,CAAA,OAAO,GAAqB,EAAE;AAE9B,QAAA,IAAA,CAAA,MAAM,GAAG,CAAC;;AAElB;;;;;;;;;AASG;AACI,IAAA,GAAG,CACR,MAAc,EACd,QAAQ,GAAG,aAAa,CAAC,eAAe,EAAA;;;;;QAMxC,MAAM,eAAe,GAAG,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,QAAQ,CAAC;AACzE,QAAA,IAAI,eAAe,IAAI,IAAI,EAAE;AAC3B,YAAA,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;;AAGjC,QAAA,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM;QACxB,MAAM,QAAQ,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;AACzE,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;AACrB,QAAA,OAAO,QAAQ;;AAGjB;;;;AAIG;AACK,IAAA,MAAM,CAAC,QAAgB,EAAA;AAC7B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,QAAQ,CAAC;AACjE,QAAA,IAAI,KAAK,IAAI,CAAC,EAAE;YACd,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AAC7B,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;;;AAIzB;;;;;;AAMG;IACK,0BAA0B,CAChC,aAAqB,EACrB,eAAuB,EAAA;QAEvB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CACtB,CAAC,MAAM,KACL,MAAM,CAAC,MAAM,KAAK,aAAa,IAAI,MAAM,CAAC,QAAQ,KAAK,eAAe,CACzE;;AAGH;;;;AAIG;IACI,eAAe,GAAA;;AACpB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC;AACjB,aAAA,MAAM;AACN,aAAA,OAAO;AACP,aAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;QAE1C,OAAO,MAAA,MAAM,CAAC,CAAC,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,MAAM;;;AAnG1B;;AAEG;AACoB,aAAA,CAAA,YAAY,GAAG,CAAH;AAEnC;;;AAGG;AACoB,aAAA,CAAA,eAAe,GAAG,EAAH;AAEtC;;AAEG;AACoB,aAAA,CAAA,aAAa,GAAG,EAAH;AAyFtC;AAEO,MAAM,iBAAiB,GAAG;AAC/B,IAAA,GAAG,EAAE,irBAAirB;IACtrB,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,GAAG;;AAGP,MAAM,0BAA0B,GAAG;AACxC,IAAA,GAAG,EAAE,siCAAsiC;IAC3iC,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,GAAG;;AAGP,MAAM,SAAS,GAAG;AACvB,IAAA,GAAG,EAAE,2oCAA2oC;AAChpC,IAAA,OAAO,EAAE,EAAE;AACX,IAAA,OAAO,EAAE,EAAE;;AAGN,MAAM,cAAc,GAAG;AAC5B,IAAA,GAAG,EAAE,mvBAAmvB;AACxvB,IAAA,OAAO,EAAE,EAAE;AACX,IAAA,OAAO,EAAE,EAAE;;AAGN,MAAM,cAAc,GAAG;AAC5B,IAAA,GAAG,EAAE,+0BAA+0B;IACp1B,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,GAAG;;;;;"}
|
|
1
|
+
{"version":3,"file":"cursors-BbBDEutb.js","sources":["src/lib/cursors.ts"],"sourcesContent":["import { Disposable, EventDispatcher } from '@vertexvis/utils';\n\n/**\n * Represents a built-in [browser CSS\n * cursor](https://developer.mozilla.org/en-US/docs/Web/CSS/cursor).\n */\nexport type CssCursor =\n | 'auto'\n | 'default'\n | 'none'\n | 'context-menu'\n | 'help'\n | 'pointer'\n | 'progress'\n | 'wait'\n | 'cell'\n | 'crosshair'\n | 'text'\n | 'vertical-text'\n | 'alias'\n | 'copy'\n | 'move'\n | 'no-drop'\n | 'not-allowed'\n | 'grab'\n | 'grabbing'\n | 'all-scroll'\n | 'col-resize'\n | 'row-resize'\n | 'n-resize'\n | 'e-resize'\n | 's-resize'\n | 'w-resize'\n | 'ne-resize'\n | 'nw-resize'\n | 'se-resize'\n | 'sw-resize'\n | 'ew-resize'\n | 'ns-resize'\n | 'nesw-resize'\n | 'nwse-resize'\n | 'zoom-in'\n | 'zoom-out'\n | string;\n\n/**\n * Represents a custom cursor that points to an image file and offset.\n */\nexport interface CustomCursor {\n url: string;\n offsetX?: number;\n offsetY?: number;\n}\n\n/**\n * Represents all possible cursor types.\n */\nexport type Cursor = CssCursor | CustomCursor;\n\ninterface CursorInstance extends Disposable {\n id: number;\n cursor: Cursor;\n priority: number;\n}\n\n/**\n * The cursor manager maintains a prioritized list of cursors for the viewer.\n *\n * Cursors with the highest priority will be considered active, where the most\n * recently added cursor will take precedence if there are multiple cursors with\n * the same priority.\n */\nexport class CursorManager {\n /**\n * A constant representing the lowest priority cursors.\n */\n public static readonly LOW_PRIORITY = 0;\n\n /**\n * A constant representing a priority between `LOW_PRIORITY` and\n * `HIGH_PRIORITY`.\n */\n public static readonly NORMAL_PRIORITY = 10;\n\n /**\n * A constant representing the high priority cursors.\n */\n public static readonly HIGH_PRIORITY = 20;\n\n /**\n * An event dispatcher that emits an event when a cursor is added or removed.\n *\n * @see {@link CursorManager.add} to add a cursor.\n * @see {@link CursorManager.getActiveCursor} to query the current cursor.\n */\n public readonly onChanged = new EventDispatcher<void>();\n\n private cursors: CursorInstance[] = [];\n\n private nextId = 0;\n\n /**\n * Adds a cursor to the cursor manager, and returns an identifier that can be\n * used to remove the cursor.\n *\n * @param cursor The cursor to add.\n * @param priority The priority of the cursor. Higher values have higher\n * \tpriority over lower values.\n * @returns An identifier for the cursor.\n * @see {@link CursorManager.getActiveCursor} to query the current cursor.\n */\n public add(\n cursor: Cursor,\n priority = CursorManager.NORMAL_PRIORITY,\n ): Disposable {\n // Ensure a duplicate cursor will not be added to the cursor manager.\n // If a matching cursor exists, delete it before proceeding.\n // Note that deleting the old cursor and adding the new one results in the\n // new cursor taking precedent over other existing cursors with the same priority.\n const duplicateCursor = this.getExistingDuplicateCursor(cursor, priority);\n if (duplicateCursor != null) {\n this.remove(duplicateCursor.id);\n }\n\n const id = ++this.nextId;\n const instance = { id, cursor, priority, dispose: () => this.remove(id) };\n this.cursors.push(instance);\n this.onChanged.emit();\n return instance;\n }\n\n /**\n * Removes a cursor with the given ID, if it exists.\n *\n * @param cursorId The ID of the cursor to remove.\n */\n private remove(cursorId: number): void {\n const index = this.cursors.findIndex(({ id }) => id === cursorId);\n if (index >= 0) {\n this.cursors.splice(index, 1);\n this.onChanged.emit();\n }\n }\n\n /**\n * Checks to see if an existing cursor matches the provided cursor and priority level.\n * The matching cursor is returned if found.\n *\n * @param cursorToCheck The cursor to check for duplicates against.\n * @param priorityToCheck The priority level to check for duplicates against.\n */\n private getExistingDuplicateCursor(\n cursorToCheck: Cursor,\n priorityToCheck: number,\n ): CursorInstance | undefined {\n return this.cursors.find(\n (cursor) =>\n cursor.cursor === cursorToCheck && cursor.priority === priorityToCheck,\n );\n }\n\n /**\n * Returns the active cursor based on priority and insertion order.\n *\n * @see {@link CursorManager.add} to add a cursor.\n */\n public getActiveCursor(): Cursor | undefined {\n const sorted = this.cursors\n .concat()\n .reverse()\n .sort((a, b) => b.priority - a.priority);\n\n return sorted[0]?.cursor;\n }\n}\n\n// CSS SVG images need to be URL encoded: https://yoksel.github.io/url-encoder/\n\nexport const measurementCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath d='M21.5 8h-19a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h19a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5zm-.5 6H3V9h3v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2z' stroke='%23fff' stroke-width='1.25' stroke-opacity='0.5' stroke-miterlimit='10' shape-rendering='crispEdges'/%3E%3Cpath d='M21.5 8h-19a.5.5 0 00-.5.5v6a.5.5 0 00.5.5h19a.5.5 0 00.5-.5v-6a.5.5 0 00-.5-.5zm-.5 6H3V9h3v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2v2.5a.5.5 0 001 0V9h2z' shape-rendering='crispEdges'/%3E%3C/svg%3E\",\n offsetX: -24,\n offsetY: -24,\n};\n\nexport const measurementWithArrowCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg id='icons' xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bstroke:%23fff;stroke-miterlimit:10;stroke-width:2px;%7D.cls-2%7Bfill:%23fff;%7D.cls-2,.cls-3%7Bfill-rule:evenodd;%7D%3C/style%3E%3C/defs%3E%3Cpath class='cls-1' d='M27.46,21h-19a.5.5,0,0,0-.5.5v6a.5.5,0,0,0,.5.5h19a.5.5,0,0,0,.5-.5v-6A.5.5,0,0,0,27.46,21ZM27,27H9V22h3v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2Z'/%3E%3Cpath d='M27.46,21h-19a.5.5,0,0,0-.5.5v6a.5.5,0,0,0,.5.5h19a.5.5,0,0,0,.5-.5v-6A.5.5,0,0,0,27.46,21ZM27,27H9V22h3v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2v2.5a.5.5,0,0,0,1,0V22h2Z'/%3E%3Cpath class='cls-2' d='M1,17V1L12.59,12.62H5.81l-.41.12Z'/%3E%3Cpath class='cls-2' d='M10.08,17.69l-3.6,1.53L1.8,8.14,5.48,6.58Z'/%3E%3Cpath class='cls-3' d='M8.75,17l-1.84.77-3.1-7.37,1.84-.78Z'/%3E%3Cpath class='cls-3' d='M2,3.41V14.6l3-2.87.43-.14h4.76Z'/%3E%3C/svg%3E\",\n offsetX: -30,\n offsetY: -30,\n};\n\nexport const pinCursor = {\n url: \"data:image/svg+xml,%3Csvg width='36px' height='36px' viewBox='0 0 24 24' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Cdefs%3E%3Cpath d='M12,2 C7.581722,2 4,5.581722 4,10 C4.00435812,11.7714969 4.41127263,13.5188357 5.19,15.11 C6.15517666,17.0237439 7.49502409,18.7240579 9.13,20.11 C9.86916736,20.7592093 10.6620019,21.3446357 11.5,21.86 L12,22.14 L12.5,21.86 C13.8750156,21.0120029 15.1296156,19.9827599 16.23,18.8 C17.2698142,17.7023203 18.1394508,16.4551671 18.81,15.1 C19.5872532,13.5118707 19.9941287,11.7681184 20,10 C20,5.581722 16.418278,2 12,2 Z M12,13 C10.3431458,13 9,11.6568542 9,10 C9,8.34314575 10.3431458,7 12,7 C13.6568542,7 15,8.34314575 15,10 C15,10.7956495 14.6839295,11.5587112 14.1213203,12.1213203 C13.5587112,12.6839295 12.7956495,13 12,13 Z' id='path-1'%3E%3C/path%3E%3C/defs%3E%3Cg id='icons/pin-filled' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E%3Cmask id='mask-2' fill='white'%3E%3Cuse xlink:href='%23path-1'%3E%3C/use%3E%3C/mask%3E%3Cuse id='Shape' stroke='%23FAFAFA' fill='%23BDBDBD' fill-rule='nonzero' xlink:href='%23path-1'%3E%3C/use%3E%3C/g%3E%3C/svg%3E\",\n offsetX: 17,\n offsetY: 32,\n};\n\nexport const labelPinCursor = {\n url: \"data:image/svg+xml,%3Csvg width='36px' height='36px' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 16 24' %3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bfill:none;%7D.cls-2%7Bfill:%23616161;%7D.cls-3%7Bclip-path:url(%23clip-path);%7D%3C/style%3E%3CclipPath id='clip-path'%3E%3Ccircle cx='-576.76' cy='-107.26' r='4'/%3E%3C/clipPath%3E%3C/defs%3E%3Cpath d='M8,16H8a.48.48,0,0,1-.42-.23L5.75,13H3.51A1.5,1.5,0,0,1,2,11.5v-8A1.5,1.5,0,0,1,3.51,2h9A1.51,1.51,0,0,1,14,3.5v8a1.5,1.5,0,0,1-1.5,1.5H10.22L8.39,15.81A.5.5,0,0,1,8,16ZM3.51,3a.5.5,0,0,0-.5.5v8a.5.5,0,0,0,.5.5H6a.5.5,0,0,1,.42.23L8,14.61l1.55-2.38A.5.5,0,0,1,10,12h2.56a.5.5,0,0,0,.5-.5v-8a.51.51,0,0,0-.5-.5Z'/%3E%3Ccircle cx='8.01' cy='20' r='2'/%3E%3C/svg%3E%0A\",\n offsetX: 17,\n offsetY: 29,\n};\n\nexport const boxQueryCursor = {\n url: \"data:image/svg+xml;utf8,%3Csvg id='icons' xmlns='http://www.w3.org/2000/svg' width='30' height='30' viewBox='0 0 30 30'%3E%3Cdefs%3E%3Cstyle%3E.cls-1%7Bstroke:%23fff;stroke-miterlimit:10;stroke-width:2px;%7D.cls-2%7Bfill:%23fff;%7D.cls-2,.cls-3%7Bfill-rule:evenodd;%7D%3C/style%3E%3C/defs%3E%3Cpath class='cls-2' d='M1.25,17V1L12.59,12.62H5.81l-.41.12Z'/%3E%3Cpath class='cls-2' d='M10.33,17.69l-3.6,1.53L1.8,8.14,5.48,6.58Z'/%3E %3Cpath class='cls-3' d='M9,17l-1.84.77-3.1-7.37,1.84-.78Z'/%3E%3Cpath class='cls-3' d='M2.25,3.41V14.6l3-2.87.43-.14h4.76Z'/%3E%3Cpath class='cls-1' d='M21.36,22.5H15.5V16.64a.5.5,0,0,0-1,0V22.5H8.64a.5.5,0,0,0,0,1H14.5v5.86a.5.5,0,0,0,1,0V23.5h5.86a.5.5,0,0,0,0-1Z' /%3E %3Cpath d='M21.36,22.5H15.5V16.64a.5.5,0,0,0-1,0V22.5H8.64a.5.5,0,0,0,0,1H14.5v5.86a.5.5,0,0,0,1,0V23.5h5.86a.5.5,0,0,0,0-1Z' /%3E%3C/svg%3E\",\n offsetX: -30,\n offsetY: -30,\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom-B3m2VjbN.js","sources":["src/lib/dom.ts"],"sourcesContent":["import { Point } from '@vertexvis/geometry';\n\nimport { Cursor } from './cursors';\n\nexport function getMouseClientPosition(\n event: MouseEvent,\n offsets?: DOMRect
|
|
1
|
+
{"version":3,"file":"dom-B3m2VjbN.js","sources":["src/lib/dom.ts"],"sourcesContent":["import { Point } from '@vertexvis/geometry';\n\nimport { Cursor } from './cursors';\n\nexport function getMouseClientPosition(\n event: MouseEvent,\n offsets?: DOMRect,\n): Point.Point {\n const pt = Point.create(event.clientX, event.clientY);\n if (offsets == null) {\n return pt;\n } else {\n return Point.subtract(pt, Point.create(offsets.left, offsets.top));\n }\n}\n\n/**\n * Returns a CSS transform that will center an element at the given position.\n */\nexport function cssTransformCenterAt(position: Point.Point): string {\n const { x, y } = position;\n return `translate(-50%, -50%) translate(${x}px, ${y}px)`;\n}\n\n/**\n * Returns a CSS value for a cursor.\n */\nexport function cssCursor(cursor: Cursor): string {\n if (typeof cursor === 'string') {\n return cursor;\n } else {\n const parts = [\n `url(\"${cursor.url}\")`,\n cursor.offsetX ?? 0,\n cursor.offsetY ?? 0,\n ', auto',\n ];\n return parts.join(' ');\n }\n}\n\nexport function getWindowDevicePixelRatio(): number {\n if (typeof window !== 'undefined') {\n return window.devicePixelRatio;\n }\n return 1;\n}\n"],"names":["Point"],"mappings":";;;;;AAIM,SAAU,sBAAsB,CACpC,KAAiB,EACjB,OAAiB,EAAA;AAEjB,IAAA,MAAM,EAAE,GAAGA,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;AACrD,IAAA,IAAI,OAAO,IAAI,IAAI,EAAE;AACnB,QAAA,OAAO,EAAE;;SACJ;AACL,QAAA,OAAOA,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAEA,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;;AAEtE;AAEA;;AAEG;AACG,SAAU,oBAAoB,CAAC,QAAqB,EAAA;AACxD,IAAA,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,QAAQ;AACzB,IAAA,OAAO,CAAA,gCAAA,EAAmC,CAAC,CAAA,IAAA,EAAO,CAAC,KAAK;AAC1D;AAEA;;AAEG;AACG,SAAU,SAAS,CAAC,MAAc,EAAA;;AACtC,IAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAC9B,QAAA,OAAO,MAAM;;SACR;AACL,QAAA,MAAM,KAAK,GAAG;YACZ,CAAA,KAAA,EAAQ,MAAM,CAAC,GAAG,CAAA,EAAA,CAAI;YACtB,CAAA,EAAA,GAAA,MAAM,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,CAAC;YACnB,CAAA,EAAA,GAAA,MAAM,CAAC,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,CAAC;YACnB,QAAQ;SACT;AACD,QAAA,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;;AAE1B;SAEgB,yBAAyB,GAAA;AACvC,IAAA,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,OAAO,MAAM,CAAC,gBAAgB;;AAEhC,IAAA,OAAO,CAAC;AACV;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dom-DX6pEG54.js","sources":["src/components/scene-tree/lib/dom.ts"],"sourcesContent":["export function getSceneTreeViewportHeight(el: HTMLElement): number {\n return el.clientHeight;\n}\n\nexport function getSceneTreeOffsetTop(el: HTMLElement): number {\n return el.offsetTop;\n}\n\nexport function getSceneTreeContainsElement(\n el: Element,\n other: Element
|
|
1
|
+
{"version":3,"file":"dom-DX6pEG54.js","sources":["src/components/scene-tree/lib/dom.ts"],"sourcesContent":["export function getSceneTreeViewportHeight(el: HTMLElement): number {\n return el.clientHeight;\n}\n\nexport function getSceneTreeOffsetTop(el: HTMLElement): number {\n return el.offsetTop;\n}\n\nexport function getSceneTreeContainsElement(\n el: Element,\n other: Element,\n): boolean {\n return el.contains(other);\n}\n"],"names":[],"mappings":";;;AAAM,SAAU,0BAA0B,CAAC,EAAe,EAAA;IACxD,OAAO,EAAE,CAAC,YAAY;AACxB;AAMM,SAAU,2BAA2B,CACzC,EAAW,EACX,KAAc,EAAA;AAEd,IAAA,OAAO,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;AAC3B;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entities-zRken6VS.js","sources":["src/lib/measurement/controller.ts","src/lib/measurement/entities.ts"],"sourcesContent":["import { ModelEntity } from '@vertexvis/scene-view-protos/core/protos/model_entity_pb';\nimport {\n MeasureRequest,\n MeasureResponse,\n ModelEntityUpdate,\n UpdateModelEntitiesRequest,\n} from '@vertexvis/scene-view-protos/sceneview/protos/scene_view_api_pb';\nimport { SceneViewAPIClient } from '@vertexvis/scene-view-protos/sceneview/protos/scene_view_api_pb_service';\nimport { BoolValue } from 'google-protobuf/google/protobuf/wrappers_pb';\n\nimport { createMetadata, JwtProvider, requestUnary } from '../grpc';\nimport { MeasurementEntity } from './entities';\nimport { mapMeasureResponseOrThrow } from './mapper';\nimport { MeasurementModel } from './model';\nimport { MeasurementOutcome } from './outcomes';\n\n/**\n * The `MeasurementController` is responsible for performing measurements of\n * registered entities, and updating the model with their measurement results.\n */\nexport class MeasurementController {\n private outcome = Promise.resolve<MeasurementOutcome | undefined>(undefined);\n private debugLogs = false;\n\n public constructor(\n private model: MeasurementModel,\n private client: SceneViewAPIClient,\n private jwtProvider: JwtProvider,\n private deviceId: string | undefined\n ) {}\n\n /**\n * Registers an entity to measure and performs a measurement if this entity\n * has not been previously registered.\n *\n * @param entity The entity to measure.\n * @returns A promise that resolves with the results after registering this\n * entity.\n */\n public addEntity(\n entity: MeasurementEntity\n ): Promise<MeasurementOutcome | undefined> {\n if (this.debugLogs) {\n const deserializedEntity = ModelEntity.deserializeBinary(\n entity.modelEntity\n );\n\n this.log(\n `Adding ModelEntity. [entityId={${deserializedEntity.getEntityId()}}, sceneItemId={${deserializedEntity.getSceneItemId()}}]`\n );\n }\n\n return this.performMeasurement(() => this.model.addEntity(entity));\n }\n\n /**\n * Clears all entities and returns a promise that resolves with an empty list\n * of measurement results.\n */\n public clearEntities(): Promise<MeasurementOutcome | undefined> {\n this.log('Clearing all ModelEntities.');\n\n return this.performMeasurement(() => {\n this.model.clearEntities();\n this.model.clearOutcome();\n return true;\n });\n }\n\n /**\n * Deregisters an entity and performs a measurement if this entity was\n * removed.\n *\n * @param entity The entity to remove.\n * @returns A promise that resolves with the results after removing this\n * entity.\n */\n public removeEntity(\n entity: MeasurementEntity\n ): Promise<MeasurementOutcome | undefined> {\n if (this.debugLogs) {\n const deserializedEntity = ModelEntity.deserializeBinary(\n entity.modelEntity\n );\n\n this.log(\n `Removing ModelEntity. [entityId={${deserializedEntity.getEntityId()}}, sceneItemId={${deserializedEntity.getSceneItemId()}}]`\n );\n }\n\n return this.performMeasurement(() => this.model.removeEntity(entity));\n }\n\n /**\n * Registers a set of entities and performs a measurement\n *\n * @param entities The entities to measure.\n * @returns A promise that resolves with the results after registering these\n * entities.\n */\n public setEntities(\n entities: Set<MeasurementEntity>\n ): Promise<MeasurementOutcome | undefined> {\n if (this.debugLogs) {\n const deserializedEntities = Array.from(entities).map((e) =>\n ModelEntity.deserializeBinary(e.modelEntity)\n );\n\n this.log(\n `Setting ${deserializedEntities.length} ModelEntities. [entityIds=[${deserializedEntities.map((e) => e.getEntityId()).join(', ')}], sceneItemIds=[${deserializedEntities.map((e) => e.getSceneItemId()).join(', ')}]]`\n );\n }\n\n return this.performMeasurement(() => this.model.setEntities(entities));\n }\n\n public setDebugLogs(debugLogs: boolean): void {\n this.debugLogs = debugLogs;\n }\n\n private performMeasurement(\n effect: () => boolean\n ): Promise<MeasurementOutcome | undefined> {\n const previous = this.model.getEntities();\n const changed = effect();\n const entities = this.model.getEntities();\n if (changed) {\n this.measureAndUpdateModel(entities);\n this.highlightEntities(previous, entities);\n }\n return this.outcome;\n }\n\n private measureAndUpdateModel(entities: MeasurementEntity[]): void {\n if (entities.length > 0) {\n this.outcome = this.measureEntities(entities).then((outcome) => {\n this.model.setOutcome(outcome);\n return this.model.getOutcome();\n });\n } else {\n this.outcome = Promise.resolve(undefined);\n }\n }\n\n private async measureEntities(\n entities: MeasurementEntity[]\n ): Promise<MeasurementOutcome | undefined> {\n if (entities.length > 0) {\n const res = await requestUnary<MeasureResponse>(async (handler) => {\n const meta = await createMetadata(this.jwtProvider, this.deviceId);\n const req = new MeasureRequest();\n req.setEntitiesList(entities.map((e) => e.toProto()));\n\n this.client.measure(req, meta, handler);\n });\n\n return mapMeasureResponseOrThrow(res.toObject());\n } else {\n return undefined;\n }\n }\n\n private async highlightEntities(\n previous: MeasurementEntity[],\n entities: MeasurementEntity[]\n ): Promise<void> {\n await requestUnary(async (handler) => {\n const meta = await createMetadata(this.jwtProvider, this.deviceId);\n\n const entitySet = new Set(entities);\n const newPrevious = previous.filter((e) => !entitySet.has(e));\n\n const clearEntities = newPrevious.map((e) => {\n const update = new ModelEntityUpdate();\n update.setModelEntity(ModelEntity.deserializeBinary(e.modelEntity));\n update.setHighlight(new BoolValue().setValue(false));\n return update;\n });\n const highlightEntities = entities.map((e) => {\n const update = new ModelEntityUpdate();\n update.setModelEntity(ModelEntity.deserializeBinary(e.modelEntity));\n update.setHighlight(new BoolValue().setValue(true));\n return update;\n });\n\n const req = new UpdateModelEntitiesRequest();\n req.setUpdatesList([...clearEntities, ...highlightEntities]);\n this.client.updateModelEntities(req, meta, handler);\n });\n }\n\n private log(message?: string, ...optionalParams: unknown[]): void {\n if (this.debugLogs) {\n console.debug(message, optionalParams);\n }\n }\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { Vector3 } from '@vertexvis/geometry';\nimport { Vector3f } from '@vertexvis/scene-view-protos/core/protos/geometry_pb';\nimport { ModelEntity } from '@vertexvis/scene-view-protos/core/protos/model_entity_pb';\nimport { MeasureEntity } from '@vertexvis/scene-view-protos/sceneview/protos/scene_view_api_pb';\nimport { Mapper } from '@vertexvis/utils';\n\nimport { fromPbVector3f } from '../mappers';\n\nexport class MeasurementEntity {\n public constructor(\n public readonly point: Vector3.Vector3,\n public readonly modelEntity: Uint8Array\n ) {}\n\n public static fromHit(\n hit: vertexvis.protobuf.stream.IHit\n ): MeasurementEntity {\n if (hit.hitPoint != null && hit.modelEntity != null) {\n const hitPoint = Mapper.ifInvalidThrow(fromPbVector3f)(hit.hitPoint);\n const modelEntity = vertexvis.protobuf.core.ModelEntity.encode(\n hit.modelEntity\n ).finish();\n return new MeasurementEntity(hitPoint, modelEntity);\n } else {\n throw new Error(\n 'Cannot create MeasurementEntity from Hit. Hit is missing hit point and model entity'\n );\n }\n }\n\n public toProto(): MeasureEntity {\n const entity = new MeasureEntity();\n\n const point = new Vector3f();\n point.setX(this.point.x);\n point.setY(this.point.y);\n point.setZ(this.point.z);\n entity.setPoint(point);\n\n const modelEntity = ModelEntity.deserializeBinary(this.modelEntity);\n entity.setModelEntity(modelEntity);\n\n return entity;\n }\n}\n"],"names":["ModelEntity","MeasureRequest","ModelEntityUpdate","BoolValue","UpdateModelEntitiesRequest","Mapper","MeasureEntity","Vector3f"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"entities-zRken6VS.js","sources":["src/lib/measurement/controller.ts","src/lib/measurement/entities.ts"],"sourcesContent":["import { ModelEntity } from '@vertexvis/scene-view-protos/core/protos/model_entity_pb';\nimport {\n MeasureRequest,\n MeasureResponse,\n ModelEntityUpdate,\n UpdateModelEntitiesRequest,\n} from '@vertexvis/scene-view-protos/sceneview/protos/scene_view_api_pb';\nimport { SceneViewAPIClient } from '@vertexvis/scene-view-protos/sceneview/protos/scene_view_api_pb_service';\nimport { BoolValue } from 'google-protobuf/google/protobuf/wrappers_pb';\n\nimport { createMetadata, JwtProvider, requestUnary } from '../grpc';\nimport { MeasurementEntity } from './entities';\nimport { mapMeasureResponseOrThrow } from './mapper';\nimport { MeasurementModel } from './model';\nimport { MeasurementOutcome } from './outcomes';\n\n/**\n * The `MeasurementController` is responsible for performing measurements of\n * registered entities, and updating the model with their measurement results.\n */\nexport class MeasurementController {\n private outcome = Promise.resolve<MeasurementOutcome | undefined>(undefined);\n private debugLogs = false;\n\n public constructor(\n private model: MeasurementModel,\n private client: SceneViewAPIClient,\n private jwtProvider: JwtProvider,\n private deviceId: string | undefined,\n ) {}\n\n /**\n * Registers an entity to measure and performs a measurement if this entity\n * has not been previously registered.\n *\n * @param entity The entity to measure.\n * @returns A promise that resolves with the results after registering this\n * entity.\n */\n public addEntity(\n entity: MeasurementEntity,\n ): Promise<MeasurementOutcome | undefined> {\n if (this.debugLogs) {\n const deserializedEntity = ModelEntity.deserializeBinary(\n entity.modelEntity,\n );\n\n this.log(\n `Adding ModelEntity. [entityId={${deserializedEntity.getEntityId()}}, sceneItemId={${deserializedEntity.getSceneItemId()}}]`,\n );\n }\n\n return this.performMeasurement(() => this.model.addEntity(entity));\n }\n\n /**\n * Clears all entities and returns a promise that resolves with an empty list\n * of measurement results.\n */\n public clearEntities(): Promise<MeasurementOutcome | undefined> {\n this.log('Clearing all ModelEntities.');\n\n return this.performMeasurement(() => {\n this.model.clearEntities();\n this.model.clearOutcome();\n return true;\n });\n }\n\n /**\n * Deregisters an entity and performs a measurement if this entity was\n * removed.\n *\n * @param entity The entity to remove.\n * @returns A promise that resolves with the results after removing this\n * entity.\n */\n public removeEntity(\n entity: MeasurementEntity,\n ): Promise<MeasurementOutcome | undefined> {\n if (this.debugLogs) {\n const deserializedEntity = ModelEntity.deserializeBinary(\n entity.modelEntity,\n );\n\n this.log(\n `Removing ModelEntity. [entityId={${deserializedEntity.getEntityId()}}, sceneItemId={${deserializedEntity.getSceneItemId()}}]`,\n );\n }\n\n return this.performMeasurement(() => this.model.removeEntity(entity));\n }\n\n /**\n * Registers a set of entities and performs a measurement\n *\n * @param entities The entities to measure.\n * @returns A promise that resolves with the results after registering these\n * entities.\n */\n public setEntities(\n entities: Set<MeasurementEntity>,\n ): Promise<MeasurementOutcome | undefined> {\n if (this.debugLogs) {\n const deserializedEntities = Array.from(entities).map((e) =>\n ModelEntity.deserializeBinary(e.modelEntity),\n );\n\n this.log(\n `Setting ${deserializedEntities.length} ModelEntities. [entityIds=[${deserializedEntities.map((e) => e.getEntityId()).join(', ')}], sceneItemIds=[${deserializedEntities.map((e) => e.getSceneItemId()).join(', ')}]]`,\n );\n }\n\n return this.performMeasurement(() => this.model.setEntities(entities));\n }\n\n public setDebugLogs(debugLogs: boolean): void {\n this.debugLogs = debugLogs;\n }\n\n private performMeasurement(\n effect: () => boolean,\n ): Promise<MeasurementOutcome | undefined> {\n const previous = this.model.getEntities();\n const changed = effect();\n const entities = this.model.getEntities();\n if (changed) {\n this.measureAndUpdateModel(entities);\n this.highlightEntities(previous, entities);\n }\n return this.outcome;\n }\n\n private measureAndUpdateModel(entities: MeasurementEntity[]): void {\n if (entities.length > 0) {\n this.outcome = this.measureEntities(entities).then((outcome) => {\n this.model.setOutcome(outcome);\n return this.model.getOutcome();\n });\n } else {\n this.outcome = Promise.resolve(undefined);\n }\n }\n\n private async measureEntities(\n entities: MeasurementEntity[],\n ): Promise<MeasurementOutcome | undefined> {\n if (entities.length > 0) {\n const res = await requestUnary<MeasureResponse>(async (handler) => {\n const meta = await createMetadata(this.jwtProvider, this.deviceId);\n const req = new MeasureRequest();\n req.setEntitiesList(entities.map((e) => e.toProto()));\n\n this.client.measure(req, meta, handler);\n });\n\n return mapMeasureResponseOrThrow(res.toObject());\n } else {\n return undefined;\n }\n }\n\n private async highlightEntities(\n previous: MeasurementEntity[],\n entities: MeasurementEntity[],\n ): Promise<void> {\n await requestUnary(async (handler) => {\n const meta = await createMetadata(this.jwtProvider, this.deviceId);\n\n const entitySet = new Set(entities);\n const newPrevious = previous.filter((e) => !entitySet.has(e));\n\n const clearEntities = newPrevious.map((e) => {\n const update = new ModelEntityUpdate();\n update.setModelEntity(ModelEntity.deserializeBinary(e.modelEntity));\n update.setHighlight(new BoolValue().setValue(false));\n return update;\n });\n const highlightEntities = entities.map((e) => {\n const update = new ModelEntityUpdate();\n update.setModelEntity(ModelEntity.deserializeBinary(e.modelEntity));\n update.setHighlight(new BoolValue().setValue(true));\n return update;\n });\n\n const req = new UpdateModelEntitiesRequest();\n req.setUpdatesList([...clearEntities, ...highlightEntities]);\n this.client.updateModelEntities(req, meta, handler);\n });\n }\n\n private log(message?: string, ...optionalParams: unknown[]): void {\n if (this.debugLogs) {\n console.debug(message, optionalParams);\n }\n }\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { Vector3 } from '@vertexvis/geometry';\nimport { Vector3f } from '@vertexvis/scene-view-protos/core/protos/geometry_pb';\nimport { ModelEntity } from '@vertexvis/scene-view-protos/core/protos/model_entity_pb';\nimport { MeasureEntity } from '@vertexvis/scene-view-protos/sceneview/protos/scene_view_api_pb';\nimport { Mapper } from '@vertexvis/utils';\n\nimport { fromPbVector3f } from '../mappers';\n\nexport class MeasurementEntity {\n public constructor(\n public readonly point: Vector3.Vector3,\n public readonly modelEntity: Uint8Array,\n ) {}\n\n public static fromHit(\n hit: vertexvis.protobuf.stream.IHit,\n ): MeasurementEntity {\n if (hit.hitPoint != null && hit.modelEntity != null) {\n const hitPoint = Mapper.ifInvalidThrow(fromPbVector3f)(hit.hitPoint);\n const modelEntity = vertexvis.protobuf.core.ModelEntity.encode(\n hit.modelEntity,\n ).finish();\n return new MeasurementEntity(hitPoint, modelEntity);\n } else {\n throw new Error(\n 'Cannot create MeasurementEntity from Hit. Hit is missing hit point and model entity',\n );\n }\n }\n\n public toProto(): MeasureEntity {\n const entity = new MeasureEntity();\n\n const point = new Vector3f();\n point.setX(this.point.x);\n point.setY(this.point.y);\n point.setZ(this.point.z);\n entity.setPoint(point);\n\n const modelEntity = ModelEntity.deserializeBinary(this.modelEntity);\n entity.setModelEntity(modelEntity);\n\n return entity;\n }\n}\n"],"names":["ModelEntity","MeasureRequest","ModelEntityUpdate","BoolValue","UpdateModelEntitiesRequest","Mapper","MeasureEntity","Vector3f"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"geometry_pb-BiZRfctN.js","sources":["src/lib/measurement/mapper.ts"],"sourcesContent":["import { Plane } from '@vertexvis/geometry';\nimport type {\n MeasurementResult as PbMeasurementResult,\n MinimumDistanceResult as PbMinimumDistanceResult,\n PlanarAngleResult as PbPlanarAngleResult,\n PlanarDistanceResult as PbPlanarDistanceResult,\n PlanePair as PbPlanePair,\n SurfaceAreaResult as PbSurfaceAreaResult,\n} from '@vertexvis/scene-view-protos/core/protos/measurement_pb';\nimport type { MeasureResponse as PbMeasureResponse } from '@vertexvis/scene-view-protos/sceneview/protos/scene_view_api_pb';\nimport { Mapper as M } from '@vertexvis/utils';\n\nimport { fromPbPlane, fromPbVector3f } from '../mappers';\nimport { MeasurementOutcome } from './outcomes';\nimport {\n MeasurementResult,\n MinimumDistanceMeasurementResult,\n PlanarAngleMeasurementResult,\n PlanarDistanceMeasurementResult,\n SurfaceAreaMeasurementResult,\n} from './results';\n\nconst mapPlanePair: M.Func<\n PbPlanePair.AsObject,\n { start: Plane.Plane; end: Plane.Plane }\n> = M.defineMapper(\n M.read(\n M.mapRequiredProp('start', fromPbPlane),\n M.mapRequiredProp('end', fromPbPlane)
|
|
1
|
+
{"version":3,"file":"geometry_pb-BiZRfctN.js","sources":["src/lib/measurement/mapper.ts"],"sourcesContent":["import { Plane } from '@vertexvis/geometry';\nimport type {\n MeasurementResult as PbMeasurementResult,\n MinimumDistanceResult as PbMinimumDistanceResult,\n PlanarAngleResult as PbPlanarAngleResult,\n PlanarDistanceResult as PbPlanarDistanceResult,\n PlanePair as PbPlanePair,\n SurfaceAreaResult as PbSurfaceAreaResult,\n} from '@vertexvis/scene-view-protos/core/protos/measurement_pb';\nimport type { MeasureResponse as PbMeasureResponse } from '@vertexvis/scene-view-protos/sceneview/protos/scene_view_api_pb';\nimport { Mapper as M } from '@vertexvis/utils';\n\nimport { fromPbPlane, fromPbVector3f } from '../mappers';\nimport { MeasurementOutcome } from './outcomes';\nimport {\n MeasurementResult,\n MinimumDistanceMeasurementResult,\n PlanarAngleMeasurementResult,\n PlanarDistanceMeasurementResult,\n SurfaceAreaMeasurementResult,\n} from './results';\n\nconst mapPlanePair: M.Func<\n PbPlanePair.AsObject,\n { start: Plane.Plane; end: Plane.Plane }\n> = M.defineMapper(\n M.read(\n M.mapRequiredProp('start', fromPbPlane),\n M.mapRequiredProp('end', fromPbPlane),\n ),\n ([start, end]) => ({ start, end }),\n);\n\nconst mapPlanarDistance: M.Func<\n PbPlanarDistanceResult.AsObject,\n PlanarDistanceMeasurementResult\n> = M.defineMapper(\n M.read(\n M.getProp('distance'),\n M.mapRequiredProp(\n 'planes',\n M.compose(mapPlanePair, M.requiredProp('start')),\n ),\n M.mapRequiredProp('planes', M.compose(mapPlanePair, M.requiredProp('end'))),\n ),\n ([distance, plane1, plane2]) => ({\n type: 'planar-distance',\n distance,\n plane1,\n plane2,\n }),\n);\n\nconst mapPlanarAngle: M.Func<\n PbPlanarAngleResult.AsObject,\n PlanarAngleMeasurementResult\n> = M.defineMapper(\n M.read(\n M.getProp('angleInRadians'),\n M.mapRequiredProp(\n 'planes',\n M.compose(mapPlanePair, M.requiredProp('start')),\n ),\n M.mapRequiredProp('planes', M.compose(mapPlanePair, M.requiredProp('end'))),\n ),\n ([angle, plane1, plane2]) => ({\n type: 'planar-angle',\n angle,\n plane1,\n plane2,\n }),\n);\n\nconst mapMinimumDistance: M.Func<\n PbMinimumDistanceResult.AsObject,\n MinimumDistanceMeasurementResult\n> = M.defineMapper(\n M.read(\n M.getProp('distance'),\n M.mapRequiredProp('closestPoint1', fromPbVector3f),\n M.mapRequiredProp('closestPoint2', fromPbVector3f),\n ),\n ([distance, point1, point2]) => ({\n type: 'minimum-distance',\n distance,\n point1,\n point2,\n }),\n);\n\nconst mapSurfaceArea: M.Func<\n PbSurfaceAreaResult.AsObject,\n SurfaceAreaMeasurementResult\n> = M.defineMapper(M.read(M.getProp('area')), ([area]) => ({\n type: 'surface-area',\n area,\n}));\n\nconst mapPlanarDistanceFromResult: M.Func<\n PbMeasurementResult.AsObject,\n PlanarDistanceMeasurementResult | undefined | null\n> = M.mapProp('planarDistance', M.ifDefined(mapPlanarDistance));\n\nconst mapPlanarAngleFromResult: M.Func<\n PbMeasurementResult.AsObject,\n PlanarAngleMeasurementResult | undefined | null\n> = M.mapProp('planarAngle', M.ifDefined(mapPlanarAngle));\n\nconst mapMinimumDistanceFromResult: M.Func<\n PbMeasurementResult.AsObject,\n MinimumDistanceMeasurementResult | undefined | null\n> = M.mapProp('minimumDistance', M.ifDefined(mapMinimumDistance));\n\nconst mapSurfaceAreaFromResult: M.Func<\n PbMeasurementResult.AsObject,\n SurfaceAreaMeasurementResult | undefined | null\n> = M.mapProp('totalSurfaceArea', M.ifDefined(mapSurfaceArea));\n\nconst mapMeasurementResult: M.Func<\n PbMeasurementResult.AsObject,\n MeasurementResult\n> = M.compose(\n M.pickFirst(\n mapPlanarDistanceFromResult,\n mapPlanarAngleFromResult,\n mapMinimumDistanceFromResult,\n mapSurfaceAreaFromResult,\n ),\n M.required('Result field'),\n);\n\nexport const mapMeasureResponse: M.Func<\n PbMeasureResponse.AsObject,\n MeasurementOutcome\n> = M.defineMapper(\n M.read(\n M.mapRequiredProp(\n 'outcome',\n M.mapRequiredProp('resultsList', M.mapArray(mapMeasurementResult)),\n ),\n M.mapRequiredProp('outcome', M.getProp('isApproximate')),\n ),\n ([results, isApproximate]) => ({ results, isApproximate }),\n);\n\nexport const mapMeasureResponseOrThrow = M.ifInvalidThrow(mapMeasureResponse);\n"],"names":["M"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"grpc-CZAYqbTu.js","sources":["src/lib/grpc.ts"],"sourcesContent":["import { grpc } from '@improbable-eng/grpc-web';\n\nexport type GrpcCaller<R, E> = (\n handler: GrpcHandler<R, E
|
|
1
|
+
{"version":3,"file":"grpc-CZAYqbTu.js","sources":["src/lib/grpc.ts"],"sourcesContent":["import { grpc } from '@improbable-eng/grpc-web';\n\nexport type GrpcCaller<R, E> = (\n handler: GrpcHandler<R, E>,\n) => void | Promise<void>;\n\ntype GrpcHandler<R, E> = (err: E | null, res: R | null) => void | Promise<void>;\n\nexport type JwtProvider = () =>\n | Promise<string | undefined>\n | string\n | undefined;\n\nexport function requestUnary<R, E = unknown>(\n caller: GrpcCaller<R, E>,\n): Promise<R> {\n return new Promise((resolve, reject) => {\n caller((err, res) => {\n if (err != null) {\n reject(err);\n } else if (res != null) {\n resolve(res);\n } else {\n reject(new Error('Invalid gRPC response. Error and result are empty.'));\n }\n });\n });\n}\n\nexport async function* requestPaged<R, E = unknown>(\n fetch: (cursor: string | undefined) => GrpcCaller<R, E>,\n next: (res: R) => string | undefined,\n): AsyncGenerator<R, void, void> {\n let cursor = undefined;\n\n do {\n const res = await requestUnary(fetch(cursor));\n yield res;\n cursor = next(res);\n } while (cursor != null);\n}\n\nexport async function createMetadata(\n jwtProvider: JwtProvider,\n deviceId?: string,\n): Promise<grpc.Metadata> {\n const jwt = await jwtProvider();\n const meta = new grpc.Metadata({\n 'jwt-context': JSON.stringify({\n jwt,\n metadata: { 'x-device-id': deviceId || '' },\n }),\n });\n\n return meta;\n}\n"],"names":["grpc"],"mappings":";;;;;AAaM,SAAU,YAAY,CAC1B,MAAwB,EAAA;IAExB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,QAAA,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,KAAI;AAClB,YAAA,IAAI,GAAG,IAAI,IAAI,EAAE;gBACf,MAAM,CAAC,GAAG,CAAC;;AACN,iBAAA,IAAI,GAAG,IAAI,IAAI,EAAE;gBACtB,OAAO,CAAC,GAAG,CAAC;;iBACP;AACL,gBAAA,MAAM,CAAC,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;;AAE3E,SAAC,CAAC;AACJ,KAAC,CAAC;AACJ;AAEO,gBAAgB,YAAY,CACjC,KAAuD,EACvD,IAAoC,EAAA;IAEpC,IAAI,MAAM,GAAG,SAAS;AAEtB,IAAA,GAAG;QACD,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC7C,QAAA,MAAM,GAAG;AACT,QAAA,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC;AACpB,KAAC,QAAQ,MAAM,IAAI,IAAI;AACzB;AAEO,eAAe,cAAc,CAClC,WAAwB,EACxB,QAAiB,EAAA;AAEjB,IAAA,MAAM,GAAG,GAAG,MAAM,WAAW,EAAE;AAC/B,IAAA,MAAM,IAAI,GAAG,IAAIA,6BAAI,CAAC,QAAQ,CAAC;AAC7B,QAAA,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC;YAC5B,GAAG;AACH,YAAA,QAAQ,EAAE,EAAE,aAAa,EAAE,QAAQ,IAAI,EAAE,EAAE;SAC5C,CAAC;AACH,KAAA,CAAC;AAEF,IAAA,OAAO,IAAI;AACb;;;;"}
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["src/lib/transforms/transformation-delta.ts"],"sourcesContent":["import { Matrix4, Quaternion, Vector3 } from '@vertexvis/geometry';\n\nexport const ALMOST_ONE = 0.9999;\n\n/**\n * For any single normal vector, there are an infinite number of potential orthogonal vectors. This function will\n * calculate a single vector evaluating the length of two candidates, and picking the one with the higher squared magnitude\n * @param normal\n * @returns\n */\nexport function calculateOrthogonalCoordinate(\n norm: Vector3.Vector3
|
|
1
|
+
{"version":3,"file":"index.js","sources":["src/lib/transforms/transformation-delta.ts"],"sourcesContent":["import { Matrix4, Quaternion, Vector3 } from '@vertexvis/geometry';\n\nexport const ALMOST_ONE = 0.9999;\n\n/**\n * For any single normal vector, there are an infinite number of potential orthogonal vectors. This function will\n * calculate a single vector evaluating the length of two candidates, and picking the one with the higher squared magnitude\n * @param normal\n * @returns\n */\nexport function calculateOrthogonalCoordinate(\n norm: Vector3.Vector3,\n): Vector3.Vector3 {\n const orthogonalCandidate0 = Vector3.create(0, norm.z, -norm.y);\n const orthogonalCandidate1 = Vector3.create(-norm.z, 0, norm.x);\n\n const theChosenOne =\n Vector3.magnitudeSquared(orthogonalCandidate0) >\n Vector3.magnitudeSquared(orthogonalCandidate1)\n ? orthogonalCandidate0\n : orthogonalCandidate1;\n\n return Vector3.normalize(Vector3.cross(norm, theChosenOne));\n}\n\n/**\n * Computes the rotation matrix for two normals. If both normals are neither parallel nor anti-parallel,\n * this will compute the rotation matrix delta based on the angle from both normals.\n * If the normals are anti-parallel, the identity matrix will be returned, as no rotation is necessary in this case.\n * If the normals are parallel, an axis direction based on a chosen orthogonal vector will be used\n * to compute the rotation matrix to rotate the plane 180 degrees.\n * @param normal1\n * @param normal2\n * @returns an anti-parallel rotation Matrix4 between the given normals\n */\nexport function computeRotationMatrix(\n normal1: Vector3.Vector3,\n normal2: Vector3.Vector3,\n): Matrix4.Matrix4 {\n const dot = Vector3.dot(normal1, normal2);\n // the angle is almost 0 in this case.\n if (dot > ALMOST_ONE) {\n const axisDirection = calculateOrthogonalCoordinate(normal1);\n\n const quaternion = Quaternion.fromAxisAngle(axisDirection, Math.PI);\n return Matrix4.makeRotation(quaternion);\n }\n // the angle is almost 180 in this case.\n else if (dot <= -ALMOST_ONE) {\n return Matrix4.makeIdentity();\n }\n // the angle is between 0 & 180\n else {\n const angle = Vector3.angleTo(normal2, normal1);\n const axisDirection = Vector3.normalize(Vector3.cross(normal1, normal2));\n return Matrix4.makeRotation(\n Quaternion.fromAxisAngle(axisDirection, angle + Math.PI),\n );\n }\n}\n\n/**\n * Computes the translation & rotation matrix delta between two world positions and two normals.\n * such that the computed translation matrix will be the delta between position 1 and position 2,\n * and the rotation will be rotated to be anti-parallel.\n *\n * @param normal1\n * @param position1\n * @param normal2\n * @param position2\n *\n * @returns Matrix4 translation matrix delta from position1 to\n * position2 & an anti-parallel rotation delta.\n */\nexport function computeTransformationDelta(\n normal1: Vector3.Vector3,\n position1: Vector3.Vector3,\n normal2: Vector3.Vector3,\n position2: Vector3.Vector3,\n): Matrix4.Matrix4 {\n const rotationMatrix = computeRotationMatrix(normal1, normal2);\n\n const translationDeltaMatrix = Matrix4.makeTranslation(position2);\n return Matrix4.multiply(\n Matrix4.multiply(translationDeltaMatrix, rotationMatrix),\n Matrix4.makeTranslation(Vector3.negate(position1)),\n );\n}\n"],"names":["Vector3","quaternion","Quaternion","Matrix4"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEO,MAAM,UAAU,GAAG,MAAM;AAEhC;;;;;AAKG;AACG,SAAU,6BAA6B,CAC3C,IAAqB,EAAA;AAErB,IAAA,MAAM,oBAAoB,GAAGA,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/D,IAAA,MAAM,oBAAoB,GAAGA,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AAE/D,IAAA,MAAM,YAAY,GAChBA,OAAO,CAAC,gBAAgB,CAAC,oBAAoB,CAAC;AAC9C,QAAAA,OAAO,CAAC,gBAAgB,CAAC,oBAAoB;AAC3C,UAAE;UACA,oBAAoB;AAE1B,IAAA,OAAOA,OAAO,CAAC,SAAS,CAACA,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AAC7D;AAEA;;;;;;;;;AASG;AACG,SAAU,qBAAqB,CACnC,OAAwB,EACxB,OAAwB,EAAA;IAExB,MAAM,GAAG,GAAGA,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC;;AAEzC,IAAA,IAAI,GAAG,GAAG,UAAU,EAAE;AACpB,QAAA,MAAM,aAAa,GAAG,6BAA6B,CAAC,OAAO,CAAC;AAE5D,QAAA,MAAMC,YAAU,GAAGC,UAAU,CAAC,aAAa,CAAC,aAAa,EAAE,IAAI,CAAC,EAAE,CAAC;AACnE,QAAA,OAAOC,OAAO,CAAC,YAAY,CAACF,YAAU,CAAC;;;AAGpC,SAAA,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE;AAC3B,QAAA,OAAOE,OAAO,CAAC,YAAY,EAAE;;;SAG1B;QACH,MAAM,KAAK,GAAGH,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC;AAC/C,QAAA,MAAM,aAAa,GAAGA,OAAO,CAAC,SAAS,CAACA,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACxE,QAAA,OAAOG,OAAO,CAAC,YAAY,CACzBD,UAAU,CAAC,aAAa,CAAC,aAAa,EAAE,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CACzD;;AAEL;AAEA;;;;;;;;;;;;AAYG;AACG,SAAU,0BAA0B,CACxC,OAAwB,EACxB,SAA0B,EAC1B,OAAwB,EACxB,SAA0B,EAAA;IAE1B,MAAM,cAAc,GAAG,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC;IAE9D,MAAM,sBAAsB,GAAGC,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC;IACjE,OAAOA,OAAO,CAAC,QAAQ,CACrBA,OAAO,CAAC,QAAQ,CAAC,sBAAsB,EAAE,cAAc,CAAC,EACxDA,OAAO,CAAC,eAAe,CAACH,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CACnD;AACH;;;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-BYW5YIye.js","sources":["src/lib/keyBinding.ts","src/lib/walk-mode/controller.ts","src/lib/walk-mode/model.ts"],"sourcesContent":["export class KeyBinding {\n private bindings: string[];\n\n public constructor(...bindings: string[]) {\n this.bindings = bindings.map((binding) => binding.toLowerCase());\n }\n\n public matches(keys: Record<string, boolean>): boolean {\n return (\n this.bindings.length > 0 &&\n this.bindings.every((binding) => this.bindingMatches(keys, binding))\n );\n }\n\n private bindingMatches(\n keys: Record<string, boolean>,\n binding: string\n ): boolean {\n const negated = binding.includes('!');\n const key = binding.replace('!', '');\n\n return negated ? !keys[key] : keys[key];\n }\n}\n","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","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"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"model-BYW5YIye.js","sources":["src/lib/keyBinding.ts","src/lib/walk-mode/controller.ts","src/lib/walk-mode/model.ts"],"sourcesContent":["export class KeyBinding {\n private bindings: string[];\n\n public constructor(...bindings: string[]) {\n this.bindings = bindings.map((binding) => binding.toLowerCase());\n }\n\n public matches(keys: Record<string, boolean>): boolean {\n return (\n this.bindings.length > 0 &&\n this.bindings.every((binding) => this.bindingMatches(keys, binding))\n );\n }\n\n private bindingMatches(\n keys: Record<string, boolean>,\n binding: string,\n ): boolean {\n const negated = binding.includes('!');\n const key = binding.replace('!', '');\n\n return negated ? !keys[key] : keys[key];\n }\n}\n","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","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"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-CLtwOS0o.js","sources":["src/lib/pins/controller.ts","src/components/viewer-pin-tool/utils.ts","src/lib/pins/model.ts"],"sourcesContent":["import { Point, Vector3 } from '@vertexvis/geometry';\nimport { Color } from '@vertexvis/utils';\n\nimport {\n Pin,\n PinModel,\n PinStyleAttributes,\n ViewerPinToolMode,\n ViewerPinToolType,\n} from './model';\n\nexport interface Draggable {\n id: string;\n lastPoint?: Point.Point;\n}\n\n/**\n * The `PinController` is responsible for adding pin entities to the viewer canvas\n */\nexport class PinController {\n private draggable?: Draggable;\n\n public constructor(\n private model: PinModel,\n private mode: ViewerPinToolMode = 'view',\n private type: ViewerPinToolType = 'pin-icon',\n private styleAttributes: PinStyleAttributes | undefined = undefined\n ) {}\n\n /**\n * Registers an entity to place on the canvas and places the pin on the associated part.\n *\n * @param pin The pin entity\n * @returns A void promise\n */\n public addPin(pin: Pin): void {\n this.model.addPin(pin);\n }\n\n /**\n * Clears all entities and returns a promise that resolves with an empty list\n * of pin results.\n */\n public clearPins(): void {\n this.model.clearPins();\n }\n\n /**\n * Deregisters an entity and performs a pin if this entity was\n * removed.\n *\n * @param entity The entity to remove.\n * @returns A promise that resolves with the results after removing this\n * entity.\n */\n public removePin(pin: Pin): void {\n this.model.removePin(pin);\n }\n\n /**\n * Registers a set of entities and adds a pin\n *\n * @param entities The pin entities to draw.\n * @returns A promise that resolves with the results after registering these\n * entities.\n */\n public setPins(pins: Set<Pin>): void {\n this.model.setPins(pins);\n }\n\n /**\n * Sets the set of entities to be placed with the model.\n *\n * @param pin A pin to set\n * @returns `true` if the entity has been added.\n */\n public setPin(pin: Pin): void {\n this.model.setPin(pin);\n }\n\n /**\n * Updates an existing pin\n * @param pin A pin to set\n * @returns `true` if the entity has been updated, false otherwise\n */\n public updatePin(pin: Pin): void {\n this.model.updatePin(pin);\n }\n\n /**\n * Tells the controller which pin is selected in the model\n * @param pinId\n */\n public setSelectedPinId(pinId?: string): void {\n this.model.setSelectedPin(pinId);\n }\n\n public getToolMode(): ViewerPinToolMode {\n return this.mode;\n }\n\n public getToolType(): ViewerPinToolType {\n return this.type;\n }\n\n public setToolMode(mode: ViewerPinToolMode): void {\n this.mode = mode;\n }\n\n public setToolType(type: ViewerPinToolType): void {\n this.type = type;\n }\n\n public getDraggable(): Draggable | undefined {\n return this.draggable;\n }\n\n public setDraggable(draggable: Draggable | undefined): void {\n this.draggable = draggable;\n }\n\n public setPrimaryColor(color?: Color.Color | string): void {\n this.styleAttributes = {\n ...this.styleAttributes,\n primaryColor: color,\n };\n }\n\n public setAccentColor(color?: Color.Color | string): void {\n this.styleAttributes = {\n ...this.styleAttributes,\n accentColor: color,\n };\n }\n\n public getStyleAttributes(): PinStyleAttributes | undefined {\n return this.styleAttributes;\n }\n\n public updateDraggable(\n draggable: Draggable,\n worldPosition: Vector3.Vector3,\n partId?: string\n ): void {\n if (this.draggable != null) {\n this.draggable = draggable;\n }\n const pin = this.model.getPinById(draggable.id);\n if (pin != null) {\n this.updatePin({\n ...pin,\n worldPosition,\n partId,\n });\n }\n }\n}\n","import { Dimensions, Point } from '@vertexvis/geometry';\nimport { Range } from '@vertexvis/utils';\n\nexport function constrainRelativePoint(\n pt: Point.Point,\n range: Range.Range\n): Point.Point {\n const constrainedX = Math.max(range.start, Math.min(range.end, pt.x));\n const constrainedY = Math.max(range.start, Math.min(range.end, pt.y));\n\n return Point.create(constrainedX, constrainedY);\n}\n\n/**\n * Translates a point in relative units to a point in screen units.\n */\nexport function translatePointToScreen(\n pt: Point.Point,\n canvasDimensions: Dimensions.Dimensions\n): Point.Point {\n return Point.add(\n Point.scale(pt, canvasDimensions.width, canvasDimensions.height),\n Dimensions.center(canvasDimensions)\n );\n}\n\n/**\n * Translates a point in screen units to a point in relative units.\n */\nexport function translatePointToRelative(\n pt: Point.Point,\n canvasDimensions: Dimensions.Dimensions,\n includeOffset?: boolean,\n xOffset?: number,\n yOffset?: number\n): Point.Point {\n const verticalScaleFactor = 1 / canvasDimensions.height;\n const horizontalScaleFactor = 1 / canvasDimensions.width;\n const canvasCenterPoint = Dimensions.center(canvasDimensions);\n\n const point = Point.scale(\n Point.subtract(pt, canvasCenterPoint),\n horizontalScaleFactor,\n verticalScaleFactor\n );\n\n if (includeOffset) {\n const offset = Point.scale(\n Point.create(xOffset, yOffset),\n horizontalScaleFactor,\n verticalScaleFactor\n );\n\n // We want to place the label towards the center of the screen.\n // The given point corresponds to the upper left corner of the label, so increase the offset\n // when placing it to the left or above to ensure that part of the label line is visible\n const centerIsToTheRightInXDirection = canvasCenterPoint.x > pt.x;\n const xOffsetCalculated = centerIsToTheRightInXDirection\n ? offset.x\n : -3 * offset.x;\n\n const centerIsBelowInYDirection = canvasCenterPoint.y > pt.y;\n const yOffsetCalculated = centerIsBelowInYDirection\n ? offset.y\n : -3 * offset.y;\n\n const offsetPoint = Point.add(\n point,\n Point.create(xOffsetCalculated, yOffsetCalculated)\n );\n\n return constrainRelativePoint(offsetPoint, Range.create(-0.5, 0.5));\n } else {\n return constrainRelativePoint(point, Range.create(-0.5, 0.5));\n }\n}\n","import { Color, Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\n/**\n * The types of pins that can be performed by this tool.\n */\nexport type ViewerPinToolType = 'pin-icon' | 'pin-text';\n\n/**\n * The mode of the pin tool\n */\nexport type ViewerPinToolMode = 'edit' | 'view';\n\n/**\n * A model representing the state of pins.\n *\n */\n\nimport { Point, Vector3 } from '@vertexvis/geometry';\n\ninterface BasePinAttributes {\n style?: PinStyleAttributes;\n}\n\ninterface BasePin {\n id: string;\n worldPosition: Vector3.Vector3;\n partId?: string;\n attributes?: BasePinAttributes;\n}\n\nexport interface TextPin extends BasePin {\n type: 'text';\n label: PinLabel;\n}\n\n// Future: Support custom icons.\nexport interface IconPin extends BasePin {\n type: 'icon';\n}\n\nexport type Pin = IconPin | TextPin;\n\nexport interface PinLabel {\n point: Point.Point;\n text?: string;\n}\n\nexport function isTextPin(pin?: Pin): pin is TextPin {\n return pin?.type === 'text';\n}\n\nexport interface PinStyleAttributes {\n primaryColor?: Color.Color | string;\n accentColor?: Color.Color | string;\n}\n\nexport function isIconPin(pin?: Pin): pin is Pin {\n return pin?.type === 'icon';\n}\n\nfunction convertColorToString(color: Color.Color | string): string {\n return typeof color === 'string' ? color : Color.toHexString(color);\n}\nexport function getPinColors(pin?: Pin): {\n primaryColor?: string;\n accentColor?: string;\n} {\n return {\n primaryColor:\n pin?.attributes?.style?.primaryColor == null\n ? undefined\n : convertColorToString(pin?.attributes?.style?.primaryColor),\n accentColor:\n pin?.attributes?.style?.accentColor == null\n ? undefined\n : convertColorToString(pin?.attributes?.style?.accentColor),\n };\n}\n\nexport class PinModel {\n private entities: Record<string, Pin> = {};\n private selectedPinId?: string;\n\n private readonly entityAdded = new EventDispatcher<Pin>();\n private readonly entityUpdated = new EventDispatcher<Pin>();\n private readonly entitiesChanged = new EventDispatcher<Pin[]>();\n private readonly selectionChanged = new EventDispatcher<string | undefined>();\n\n /**\n * Registers an entity to be drawn in the canvas\n *\n * @param pin A pin entity to draw.\n * @returns `true` if the entity has been added.\n */\n public addPin(pin: Pin, suppressEvent = false): boolean {\n if (this.entities[pin.id] == null) {\n this.entities = {\n ...this.entities,\n [pin.id]: pin,\n };\n\n if (!suppressEvent) {\n this.entitiesChanged.emit(this.getPins());\n this.entityAdded.emit(pin);\n }\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Clears all registered entities from the model.\n */\n public clearPins(): void {\n this.getPins().forEach((e) => this.removePin(e));\n }\n\n /**\n * Returns all the entities registered with the model.\n */\n public getPins(): Pin[] {\n return Object.keys(this.entities).map((key) => this.entities[key]);\n }\n\n /**\n * Returns single entity by id if present in the model.\n */\n public getPinById(id: string): Pin | undefined {\n return this.entities[id];\n }\n\n public getSelectedPinId(): string | undefined {\n return this.selectedPinId;\n }\n\n /**\n * Unregisters an entity from the model.\n *\n * @param entity The entity to remove.\n * @returns `true` if the entity was removed.\n */\n public removePin(entity: Pin): boolean {\n if (this.entities[entity.id] != null) {\n delete this.entities[entity.id];\n this.entitiesChanged.emit(this.getPins());\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Sets the set of entities to be placed with the model.\n *\n * @param entities A set of entities to draw.\n * @returns `true` if the entity has been added.\n */\n public setPins(pins: Set<Pin>): boolean {\n this.clearPins();\n pins.forEach((e) => this.addPin(e, true));\n this.entitiesChanged.emit(this.getPins());\n\n return true;\n }\n\n /**\n * Sets the set of entities to be placed with the model.\n *\n * @param pin A pin to set\n * @returns `true` if the entity has been set\n */\n public setPin(pin: Pin): boolean {\n const isNewPin = this.entities[pin.id] == null;\n\n this.entities = {\n ...this.entities,\n [pin.id]: pin,\n };\n\n this.entitiesChanged.emit(this.getPins());\n if (isNewPin) {\n this.entityAdded.emit(pin);\n }\n\n return true;\n }\n\n /**\n * Updates a pin in the model.\n *\n * @param pin A pin to update\n * @returns `true` if the entity has been updated\n */\n public updatePin(pin: Pin): boolean {\n const pinById = this.getPinById(pin.id);\n if (pinById != null) {\n this.entities = {\n ...this.entities,\n [pin.id]: pin,\n };\n this.entitiesChanged.emit(this.getPins());\n this.entityUpdated.emit(pin);\n\n return true;\n }\n return false;\n }\n\n /**\n * Registers an event listener that will be invoked when the model's\n * pin entities change.\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onEntitiesChanged(listener: Listener<Pin[]>): Disposable {\n return this.entitiesChanged.on(listener);\n }\n\n /**\n * Registers an event listener that will be invoked when a new pin\n * is added to the model.\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onEntityAdded(listener: Listener<Pin>): Disposable {\n return this.entityAdded.on(listener);\n }\n\n /**\n * Registers an event listener that will be invoked when a pin\n * is updated in the model.\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onEntityUpdated(listener: Listener<Pin>): Disposable {\n return this.entityUpdated.on(listener);\n }\n\n /**\n * Registers an event listener that will be invoked when the model's\n * pin selection changes\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onSelectionChange(listener: Listener<string | undefined>): Disposable {\n return this.selectionChanged.on(listener);\n }\n\n /**\n * Sets the selected pin id\n * @param pinId\n */\n public setSelectedPin(pinId?: string): void {\n this.selectedPinId = pinId;\n this.selectionChanged.emit(this.selectedPinId);\n }\n}\n"],"names":["Point","Dimensions","point","Range","color","Color"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"model-CLtwOS0o.js","sources":["src/lib/pins/controller.ts","src/components/viewer-pin-tool/utils.ts","src/lib/pins/model.ts"],"sourcesContent":["import { Point, Vector3 } from '@vertexvis/geometry';\nimport { Color } from '@vertexvis/utils';\n\nimport {\n Pin,\n PinModel,\n PinStyleAttributes,\n ViewerPinToolMode,\n ViewerPinToolType,\n} from './model';\n\nexport interface Draggable {\n id: string;\n lastPoint?: Point.Point;\n}\n\n/**\n * The `PinController` is responsible for adding pin entities to the viewer canvas\n */\nexport class PinController {\n private draggable?: Draggable;\n\n public constructor(\n private model: PinModel,\n private mode: ViewerPinToolMode = 'view',\n private type: ViewerPinToolType = 'pin-icon',\n private styleAttributes: PinStyleAttributes | undefined = undefined,\n ) {}\n\n /**\n * Registers an entity to place on the canvas and places the pin on the associated part.\n *\n * @param pin The pin entity\n * @returns A void promise\n */\n public addPin(pin: Pin): void {\n this.model.addPin(pin);\n }\n\n /**\n * Clears all entities and returns a promise that resolves with an empty list\n * of pin results.\n */\n public clearPins(): void {\n this.model.clearPins();\n }\n\n /**\n * Deregisters an entity and performs a pin if this entity was\n * removed.\n *\n * @param entity The entity to remove.\n * @returns A promise that resolves with the results after removing this\n * entity.\n */\n public removePin(pin: Pin): void {\n this.model.removePin(pin);\n }\n\n /**\n * Registers a set of entities and adds a pin\n *\n * @param entities The pin entities to draw.\n * @returns A promise that resolves with the results after registering these\n * entities.\n */\n public setPins(pins: Set<Pin>): void {\n this.model.setPins(pins);\n }\n\n /**\n * Sets the set of entities to be placed with the model.\n *\n * @param pin A pin to set\n * @returns `true` if the entity has been added.\n */\n public setPin(pin: Pin): void {\n this.model.setPin(pin);\n }\n\n /**\n * Updates an existing pin\n * @param pin A pin to set\n * @returns `true` if the entity has been updated, false otherwise\n */\n public updatePin(pin: Pin): void {\n this.model.updatePin(pin);\n }\n\n /**\n * Tells the controller which pin is selected in the model\n * @param pinId\n */\n public setSelectedPinId(pinId?: string): void {\n this.model.setSelectedPin(pinId);\n }\n\n public getToolMode(): ViewerPinToolMode {\n return this.mode;\n }\n\n public getToolType(): ViewerPinToolType {\n return this.type;\n }\n\n public setToolMode(mode: ViewerPinToolMode): void {\n this.mode = mode;\n }\n\n public setToolType(type: ViewerPinToolType): void {\n this.type = type;\n }\n\n public getDraggable(): Draggable | undefined {\n return this.draggable;\n }\n\n public setDraggable(draggable: Draggable | undefined): void {\n this.draggable = draggable;\n }\n\n public setPrimaryColor(color?: Color.Color | string): void {\n this.styleAttributes = {\n ...this.styleAttributes,\n primaryColor: color,\n };\n }\n\n public setAccentColor(color?: Color.Color | string): void {\n this.styleAttributes = {\n ...this.styleAttributes,\n accentColor: color,\n };\n }\n\n public getStyleAttributes(): PinStyleAttributes | undefined {\n return this.styleAttributes;\n }\n\n public updateDraggable(\n draggable: Draggable,\n worldPosition: Vector3.Vector3,\n partId?: string,\n ): void {\n if (this.draggable != null) {\n this.draggable = draggable;\n }\n const pin = this.model.getPinById(draggable.id);\n if (pin != null) {\n this.updatePin({\n ...pin,\n worldPosition,\n partId,\n });\n }\n }\n}\n","import { Dimensions, Point } from '@vertexvis/geometry';\nimport { Range } from '@vertexvis/utils';\n\nexport function constrainRelativePoint(\n pt: Point.Point,\n range: Range.Range,\n): Point.Point {\n const constrainedX = Math.max(range.start, Math.min(range.end, pt.x));\n const constrainedY = Math.max(range.start, Math.min(range.end, pt.y));\n\n return Point.create(constrainedX, constrainedY);\n}\n\n/**\n * Translates a point in relative units to a point in screen units.\n */\nexport function translatePointToScreen(\n pt: Point.Point,\n canvasDimensions: Dimensions.Dimensions,\n): Point.Point {\n return Point.add(\n Point.scale(pt, canvasDimensions.width, canvasDimensions.height),\n Dimensions.center(canvasDimensions),\n );\n}\n\n/**\n * Translates a point in screen units to a point in relative units.\n */\nexport function translatePointToRelative(\n pt: Point.Point,\n canvasDimensions: Dimensions.Dimensions,\n includeOffset?: boolean,\n xOffset?: number,\n yOffset?: number,\n): Point.Point {\n const verticalScaleFactor = 1 / canvasDimensions.height;\n const horizontalScaleFactor = 1 / canvasDimensions.width;\n const canvasCenterPoint = Dimensions.center(canvasDimensions);\n\n const point = Point.scale(\n Point.subtract(pt, canvasCenterPoint),\n horizontalScaleFactor,\n verticalScaleFactor,\n );\n\n if (includeOffset) {\n const offset = Point.scale(\n Point.create(xOffset, yOffset),\n horizontalScaleFactor,\n verticalScaleFactor,\n );\n\n // We want to place the label towards the center of the screen.\n // The given point corresponds to the upper left corner of the label, so increase the offset\n // when placing it to the left or above to ensure that part of the label line is visible\n const centerIsToTheRightInXDirection = canvasCenterPoint.x > pt.x;\n const xOffsetCalculated = centerIsToTheRightInXDirection\n ? offset.x\n : -3 * offset.x;\n\n const centerIsBelowInYDirection = canvasCenterPoint.y > pt.y;\n const yOffsetCalculated = centerIsBelowInYDirection\n ? offset.y\n : -3 * offset.y;\n\n const offsetPoint = Point.add(\n point,\n Point.create(xOffsetCalculated, yOffsetCalculated),\n );\n\n return constrainRelativePoint(offsetPoint, Range.create(-0.5, 0.5));\n } else {\n return constrainRelativePoint(point, Range.create(-0.5, 0.5));\n }\n}\n","import { Color, Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\n/**\n * The types of pins that can be performed by this tool.\n */\nexport type ViewerPinToolType = 'pin-icon' | 'pin-text';\n\n/**\n * The mode of the pin tool\n */\nexport type ViewerPinToolMode = 'edit' | 'view';\n\n/**\n * A model representing the state of pins.\n *\n */\n\nimport { Point, Vector3 } from '@vertexvis/geometry';\n\ninterface BasePinAttributes {\n style?: PinStyleAttributes;\n}\n\ninterface BasePin {\n id: string;\n worldPosition: Vector3.Vector3;\n partId?: string;\n attributes?: BasePinAttributes;\n}\n\nexport interface TextPin extends BasePin {\n type: 'text';\n label: PinLabel;\n}\n\n// Future: Support custom icons.\nexport interface IconPin extends BasePin {\n type: 'icon';\n}\n\nexport type Pin = IconPin | TextPin;\n\nexport interface PinLabel {\n point: Point.Point;\n text?: string;\n}\n\nexport function isTextPin(pin?: Pin): pin is TextPin {\n return pin?.type === 'text';\n}\n\nexport interface PinStyleAttributes {\n primaryColor?: Color.Color | string;\n accentColor?: Color.Color | string;\n}\n\nexport function isIconPin(pin?: Pin): pin is Pin {\n return pin?.type === 'icon';\n}\n\nfunction convertColorToString(color: Color.Color | string): string {\n return typeof color === 'string' ? color : Color.toHexString(color);\n}\nexport function getPinColors(pin?: Pin): {\n primaryColor?: string;\n accentColor?: string;\n} {\n return {\n primaryColor:\n pin?.attributes?.style?.primaryColor == null\n ? undefined\n : convertColorToString(pin?.attributes?.style?.primaryColor),\n accentColor:\n pin?.attributes?.style?.accentColor == null\n ? undefined\n : convertColorToString(pin?.attributes?.style?.accentColor),\n };\n}\n\nexport class PinModel {\n private entities: Record<string, Pin> = {};\n private selectedPinId?: string;\n\n private readonly entityAdded = new EventDispatcher<Pin>();\n private readonly entityUpdated = new EventDispatcher<Pin>();\n private readonly entitiesChanged = new EventDispatcher<Pin[]>();\n private readonly selectionChanged = new EventDispatcher<string | undefined>();\n\n /**\n * Registers an entity to be drawn in the canvas\n *\n * @param pin A pin entity to draw.\n * @returns `true` if the entity has been added.\n */\n public addPin(pin: Pin, suppressEvent = false): boolean {\n if (this.entities[pin.id] == null) {\n this.entities = {\n ...this.entities,\n [pin.id]: pin,\n };\n\n if (!suppressEvent) {\n this.entitiesChanged.emit(this.getPins());\n this.entityAdded.emit(pin);\n }\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Clears all registered entities from the model.\n */\n public clearPins(): void {\n this.getPins().forEach((e) => this.removePin(e));\n }\n\n /**\n * Returns all the entities registered with the model.\n */\n public getPins(): Pin[] {\n return Object.keys(this.entities).map((key) => this.entities[key]);\n }\n\n /**\n * Returns single entity by id if present in the model.\n */\n public getPinById(id: string): Pin | undefined {\n return this.entities[id];\n }\n\n public getSelectedPinId(): string | undefined {\n return this.selectedPinId;\n }\n\n /**\n * Unregisters an entity from the model.\n *\n * @param entity The entity to remove.\n * @returns `true` if the entity was removed.\n */\n public removePin(entity: Pin): boolean {\n if (this.entities[entity.id] != null) {\n delete this.entities[entity.id];\n this.entitiesChanged.emit(this.getPins());\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Sets the set of entities to be placed with the model.\n *\n * @param entities A set of entities to draw.\n * @returns `true` if the entity has been added.\n */\n public setPins(pins: Set<Pin>): boolean {\n this.clearPins();\n pins.forEach((e) => this.addPin(e, true));\n this.entitiesChanged.emit(this.getPins());\n\n return true;\n }\n\n /**\n * Sets the set of entities to be placed with the model.\n *\n * @param pin A pin to set\n * @returns `true` if the entity has been set\n */\n public setPin(pin: Pin): boolean {\n const isNewPin = this.entities[pin.id] == null;\n\n this.entities = {\n ...this.entities,\n [pin.id]: pin,\n };\n\n this.entitiesChanged.emit(this.getPins());\n if (isNewPin) {\n this.entityAdded.emit(pin);\n }\n\n return true;\n }\n\n /**\n * Updates a pin in the model.\n *\n * @param pin A pin to update\n * @returns `true` if the entity has been updated\n */\n public updatePin(pin: Pin): boolean {\n const pinById = this.getPinById(pin.id);\n if (pinById != null) {\n this.entities = {\n ...this.entities,\n [pin.id]: pin,\n };\n this.entitiesChanged.emit(this.getPins());\n this.entityUpdated.emit(pin);\n\n return true;\n }\n return false;\n }\n\n /**\n * Registers an event listener that will be invoked when the model's\n * pin entities change.\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onEntitiesChanged(listener: Listener<Pin[]>): Disposable {\n return this.entitiesChanged.on(listener);\n }\n\n /**\n * Registers an event listener that will be invoked when a new pin\n * is added to the model.\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onEntityAdded(listener: Listener<Pin>): Disposable {\n return this.entityAdded.on(listener);\n }\n\n /**\n * Registers an event listener that will be invoked when a pin\n * is updated in the model.\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onEntityUpdated(listener: Listener<Pin>): Disposable {\n return this.entityUpdated.on(listener);\n }\n\n /**\n * Registers an event listener that will be invoked when the model's\n * pin selection changes\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onSelectionChange(listener: Listener<string | undefined>): Disposable {\n return this.selectionChanged.on(listener);\n }\n\n /**\n * Sets the selected pin id\n * @param pinId\n */\n public setSelectedPin(pinId?: string): void {\n this.selectedPinId = pinId;\n this.selectionChanged.emit(this.selectedPinId);\n }\n}\n"],"names":["Point","Dimensions","point","Range","color","Color"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-D0EJdHmW.js","sources":["src/lib/measurement/model.ts"],"sourcesContent":["import {\n Disposable,\n EventDispatcher,\n Listener,\n Objects,\n} from '@vertexvis/utils';\n\nimport { MeasurementEntity } from './entities';\nimport { MeasurementOutcome } from './outcomes';\nimport { MeasurementResult } from './results';\n\n/**\n * A model representing the state of measurement.\n *\n * Measurement contains a set of `MeasureEntity`s that represent what's being\n * measured, and a set of `MeasurementResult`s representing the results of the\n * measurement.\n *\n * Views can register event listeners to the model to be notified when new\n * measurements have been added.\n */\nexport class MeasurementModel {\n private entities = new Set<MeasurementEntity>();\n private outcome?: MeasurementOutcome;\n private results = new Set<MeasurementResult>();\n\n private entitiesChanged = new EventDispatcher<MeasurementEntity[]>();\n\n private outcomeChanged = new EventDispatcher<\n MeasurementOutcome | undefined\n >();\n\n /**\n * Registers an entity to be measured with the model.\n *\n * @param entity An entity to measure.\n * @returns `true` if the entity has been added.\n */\n public addEntity(entity: MeasurementEntity): boolean {\n if (!this.entities.has(entity)) {\n this.entities.add(entity);\n this.entitiesChanged.emit(this.getEntities());\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Clears all registered entities from the model.\n */\n public clearEntities(): void {\n this.entities.forEach((e) => this.removeEntity(e));\n }\n\n /**\n * Clears the outcome containing the results of a measurement.\n */\n public clearOutcome(): void {\n this.setOutcome(undefined);\n }\n\n /**\n * Sets the outcome containing the results of a measurement.\n *\n * Emits a _outcome changed_ event.\n *\n * @param outcome The outcome containing results.\n */\n public setOutcome(outcome: MeasurementOutcome | undefined): void {\n if (!Objects.isEqual(this.outcome, outcome)) {\n this.outcome = outcome;\n this.outcomeChanged.emit(outcome);\n }\n }\n\n /**\n * Returns all the entities registered with the model.\n */\n public getEntities(): MeasurementEntity[] {\n return Array.from(this.entities);\n }\n\n /**\n * Returns the outcome that contains the results of a measurement.\n */\n public getOutcome(): MeasurementOutcome | undefined {\n return this.outcome;\n }\n\n /**\n * Returns all the measurement results of the model.\n */\n public getResults(): MeasurementResult[] {\n return Array.from(this.results);\n }\n\n /**\n * Unregisters an entity from the model.\n *\n * @param entity The entity to remove.\n * @returns `true` if the entity was removed.\n */\n public removeEntity(entity: MeasurementEntity): boolean {\n if (this.entities.has(entity)) {\n this.entities.delete(entity);\n this.entitiesChanged.emit(this.getEntities());\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Sets the set of entities to be measured with the model.\n *\n * @param entities A set of entities to measure.\n * @returns `true` if the entity has been added.\n */\n public setEntities(entities: Set<MeasurementEntity>): boolean {\n this.entities.clear();\n entities.forEach((e) => this.entities.add(e));\n this.entitiesChanged.emit(this.getEntities());\n return true;\n }\n\n /**\n * Registers an event listener that will be invoked when the model's outcome\n * changes.\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onOutcomeChanged(\n listener: Listener<MeasurementOutcome | undefined
|
|
1
|
+
{"version":3,"file":"model-D0EJdHmW.js","sources":["src/lib/measurement/model.ts"],"sourcesContent":["import {\n Disposable,\n EventDispatcher,\n Listener,\n Objects,\n} from '@vertexvis/utils';\n\nimport { MeasurementEntity } from './entities';\nimport { MeasurementOutcome } from './outcomes';\nimport { MeasurementResult } from './results';\n\n/**\n * A model representing the state of measurement.\n *\n * Measurement contains a set of `MeasureEntity`s that represent what's being\n * measured, and a set of `MeasurementResult`s representing the results of the\n * measurement.\n *\n * Views can register event listeners to the model to be notified when new\n * measurements have been added.\n */\nexport class MeasurementModel {\n private entities = new Set<MeasurementEntity>();\n private outcome?: MeasurementOutcome;\n private results = new Set<MeasurementResult>();\n\n private entitiesChanged = new EventDispatcher<MeasurementEntity[]>();\n\n private outcomeChanged = new EventDispatcher<\n MeasurementOutcome | undefined\n >();\n\n /**\n * Registers an entity to be measured with the model.\n *\n * @param entity An entity to measure.\n * @returns `true` if the entity has been added.\n */\n public addEntity(entity: MeasurementEntity): boolean {\n if (!this.entities.has(entity)) {\n this.entities.add(entity);\n this.entitiesChanged.emit(this.getEntities());\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Clears all registered entities from the model.\n */\n public clearEntities(): void {\n this.entities.forEach((e) => this.removeEntity(e));\n }\n\n /**\n * Clears the outcome containing the results of a measurement.\n */\n public clearOutcome(): void {\n this.setOutcome(undefined);\n }\n\n /**\n * Sets the outcome containing the results of a measurement.\n *\n * Emits a _outcome changed_ event.\n *\n * @param outcome The outcome containing results.\n */\n public setOutcome(outcome: MeasurementOutcome | undefined): void {\n if (!Objects.isEqual(this.outcome, outcome)) {\n this.outcome = outcome;\n this.outcomeChanged.emit(outcome);\n }\n }\n\n /**\n * Returns all the entities registered with the model.\n */\n public getEntities(): MeasurementEntity[] {\n return Array.from(this.entities);\n }\n\n /**\n * Returns the outcome that contains the results of a measurement.\n */\n public getOutcome(): MeasurementOutcome | undefined {\n return this.outcome;\n }\n\n /**\n * Returns all the measurement results of the model.\n */\n public getResults(): MeasurementResult[] {\n return Array.from(this.results);\n }\n\n /**\n * Unregisters an entity from the model.\n *\n * @param entity The entity to remove.\n * @returns `true` if the entity was removed.\n */\n public removeEntity(entity: MeasurementEntity): boolean {\n if (this.entities.has(entity)) {\n this.entities.delete(entity);\n this.entitiesChanged.emit(this.getEntities());\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Sets the set of entities to be measured with the model.\n *\n * @param entities A set of entities to measure.\n * @returns `true` if the entity has been added.\n */\n public setEntities(entities: Set<MeasurementEntity>): boolean {\n this.entities.clear();\n entities.forEach((e) => this.entities.add(e));\n this.entitiesChanged.emit(this.getEntities());\n return true;\n }\n\n /**\n * Registers an event listener that will be invoked when the model's outcome\n * changes.\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onOutcomeChanged(\n listener: Listener<MeasurementOutcome | undefined>,\n ): Disposable {\n return this.outcomeChanged.on(listener);\n }\n\n /**\n * Registers an event listener that will be invoked when the model's\n * measurement entities change.\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onEntitiesChanged(\n listener: Listener<MeasurementEntity[]>,\n ): Disposable {\n return this.entitiesChanged.on(listener);\n }\n}\n"],"names":["Objects"],"mappings":";;;;;AAWA;;;;;;;;;AASG;MACU,gBAAgB,CAAA;AAA7B,IAAA,WAAA,GAAA;AACU,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,GAAG,EAAqB;AAEvC,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,GAAG,EAAqB;AAEtC,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,eAAe,EAAuB;AAE5D,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,eAAe,EAEzC;;AAEH;;;;;AAKG;AACI,IAAA,SAAS,CAAC,MAAyB,EAAA;QACxC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;AAC9B,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;YACzB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AAC7C,YAAA,OAAO,IAAI;;aACN;AACL,YAAA,OAAO,KAAK;;;AAIhB;;AAEG;IACI,aAAa,GAAA;AAClB,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;;AAGpD;;AAEG;IACI,YAAY,GAAA;AACjB,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;;AAG5B;;;;;;AAMG;AACI,IAAA,UAAU,CAAC,OAAuC,EAAA;AACvD,QAAA,IAAI,CAACA,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE;AAC3C,YAAA,IAAI,CAAC,OAAO,GAAG,OAAO;AACtB,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;;;AAIrC;;AAEG;IACI,WAAW,GAAA;QAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;;AAGlC;;AAEG;IACI,UAAU,GAAA;QACf,OAAO,IAAI,CAAC,OAAO;;AAGrB;;AAEG;IACI,UAAU,GAAA;QACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;;AAGjC;;;;;AAKG;AACI,IAAA,YAAY,CAAC,MAAyB,EAAA;QAC3C,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;AAC7B,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;YAC5B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AAC7C,YAAA,OAAO,IAAI;;aACN;AACL,YAAA,OAAO,KAAK;;;AAIhB;;;;;AAKG;AACI,IAAA,WAAW,CAAC,QAAgC,EAAA;AACjD,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;AACrB,QAAA,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;AAC7C,QAAA,OAAO,IAAI;;AAGb;;;;;;AAMG;AACI,IAAA,gBAAgB,CACrB,QAAkD,EAAA;QAElD,OAAO,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,QAAQ,CAAC;;AAGzC;;;;;;AAMG;AACI,IAAA,iBAAiB,CACtB,QAAuC,EAAA;QAEvC,OAAO,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,QAAQ,CAAC;;AAE3C;;;;"}
|