@vertexvis/viewer 0.18.1 → 0.18.2-testing.0
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/components/_commonjsHelpers.js +41 -0
- package/dist/components/_commonjsHelpers.js.map +1 -0
- package/dist/components/browser.esm.js +3173 -0
- package/dist/components/browser.esm.js.map +1 -0
- package/dist/components/bundle.esm.js +2250 -0
- package/dist/components/bundle.esm.js.map +1 -0
- package/dist/components/bundle.esm2.js +39740 -0
- package/dist/components/bundle.esm2.js.map +1 -0
- package/dist/components/config.js +81 -0
- package/dist/components/config.js.map +1 -0
- package/dist/components/controller.js +7627 -0
- package/dist/components/controller.js.map +1 -0
- package/dist/components/controller2.js +124 -0
- package/dist/components/controller2.js.map +1 -0
- package/dist/components/controller3.js +111 -0
- package/dist/components/controller3.js.map +1 -0
- package/dist/components/cursors.js +110 -0
- package/dist/components/cursors.js.map +1 -0
- package/dist/components/dom.js +43 -0
- package/dist/components/dom.js.map +1 -0
- package/dist/components/dom2.js +10 -0
- package/dist/components/dom2.js.map +1 -0
- package/dist/components/elementRectObserver.js +25 -0
- package/dist/components/elementRectObserver.js.map +1 -0
- package/dist/components/entities.js +179 -0
- package/dist/components/entities.js.map +1 -0
- package/dist/components/errors.js +80 -0
- package/dist/components/errors.js.map +1 -0
- package/dist/components/events.js +11 -0
- package/dist/components/events.js.map +1 -0
- package/dist/components/index.d.ts +26 -0
- package/dist/components/index.js +365 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/index2.js +63 -0
- package/dist/components/index2.js.map +1 -0
- package/dist/components/interactions.js +236 -0
- package/dist/components/interactions.js.map +1 -0
- package/dist/components/mapper.js +9811 -0
- package/dist/components/mapper.js.map +1 -0
- package/dist/components/markup.js +33 -0
- package/dist/components/markup.js.map +1 -0
- package/dist/components/model.js +134 -0
- package/dist/components/model.js.map +1 -0
- package/dist/components/model2.js +157 -0
- package/dist/components/model2.js.map +1 -0
- package/dist/components/overlays.js +76 -0
- package/dist/components/overlays.js.map +1 -0
- package/dist/components/png-decoder.js +2405 -0
- package/dist/components/png-decoder.js.map +1 -0
- package/dist/components/regl-component.js +12582 -0
- package/dist/components/regl-component.js.map +1 -0
- package/dist/components/results.js +24 -0
- package/dist/components/results.js.map +1 -0
- package/dist/components/row.js +32 -0
- package/dist/components/row.js.map +1 -0
- package/dist/components/scene-tree-search.js +146 -0
- package/dist/components/scene-tree-search.js.map +1 -0
- package/dist/components/scene-tree-table-layout.js +928 -0
- package/dist/components/scene-tree-table-layout.js.map +1 -0
- package/dist/components/scene-tree-toolbar.js +35 -0
- package/dist/components/scene-tree-toolbar.js.map +1 -0
- package/dist/components/scene.js +1508 -0
- package/dist/components/scene.js.map +1 -0
- package/dist/components/stencil.js +25 -0
- package/dist/components/stencil.js.map +1 -0
- package/dist/components/streamAttributes.js +40833 -0
- package/dist/components/streamAttributes.js.map +1 -0
- package/dist/components/templates.js +36 -0
- package/dist/components/templates.js.map +1 -0
- package/dist/components/tslib.es6.js +125 -0
- package/dist/components/tslib.es6.js.map +1 -0
- package/dist/components/vertex-scene-tree-search.d.ts +11 -0
- package/dist/components/vertex-scene-tree-search.js +11 -0
- package/dist/components/vertex-scene-tree-search.js.map +1 -0
- package/dist/components/vertex-scene-tree-table-cell.d.ts +11 -0
- package/dist/components/vertex-scene-tree-table-cell.js +209 -0
- package/dist/components/vertex-scene-tree-table-cell.js.map +1 -0
- package/dist/components/vertex-scene-tree-table-column.d.ts +11 -0
- package/dist/components/vertex-scene-tree-table-column.js +42 -0
- package/dist/components/vertex-scene-tree-table-column.js.map +1 -0
- package/dist/components/vertex-scene-tree-table-header.d.ts +11 -0
- package/dist/components/vertex-scene-tree-table-header.js +38 -0
- package/dist/components/vertex-scene-tree-table-header.js.map +1 -0
- package/dist/components/vertex-scene-tree-table-layout.d.ts +11 -0
- package/dist/components/vertex-scene-tree-table-layout.js +11 -0
- package/dist/components/vertex-scene-tree-table-layout.js.map +1 -0
- package/dist/components/vertex-scene-tree-table-resize-divider.d.ts +11 -0
- package/dist/components/vertex-scene-tree-table-resize-divider.js +57 -0
- package/dist/components/vertex-scene-tree-table-resize-divider.js.map +1 -0
- package/dist/components/vertex-scene-tree-toolbar-group.d.ts +11 -0
- package/dist/components/vertex-scene-tree-toolbar-group.js +38 -0
- package/dist/components/vertex-scene-tree-toolbar-group.js.map +1 -0
- package/dist/components/vertex-scene-tree-toolbar.d.ts +11 -0
- package/dist/components/vertex-scene-tree-toolbar.js +11 -0
- package/dist/components/vertex-scene-tree-toolbar.js.map +1 -0
- package/dist/components/vertex-scene-tree.d.ts +11 -0
- package/dist/components/vertex-scene-tree.js +803 -0
- package/dist/components/vertex-scene-tree.js.map +1 -0
- package/dist/components/vertex-viewer-box-query-tool.d.ts +11 -0
- package/dist/components/vertex-viewer-box-query-tool.js +352 -0
- package/dist/components/vertex-viewer-box-query-tool.js.map +1 -0
- package/dist/components/vertex-viewer-button.d.ts +11 -0
- package/dist/components/vertex-viewer-button.js +11 -0
- package/dist/components/vertex-viewer-button.js.map +1 -0
- package/dist/components/vertex-viewer-default-toolbar.d.ts +11 -0
- package/dist/components/vertex-viewer-default-toolbar.js +99 -0
- package/dist/components/vertex-viewer-default-toolbar.js.map +1 -0
- package/dist/components/vertex-viewer-dom-element.d.ts +11 -0
- package/dist/components/vertex-viewer-dom-element.js +11 -0
- package/dist/components/vertex-viewer-dom-element.js.map +1 -0
- package/dist/components/vertex-viewer-dom-group.d.ts +11 -0
- package/dist/components/vertex-viewer-dom-group.js +11 -0
- package/dist/components/vertex-viewer-dom-group.js.map +1 -0
- package/dist/components/vertex-viewer-dom-renderer.d.ts +11 -0
- package/dist/components/vertex-viewer-dom-renderer.js +11 -0
- package/dist/components/vertex-viewer-dom-renderer.js.map +1 -0
- package/dist/components/vertex-viewer-hit-result-indicator.d.ts +11 -0
- package/dist/components/vertex-viewer-hit-result-indicator.js +335 -0
- package/dist/components/vertex-viewer-hit-result-indicator.js.map +1 -0
- package/dist/components/vertex-viewer-icon.d.ts +11 -0
- package/dist/components/vertex-viewer-icon.js +11 -0
- package/dist/components/vertex-viewer-icon.js.map +1 -0
- package/dist/components/vertex-viewer-layer.d.ts +11 -0
- package/dist/components/vertex-viewer-layer.js +11 -0
- package/dist/components/vertex-viewer-layer.js.map +1 -0
- package/dist/components/vertex-viewer-markup-arrow.d.ts +11 -0
- package/dist/components/vertex-viewer-markup-arrow.js +11 -0
- package/dist/components/vertex-viewer-markup-arrow.js.map +1 -0
- package/dist/components/vertex-viewer-markup-circle.d.ts +11 -0
- package/dist/components/vertex-viewer-markup-circle.js +11 -0
- package/dist/components/vertex-viewer-markup-circle.js.map +1 -0
- package/dist/components/vertex-viewer-markup-freeform.d.ts +11 -0
- package/dist/components/vertex-viewer-markup-freeform.js +11 -0
- package/dist/components/vertex-viewer-markup-freeform.js.map +1 -0
- package/dist/components/vertex-viewer-markup-tool.d.ts +11 -0
- package/dist/components/vertex-viewer-markup-tool.js +257 -0
- package/dist/components/vertex-viewer-markup-tool.js.map +1 -0
- package/dist/components/vertex-viewer-markup.d.ts +11 -0
- package/dist/components/vertex-viewer-markup.js +362 -0
- package/dist/components/vertex-viewer-markup.js.map +1 -0
- package/dist/components/vertex-viewer-measurement-details.d.ts +11 -0
- package/dist/components/vertex-viewer-measurement-details.js +307 -0
- package/dist/components/vertex-viewer-measurement-details.js.map +1 -0
- package/dist/components/vertex-viewer-measurement-distance.d.ts +11 -0
- package/dist/components/vertex-viewer-measurement-distance.js +1067 -0
- package/dist/components/vertex-viewer-measurement-distance.js.map +1 -0
- package/dist/components/vertex-viewer-measurement-line.d.ts +11 -0
- package/dist/components/vertex-viewer-measurement-line.js +11 -0
- package/dist/components/vertex-viewer-measurement-line.js.map +1 -0
- package/dist/components/vertex-viewer-measurement-overlays.d.ts +11 -0
- package/dist/components/vertex-viewer-measurement-overlays.js +11 -0
- package/dist/components/vertex-viewer-measurement-overlays.js.map +1 -0
- package/dist/components/vertex-viewer-measurement-precise.d.ts +11 -0
- package/dist/components/vertex-viewer-measurement-precise.js +362 -0
- package/dist/components/vertex-viewer-measurement-precise.js.map +1 -0
- package/dist/components/vertex-viewer-pin-group.d.ts +11 -0
- package/dist/components/vertex-viewer-pin-group.js +11 -0
- package/dist/components/vertex-viewer-pin-group.js.map +1 -0
- package/dist/components/vertex-viewer-pin-label-line.d.ts +11 -0
- package/dist/components/vertex-viewer-pin-label-line.js +11 -0
- package/dist/components/vertex-viewer-pin-label-line.js.map +1 -0
- package/dist/components/vertex-viewer-pin-label.d.ts +11 -0
- package/dist/components/vertex-viewer-pin-label.js +11 -0
- package/dist/components/vertex-viewer-pin-label.js.map +1 -0
- package/dist/components/vertex-viewer-pin-tool.d.ts +11 -0
- package/dist/components/vertex-viewer-pin-tool.js +430 -0
- package/dist/components/vertex-viewer-pin-tool.js.map +1 -0
- package/dist/components/vertex-viewer-spinner.d.ts +11 -0
- package/dist/components/vertex-viewer-spinner.js +11 -0
- package/dist/components/vertex-viewer-spinner.js.map +1 -0
- package/dist/components/vertex-viewer-toolbar-group.d.ts +11 -0
- package/dist/components/vertex-viewer-toolbar-group.js +11 -0
- package/dist/components/vertex-viewer-toolbar-group.js.map +1 -0
- package/dist/components/vertex-viewer-toolbar.d.ts +11 -0
- package/dist/components/vertex-viewer-toolbar.js +11 -0
- package/dist/components/vertex-viewer-toolbar.js.map +1 -0
- package/dist/components/vertex-viewer-transform-widget.d.ts +11 -0
- package/dist/components/vertex-viewer-transform-widget.js +838 -0
- package/dist/components/vertex-viewer-transform-widget.js.map +1 -0
- package/dist/components/vertex-viewer-view-cube.d.ts +11 -0
- package/dist/components/vertex-viewer-view-cube.js +270 -0
- package/dist/components/vertex-viewer-view-cube.js.map +1 -0
- package/dist/components/vertex-viewer.d.ts +11 -0
- package/dist/components/vertex-viewer.js +3543 -0
- package/dist/components/vertex-viewer.js.map +1 -0
- package/dist/components/viewer-button.js +35 -0
- package/dist/components/viewer-button.js.map +1 -0
- package/dist/components/viewer-dom-element.js +250 -0
- package/dist/components/viewer-dom-element.js.map +1 -0
- package/dist/components/viewer-dom-group.js +214 -0
- package/dist/components/viewer-dom-group.js.map +1 -0
- package/dist/components/viewer-dom-renderer.js +295 -0
- package/dist/components/viewer-dom-renderer.js.map +1 -0
- package/dist/components/viewer-icon.js +87 -0
- package/dist/components/viewer-icon.js.map +1 -0
- package/dist/components/viewer-layer.js +46 -0
- package/dist/components/viewer-layer.js.map +1 -0
- package/dist/components/viewer-markup-arrow.js +235 -0
- package/dist/components/viewer-markup-arrow.js.map +1 -0
- package/dist/components/viewer-markup-circle-components.js +42 -0
- package/dist/components/viewer-markup-circle-components.js.map +1 -0
- package/dist/components/viewer-markup-circle.js +201 -0
- package/dist/components/viewer-markup-circle.js.map +1 -0
- package/dist/components/viewer-markup-freeform.js +251 -0
- package/dist/components/viewer-markup-freeform.js.map +1 -0
- package/dist/components/viewer-measurement-line.js +77 -0
- package/dist/components/viewer-measurement-line.js.map +1 -0
- package/dist/components/viewer-measurement-overlays.js +184 -0
- package/dist/components/viewer-measurement-overlays.js.map +1 -0
- package/dist/components/viewer-pin-group.js +207 -0
- package/dist/components/viewer-pin-group.js.map +1 -0
- package/dist/components/viewer-pin-label-line.js +43 -0
- package/dist/components/viewer-pin-label-line.js.map +1 -0
- package/dist/components/viewer-pin-label.js +427 -0
- package/dist/components/viewer-pin-label.js.map +1 -0
- package/dist/components/viewer-spinner.js +53 -0
- package/dist/components/viewer-spinner.js.map +1 -0
- package/dist/components/viewer-toolbar-group.js +42 -0
- package/dist/components/viewer-toolbar-group.js.map +1 -0
- package/dist/components/viewer-toolbar.js +61 -0
- package/dist/components/viewer-toolbar.js.map +1 -0
- package/dist/components/viewport.js +188 -0
- package/dist/components/viewport.js.map +1 -0
- package/dist/components/wrappers_pb.js +1926 -0
- package/dist/components/wrappers_pb.js.map +1 -0
- package/package.json +7 -7
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2023 Vertex Software LLC. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import { proxyCustomElement, HTMLElement, h } from '@stencil/core/internal/client';
|
|
5
|
+
import { c as classnames } from './index2.js';
|
|
6
|
+
import { d as defineCustomElement$1 } from './viewer-layer.js';
|
|
7
|
+
|
|
8
|
+
const viewerToolbarCss = ".layer{padding:1rem;display:flex}.layer.position-top{align-items:flex-start}.layer.position-middle{align-items:center}.layer.position-bottom{align-items:flex-end}.layer.position-left{justify-content:flex-start}.layer.position-center{justify-content:center}.layer.position-right{justify-content:flex-end}.inner{display:flex}.inner.vertical{flex-direction:column}.inner.horizonal{flex-direction:row}::slotted(*){pointer-events:initial}";
|
|
9
|
+
|
|
10
|
+
const ViewerToolbar = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
|
|
11
|
+
constructor() {
|
|
12
|
+
super();
|
|
13
|
+
this.__registerHost();
|
|
14
|
+
this.__attachShadow();
|
|
15
|
+
/**
|
|
16
|
+
* Specifies where the toolbar is positioned.
|
|
17
|
+
*/
|
|
18
|
+
this.placement = 'bottom-center';
|
|
19
|
+
this.direction = 'horizontal';
|
|
20
|
+
}
|
|
21
|
+
render() {
|
|
22
|
+
const [vertical, horizontal] = this.placement.split('-');
|
|
23
|
+
return (h("vertex-viewer-layer", { class: classnames('layer', {
|
|
24
|
+
'position-top': vertical === 'top',
|
|
25
|
+
'position-middle': vertical === 'middle',
|
|
26
|
+
'position-bottom': vertical === 'bottom',
|
|
27
|
+
'position-left': horizontal === 'left',
|
|
28
|
+
'position-center': horizontal === 'center',
|
|
29
|
+
'position-right': horizontal === 'right',
|
|
30
|
+
}) }, h("div", { class: classnames('inner', {
|
|
31
|
+
vertical: this.direction === 'vertical',
|
|
32
|
+
horizontal: this.direction === 'horizontal',
|
|
33
|
+
}) }, h("slot", null))));
|
|
34
|
+
}
|
|
35
|
+
static get style() { return viewerToolbarCss; }
|
|
36
|
+
}, [1, "vertex-viewer-toolbar", {
|
|
37
|
+
"placement": [1],
|
|
38
|
+
"direction": [1]
|
|
39
|
+
}]);
|
|
40
|
+
function defineCustomElement() {
|
|
41
|
+
if (typeof customElements === "undefined") {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const components = ["vertex-viewer-toolbar", "vertex-viewer-layer"];
|
|
45
|
+
components.forEach(tagName => { switch (tagName) {
|
|
46
|
+
case "vertex-viewer-toolbar":
|
|
47
|
+
if (!customElements.get(tagName)) {
|
|
48
|
+
customElements.define(tagName, ViewerToolbar);
|
|
49
|
+
}
|
|
50
|
+
break;
|
|
51
|
+
case "vertex-viewer-layer":
|
|
52
|
+
if (!customElements.get(tagName)) {
|
|
53
|
+
defineCustomElement$1();
|
|
54
|
+
}
|
|
55
|
+
break;
|
|
56
|
+
} });
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export { ViewerToolbar as V, defineCustomElement as d };
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=viewer-toolbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"file":"viewer-toolbar.js","mappings":";;;;;;;AAAA,MAAM,gBAAgB,GAAG,mbAAmb;;MCU/b,aAAa;EAL1B;;;;;;;IAUS,cAAS,GAA2B,eAAe,CAAC;IAGpD,cAAS,GAA2B,YAAY,CAAC;GA2BzD;EAzBQ,MAAM;IACX,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEzD,QACE,2BACE,KAAK,EAAEA,UAAS,CAAC,OAAO,EAAE;QACxB,cAAc,EAAE,QAAQ,KAAK,KAAK;QAClC,iBAAiB,EAAE,QAAQ,KAAK,QAAQ;QACxC,iBAAiB,EAAE,QAAQ,KAAK,QAAQ;QACxC,eAAe,EAAE,UAAU,KAAK,MAAM;QACtC,iBAAiB,EAAE,UAAU,KAAK,QAAQ;QAC1C,gBAAgB,EAAE,UAAU,KAAK,OAAO;OACzC,CAAC,IAEF,WACE,KAAK,EAAEA,UAAS,CAAC,OAAO,EAAE;QACxB,QAAQ,EAAE,IAAI,CAAC,SAAS,KAAK,UAAU;QACvC,UAAU,EAAE,IAAI,CAAC,SAAS,KAAK,YAAY;OAC5C,CAAC,IAEF,eAAa,CACT,CACc,EACtB;GACH;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":["classname"],"sources":["./src/components/viewer-toolbar/viewer-toolbar.css?tag=vertex-viewer-toolbar&encapsulation=shadow","./src/components/viewer-toolbar/viewer-toolbar.tsx"],"sourcesContent":[".layer {\n padding: 1rem;\n display: flex;\n}\n\n.layer.position-top {\n align-items: flex-start;\n}\n\n.layer.position-middle {\n align-items: center;\n}\n\n.layer.position-bottom {\n align-items: flex-end;\n}\n\n.layer.position-left {\n justify-content: flex-start;\n}\n\n.layer.position-center {\n justify-content: center;\n}\n\n.layer.position-right {\n justify-content: flex-end;\n}\n\n.inner {\n display: flex;\n}\n\n.inner.vertical {\n flex-direction: column;\n}\n\n.inner.horizonal {\n flex-direction: row;\n}\n\n::slotted(*) {\n pointer-events: initial;\n}\n","import { Component, h, Prop } from '@stencil/core';\nimport classname from 'classnames';\n\nimport { ViewerToolbarDirection, ViewerToolbarPlacement } from './types';\n\n@Component({\n tag: 'vertex-viewer-toolbar',\n styleUrl: 'viewer-toolbar.css',\n shadow: true,\n})\nexport class ViewerToolbar {\n /**\n * Specifies where the toolbar is positioned.\n */\n @Prop()\n public placement: ViewerToolbarPlacement = 'bottom-center';\n\n @Prop()\n public direction: ViewerToolbarDirection = 'horizontal';\n\n public render(): h.JSX.IntrinsicElements {\n const [vertical, horizontal] = this.placement.split('-');\n\n return (\n <vertex-viewer-layer\n class={classname('layer', {\n 'position-top': vertical === 'top',\n 'position-middle': vertical === 'middle',\n 'position-bottom': vertical === 'bottom',\n 'position-left': horizontal === 'left',\n 'position-center': horizontal === 'center',\n 'position-right': horizontal === 'right',\n })}\n >\n <div\n class={classname('inner', {\n vertical: this.direction === 'vertical',\n horizontal: this.direction === 'horizontal',\n })}\n >\n <slot></slot>\n </div>\n </vertex-viewer-layer>\n );\n }\n}\n"],"version":3}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2023 Vertex Software LLC. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
import { d as dimensions, p as point, v as vector3, r as ray, e as rectangle } from './bundle.esm.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A `Viewport` represents the drawing area in the viewer.
|
|
8
|
+
*
|
|
9
|
+
* When a frame is received from the rendering pipeline, it might not be the
|
|
10
|
+
* same dimensions of the viewport because of an interactive frame or because of
|
|
11
|
+
* bandwidth limitations or other performance reasons.
|
|
12
|
+
*
|
|
13
|
+
* The viewport contains methods to scale an image to the viewport, as well as
|
|
14
|
+
* translate 2D coordinates between the viewport and the frame.
|
|
15
|
+
*/
|
|
16
|
+
class Viewport {
|
|
17
|
+
constructor(
|
|
18
|
+
/**
|
|
19
|
+
* The width of the viewport.
|
|
20
|
+
*/
|
|
21
|
+
width,
|
|
22
|
+
/**
|
|
23
|
+
* The height of the viewport.
|
|
24
|
+
*/
|
|
25
|
+
height) {
|
|
26
|
+
this.width = width;
|
|
27
|
+
this.height = height;
|
|
28
|
+
this.center = dimensions.center(this.dimensions);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Returns a new viewport with the given dimensions.
|
|
32
|
+
* @param dimensions The dimensions of the viewport
|
|
33
|
+
* @returns A new viewport.
|
|
34
|
+
*/
|
|
35
|
+
static fromDimensions(dimensions) {
|
|
36
|
+
return new Viewport(dimensions.width, dimensions.height);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Transforms a normalized device coordinate to a 2D point within the
|
|
40
|
+
* viewport.
|
|
41
|
+
*
|
|
42
|
+
* @param ndc A 2D point in NDC.
|
|
43
|
+
* @returns A 2D point in the coordinate space of the viewport.
|
|
44
|
+
*/
|
|
45
|
+
transformNdcPointToViewport(ndc) {
|
|
46
|
+
return point.create(ndc.x * this.center.x + this.center.x, -ndc.y * this.center.y + this.center.y);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Transforms a normalized device coordinate to a 2D point within the
|
|
50
|
+
* viewport.
|
|
51
|
+
*
|
|
52
|
+
* @param ndc A 3D point in NDC.
|
|
53
|
+
* @returns A 2D point in the coordinate space of the viewport.
|
|
54
|
+
*/
|
|
55
|
+
transformVectorToViewport(ndc) {
|
|
56
|
+
return this.transformNdcPointToViewport(ndc);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Transforms a world point to 2D point in viewport space.
|
|
60
|
+
*
|
|
61
|
+
* @param worldPt The world point to transform.
|
|
62
|
+
* @param projectionViewMatrix The projection matrix to transform a 3D point to 2D point.
|
|
63
|
+
* @returns A point in viewport space.
|
|
64
|
+
*/
|
|
65
|
+
transformWorldToViewport(worldPt, projectionViewMatrix) {
|
|
66
|
+
const ndc = vector3.transformMatrix(worldPt, projectionViewMatrix);
|
|
67
|
+
return this.transformVectorToViewport(ndc);
|
|
68
|
+
}
|
|
69
|
+
transformPointToViewport(pt, image) {
|
|
70
|
+
const { x: scaleX, y: scaleY } = this.calculateFrameScale(image);
|
|
71
|
+
return point.scale(pt, 1 * scaleX, 1 * scaleY);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Transforms a point in viewport coordinate space to a point in a frame's
|
|
75
|
+
* coordinate space.
|
|
76
|
+
*
|
|
77
|
+
* @param pt A point in viewport coordinate space.
|
|
78
|
+
* @param image An image of a frame.
|
|
79
|
+
* @returns A point in the coordinate space of the frame.
|
|
80
|
+
*/
|
|
81
|
+
transformPointToFrame(pt, image) {
|
|
82
|
+
const { x: scaleX, y: scaleY } = this.calculateFrameScale(image);
|
|
83
|
+
return point.scale(pt, 1 / scaleX, 1 / scaleY);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Transforms a point in viewport coordinates to a point in perspective world space
|
|
87
|
+
* coordinates. This method expects a depth buffer in order to compute a value
|
|
88
|
+
* for the Z axis.
|
|
89
|
+
*
|
|
90
|
+
* @param pt A point in viewport coordinates.
|
|
91
|
+
* @param depthBuffer A depth buffer for computing the Z axis.
|
|
92
|
+
* @param fallbackNormalizedDepth A fallback value if the depth is the max
|
|
93
|
+
* depth value, or cannot be determined.
|
|
94
|
+
* @returns
|
|
95
|
+
*/
|
|
96
|
+
transformPointToWorldSpace(pt, depthBuffer, fallbackNormalizedDepth) {
|
|
97
|
+
const depthPt = this.transformPointToFrame(pt, depthBuffer);
|
|
98
|
+
const ray = this.transformPointToRay(pt, depthBuffer, depthBuffer.camera);
|
|
99
|
+
return depthBuffer.getWorldPoint(depthPt, ray, fallbackNormalizedDepth);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Transforms a point in viewport coordinates to a point in orthographic world space
|
|
103
|
+
* coordinates. This method expects a depth buffer in order to compute a value
|
|
104
|
+
* for the Z axis.
|
|
105
|
+
*
|
|
106
|
+
* @param pt A point in viewport coordinates.
|
|
107
|
+
* @param depthBuffer A depth buffer for computing the Z axis.
|
|
108
|
+
* @param fallbackNormalizedDepth A fallback value if the depth is the max
|
|
109
|
+
* depth value, or cannot be determined.
|
|
110
|
+
*/
|
|
111
|
+
transformPointToOrthographicWorldSpace(pt, depthBuffer, fallbackNormalizedDepth) {
|
|
112
|
+
const depthPt = this.transformPointToFrame(pt, depthBuffer);
|
|
113
|
+
const ray = this.transformPointToOrthographicRay(pt, depthBuffer, depthBuffer.camera);
|
|
114
|
+
return depthBuffer.getOrthographicWorldPoint(depthPt, ray, fallbackNormalizedDepth);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Transforms a point in viewport coordinates to a ray. The returned ray will
|
|
118
|
+
* have an origin that is at the position of the camera with a direction that
|
|
119
|
+
* is pointing into world space away from the camera.
|
|
120
|
+
*
|
|
121
|
+
* @param pt A point in viewport coordinates.
|
|
122
|
+
* @param image An image of a frame.
|
|
123
|
+
* @param camera A camera used to determine orientation of the scene.
|
|
124
|
+
* @returns
|
|
125
|
+
*/
|
|
126
|
+
transformPointToRay(pt, image, camera) {
|
|
127
|
+
const ndc = this.transformScreenPointToNdc(pt, image);
|
|
128
|
+
const origin = vector3.fromMatrixPosition(camera.worldMatrix);
|
|
129
|
+
const world = vector3.transformNdcToWorldSpace(vector3.create(ndc.x, ndc.y, 0.5), camera.worldMatrix, camera.projectionMatrixInverse);
|
|
130
|
+
const direction = vector3.normalize(vector3.subtract(world, origin));
|
|
131
|
+
return ray.create({ origin, direction });
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Transforms a point in viewport coordinates to a ray. The returned ray will
|
|
135
|
+
* have an origin that is at the world point of viewport coordinate with a direction that
|
|
136
|
+
* is pointing into world space away from the camera.
|
|
137
|
+
*
|
|
138
|
+
* @param pt A point in viewport coordinates.
|
|
139
|
+
* @param image An image of a frame.
|
|
140
|
+
* @param camera A camera used to determine orientation of the scene.
|
|
141
|
+
*/
|
|
142
|
+
transformPointToOrthographicRay(pt, image, camera) {
|
|
143
|
+
const ndc = this.transformScreenPointToNdc(pt, image);
|
|
144
|
+
const origin = vector3.transformNdcToWorldSpace(vector3.create(ndc.x, ndc.y, 0), camera.worldMatrix, camera.projectionMatrixInverse);
|
|
145
|
+
return ray.create({
|
|
146
|
+
origin,
|
|
147
|
+
direction: vector3.normalize(camera.viewVector),
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Maps a screen point to normalized device coordinates (NDC). A screen point
|
|
152
|
+
* at 0,0 represents the top-left of the viewport.
|
|
153
|
+
*
|
|
154
|
+
* @param screenPt A screen point.
|
|
155
|
+
*/
|
|
156
|
+
transformScreenPointToNdc(screenPt, image) {
|
|
157
|
+
const framePt = this.transformPointToFrame(screenPt, image);
|
|
158
|
+
return point.create((framePt.x / image.imageAttr.frameDimensions.width) * 2 - 1, -(framePt.y / image.imageAttr.frameDimensions.height) * 2 + 1);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Computes a rectangle that is scaled correctly to be drawn within the
|
|
162
|
+
* viewport.
|
|
163
|
+
*
|
|
164
|
+
* @param image The image to be drawn.
|
|
165
|
+
* @param imageDimensions The dimensions of the received image.
|
|
166
|
+
* @returns A rectangle.
|
|
167
|
+
*/
|
|
168
|
+
calculateDrawRect(image) {
|
|
169
|
+
const { x: scaleX, y: scaleY } = this.calculateFrameScale(image);
|
|
170
|
+
return rectangle.scale(image.imageAttr.imageRect, scaleX, scaleY);
|
|
171
|
+
}
|
|
172
|
+
calculateFrameScale(image) {
|
|
173
|
+
const { frameDimensions: dimensions } = image.imageAttr;
|
|
174
|
+
const imageRect = rectangle.fromDimensions(dimensions);
|
|
175
|
+
const viewport = rectangle.fromDimensions(this.dimensions);
|
|
176
|
+
const fit = rectangle.containFit(viewport, imageRect);
|
|
177
|
+
const scaleX = fit.width / imageRect.width;
|
|
178
|
+
const scaleY = fit.height / imageRect.height;
|
|
179
|
+
return point.create(scaleX, scaleY);
|
|
180
|
+
}
|
|
181
|
+
get dimensions() {
|
|
182
|
+
return dimensions.create(this.width, this.height);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export { Viewport as V };
|
|
187
|
+
|
|
188
|
+
//# sourceMappingURL=viewport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"file":"viewport.js","mappings":"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","names":["Dimensions","Point","Vector3","Ray","Rectangle"],"sources":["./src/lib/types/viewport.ts"],"sourcesContent":["import {\n Dimensions,\n Matrix4,\n Point,\n Ray,\n Rectangle,\n Vector3,\n} from '@vertexvis/geometry';\n\nimport { DepthBuffer } from './depthBuffer';\nimport type { FrameCameraWithMatrices, FrameImageLike } from './frame';\n\n/**\n * A `Viewport` represents the drawing area in the viewer.\n *\n * When a frame is received from the rendering pipeline, it might not be the\n * same dimensions of the viewport because of an interactive frame or because of\n * bandwidth limitations or other performance reasons.\n *\n * The viewport contains methods to scale an image to the viewport, as well as\n * translate 2D coordinates between the viewport and the frame.\n */\nexport class Viewport implements Dimensions.Dimensions {\n /**\n * The center point of the viewport.\n */\n public readonly center: Point.Point;\n\n public constructor(\n /**\n * The width of the viewport.\n */\n public readonly width: number,\n\n /**\n * The height of the viewport.\n */\n public readonly height: number\n ) {\n this.center = Dimensions.center(this.dimensions);\n }\n\n /**\n * Returns a new viewport with the given dimensions.\n * @param dimensions The dimensions of the viewport\n * @returns A new viewport.\n */\n public static fromDimensions(dimensions: Dimensions.Dimensions): Viewport {\n return new Viewport(dimensions.width, dimensions.height);\n }\n\n /**\n * Transforms a normalized device coordinate to a 2D point within the\n * viewport.\n *\n * @param ndc A 2D point in NDC.\n * @returns A 2D point in the coordinate space of the viewport.\n */\n public transformNdcPointToViewport(ndc: Point.Point): Point.Point {\n return Point.create(\n ndc.x * this.center.x + this.center.x,\n -ndc.y * this.center.y + this.center.y\n );\n }\n\n /**\n * Transforms a normalized device coordinate to a 2D point within the\n * viewport.\n *\n * @param ndc A 3D point in NDC.\n * @returns A 2D point in the coordinate space of the viewport.\n */\n public transformVectorToViewport(ndc: Vector3.Vector3): Point.Point {\n return this.transformNdcPointToViewport(ndc);\n }\n\n /**\n * Transforms a world point to 2D point in viewport space.\n *\n * @param worldPt The world point to transform.\n * @param projectionViewMatrix The projection matrix to transform a 3D point to 2D point.\n * @returns A point in viewport space.\n */\n public transformWorldToViewport(\n worldPt: Vector3.Vector3,\n projectionViewMatrix: Matrix4.Matrix4\n ): Point.Point {\n const ndc = Vector3.transformMatrix(worldPt, projectionViewMatrix);\n return this.transformVectorToViewport(ndc);\n }\n\n public transformPointToViewport(\n pt: Point.Point,\n image: FrameImageLike\n ): Point.Point {\n const { x: scaleX, y: scaleY } = this.calculateFrameScale(image);\n return Point.scale(pt, 1 * scaleX, 1 * scaleY);\n }\n\n /**\n * Transforms a point in viewport coordinate space to a point in a frame's\n * coordinate space.\n *\n * @param pt A point in viewport coordinate space.\n * @param image An image of a frame.\n * @returns A point in the coordinate space of the frame.\n */\n public transformPointToFrame(\n pt: Point.Point,\n image: FrameImageLike\n ): Point.Point {\n const { x: scaleX, y: scaleY } = this.calculateFrameScale(image);\n return Point.scale(pt, 1 / scaleX, 1 / scaleY);\n }\n\n /**\n * Transforms a point in viewport coordinates to a point in perspective world space\n * coordinates. This method expects a depth buffer in order to compute a value\n * for the Z axis.\n *\n * @param pt A point in viewport coordinates.\n * @param depthBuffer A depth buffer for computing the Z axis.\n * @param fallbackNormalizedDepth A fallback value if the depth is the max\n * depth value, or cannot be determined.\n * @returns\n */\n public transformPointToWorldSpace(\n pt: Point.Point,\n depthBuffer: DepthBuffer,\n fallbackNormalizedDepth?: number\n ): Vector3.Vector3 {\n const depthPt = this.transformPointToFrame(pt, depthBuffer);\n const ray = this.transformPointToRay(pt, depthBuffer, depthBuffer.camera);\n return depthBuffer.getWorldPoint(depthPt, ray, fallbackNormalizedDepth);\n }\n\n /**\n * Transforms a point in viewport coordinates to a point in orthographic world space\n * coordinates. This method expects a depth buffer in order to compute a value\n * for the Z axis.\n *\n * @param pt A point in viewport coordinates.\n * @param depthBuffer A depth buffer for computing the Z axis.\n * @param fallbackNormalizedDepth A fallback value if the depth is the max\n * depth value, or cannot be determined.\n */\n public transformPointToOrthographicWorldSpace(\n pt: Point.Point,\n depthBuffer: DepthBuffer,\n fallbackNormalizedDepth?: number\n ): Vector3.Vector3 {\n const depthPt = this.transformPointToFrame(pt, depthBuffer);\n const ray = this.transformPointToOrthographicRay(\n pt,\n depthBuffer,\n depthBuffer.camera\n );\n return depthBuffer.getOrthographicWorldPoint(\n depthPt,\n ray,\n fallbackNormalizedDepth\n );\n }\n\n /**\n * Transforms a point in viewport coordinates to a ray. The returned ray will\n * have an origin that is at the position of the camera with a direction that\n * is pointing into world space away from the camera.\n *\n * @param pt A point in viewport coordinates.\n * @param image An image of a frame.\n * @param camera A camera used to determine orientation of the scene.\n * @returns\n */\n public transformPointToRay(\n pt: Point.Point,\n image: FrameImageLike,\n camera: FrameCameraWithMatrices\n ): Ray.Ray {\n const ndc = this.transformScreenPointToNdc(pt, image);\n const origin = Vector3.fromMatrixPosition(camera.worldMatrix);\n const world = Vector3.transformNdcToWorldSpace(\n Vector3.create(ndc.x, ndc.y, 0.5),\n camera.worldMatrix,\n camera.projectionMatrixInverse\n );\n const direction = Vector3.normalize(Vector3.subtract(world, origin));\n return Ray.create({ origin, direction });\n }\n\n /**\n * Transforms a point in viewport coordinates to a ray. The returned ray will\n * have an origin that is at the world point of viewport coordinate with a direction that\n * is pointing into world space away from the camera.\n *\n * @param pt A point in viewport coordinates.\n * @param image An image of a frame.\n * @param camera A camera used to determine orientation of the scene.\n */\n public transformPointToOrthographicRay(\n pt: Point.Point,\n image: FrameImageLike,\n camera: FrameCameraWithMatrices\n ): Ray.Ray {\n const ndc = this.transformScreenPointToNdc(pt, image);\n const origin = Vector3.transformNdcToWorldSpace(\n Vector3.create(ndc.x, ndc.y, 0),\n camera.worldMatrix,\n camera.projectionMatrixInverse\n );\n return Ray.create({\n origin,\n direction: Vector3.normalize(camera.viewVector),\n });\n }\n\n /**\n * Maps a screen point to normalized device coordinates (NDC). A screen point\n * at 0,0 represents the top-left of the viewport.\n *\n * @param screenPt A screen point.\n */\n public transformScreenPointToNdc(\n screenPt: Point.Point,\n image: FrameImageLike\n ): Point.Point {\n const framePt = this.transformPointToFrame(screenPt, image);\n return Point.create(\n (framePt.x / image.imageAttr.frameDimensions.width) * 2 - 1,\n -(framePt.y / image.imageAttr.frameDimensions.height) * 2 + 1\n );\n }\n\n /**\n * Computes a rectangle that is scaled correctly to be drawn within the\n * viewport.\n *\n * @param image The image to be drawn.\n * @param imageDimensions The dimensions of the received image.\n * @returns A rectangle.\n */\n public calculateDrawRect(image: FrameImageLike): Rectangle.Rectangle {\n const { x: scaleX, y: scaleY } = this.calculateFrameScale(image);\n return Rectangle.scale(image.imageAttr.imageRect, scaleX, scaleY);\n }\n\n private calculateFrameScale(image: FrameImageLike): Point.Point {\n const { frameDimensions: dimensions } = image.imageAttr;\n\n const imageRect = Rectangle.fromDimensions(dimensions);\n const viewport = Rectangle.fromDimensions(this.dimensions);\n const fit = Rectangle.containFit(viewport, imageRect);\n\n const scaleX = fit.width / imageRect.width;\n const scaleY = fit.height / imageRect.height;\n\n return Point.create(scaleX, scaleY);\n }\n\n public get dimensions(): Dimensions.Dimensions {\n return Dimensions.create(this.width, this.height);\n }\n}\n"],"version":3}
|