@vertexvis/viewer 0.17.5-testing.4 → 0.17.5
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/README.template.md +3 -3
- package/dist/cjs/{controller-4e9ef328.js → controller-c7c4f333.js} +6 -6
- package/dist/cjs/controller-c7c4f333.js.map +1 -0
- package/dist/cjs/index.cjs.js +2 -2
- package/dist/cjs/{scene-9762fef8.js → scene-4425281f.js} +6 -3
- package/dist/cjs/scene-4425281f.js.map +1 -0
- package/dist/cjs/vertex-scene-tree-search_3.cjs.entry.js +1 -3
- package/dist/cjs/vertex-scene-tree-search_3.cjs.entry.js.map +1 -1
- package/dist/cjs/vertex-scene-tree.cjs.entry.js +1 -1
- package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js +1 -1
- package/dist/cjs/vertex-viewer.cjs.entry.js +13 -10
- package/dist/cjs/vertex-viewer.cjs.entry.js.map +1 -1
- package/dist/collection/components/scene-tree/lib/controller.js +5 -5
- package/dist/collection/components/scene-tree/lib/controller.js.map +1 -1
- package/dist/collection/components/scene-tree-table-layout/scene-tree-table-layout.js +1 -3
- package/dist/collection/components/scene-tree-table-layout/scene-tree-table-layout.js.map +1 -1
- package/dist/collection/components/viewer/viewer.js +3 -3
- package/dist/collection/components/viewer/viewer.js.map +1 -1
- package/dist/collection/lib/interactions/interactionApiOrthographic.js +5 -4
- package/dist/collection/lib/interactions/interactionApiOrthographic.js.map +1 -1
- package/dist/collection/lib/interactions/interactionApiPerspective.js +4 -3
- package/dist/collection/lib/interactions/interactionApiPerspective.js.map +1 -1
- package/dist/collection/lib/interactions/multiTouchInteractionHandler.js +3 -2
- package/dist/collection/lib/interactions/multiTouchInteractionHandler.js.map +1 -1
- package/dist/collection/lib/types/loadableResource.js +5 -2
- package/dist/collection/lib/types/loadableResource.js.map +1 -1
- package/dist/collection/testing/viewer.js +2 -2
- package/dist/collection/testing/viewer.js.map +1 -1
- package/dist/custom-elements/index.js +23 -19
- package/dist/custom-elements/index.js.map +1 -1
- package/dist/esm/{controller-53f803d9.js → controller-bbcc1700.js} +6 -6
- package/dist/esm/controller-bbcc1700.js.map +1 -0
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.mjs +2 -2
- package/dist/esm/{scene-1bd307f3.js → scene-31d88655.js} +6 -3
- package/dist/esm/scene-31d88655.js.map +1 -0
- package/dist/esm/vertex-scene-tree-search_3.entry.js +1 -3
- package/dist/esm/vertex-scene-tree-search_3.entry.js.map +1 -1
- package/dist/esm/vertex-scene-tree.entry.js +1 -1
- package/dist/esm/vertex-viewer-pin-group.entry.js +1 -1
- package/dist/esm/vertex-viewer.entry.js +13 -10
- package/dist/esm/vertex-viewer.entry.js.map +1 -1
- package/dist/types/components/viewer/viewer.d.ts +2 -2
- package/dist/types/components.d.ts +3 -3
- package/dist/types/testing/viewer.d.ts +2 -2
- package/dist/viewer/index.esm.js +1 -1
- package/dist/viewer/{p-921ec41b.js → p-3d19b37e.js} +2 -2
- package/dist/viewer/p-3d19b37e.js.map +1 -0
- package/dist/viewer/p-43eb668e.js +5 -0
- package/dist/viewer/p-43eb668e.js.map +1 -0
- package/dist/viewer/{p-951a2e08.entry.js → p-5ce0269a.entry.js} +2 -2
- package/dist/viewer/p-5ce0269a.entry.js.map +1 -0
- package/dist/viewer/{p-1815d19b.entry.js → p-6114701c.entry.js} +2 -2
- package/dist/viewer/p-8f16e792.entry.js +5 -0
- package/dist/viewer/p-8f16e792.entry.js.map +1 -0
- package/dist/viewer/{p-9b8dae4a.entry.js → p-d256624d.entry.js} +2 -2
- package/dist/viewer/viewer.esm.js +1 -1
- package/package.json +7 -7
- package/readme.md +7 -7
- package/dist/cjs/controller-4e9ef328.js.map +0 -1
- package/dist/cjs/scene-9762fef8.js.map +0 -1
- package/dist/esm/controller-53f803d9.js.map +0 -1
- package/dist/esm/scene-1bd307f3.js.map +0 -1
- package/dist/viewer/p-27a5034e.entry.js +0 -5
- package/dist/viewer/p-27a5034e.entry.js.map +0 -1
- package/dist/viewer/p-921ec41b.js.map +0 -1
- package/dist/viewer/p-951a2e08.entry.js.map +0 -1
- package/dist/viewer/p-c3be5b4d.js +0 -5
- package/dist/viewer/p-c3be5b4d.js.map +0 -1
- /package/dist/viewer/{p-1815d19b.entry.js.map → p-6114701c.entry.js.map} +0 -0
- /package/dist/viewer/{p-9b8dae4a.entry.js.map → p-d256624d.entry.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["src/components/scene-tree-search/scene-tree-search.css?tag=vertex-scene-tree-search&encapsulation=shadow","src/components/scene-tree-search/scene-tree-search.tsx","../html-templates/dist/bundle.esm.js","src/components/scene-tree-table-layout/lib/dom.ts","src/components/scene-tree-table-layout/lib/hover-controller.ts","src/components/scene-tree-table-layout/lib/window.ts","src/components/scene-tree-table-layout/scene-tree-table-layout.css?tag=vertex-scene-tree-table-layout&encapsulation=shadow","src/components/scene-tree-table-layout/scene-tree-table-layout.tsx","src/components/scene-tree-toolbar/scene-tree-toolbar.css?tag=vertex-scene-tree-toolbar&encapsulation=shadow","src/components/scene-tree-toolbar/scene-tree-toolbar.tsx"],"names":["sceneTreeSearchCss","SceneTreeSearch","[object Object]","hostRef","this","debounce","disabled","placeholder","undefined","value","focused","isSearching","handleTextInput","event","input","target","search","emit","handleTextFocus","handleTextBlur","handleClear","preventDefault","setFocus","_a","inputEl","focus","_b","controller","setupController","handleDebounceChanged","onStateChangeDisposable","dispose","h","Host","class","name","slot","size","classNames","background","length","type","ref","onInput","onFocus","onBlur","show","tabIndex","onMouseDown","debounceEvent","onStateChange","on","state","lowerCase","str","toLowerCase","DEFAULT_SPLIT_REGEXP","DEFAULT_STRIP_REGEXP","noCase","options","splitRegexp","stripRegexp","_c","transform","_d","delimiter","result","replace","start","end","charAt","slice","split","map","join","re","RegExp","reduce","pascalCaseTransform","index","firstChar","lowerChars","substr","toUpperCase","pascalCase","__assign","camelCaseTransform","camelCase","bindingRegEx","CollectionBinding","bindings","data","forEach","binding","bind","NodeBinding","node","expr","TextNodeBinding","super","newContent","replaceBindingString","textContent","AttributeBinding","attr","newValue","oldValue","getAttribute","setAttribute","PropertyBinding","prop","replaceBinding","EventHandlerBinding","eventName","path","extractBindingPath","disposable","listener","getBindableValue","addEventListener","removeEventListener","generateBindings","nodeType","Node","ELEMENT_NODE","el","bindableAttributes","getBindableAttributes","startsWith","push","propName","TEXT_NODE","test","i","childNodes","element","Array","from","attributes","filter","exec","toString","isHead","head","tail","ElementPool","container","elementFactory","instanceMap","Map","elements","count","sliced","splice","concat","diff","createElement","deleteElement","f","instance","get","updateElements","set","append","pop","delete","remove","generateInstanceFromTemplate","template","fragment","content","cloneNode","firstElementChild","getSceneTreeTableOffsetTop","getBoundingClientRect","top","getSceneTreeTableViewportWidth","clientWidth","scrollToTop","scrollTo","Object","assign","SceneTreeCellHoverController","EventDispatcher","id","restartTimeout","fn","existingTimeout","delay","window","clearTimeout","setTimeout","sceneTreeTableLayoutCss","SceneTreeTableLayout","rows","totalRows","rowHeight","overScanCount","layoutOffset","scrollOffset","viewportStartIndex","viewportEndIndex","columnGridLayout","columnGridFixedLayout","isComputingCellHeight","isScrolling","stateMap","viewportRows","columnWidths","columnWidthPercentages","lastStartIndex","columnElements","cellHoverController","layoutColumns","visibleRowCount","iterateColumns","col","pool","colIndex","swapHeadToTail","swapTailToHead","style","minHeight","cellPaddingLeft","depth","iterateElements","rowIndex","row","isLoadedRow","updateCell","cell","position","boxSizing","height","width","paddingLeft","tree","hoverController","updateLayoutPosition","readDOM","tableElement","recomputeColumnWidths","layoutWidth","getLayoutWidth","w","recomputeColumnPercentages","computeInitialColumnWidths","c","initialWidth","updateColumnElements","hostEl","querySelectorAll","computeCellHeight","async","dummyData","hex","expanded","selected","visible","partiallyVisible","isLeaf","columnsList","filterHit","phantom","endItem","metadata","createColumnCellInstance","visibility","appendChild","componentOnReady","clientHeight","attempts","Promise","resolve","computeHeaderHeight","headerHeight","headerElement","setProperty","computeColumnGridLayout","res","bindHeaderData","headerInstances","createHeaderInstance","paddingRight","gridColumnStart","gridColumnEnd","headerDividerInstances","_","createDividerInstance","right","pointerEvents","rebindHeaderData","removeDividerDragListeners","addDividerDragListeners","createDividerPointerDownHandler","stopPropagation","lastDividerPointerPosition","Point","create","Math","floor","clientX","clientY","resizingColumnIndex","classList","add","handleDividerPointerMove","handleDividerPointerUp","current","subtract","abs","x","isValidResize","currentColumn","nextColumn","currentWidth","nextWidth","currentMinWidth","minWidth","currentMaxWidth","maxWidth","Number","MAX_SAFE_INTEGER","nextMinWidth","nextMaxWidth","currentIsValid","nextIsValid","handleScrollChanged","scrollTimer","scrollTop","computeAndUpdateViewportRows","createPools","headerResizeObserver","ResizeObserver","resizeObserver","clearLayoutHeight","clearLayoutWidth","ensureDividerTemplateDefined","passive","observe","layoutRendered","disconnect","gridTemplateColumns","display","onSlotchange","recreateColumnPools","viewportHeight","getLayoutHeight","viewportCount","ceil","startIndex","max","endIndex","min","getViewportRows","computeViewportRows","isConnected","updateActiveRowRange","columnElementPools","WeakMap","updateElementFactory","column","Error","querySelector","defaultDividerTemplate","document","innerHTML","headerDividerListeners","d","listeners","populateRowData","rowData","call","layoutHeight","getSceneTreeViewportHeight","computedWidth","sceneTreeToolbarCss","SceneTreeToolbar"],"mappings":"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","sourcesContent":["@import url('../../css/button-reset.css');\n\n:host {\n /**\n * @prop --scene-tree-search-search-icon-offset: A CSS length that specifies\n * the horizontal offset of the search icon\n */\n --scene-tree-search-search-icon-offset: 8px;\n\n /**\n * @prop --scene-tree-search-clear-button-offset: A CSS length that specifies\n * the horizontal offset of the clear button.\n */\n --scene-tree-search-clear-button-offset: 8px;\n\n /**\n * @prop --scene-tree-search-input-padding: A CSS padding value that specifies\n * horizontal and vertical lengths of the internal text input.\n */\n --scene-tree-search-input-padding: 0.5rem 32px;\n\n /**\n * @prop --scene-tree-search-input-border: A CSS border value that specifies\n * the border of the internal text input.\n */\n --scene-tree-search-input-border: none;\n\n /**\n * @prop --scene-tree-search-input-border-radius: A CSS length that specifies\n * the radius of the internal text input.\n */\n --scene-tree-search-input-border-radius: 0.25rem;\n\n /**\n * @prop --scene-tree-search-input-background: A CSS background that specifies\n * the background color or image of the internal text input.\n */\n --scene-tree-search-input-background: none;\n\n /**\n * @prop --scene-tree-search-focused-input-background: A CSS background value\n * that specifies the background of the internal text input when focused.\n */\n --scene-tree-search-focused-input-background: var(--neutral-200);\n\n /**\n * @prop --scene-tree-search-focused-input-outline: A CSS outline value that\n * specifies the outline of the internal text input when focused.\n */\n --scene-tree-search-focused-input-outline: none;\n\n display: block;\n width: 100%;\n font-size: 0.875rem;\n}\n\n.root {\n width: 100%;\n position: relative;\n}\n\n.input {\n background: var(--scene-tree-search-input-background);\n border: var(--scene-tree-search-input-border);\n border-radius: var(--scene-tree-search-input-border-radius);\n box-sizing: border-box;\n font-size: inherit;\n padding: var(--scene-tree-search-input-padding);\n outline: none;\n width: 100%;\n}\n\n.input.background {\n background: var(--scene-tree-search-focused-input-background);\n outline: var(--scene-tree-search-focused-input-outline);\n}\n\n.overlay {\n position: absolute;\n top: 0;\n bottom: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n}\n\n.overlay-clear {\n display: none;\n right: var(--scene-tree-search-clear-button-offset);\n}\n\n.overlay-clear.show {\n display: flex;\n}\n\n.icon {\n color: var(--neutral-700);\n}\n\n.icon-search {\n position: absolute;\n left: var(--scene-tree-search-search-icon-offset);\n pointer-events: none;\n}\n\n.clear-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: initial;\n cursor: pointer;\n}\n.clear-btn:hover {\n color: var(--neutral-800);\n}\n.clear-btn:disabled {\n pointer-events: none;\n opacity: 0.5;\n}","import {\n Component,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Disposable } from '@vertexvis/utils';\nimport classNames from 'classnames';\n\nimport { debounceEvent } from '../../lib/stencil';\nimport { SceneTreeController } from '../scene-tree/lib/controller';\n\n/**\n * @slot search-icon - A slot that replaces the component's default search icon.\n * @slot clear-icon - A slot that replaces the component's default clear icon.\n */\n@Component({\n tag: 'vertex-scene-tree-search',\n styleUrl: 'scene-tree-search.css',\n shadow: true,\n})\nexport class SceneTreeSearch {\n /**\n * Specifies the delay, in milliseconds, to emit `search` events after user\n * input.\n */\n @Prop()\n public debounce = 350;\n\n /**\n * If `true`, disables user interaction of the component.\n */\n @Prop()\n public disabled = false;\n\n /**\n * Placeholder text if `value` is empty.\n */\n @Prop()\n public placeholder?: string = undefined;\n\n /**\n * The scene tree controller\n */\n @Prop()\n public controller?: SceneTreeController;\n\n /**\n * The current text value of the component. Value is updated on user\n * interaction.\n */\n @Prop({ mutable: true })\n public value = '';\n\n /**\n * An event that is emitted when a user has inputted or cleared the search\n * term. The event may be delayed according to the current `debounce` value.\n */\n @Event({ bubbles: true })\n public search!: EventEmitter<string>;\n\n @State()\n private focused = false;\n\n @State()\n private isSearching = false;\n\n private inputEl?: HTMLInputElement;\n private onStateChangeDisposable?: Disposable;\n\n /**\n * Gives focus to the the component's internal text input.\n */\n @Method()\n public async setFocus(): Promise<void> {\n // HTMLInputElement.focus() doesn't exist in tests.\n if (typeof this.inputEl?.focus === 'function') {\n this.inputEl?.focus();\n }\n }\n\n /**\n * @ignore\n */\n @Watch('controller')\n public controllerChanged(controller: SceneTreeController): void {\n this.setupController();\n }\n\n /**\n * @ignore\n */\n protected componentDidLoad(): void {\n this.handleDebounceChanged();\n\n this.setupController();\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.onStateChangeDisposable?.dispose();\n }\n\n /**\n * @ignore\n */\n protected render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <div class=\"root\">\n <div class=\"overlay icon icon-search\">\n <slot name=\"search-icon\">\n {this.isSearching ? (\n <vertex-viewer-spinner slot=\"search-icon\" size=\"xs\" />\n ) : (\n <vertex-viewer-icon name=\"search\" size=\"sm\" />\n )}\n </slot>\n </div>\n\n <input\n class={classNames('input', {\n background: this.focused || this.value.length > 0,\n })}\n type=\"text\"\n ref={(ref) => (this.inputEl = ref)}\n placeholder={this.placeholder}\n disabled={this.disabled}\n value={this.value}\n onInput={this.handleTextInput}\n onFocus={this.handleTextFocus}\n onBlur={this.handleTextBlur}\n />\n\n <div\n class={classNames('overlay overlay-clear', {\n show: this.value.length > 0,\n })}\n >\n <button\n class=\"clear-btn icon\"\n tabIndex={-1}\n onMouseDown={this.handleClear}\n disabled={this.disabled}\n >\n <slot name=\"clear-icon\">\n <vertex-viewer-icon name=\"close-circle\" size=\"sm\" />\n </slot>\n </button>\n </div>\n </div>\n </Host>\n );\n }\n\n private handleTextInput = (event: Event): void => {\n const input = event.target as HTMLInputElement;\n this.value = input.value;\n this.search.emit(this.value);\n };\n\n private handleTextFocus = (): void => {\n this.focused = true;\n };\n\n private handleTextBlur = (): void => {\n this.focused = false;\n };\n\n private handleClear = (event: MouseEvent): void => {\n event.preventDefault();\n\n this.value = '';\n this.search.emit(this.value);\n this.setFocus();\n };\n\n private handleDebounceChanged(): void {\n this.search = debounceEvent(this.search, this.debounce);\n }\n\n private setupController(): void {\n this.onStateChangeDisposable?.dispose();\n\n this.onStateChangeDisposable = this.controller?.onStateChange.on(\n (state) => {\n this.isSearching = state.isSearching;\n }\n );\n }\n}\n","import { __assign } from 'tslib';\n\n/**\n * Source: ftp://ftp.unicode.org/Public/UCD/latest/ucd/SpecialCasing.txt\n */\n/**\n * Lower case as a function.\n */\nfunction lowerCase(str) {\n return str.toLowerCase();\n}\n\n// Support camel case (\"camelCase\" -> \"camel Case\" and \"CAMELCase\" -> \"CAMEL Case\").\nvar DEFAULT_SPLIT_REGEXP = [/([a-z0-9])([A-Z])/g, /([A-Z])([A-Z][a-z])/g];\n// Remove all non-word characters.\nvar DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi;\n/**\n * Normalize the string into something other libraries can manipulate easier.\n */\nfunction noCase(input, options) {\n if (options === void 0) { options = {}; }\n var _a = options.splitRegexp, splitRegexp = _a === void 0 ? DEFAULT_SPLIT_REGEXP : _a, _b = options.stripRegexp, stripRegexp = _b === void 0 ? DEFAULT_STRIP_REGEXP : _b, _c = options.transform, transform = _c === void 0 ? lowerCase : _c, _d = options.delimiter, delimiter = _d === void 0 ? \" \" : _d;\n var result = replace(replace(input, splitRegexp, \"$1\\0$2\"), stripRegexp, \"\\0\");\n var start = 0;\n var end = result.length;\n // Trim the delimiter from around the output string.\n while (result.charAt(start) === \"\\0\")\n start++;\n while (result.charAt(end - 1) === \"\\0\")\n end--;\n // Transform each token independently.\n return result.slice(start, end).split(\"\\0\").map(transform).join(delimiter);\n}\n/**\n * Replace `re` in the input string with the replacement value.\n */\nfunction replace(input, re, value) {\n if (re instanceof RegExp)\n return input.replace(re, value);\n return re.reduce(function (input, re) { return input.replace(re, value); }, input);\n}\n\nfunction pascalCaseTransform(input, index) {\n var firstChar = input.charAt(0);\n var lowerChars = input.substr(1).toLowerCase();\n if (index > 0 && firstChar >= \"0\" && firstChar <= \"9\") {\n return \"_\" + firstChar + lowerChars;\n }\n return \"\" + firstChar.toUpperCase() + lowerChars;\n}\nfunction pascalCase(input, options) {\n if (options === void 0) { options = {}; }\n return noCase(input, __assign({ delimiter: \"\", transform: pascalCaseTransform }, options));\n}\n\nfunction camelCaseTransform(input, index) {\n if (index === 0)\n return input.toLowerCase();\n return pascalCaseTransform(input, index);\n}\nfunction camelCase(input, options) {\n if (options === void 0) { options = {}; }\n return pascalCase(input, __assign({ transform: camelCaseTransform }, options));\n}\n\nconst bindingRegEx = /{{(.+)}}/;\r\nclass CollectionBinding {\r\n constructor(bindings) {\r\n this.bindings = bindings;\r\n }\r\n bind(data) {\r\n this.bindings.forEach((binding) => binding.bind(data));\r\n }\r\n}\r\nclass NodeBinding {\r\n constructor(node, expr) {\r\n this.node = node;\r\n this.expr = expr;\r\n }\r\n}\r\nclass TextNodeBinding extends NodeBinding {\r\n constructor(node, expr) {\r\n super(node, expr);\r\n }\r\n bind(data) {\r\n const newContent = replaceBindingString(data, this.expr);\r\n if (newContent !== this.node.textContent) {\r\n this.node.textContent = newContent;\r\n }\r\n }\r\n}\r\nclass AttributeBinding extends NodeBinding {\r\n constructor(node, expr, attr) {\r\n super(node, expr);\r\n this.attr = attr;\r\n }\r\n bind(data) {\r\n const newValue = replaceBindingString(data, this.expr);\r\n const oldValue = this.node.getAttribute(this.attr);\r\n if (oldValue !== newValue) {\r\n this.node.setAttribute(this.attr, newValue);\r\n }\r\n }\r\n}\r\nclass PropertyBinding extends NodeBinding {\r\n constructor(node, expr, prop) {\r\n super(node, expr);\r\n this.prop = prop;\r\n }\r\n bind(data) {\r\n const newValue = replaceBinding(data, this.expr);\r\n /* eslint-disable @typescript-eslint/no-explicit-any */\r\n const oldValue = this.node[this.prop];\r\n if (oldValue !== newValue) {\r\n this.node[this.prop] = newValue;\r\n }\r\n /* eslint-enable @typescript-eslint/no-explicit-any */\r\n }\r\n}\r\nclass EventHandlerBinding extends NodeBinding {\r\n constructor(node, expr, eventName) {\r\n super(node, expr);\r\n this.eventName = eventName;\r\n }\r\n bind(data) {\r\n var _a;\r\n const path = extractBindingPath(this.expr);\r\n if (path != null) {\r\n (_a = this.disposable) === null || _a === void 0 ? void 0 : _a.dispose();\r\n const listener = getBindableValue(data, path, true);\r\n this.node.addEventListener(this.eventName, listener);\r\n this.disposable = {\r\n dispose: () => {\r\n this.node.removeEventListener(this.eventName, listener);\r\n },\r\n };\r\n }\r\n }\r\n}\r\nfunction generateBindings(node) {\r\n const bindings = [];\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n const el = node;\r\n const bindableAttributes = getBindableAttributes(el);\r\n bindableAttributes.forEach((attr) => {\r\n if (attr.name.startsWith('event:')) {\r\n const eventName = camelCase(attr.name.replace('event:', ''));\r\n bindings.push(new EventHandlerBinding(el, attr.value, eventName));\r\n }\r\n else if (attr.name.startsWith('attr:')) {\r\n bindings.push(new AttributeBinding(el, attr.value, attr.name.replace('attr:', '')));\r\n }\r\n else if (attr.name.startsWith('prop:')) {\r\n const propName = camelCase(attr.name.replace('prop:', ''));\r\n bindings.push(new PropertyBinding(el, attr.value, propName));\r\n }\r\n });\r\n }\r\n else if (node.nodeType === Node.TEXT_NODE &&\r\n node.textContent != null &&\r\n bindingRegEx.test(node.textContent)) {\r\n bindings.push(new TextNodeBinding(node, node.textContent));\r\n }\r\n for (let i = 0; i < node.childNodes.length; i++) {\r\n bindings.push(...generateBindings(node.childNodes[i]));\r\n }\r\n return bindings;\r\n}\r\nfunction getBindableAttributes(element) {\r\n return Array.from(element.attributes).filter((attr) => bindingRegEx.test(attr.value));\r\n}\r\nfunction extractBindingPath(expr) {\r\n const result = bindingRegEx.exec(expr);\r\n return result != null ? result[1] : undefined;\r\n}\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nfunction replaceBindingString(data, expr) {\r\n const path = extractBindingPath(expr);\r\n if (path != null) {\r\n const value = getBindableValue(data, path, true);\r\n return expr.replace(`{{${path}}}`, value === null || value === void 0 ? void 0 : value.toString());\r\n }\r\n else {\r\n return expr;\r\n }\r\n}\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nfunction replaceBinding(data, expr) {\r\n const path = extractBindingPath(expr);\r\n if (path != null) {\r\n const value = getBindableValue(data, path, true);\r\n return value;\r\n }\r\n else {\r\n return expr;\r\n }\r\n}\r\nfunction getBindableValue(\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ndata, path, isHead = false\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n) {\r\n const [head, ...tail] = path.split('.');\r\n if (isHead && tail.length === 0) {\r\n return data;\r\n }\r\n else if (isHead && tail.length > 0) {\r\n return getBindableValue(data, tail.join('.'), false);\r\n }\r\n else {\r\n const value = data[head];\r\n if (tail.length > 0) {\r\n return getBindableValue(value, tail.join('.'), false);\r\n }\r\n else {\r\n return value;\r\n }\r\n }\r\n}\n\nclass ElementPool {\r\n constructor(container, elementFactory) {\r\n this.container = container;\r\n this.elementFactory = elementFactory;\r\n this.instanceMap = new Map();\r\n this.elements = [];\r\n }\r\n swapHeadToTail(count) {\r\n const sliced = this.elements.splice(0, count);\r\n this.elements.splice(this.elements.length, 0, ...sliced);\r\n return this.elements.concat();\r\n }\r\n swapTailToHead(count) {\r\n const sliced = this.elements.splice(-count, count);\r\n this.elements.splice(0, 0, ...sliced);\r\n return this.elements.concat();\r\n }\r\n updateElements(count) {\r\n const diff = count - this.elements.length;\r\n if (diff > 0) {\r\n for (let i = 0; i < diff; i++) {\r\n this.createElement();\r\n }\r\n }\r\n else {\r\n for (let i = 0; i < -diff; i++) {\r\n this.deleteElement();\r\n }\r\n }\r\n return this.elements.concat();\r\n }\r\n updateData(f) {\r\n this.elements.forEach((el, i) => {\r\n const instance = this.instanceMap.get(el);\r\n const data = f(i);\r\n instance === null || instance === void 0 ? void 0 : instance.bindings.bind(data);\r\n });\r\n }\r\n updateElementFactory(elementFactory) {\r\n this.elementFactory = elementFactory;\r\n this.updateElements(0);\r\n }\r\n iterateElements(f) {\r\n this.elements.forEach((el, i) => {\r\n const instance = this.instanceMap.get(el);\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n f(el, instance.bindings, i);\r\n });\r\n }\r\n createElement() {\r\n const instance = this.elementFactory();\r\n this.elements.push(instance.element);\r\n this.instanceMap.set(instance.element, instance);\r\n this.container.append(instance.element);\r\n return instance;\r\n }\r\n deleteElement() {\r\n const element = this.elements.pop();\r\n if (element != null) {\r\n this.instanceMap.delete(element);\r\n element.remove();\r\n }\r\n }\r\n}\n\nfunction append(container, element, data) {\r\n const bindings = new CollectionBinding(generateBindings(element));\r\n bindings.bind(data);\r\n container.appendChild(element);\r\n const created = container.lastElementChild;\r\n if (created != null) {\r\n return { element: created, bindings };\r\n }\r\n else {\r\n throw new Error('Failed to append element');\r\n }\r\n}\r\nfunction generateInstanceFromTemplate(template) {\r\n const fragment = template.content.cloneNode(true);\r\n const element = fragment.firstElementChild;\r\n const bindings = new CollectionBinding(generateBindings(fragment));\r\n return { element, bindings };\r\n}\n\nexport { AttributeBinding, CollectionBinding, ElementPool, EventHandlerBinding, NodeBinding, PropertyBinding, TextNodeBinding, append, generateBindings, generateInstanceFromTemplate };\n//# sourceMappingURL=bundle.esm.js.map\n","export type DomScrollToOptions = ScrollToOptions;\n\nexport function getSceneTreeTableOffsetTop(el: HTMLElement): number {\n return el.getBoundingClientRect().top ?? 0;\n}\n\nexport function getSceneTreeTableViewportWidth(el: HTMLElement): number {\n return el.clientWidth;\n}\n\nexport function scrollToTop(\n el: HTMLElement,\n top: number,\n options: Pick<DomScrollToOptions, 'behavior'>\n): void {\n el.scrollTo({ top, ...options });\n}\n","import { Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\nexport class SceneTreeCellHoverController {\n public onStateChange = new EventDispatcher<string | undefined>();\n\n public setHovered(id?: string): void {\n this.onStateChange.emit(id);\n }\n\n public stateChanged(listener: Listener<string | undefined>): Disposable {\n return this.onStateChange.on(listener);\n }\n}\n","export function restartTimeout(\n fn: VoidFunction,\n existingTimeout?: number,\n delay = 200\n): number {\n window.clearTimeout(existingTimeout);\n return window.setTimeout(fn, delay);\n}\n",":host {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n height: 100%;\n overflow: hidden;\n font-size: 0.825rem;\n\n /**\n * @prop --scene-tree-table-row-padding: CSS lengths that specifies the amount of\n * padding between the row's border and content.\n */\n --scene-tree-table-row-padding: 2px 0px;\n\n /**\n * @prop --scene-tree-table-column-gap: CSS length that specifies the amount of\n * padding between columns in the table.\n */\n --scene-tree-table-column-gap: 0.5rem;\n\n /**\n * @prop --scene-tree-table-column-resize-cursor: A CSS cursor value that will\n * be displayed when resizing a column. Defaults to `col-resize`.\n */\n --scene-tree-table-column-resize-cursor: col-resize;\n}\n\n.header {\n position: relative;\n display: grid;\n width: 100%;\n border-bottom: var(--scene-tree-toolbar-separator);\n}\n\n.table {\n position: relative;\n display: grid;\n width: 100%;\n height: 100%;\n overflow: auto;\n}\n\n.resize-overlay {\n position: absolute;\n top: 0;\n cursor: var(--scene-tree-table-column-resize-cursor);\n z-index: 1000;\n width: 100%;\n height: 100%;\n}\n\n.divider-overlay {\n position: absolute;\n top: 0;\n display: grid;\n pointer-events: none;\n z-index: 2000;\n width: 100%;\n height: 100%;\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Point } from '@vertexvis/geometry';\nimport {\n Binding,\n ElementPool,\n generateInstanceFromTemplate,\n InstancedTemplate,\n} from '@vertexvis/html-templates';\n\nimport { readDOM } from '../../lib/stencil';\nimport { SceneTreeController } from '../scene-tree/lib/controller';\nimport { getSceneTreeViewportHeight } from '../scene-tree/lib/dom';\nimport { isLoadedRow, LoadedRow, Row } from '../scene-tree/lib/row';\nimport { RowDataProvider } from '../scene-tree/types';\nimport {\n DomScrollToOptions,\n getSceneTreeTableOffsetTop,\n getSceneTreeTableViewportWidth,\n scrollToTop,\n} from './lib/dom';\nimport { SceneTreeCellHoverController } from './lib/hover-controller';\nimport { restartTimeout } from './lib/window';\n\ninterface StateMap {\n columnElementPools?: WeakMap<\n HTMLVertexSceneTreeTableColumnElement,\n ElementPool\n >;\n headerInstances?: Array<InstancedTemplate<HTMLElement>>;\n headerDividerInstances?: Array<InstancedTemplate<HTMLElement>>;\n headerDividerListeners?: Array<(event: PointerEvent) => void>;\n\n viewportRows: Row[];\n\n headerHeight?: number;\n columnWidths: number[];\n columnWidthPercentages: number[];\n}\n\n@Component({\n tag: 'vertex-scene-tree-table-layout',\n styleUrl: 'scene-tree-table-layout.css',\n shadow: true,\n})\nexport class SceneTreeTableLayout {\n /**\n * A reference to the scene tree to perform operations for interactions. Such\n * as expansion, visibility and selection.\n */\n @Prop()\n public tree?: HTMLVertexSceneTreeElement;\n\n /**\n * @internal\n */\n @Prop()\n public controller?: SceneTreeController;\n\n /**\n * @internal\n */\n @Prop()\n public rows: Row[] = [];\n\n /**\n * @internal\n */\n @Prop()\n public totalRows = 0;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public rowHeight = 24;\n\n /**\n * The number of offscreen rows above and below the viewport to render. Having\n * a higher number reduces the chance of the browser not displaying a row\n * while scrolling.\n *\n * This prop will be automatically populated based on the `overScanCount` prop\n * specified in the parent `<vertex-scene-tree />` element.\n */\n @Prop()\n public overScanCount = 25;\n\n /**\n * A callback that is invoked immediately before a row is about to rendered.\n * This callback can return additional data that can be bound to in a\n * template.\n *\n * This prop will be automatically populated based on the `rowData` prop\n * specified in the parent `<vertex-scene-tree />` element.\n *\n * @example\n *\n * ```html\n * <script>\n * const table = document.querySelector('vertex-scene-tree-table');\n * table.rowData = (row) => {\n * return { func: () => console.log('row', row.node.name) };\n * }\n * </script>\n *\n * <vertex-scene-tree>\n * <vertex-scene-tree-table>\n * <vertex-scene-tree-table-column>\n * <template>\n * <button event:click=\"{{row.data.func}}\">Hi</button>\n * </template>\n * </vertex-scene-tree-table-column>\n * </vertex-scene-tree-table>\n * </vertex-scene-tree>\n * ```\n */\n @Prop()\n public rowData?: RowDataProvider;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public layoutOffset = 0;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public scrollOffset = 0;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public layoutHeight?: number;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public layoutWidth?: number;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public viewportStartIndex = 0;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public viewportEndIndex = 0;\n\n /**\n * @internal\n */\n @Event()\n public layoutRendered!: EventEmitter<void>;\n\n @Element()\n private hostEl!: HTMLElement;\n\n @State()\n private columnGridLayout = '1fr';\n\n @State()\n private columnGridFixedLayout = '';\n\n @State()\n private isComputingCellHeight = true;\n\n @State()\n private lastDividerPointerPosition?: Point.Point;\n\n @State()\n private resizingColumnIndex?: number;\n\n @State()\n private isScrolling = false;\n\n @State()\n private scrollTimer: number | undefined;\n\n /**\n * This stores internal state that you want to preserve across live-reloads,\n * but shouldn't trigger a refresh if the data changes. Marking this with\n * @State to allow to preserve state across live-reloads.\n */\n @State()\n private stateMap: StateMap = {\n viewportRows: [],\n columnWidths: [],\n columnWidthPercentages: [],\n };\n\n private lastStartIndex = 0;\n private resizeObserver?: ResizeObserver;\n private headerResizeObserver?: ResizeObserver;\n\n private tableElement?: HTMLDivElement;\n private headerElement?: HTMLDivElement;\n private columnElements: HTMLVertexSceneTreeTableColumnElement[] = [];\n\n private cellHoverController = new SceneTreeCellHoverController();\n\n public componentWillLoad(): void {\n this.updateColumnElements();\n this.createPools();\n\n this.headerResizeObserver = new ResizeObserver(() => {\n this.stateMap.headerHeight = undefined;\n this.computeHeaderHeight();\n this.updateLayoutPosition();\n });\n\n this.resizeObserver = new ResizeObserver(() => {\n this.updateLayoutPosition();\n this.clearLayoutHeight();\n this.clearLayoutWidth();\n this.recomputeColumnWidths();\n this.computeColumnGridLayout();\n });\n }\n\n public componentDidLoad(): void {\n this.computeColumnGridLayout();\n this.ensureDividerTemplateDefined();\n this.computeCellHeight();\n this.computeHeaderHeight();\n this.computeInitialColumnWidths();\n this.rebindHeaderData();\n\n this.tableElement?.addEventListener('scroll', this.handleScrollChanged, {\n passive: true,\n });\n\n if (this.headerElement != null) {\n this.headerResizeObserver?.observe(this.headerElement);\n }\n\n this.resizeObserver?.observe(this.hostEl);\n }\n\n public async componentWillRender(): Promise<void> {\n await this.computeAndUpdateViewportRows();\n }\n\n public componentDidRender(): void {\n this.layoutColumns();\n\n this.layoutRendered.emit();\n }\n\n public disconnectedCallback(): void {\n this.tableElement?.removeEventListener('scroll', this.handleScrollChanged);\n this.removeDividerDragListeners();\n this.headerResizeObserver?.disconnect();\n this.resizeObserver?.disconnect();\n this.stateMap.columnWidths = [];\n this.stateMap.columnWidthPercentages = [];\n }\n\n @Watch('rows')\n @Watch('totalRows')\n @Watch('rowHeight')\n protected async handleViewportRowsPropsChanged(): Promise<void> {\n await this.computeAndUpdateViewportRows();\n }\n\n /**\n * Scrolls the table to the provided top value.\n *\n * @param top The position to scroll to.\n * @param options A set of options to configure the scrolling behavior.\n */\n @Method()\n public async scrollToPosition(\n top: number,\n options: Pick<DomScrollToOptions, 'behavior'>\n ): Promise<void> {\n if (this.tableElement != null) {\n scrollToTop(this.tableElement, top, options);\n }\n }\n\n public render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <div\n class=\"header\"\n ref={(ref) => (this.headerElement = ref)}\n style={{\n gridTemplateColumns: this.columnGridFixedLayout,\n display: this.columnElements.length <= 1 ? 'none' : 'grid',\n }}\n >\n <slot name=\"header\" />\n </div>\n <div\n class=\"table\"\n ref={(ref) => (this.tableElement = ref)}\n style={{\n gridTemplateColumns: this.columnGridLayout,\n }}\n >\n <slot\n onSlotchange={() => {\n this.ensureDividerTemplateDefined();\n this.updateColumnElements();\n this.recreateColumnPools();\n this.computeInitialColumnWidths();\n this.rebindHeaderData();\n this.computeColumnGridLayout();\n }}\n />\n </div>\n <div\n class=\"divider-overlay\"\n style={{\n gridTemplateColumns: this.columnGridFixedLayout,\n }}\n >\n <slot name=\"divider\" />\n </div>\n {this.resizingColumnIndex != null && <div class=\"resize-overlay\" />}\n </Host>\n );\n }\n\n private computeViewportRows(): void {\n const viewportHeight = this.getLayoutHeight();\n if (viewportHeight != null) {\n const viewportCount = Math.ceil(viewportHeight / this.rowHeight);\n\n const viewportStartIndex = Math.floor(this.scrollOffset / this.rowHeight);\n const viewportEndIndex = viewportStartIndex + viewportCount;\n\n const startIndex = Math.max(0, viewportStartIndex - this.overScanCount);\n const endIndex = Math.min(\n this.totalRows - 1,\n viewportEndIndex + this.overScanCount\n );\n\n const rows = this.getViewportRows(startIndex, endIndex);\n\n this.viewportStartIndex = startIndex;\n this.viewportEndIndex = endIndex;\n this.stateMap.viewportRows = rows;\n }\n }\n\n private async computeAndUpdateViewportRows(): Promise<void> {\n this.computeViewportRows();\n\n if (\n this.controller?.isConnected &&\n this.viewportStartIndex >= 0 &&\n this.viewportEndIndex >= 0\n ) {\n await this.controller.updateActiveRowRange(\n this.viewportStartIndex,\n this.viewportEndIndex\n );\n }\n }\n\n private layoutColumns = (): void => {\n const visibleRowCount = this.viewportEndIndex - this.viewportStartIndex + 1;\n const diff = this.viewportStartIndex - this.lastStartIndex;\n this.lastStartIndex = this.viewportStartIndex;\n\n this.iterateColumns((col, pool, colIndex) => {\n pool.updateElements(visibleRowCount);\n\n if (diff > 0) {\n pool.swapHeadToTail(diff);\n } else {\n pool.swapTailToHead(-diff);\n }\n\n col.style.minHeight = `${this.rowHeight * this.totalRows}px`;\n\n const cellPaddingLeft =\n colIndex === 0\n ? (depth: number) => `calc(${depth} * 0.5rem)`\n : () => `0`;\n\n pool.iterateElements((el, binding, rowIndex) => {\n const row = this.stateMap.viewportRows[rowIndex];\n\n if (isLoadedRow(row)) {\n this.updateCell(row, el, binding, rowIndex, cellPaddingLeft);\n }\n });\n });\n };\n\n private updateCell = (\n row: LoadedRow,\n cell: HTMLElement,\n binding: Binding,\n rowIndex: number,\n cellPaddingLeft: (depth: number) => string\n ): void => {\n cell.style.position = 'absolute';\n cell.style.top = `${\n (this.viewportStartIndex + rowIndex) * this.rowHeight\n }px`;\n cell.style.boxSizing = 'border-box';\n cell.style.height = `${this.rowHeight}px`;\n cell.style.width = '100%';\n cell.style.paddingLeft = cellPaddingLeft(row.node.depth);\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n (cell as any).tree = this.tree;\n (cell as any).node = row.node;\n (cell as any).hoverController = this.cellHoverController;\n (cell as any).isScrolling = this.isScrolling;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n\n binding.bind(row);\n };\n\n private updateLayoutPosition = (): void => {\n readDOM(() => {\n if (this.tableElement != null) {\n this.layoutOffset = getSceneTreeTableOffsetTop(this.tableElement);\n }\n });\n };\n\n private recomputeColumnWidths = (): void => {\n const layoutWidth = this.getLayoutWidth();\n if (\n layoutWidth != null &&\n this.stateMap.columnWidths.length ===\n this.stateMap.columnWidthPercentages.length\n ) {\n this.stateMap.columnWidths = this.stateMap.columnWidthPercentages.map(\n (w) => w * layoutWidth\n );\n }\n };\n\n private recomputeColumnPercentages = (): void => {\n const layoutWidth = this.getLayoutWidth();\n if (\n layoutWidth != null &&\n this.stateMap.columnWidths.length ===\n this.stateMap.columnWidthPercentages.length\n ) {\n this.stateMap.columnWidthPercentages = this.stateMap.columnWidths.map(\n (w) => w / layoutWidth\n );\n }\n };\n\n private computeInitialColumnWidths = (): void => {\n this.stateMap.columnWidths = this.columnElements.map(\n (c) => c.initialWidth ?? 100\n );\n\n const layoutWidth = this.getLayoutWidth();\n if (layoutWidth != null) {\n this.stateMap.columnWidthPercentages = this.columnElements.map(\n (c) => (c.initialWidth ?? 100) / layoutWidth\n );\n }\n };\n\n private updateColumnElements = (): void => {\n this.columnElements = Array.from(\n this.hostEl.querySelectorAll('vertex-scene-tree-table-column')\n ) as Array<HTMLVertexSceneTreeTableColumnElement>;\n };\n\n private createPools(): void {\n if (this.stateMap.columnElementPools == null) {\n this.stateMap.columnElementPools = this.columnElements.reduce(\n (map, c) =>\n map.set(\n c,\n new ElementPool(c, () => this.createColumnCellInstance(c))\n ),\n new WeakMap()\n );\n }\n }\n\n private recreateColumnPools(): void {\n this.columnElements.forEach((c) => {\n if (this.stateMap.columnElementPools?.get(c) == null) {\n this.stateMap.columnElementPools?.set(\n c,\n new ElementPool(c, () => this.createColumnCellInstance(c))\n );\n } else {\n this.stateMap.columnElementPools\n .get(c)\n ?.updateElementFactory(() => this.createColumnCellInstance(c));\n }\n });\n }\n\n private iterateColumns(\n f: (\n column: HTMLVertexSceneTreeTableColumnElement,\n pool: ElementPool,\n index: number\n ) => void\n ): void {\n this.columnElements.forEach((column, i) => {\n const pool = this.stateMap.columnElementPools?.get(column);\n if (pool != null) {\n f(column, pool, i);\n } else {\n throw new Error('Cannot find pool for column');\n }\n });\n }\n\n private ensureDividerTemplateDefined(): void {\n const template = this.hostEl.querySelector(\n 'template[slot=\"divider\"]'\n ) as HTMLTemplateElement;\n if (template == null) {\n const defaultDividerTemplate = document.createElement('template');\n defaultDividerTemplate.slot = 'divider';\n defaultDividerTemplate.innerHTML = `\n <vertex-scene-tree-table-resize-divider slot=\"divider\">\n </vertex-scene-tree-table-resize-divider>\n `;\n this.hostEl.appendChild(defaultDividerTemplate);\n }\n }\n\n private createHeaderInstance(\n column: HTMLVertexSceneTreeTableColumnElement\n ): InstancedTemplate<HTMLElement> | undefined {\n const template = column.querySelector(\n 'template[slot=\"header\"]'\n ) as HTMLTemplateElement;\n if (template != null) {\n return generateInstanceFromTemplate(template);\n }\n }\n\n private createDividerInstance(): InstancedTemplate<HTMLElement> {\n const template = this.hostEl.querySelector(\n 'template[slot=\"divider\"]'\n ) as HTMLTemplateElement;\n if (template != null) {\n return generateInstanceFromTemplate(template);\n } else {\n throw new Error('Table is missing divider template element');\n }\n }\n\n private createColumnCellInstance(\n column: HTMLVertexSceneTreeTableColumnElement\n ): InstancedTemplate<HTMLElement> {\n const template = column.querySelector(\n 'template:not([slot=\"header\"])'\n ) as HTMLTemplateElement;\n if (template != null) {\n return generateInstanceFromTemplate(template);\n } else {\n throw new Error('Column is missing cell template element');\n }\n }\n\n private computeCellHeight = async (): Promise<void> => {\n if (this.isComputingCellHeight && this.columnElements.length > 0) {\n const dummyData: LoadedRow = {\n index: 0,\n node: {\n id: { hex: '' },\n name: 'Dummy row',\n expanded: false,\n selected: false,\n visible: false,\n partiallyVisible: false,\n isLeaf: false,\n depth: 0,\n columnsList: [],\n filterHit: false,\n phantom: false,\n endItem: false,\n },\n metadata: {},\n data: {},\n };\n const { bindings, element } = this.createColumnCellInstance(\n this.columnElements[0]\n );\n bindings.bind(dummyData);\n element.style.visibility = 'hidden';\n\n this.columnElements[0]?.appendChild(element);\n\n /* eslint-disable @typescript-eslint/no-explicit-any */\n if (typeof (element as any).componentOnReady === 'function') {\n await (element as any).componentOnReady();\n }\n /* eslint-enable @typescript-eslint/no-explicit-any */\n\n let height = element.clientHeight;\n let attempts = 0;\n\n while (height === 0 && attempts < 10) {\n height = await new Promise((resolve) => {\n setTimeout(() => resolve(element.getBoundingClientRect().height), 5);\n });\n attempts = attempts + 1;\n }\n this.rowHeight = height ?? this.rowHeight;\n element.remove();\n this.isComputingCellHeight = false;\n }\n };\n\n private computeHeaderHeight = (): void => {\n if (this.stateMap.headerHeight == null) {\n this.stateMap.headerHeight =\n this.headerElement?.getBoundingClientRect().height;\n this.hostEl.style.setProperty(\n '--header-height',\n `${this.stateMap.headerHeight}px`\n );\n }\n };\n\n private computeColumnGridLayout = (): void => {\n if (this.stateMap.columnWidths.length === 0) {\n this.stateMap.columnWidths = this.columnElements.map(\n (c) => c.initialWidth ?? 100\n );\n }\n\n const layoutWidth = this.getLayoutWidth();\n if (layoutWidth != null) {\n if (this.stateMap.columnWidthPercentages.length === 0) {\n this.stateMap.columnWidthPercentages = this.columnElements.map(\n (c) => (c.initialWidth ?? 100) / layoutWidth\n );\n }\n }\n\n /**\n * This layout uses `1fr` instead of the final column width to\n * allow the final column to shrink when a scrollbar appears.\n *\n * This flex behavior is not desired for the header and divider\n * elements since they are not scrollable, and `columnGridFixedLayout`\n * should be used instead.\n */\n this.columnGridLayout = `${this.stateMap.columnWidths\n .slice(0, -1)\n .reduce((res, w) => `${res} ${w}px`, '')} 1fr`;\n\n this.columnGridFixedLayout = `${this.stateMap.columnWidths.reduce(\n (res, w) => `${res} ${w}px`,\n ''\n )}`;\n };\n\n private bindHeaderData = (): void => {\n if (this.stateMap.headerInstances == null) {\n this.stateMap.headerInstances = this.columnElements\n .map((c, i) => {\n const instance = this.createHeaderInstance(c);\n\n if (instance != null) {\n instance.element.style.paddingRight =\n i === this.columnElements.length - 1\n ? `0`\n : `var(--scene-tree-table-column-gap)`;\n instance.element.slot = 'header';\n instance.element.style.gridColumnStart = `${i + 1}`;\n instance.element.style.gridColumnEnd = `${i + 2}`;\n this.hostEl?.appendChild(instance.element);\n }\n\n return instance;\n })\n .filter((i) => i != null) as Array<InstancedTemplate<HTMLElement>>;\n }\n\n if (this.stateMap.headerDividerInstances == null) {\n this.stateMap.headerDividerInstances = this.columnElements\n .slice(0, -1)\n .map((_, i) => {\n const instance = this.createDividerInstance();\n\n instance.element.slot = 'divider';\n instance.element.style.position = 'absolute';\n instance.element.style.right = '0';\n instance.element.style.pointerEvents = 'auto';\n instance.element.style.gridColumnStart = `${i + 1}`;\n instance.element.style.gridColumnEnd = `${i + 2}`;\n this.hostEl?.appendChild(instance.element);\n\n return instance;\n });\n }\n };\n\n private rebindHeaderData = (): void => {\n this.removeDividerDragListeners();\n\n this.stateMap.headerInstances?.forEach((i) => i.element.remove());\n this.stateMap.headerDividerInstances?.forEach((i) => i.element.remove());\n this.stateMap.headerInstances = undefined;\n this.stateMap.headerDividerInstances = undefined;\n\n this.bindHeaderData();\n this.addDividerDragListeners();\n };\n\n private addDividerDragListeners(): void {\n this.stateMap.headerDividerListeners =\n this.stateMap.headerDividerInstances?.map((d, i) => {\n const listener = this.createDividerPointerDownHandler(i);\n\n d.element.addEventListener('pointerdown', listener);\n\n return listener;\n });\n }\n\n private removeDividerDragListeners(): void {\n if (this.stateMap.headerDividerListeners != null) {\n const listeners = this.stateMap.headerDividerListeners;\n\n this.stateMap.headerDividerInstances?.forEach((d, i) => {\n const listener = listeners[i];\n if (listener != null) {\n d.element.removeEventListener('pointerdown', listener);\n }\n });\n this.stateMap.headerDividerListeners = undefined;\n }\n }\n\n private createDividerPointerDownHandler = (\n index: number\n ): ((event: PointerEvent) => void) => {\n return (event: PointerEvent): void => {\n event.preventDefault();\n event.stopPropagation();\n\n this.lastDividerPointerPosition = Point.create(\n Math.floor(event.clientX),\n Math.floor(event.clientY)\n );\n this.resizingColumnIndex = index;\n this.stateMap.headerDividerInstances?.[index]?.element.classList.add(\n 'dragging'\n );\n\n window.addEventListener('pointermove', this.handleDividerPointerMove);\n window.addEventListener('pointerup', this.handleDividerPointerUp);\n };\n };\n\n private handleDividerPointerMove = (event: PointerEvent): void => {\n const current = Point.create(\n Math.floor(event.clientX),\n Math.floor(event.clientY)\n );\n\n if (\n this.lastDividerPointerPosition != null &&\n this.resizingColumnIndex != null\n ) {\n const diff = Point.subtract(this.lastDividerPointerPosition, current);\n\n if (\n Math.abs(diff.x) >= 1 &&\n this.isValidResize(diff, this.resizingColumnIndex)\n ) {\n this.stateMap.columnWidths[this.resizingColumnIndex] -= diff.x;\n\n if (this.resizingColumnIndex + 1 < this.stateMap.columnWidths.length) {\n this.stateMap.columnWidths[this.resizingColumnIndex + 1] += diff.x;\n }\n\n this.lastDividerPointerPosition = current;\n this.computeColumnGridLayout();\n }\n }\n };\n\n private handleDividerPointerUp = (): void => {\n if (this.resizingColumnIndex != null) {\n this.stateMap.headerDividerInstances?.[\n this.resizingColumnIndex\n ]?.element.classList.remove('dragging');\n }\n this.lastDividerPointerPosition = undefined;\n this.resizingColumnIndex = undefined;\n\n this.recomputeColumnPercentages();\n\n window.removeEventListener('pointermove', this.handleDividerPointerMove);\n window.removeEventListener('pointerup', this.handleDividerPointerUp);\n };\n\n private isValidResize = (diff: Point.Point, index: number): boolean => {\n const currentColumn = this.columnElements[index];\n const nextColumn = this.columnElements[index + 1];\n const currentWidth = this.stateMap.columnWidths[index];\n const nextWidth = this.stateMap.columnWidths[index + 1];\n const currentMinWidth = currentColumn.minWidth ?? 0;\n const currentMaxWidth = currentColumn.maxWidth ?? Number.MAX_SAFE_INTEGER;\n const nextMinWidth = nextColumn.minWidth ?? 0;\n const nextMaxWidth = nextColumn.maxWidth ?? Number.MAX_SAFE_INTEGER;\n\n const currentIsValid =\n currentWidth - diff.x > currentMinWidth &&\n currentWidth - diff.x < currentMaxWidth;\n const nextIsValid =\n nextColumn != null\n ? nextWidth + diff.x > nextMinWidth && nextWidth + diff.x < nextMaxWidth\n : true;\n\n return currentIsValid && nextIsValid;\n };\n\n private handleScrollChanged = (event: Event): void => {\n this.isScrolling = true;\n\n this.scrollTimer = restartTimeout(() => {\n this.isScrolling = false;\n }, this.scrollTimer);\n\n this.scrollOffset = (event.target as HTMLElement).scrollTop;\n this.computeAndUpdateViewportRows();\n };\n\n private getViewportRows(startIndex: number, endIndex: number): Row[] {\n const rows = this.rows.slice(startIndex, endIndex + 1);\n return rows.map((row) => (row != null ? this.populateRowData(row) : row));\n }\n\n private populateRowData(row: Row): Row {\n if (this.rowData != null && row != null) {\n const data = this.rowData?.(row) || {};\n return { ...row, data };\n } else {\n return row;\n }\n }\n\n private getLayoutHeight(): number | undefined {\n if (this.layoutHeight == null && this.tableElement != null) {\n this.layoutHeight = getSceneTreeViewportHeight(this.tableElement);\n }\n return this.layoutHeight;\n }\n\n private getLayoutWidth(): number | undefined {\n if (this.layoutWidth == null) {\n const computedWidth = getSceneTreeTableViewportWidth(this.hostEl);\n if (computedWidth > 0) {\n this.layoutWidth = computedWidth;\n }\n }\n return this.layoutWidth;\n }\n\n private clearLayoutHeight(): void {\n this.layoutHeight = undefined;\n }\n\n private clearLayoutWidth(): void {\n this.layoutWidth = undefined;\n }\n}\n",":host {\n /**\n * @prop --scene-tree-toolbar-content-gap: A CSS length that specifies the\n * horizontal gap between slots.\n */\n --scene-tree-toolbar-content-gap: 8px;\n\n display: flex;\n padding: 0.5rem;\n}\n\n.content {\n display: flex;\n align-items: center;\n}\n\n.content-primary {\n width: 100%;\n}\n\n::slotted(:not(:first-child)) {\n margin-left: var(--scene-tree-toolbar-content-gap);\n}\n","import { Component, h, Host } from '@stencil/core';\n\n/**\n * @slot The primary content that will be placed in the center of the toolbar\n * and stretch to container's available width.\n * @slot before - Content that is placed before the primary content.\n * @slot after - Content that is placed after the primary content.\n */\n@Component({\n tag: 'vertex-scene-tree-toolbar',\n styleUrl: 'scene-tree-toolbar.css',\n shadow: true,\n})\nexport class SceneTreeToolbar {\n protected render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <div class=\"content\">\n <slot name=\"before\" />\n </div>\n <div class=\"content content-primary\">\n <slot />\n </div>\n <div class=\"content\">\n <slot name=\"after\" />\n </div>\n </Host>\n );\n }\n}\n"]}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/*!
|
|
2
|
-
* Copyright (c) 2023 Vertex Software LLC. All rights reserved.
|
|
3
|
-
*/
|
|
4
|
-
import{c as t,u as e,a as s,b as r}from"./p-7f54de9d.js";import{I as i,a as n,b as o}from"./p-d45df0c0.js";import{v as a,b as u,a as h,m as c,q as l,r as d,p,d as w}from"./p-71fbe522.js";import{v,t as m,e as f,g as y,d as g,w as b,h as x}from"./p-39eab85b.js";import"./p-e1d82323.js";import{t as I}from"./p-7578885f.js";const O={opacity:255,glossiness:4,diffuse:{r:0,g:0,b:0,a:0},ambient:{r:0,g:0,b:0,a:0},specular:{r:0,g:0,b:0,a:0},emissive:{r:0,g:0,b:0,a:0}};const j=(t,e,s,r)=>Object.assign(Object.assign({},O),{opacity:r!==null&&r!==void 0?r:O.opacity,diffuse:{r:t,g:e,b:s,a:0}});const S=(e,s)=>{const r=t.fromHexString(e);return Object.assign(Object.assign({},O),{opacity:s!==null&&s!==void 0?s:O.opacity,diffuse:r!=null?Object.assign({},r):Object.assign({},O.diffuse)})};const B=Object.freeze({__proto__:null,defaultColor:O,create:j,fromHex:S});function E(t){var s;const r=e.parse(t);if(r.scheme!=="urn"||r.path==null){throw new Error("Invalid URN. Expected URN scheme.")}const[n,o,a,...u]=r.path.split(/[:/]/);if(n!=="vertexvis"){throw new Error("Invalid URN. Expected URN to be vertexvis namespace")}switch(o){case"stream-key":const t=k(r.query);const e=(s=T(u.join("/")))!==null&&s!==void 0?s:t.find((t=>t.type==="scene-view-state"));return{resource:{type:"stream-key",id:a},subResource:e,queries:t.filter((t=>t.type!=="scene-view-state"))};default:throw new i(`Invalid URN. Unknown resource type ${o}`)}}function T(t){if(t!=null){const[e,s]=t.split("/");switch(e){case"scene-view-states":return{type:"scene-view-state",id:s};default:return undefined}}}function k(t){if(t!=null){return t.split("&").map((t=>{const[e,s]=t.split("=");switch(e){case"supplied-id":return{type:"supplied-id",id:s};case"scene-view-state":return{type:"scene-view-state",id:s};default:throw new Error("Invalid URN. Unknown query value type")}}))}else{return[]}}const A=Object.freeze({__proto__:null,fromUrn:E});function V(t){return t.id!=null}function q(t){return t.suppliedId!=null}class C{constructor(t,e=new Date){this.knownRemoteTime=t;this.knownLocalTime=e}localOffset(){return this.duration(this.knownLocalTime,this.localNow())}localTime(t){const e=typeof t==="number"?new Date(this.knownLocalTime.getTime()+t):t;const s=this.duration(this.knownRemoteTime,e);return this.addDuration(this.knownLocalTime,s)}remoteOffset(t=new Date){return this.duration(this.remoteTime(this.knownLocalTime),this.remoteTime(t))}remoteNow(){return this.remoteTime(this.localNow())}remoteTime(t){const e=typeof t==="number"?new Date(this.knownLocalTime.getTime()+t):t;const s=this.duration(this.knownLocalTime,e);return this.addDuration(this.knownRemoteTime,s)}addDuration(t,e){return new Date(t.getTime()+e)}duration(t,e){return e.getTime()-t.getTime()}localNow(){return new Date(Date.now())}}const M=1e3*10;class P{constructor(t,e,s,r=M){this.stream=t;this.predicate=e;this.transform=s;this.timeout=r;this.listeners=[];this.handleMessage=this.handleMessage.bind(this)}on(t){this.listeners=[...this.listeners,t];if(this.eventDisposable==null||this.requestDisposable==null){this.addListeners()}}off(t){this.listeners=this.listeners.filter((e=>e!==t));if(this.listeners.length===0){this.removeListeners()}}once(){let t;return s.timeout(this.timeout,new Promise((e=>{t=s=>{e(s);this.off(t)};this.on(t)}))).finally((()=>{this.off(t)}))}handleMessage(t){if(this.predicate(t)){const e=this.transform(t);if(e!=null){this.listeners.forEach((t=>t(e)))}}}addListeners(){this.eventDisposable=this.stream.onEvent(this.handleMessage);this.requestDisposable=this.stream.onRequest(this.handleMessage)}removeListeners(){var t,e;(t=this.eventDisposable)===null||t===void 0?void 0:t.dispose();(e=this.requestDisposable)===null||e===void 0?void 0:e.dispose()}}class R{constructor(t,e,{animationId:s,correlationId:r},i){this.data=undefined;this.onAnimationCompleted=new P(t,(t=>{var e,r,i;return((i=(r=(e=t.event)===null||e===void 0?void 0:e.animationCompleted)===null||r===void 0?void 0:r.animationId)===null||i===void 0?void 0:i.hex)===s}),(t=>{var e,s,r;return((r=(s=(e=t.event)===null||e===void 0?void 0:e.animationCompleted)===null||s===void 0?void 0:s.animationId)===null||r===void 0?void 0:r.hex)||undefined}),i);this.onFrameReceived=new P(t,(t=>{var e,s,i;return!!((i=(s=(e=t.request)===null||e===void 0?void 0:e.drawFrame)===null||s===void 0?void 0:s.frameCorrelationIds)===null||i===void 0?void 0:i.some((t=>t===r)))}),(t=>{var s;return((s=t.request)===null||s===void 0?void 0:s.drawFrame)!=null?e(t.request.drawFrame):undefined}),i)}}function U(t){if(typeof t==="string"){return{sceneViewStateId:{hex:t}}}else if(V(t)){return{sceneViewStateId:{hex:t.id}}}else if(q(t)){return{sceneViewStateSuppliedId:{value:t.suppliedId}}}else{throw new Error("Unable to build scene view state identifier, input must be a string or `SceneViewStateIdentifier`.")}}function _(t,e){switch(t.type){case"and":case"or":return{operand:{itemCollection:{queries:t.expressions.map((t=>({sceneItemQuery:F(t)})))}}};case"not":return{not:{expression:_(t.query,e)}};case"item-id":case"supplied-id":return{operand:{item:{sceneItemQuery:F(t)}}};case"all":return{operand:{root:{}}};case"scene-tree-range":return{operand:{sceneTreeRange:{start:t.range.start,end:t.range.end}}};case"metadata":return{operand:{metadata:{valueFilter:t.filter,keys:t.keys,exactMatch:t.exactMatch}}};case"all-selected":return{operand:{override:{selection:{}}}};case"point":return{operand:{point:{point:t.point,viewport:e.dimensions}}};case"volume-intersection":return{operand:{volume:{frustumByRectangle:{rectangle:t.rectangle},exclusive:t.exclusive,viewport:e.dimensions}}};default:return{}}}function D(t,e,s){const r=z(e);const i=_(t,s);return{queryExpression:i,operationTypes:r}}function F(t){switch(t.type){case"item-id":return{id:new v.protobuf.core.Uuid({hex:t.value})};case"supplied-id":return{suppliedId:t.value};default:return{}}}function N(t,e,s){const r={frameCorrelationId:{value:t},animation:s?{duration:I(s.milliseconds)}:undefined};switch(e.flyTo.type){case"supplied":{return Object.assign(Object.assign({},r),{itemSuppliedId:e.flyTo.data})}case"internal":{return Object.assign(Object.assign({},r),{itemId:new v.protobuf.core.Uuid({hex:e.flyTo.data})})}case"camera":{return Object.assign(Object.assign({},r),{camera:m(e.flyTo.data)})}case"bounding-box":{return Object.assign(Object.assign({},r),{boundingBox:{xmin:e.flyTo.data.min.x,xmax:e.flyTo.data.max.x,ymin:e.flyTo.data.min.y,ymax:e.flyTo.data.max.y,zmin:e.flyTo.data.min.z,zmax:e.flyTo.data.max.z}})}default:return{}}}function z(t){return t.map((t=>{var e,s;switch(t.type){case"change-material":return{changeMaterial:{material:{d:t.material.opacity,ns:t.material.glossiness,ka:t.material.ambient,kd:t.material.diffuse,ks:t.material.specular,ke:t.material.emissive}}};case"clear-override":return{changeMaterial:{}};case"change-transform":return{changeTransform:{transform:Object.assign({},t.transform)}};case"clear-transform":return{clearTransform:{cascade:t.cascade}};case"hide":return{changeVisibility:{visible:false}};case"show":return{changeVisibility:{visible:true}};case"select":return{changeSelection:{selected:true}};case"deselect":return{changeSelection:{selected:false}};case"change-phantom":return{changePhantom:{phantom:(e=t.phantomState)!==null&&e!==void 0?e:true}};case"clear-phantom":return{changePhantom:{phantom:false}};case"change-end-item":return{changeEndItem:{endItem:(s=t.endItemState)!==null&&s!==void 0?s:true}};case"clear-end-item":return{changeEndItem:{endItem:false}};default:return{}}}))}function H(t){return t.map((t=>{switch(t){case"camera":return v.protobuf.stream.SceneViewStateFeature.SCENE_VIEW_STATE_FEATURE_CAMERA;case"material_overrides":return v.protobuf.stream.SceneViewStateFeature.SCENE_VIEW_STATE_FEATURE_MATERIAL_OVERRIDE;case"selection":return v.protobuf.stream.SceneViewStateFeature.SCENE_VIEW_STATE_FEATURE_SELECTION;case"visibility":return v.protobuf.stream.SceneViewStateFeature.SCENE_VIEW_STATE_FEATURE_VISIBILITY;case"transforms":return v.protobuf.stream.SceneViewStateFeature.SCENE_VIEW_STATE_FEATURE_TRANSFORM;case"cross_section":return v.protobuf.stream.SceneViewStateFeature.SCENE_VIEW_STATE_FEATURE_CROSS_SECTION;default:return v.protobuf.stream.SceneViewStateFeature.SCENE_VIEW_STATE_FEATURE_INVALID}}))}const Y=.008726646259972;class L{constructor(t){this.flyToOptions=t}build(){return this.flyToOptions}}class Q{withItemId(t){return new L({flyTo:{type:"internal",data:t}})}withSuppliedId(t){return new L({flyTo:{type:"supplied",data:t}})}withCamera(t){return new L({flyTo:{type:"camera",data:t}})}withBoundingBox(t){return new L({flyTo:{type:"bounding-box",data:t}})}build(){return this.flyToOptions}}class W{constructor(t,e,s,r,i,n){this.stream=t;this.aspect=e;this.data=s;this.boundingBox=r;this.decodeFrame=i;this.flyToOptions=n}fitCameraToBoundingBox(t,e,s){const r=a.scale(e,a.normalize(s));const i=u.center(t);const n=a.subtract(i,r);return this.update({lookAt:i,position:n,viewVector:r})}signedDistanceToBoundingBoxCenter(t){const{position:e,viewVector:s}=b(this.data);const r=u.center(t!==null&&t!==void 0?t:this.boundingBox);const i=a.subtract(r,e);return a.dot(s,i)/a.magnitude(s)}flyTo(t){if(typeof t!=="function"){return this.updateFlyToOptions({flyTo:this.buildFlyToType(t)})}else{return this.updateFlyToOptions(t(new Q).build())}}viewAll(){return this.fitToBoundingBox(this.boundingBox)}async render(t){var e,s,i;if(this.flyToOptions==null&&t!=null){this.flyToOptions={flyTo:{type:"camera",data:this.data}}}try{const n=r.create();if(this.flyToOptions!=null){const r=N(n,this.flyToOptions,t===null||t===void 0?void 0:t.animation);const o=await this.stream.flyTo(r,true);return new R(this.stream,this.decodeFrame,{correlationId:n,animationId:((s=(e=o.flyTo)===null||e===void 0?void 0:e.animationId)===null||s===void 0?void 0:s.hex)||undefined},((i=t===null||t===void 0?void 0:t.animation)===null||i===void 0?void 0:i.milliseconds)!=null?t.animation.milliseconds+M:undefined)}else{this.stream.replaceCamera({camera:m(this.data),frameCorrelationId:{value:n}});return new R(this.stream,this.decodeFrame,{correlationId:n})}}catch(t){console.warn("Error when performing render: ",t);throw t}}rotateAroundAxis(t,e){return this.rotateAroundAxisAtPoint(t,this.data.lookAt,e)}alignTo(t,e){const s=a.normalize(a.cross(this.up,a.normalize(this.viewVector)));const r=a.normalize(a.cross(a.normalize(this.viewVector),s));const i=a.angleTo(e,r)>Math.PI/2?a.negate(r):r;const n=a.isEqual(i,e)?s:a.normalize(a.cross(i,e));const o=a.transformMatrix(this.viewVector,c.makeRotation(l.fromAxisAngle(n,a.angleTo(e,i))));const u=d.create({origin:t,direction:a.normalize(o)});const h=d.at(u,a.magnitude(this.viewVector));return this.update({position:t,lookAt:h,up:e})}standardView(t){return this.update({position:t.position,viewVector:a.subtract(a.origin(),t.position),lookAt:a.origin(),up:t.up})}buildFlyToType(t){if(t.boundingBox!=null){return{type:"bounding-box",data:t.boundingBox}}else if(t.camera!=null){return{type:"camera",data:t.camera}}else if(t.itemId!=null){return{type:"internal",data:t.itemId}}else if(t.itemSuppliedId!=null){return{type:"supplied",data:t.itemSuppliedId}}else{throw new Error("Fly to must specify at least one option.")}}computeClippingPlanes(t){return x(this.boundingBox,t)}}class $ extends W{constructor(t,e,s,r,i,n){super(t,e,s,r,i,n);this.perspectiveData=s}moveBy(t){return this.update({position:a.add(this.position,t),lookAt:a.add(this.lookAt,t)})}rotateAroundAxisAtPoint(t,e,s){return this.update({position:a.rotateAboutAxis(t,this.position,s,e),lookAt:a.rotateAboutAxis(t,this.lookAt,s,e),up:a.rotateAboutAxis(t,this.up,s,a.origin())})}fitToBoundingBox(t){var e;const s=1.1*a.magnitude(a.subtract(t.max,u.center(t)));let r=Math.tan(((e=this.fovY)!==null&&e!==void 0?e:45)*Y);if(this.aspect<1){r*=this.aspect}const i=Math.abs(s/r);return super.fitCameraToBoundingBox(t,i,this.viewVector)}update(t){var e;const s=(e=t.fovY)!==null&&e!==void 0?e:this.fovY;return new $(this.stream,this.aspect,Object.assign(Object.assign(Object.assign({},this.perspectiveData),t),{fovY:s}),this.boundingBox,this.decodeFrame,this.flyToOptions)}toFrameCamera(){var t;return new f(this.position,this.lookAt,this.up,this.near,this.far,this.aspectRatio,(t=this.fovY)!==null&&t!==void 0?t:45)}get viewVector(){return a.subtract(this.lookAt,this.position)}get position(){return Object.assign({},this.perspectiveData.position)}get up(){return Object.assign({},this.perspectiveData.up)}get lookAt(){return Object.assign({},this.perspectiveData.lookAt)}get fovY(){return this.perspectiveData.fovY}get aspectRatio(){return this.aspect}get near(){const{near:t}=this.computeClippingPlanes(this.perspectiveData);return t}get far(){const{far:t}=this.computeClippingPlanes(this.perspectiveData);return t}updateFlyToOptions(t){return new $(this.stream,this.aspect,this.perspectiveData,this.boundingBox,this.decodeFrame,t)}}class G extends W{constructor(t,e,s,r,i,n){super(t,e,s,r,i,n);this.orthographicData=s}moveBy(t){return this.update({lookAt:a.add(this.lookAt,t)})}rotateAroundAxisAtPoint(t,e,s){const r=a.rotateAboutAxis(t,this.lookAt,s,e);const i=a.rotateAboutAxis(t,this.position,s,e);const n=y(a.subtract(r,i),h.create(this.boundingBox));return this.update({viewVector:n,lookAt:r,up:a.rotateAboutAxis(t,this.up,s,a.origin())})}fitToBoundingBox(t){const e=h.create(t);const s=super.fitCameraToBoundingBox(t,e.radius,this.viewVector);return this.update({lookAt:s.lookAt,viewVector:s.viewVector,fovHeight:e.radius*2})}update(t){return new G(this.stream,this.aspect,Object.assign(Object.assign({},this.orthographicData),t),this.boundingBox,this.decodeFrame,this.flyToOptions)}toFrameCamera(){return new g(y(this.viewVector,h.create(this.boundingBox)),this.lookAt,this.up,this.near,this.far,this.aspectRatio,this.fovHeight)}get viewVector(){return Object.assign({},this.orthographicData.viewVector)}get position(){return a.add(this.lookAt,a.negate(this.viewVector))}get up(){return Object.assign({},this.orthographicData.up)}get lookAt(){return Object.assign({},this.orthographicData.lookAt)}get fovHeight(){return this.orthographicData.fovHeight}get aspectRatio(){return this.aspect}get near(){const{near:t}=this.computeClippingPlanes(this.orthographicData);return t}get far(){const{far:t}=this.computeClippingPlanes(this.orthographicData);return t}updateFlyToOptions(t){return new G(this.stream,this.aspect,this.orthographicData,this.boundingBox,this.decodeFrame,t)}}class J{constructor(t,e){this.stream=t;this.imageScaleProvider=e}async hitItems(t,e){const s=this.imageScaleProvider();const r=await this.stream.hitItems({point:p.scale(t,(s===null||s===void 0?void 0:s.x)||1,(s===null||s===void 0?void 0:s.y)||1),includeMetadata:e===null||e===void 0?void 0:e.includeMetadata},true);return r.hitItems||undefined}}class K{constructor(t,e){this.stream=t;this.data=e}async update(t){const e=await this.stream.updateCrossSectioning({crossSectioning:{sectionPlanes:t.sectionPlanes,highlightColor:t.highlightColor,lineWidth:(t===null||t===void 0?void 0:t.lineWidth)!=null?{value:t.lineWidth}:null}},true);return e.updateCrossSectioning||undefined}current(){return this.data}}class X{constructor(t=[]){this.operations=t}build(){return this.operations.concat()}materialOverride(t){return new X(this.operations.concat([{type:"change-material",material:t}]))}show(){return new X(this.operations.concat([{type:"show"}]))}hide(){return new X(this.operations.concat([{type:"hide"}]))}select(){return new X(this.operations.concat([{type:"select"}]))}deselect(){return new X(this.operations.concat([{type:"deselect"}]))}clearMaterialOverrides(){return new X(this.operations.concat([{type:"clear-override"}]))}transform(t){return new X(this.operations.concat([{type:"change-transform",transform:t}]))}clearTransforms(t=true){return new X(this.operations.concat([{type:"clear-transform",cascade:t}]))}setPhantom(t){return new X(this.operations.concat([{type:"change-phantom",phantomState:t}]))}clearPhantom(){return new X(this.operations.concat([{type:"clear-phantom"}]))}setEndItem(t){return new X(this.operations.concat([{type:"change-end-item",endItemState:t}]))}clearEndItem(){return new X(this.operations.concat([{type:"clear-end-item"}]))}}class Z{constructor(t){this.inverted=t}build(){if(this.inverted){return{type:"not",query:this.queryExpressionBuilder()}}else{return this.queryExpressionBuilder()}}}class tt{constructor(t=false){this.inverted=t}all(){return new st}not(){return new et(!this.inverted)}withItemIds(t){return new ut(t,"item-id",this.inverted)}withSuppliedIds(t){return new ut(t,"supplied-id",this.inverted)}withItemId(t){return new ht({type:"item-id",value:t},this.inverted)}withSuppliedId(t){return new ht({type:"supplied-id",value:t},this.inverted)}withSceneTreeRange(t){return new rt(t,this.inverted)}withMetadata(t,e,s){return new it(t,e,s,this.inverted)}withSelected(){return new nt(this.inverted)}withPoint(t){return new ot(t,this.inverted)}withVolumeIntersection(t,e){return new at(t,this.inverted,e)}}class et extends tt{constructor(t){super(t)}}class st extends Z{constructor(t=false){super(t)}queryExpressionBuilder(){return{type:"all"}}}class rt extends Z{constructor(t,e){super(e);this.range=t}queryExpressionBuilder(){return{type:"scene-tree-range",range:this.range}}}class it extends Z{constructor(t,e,s,r){super(r);this.filter=t;this.keys=e;this.exactMatch=s}queryExpressionBuilder(){return{type:"metadata",filter:this.filter,keys:this.keys,exactMatch:this.exactMatch}}}class nt extends Z{constructor(t){super(t)}queryExpressionBuilder(){return{type:"all-selected"}}}class ot extends Z{constructor(t,e){super(e);this.point=t}queryExpressionBuilder(){return{type:"point",point:this.point}}}class at extends Z{constructor(t,e,s){super(e);this.rectangle=t;this.exclusive=s}queryExpressionBuilder(){return{type:"volume-intersection",rectangle:this.rectangle,exclusive:!!this.exclusive}}}class ut extends Z{constructor(t,e,s){super(s);this.ids=t;this.type=e}queryExpressionBuilder(){return{type:"or",expressions:this.ids.map((t=>({type:this.type,value:t})))}}}class ht extends Z{constructor(t,e){super(e);this.query=t}queryExpressionBuilder(){return Object.assign({},this.query)}and(){return new lt([this.query],this.inverted)}or(){return new ct([this.query],this.inverted)}}class ct extends Z{constructor(t,e){super(e);this.expressions=t}queryExpressionBuilder(){return{type:"or",expressions:[...this.expressions]}}withItemId(t){return new ct([...this.expressions,{type:"item-id",value:t}],this.inverted)}withSuppliedId(t){return new ct([...this.expressions,{type:"supplied-id",value:t}],this.inverted)}or(){return this}}class lt extends Z{constructor(t,e){super(e);this.expressions=t}queryExpressionBuilder(){return{type:"and",expressions:[...this.expressions]}}withItemId(t){return new lt([...this.expressions,{type:"item-id",value:t}],this.inverted)}withSuppliedId(t){return new lt([...this.expressions,{type:"supplied-id",value:t}],this.inverted)}and(){return this}}class dt{where(t){const e=t(new tt).build();return new pt(e)}}class pt{constructor(t,e){this.query=t;this.builder=e!=null?e:new X}materialOverride(t){if(typeof t==="string"){return new pt(this.query,this.builder.materialOverride(S(t)))}else{return new pt(this.query,this.builder.materialOverride(t))}}hide(){return new pt(this.query,this.builder.hide())}show(){return new pt(this.query,this.builder.show())}select(){return new pt(this.query,this.builder.select())}deselect(){return new pt(this.query,this.builder.deselect())}clearMaterialOverrides(){return new pt(this.query,this.builder.clearMaterialOverrides())}transform(t){if(Array.isArray(t)){if(t.length!==16){throw new o("Matrix provided must contain exactly 16 values (4x4).")}return new pt(this.query,this.builder.transform({r0:{x:t[0],y:t[1],z:t[2],w:t[3]},r1:{x:t[4],y:t[5],z:t[6],w:t[7]},r2:{x:t[8],y:t[9],z:t[10],w:t[11]},r3:{x:t[12],y:t[13],z:t[14],w:t[15]}}))}else{return new pt(this.query,this.builder.transform(t))}}clearTransforms(t=true){return new pt(this.query,this.builder.clearTransforms(t))}setPhantom(t){return new pt(this.query,this.builder.setPhantom(t))}clearPhantom(){return new pt(this.query,this.builder.clearPhantom())}setEndItem(t){return new pt(this.query,this.builder.setEndItem(t))}clearEndItem(){return new pt(this.query,this.builder.clearEndItem())}build(){return{query:this.query,operations:this.builder.build()}}}class wt{constructor(t,e,s,r){this.sceneViewId=t;this.stream=e;this.dimensions=s;this.queryOperations=r}async execute(t){const e=this.queryOperations.map((t=>D(t.query,t.operations,{dimensions:this.dimensions})));const s={sceneViewId:{hex:this.sceneViewId},operations:e,suppliedCorrelationId:(t===null||t===void 0?void 0:t.suppliedCorrelationId)!=null?{value:t===null||t===void 0?void 0:t.suppliedCorrelationId}:undefined};await this.stream.createSceneAlteration(s)}}class vt{constructor(t,e,s,r,i,n,o){this.stream=t;this.frame=e;this.decodeFrame=s;this.imageScaleProvider=r;this.dimensions=i;this.sceneId=n;this.sceneViewId=o}async applySceneViewState(t,e={}){const s=U(t);return await this.stream.loadSceneViewState(Object.assign(Object.assign({},s),{frameCorrelationId:e.suppliedCorrelationId?{value:e.suppliedCorrelationId}:undefined}),true)}async applyPartialSceneViewState(t,e,s={}){const r=U(t);const i=H(e);return await this.stream.loadSceneViewState(Object.assign(Object.assign({},r),{frameCorrelationId:s.suppliedCorrelationId?{value:s.suppliedCorrelationId}:undefined,sceneViewStateFeatureSubset:i}),true)}async reset(t={}){return await this.stream.resetSceneView({includeCamera:t.includeCamera,frameCorrelationId:t.suppliedCorrelationId?{value:t.suppliedCorrelationId}:undefined},true)}items(t){const e=t(new dt);const s=Array.isArray(e)?e:[e];const r=s.reduce(((t,e)=>t.concat(e.build())),[]);return new wt(this.sceneViewId,this.stream,this.dimensions,r)}camera(){const{scene:t}=this.frame;if(t.camera.isOrthographic()){return new G(this.stream,w.aspectRatio(this.viewport()),{viewVector:t.camera.viewVector,lookAt:t.camera.lookAt,up:t.camera.up,fovHeight:t.camera.fovHeight},this.frame.scene.boundingBox,this.decodeFrame)}else if(t.camera.isPerspective()){return new $(this.stream,w.aspectRatio(this.viewport()),{position:t.camera.position,lookAt:t.camera.lookAt,up:t.camera.up,fovY:t.camera.fovY},this.frame.scene.boundingBox,this.decodeFrame)}else{throw new n("Cannot retrieve camera. Scene has an unknown or invalid camera type.")}}boundingBox(){return this.frame.scene.boundingBox}crossSectioning(){return new K(this.stream,this.frame.scene.crossSection)}raycaster(){return new J(this.stream,this.imageScaleProvider)}viewport(){return this.frame.dimensions}scale(){return this.imageScaleProvider()||p.create(1,1)}}export{vt as S,C as a,B as c,E as f,A as l};
|
|
5
|
-
//# sourceMappingURL=p-c3be5b4d.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["src/lib/scenes/colorMaterial.ts","src/lib/types/loadableResource.ts","src/lib/types/sceneViewStateIdentifier.ts","src/lib/types/synchronizedClock.ts","src/lib/stream/dispatcher.ts","src/lib/scenes/cameraRenderResult.ts","src/lib/scenes/mapper.ts","src/lib/scenes/camera.ts","src/lib/scenes/raycaster.ts","src/lib/scenes/crossSectioner.ts","src/lib/scenes/operations.ts","src/lib/scenes/queries.ts","src/lib/scenes/scene.ts"],"names":["defaultColor","opacity","glossiness","diffuse","r","g","b","a","ambient","specular","emissive","create","Object","assign","fromHex","hex","color","Color","fromHexString","fromUrn","urn","uri","Uri","parse","scheme","path","Error","nid","resourceType","resourceId","subResourcePath","split","queries","fromQuery","query","subResource","_a","fromSubResourcePath","join","find","q","type","resource","id","filter","InvalidResourceUrnError","subResourceType","subResourceId","undefined","map","queryFragment","isSceneViewStateId","identifier","isSceneViewStateSuppliedId","suppliedId","SynchronizedClock","[object Object]","knownRemoteTime","knownLocalTime","Date","this","duration","localNow","remoteTimeOrDurationInMs","remoteTime","getTime","addDuration","localTime","localTimeOrDurationInMs","start","end","now","DEFAULT_TIMEOUT_IN_MS","StreamApiEventDispatcher","stream","predicate","transform","timeout","listeners","handleMessage","bind","listener","eventDisposable","requestDisposable","addListeners","l","length","removeListeners","handler","Async","Promise","resolve","data","off","on","finally","msg","transformed","forEach","onEvent","onRequest","dispose","_b","CameraRenderResult","decodeFrame","animationId","correlationId","onAnimationCompleted","_c","event","animationCompleted","onFrameReceived","request","drawFrame","frameCorrelationIds","some","buildSceneViewStateIdentifier","sceneViewStateId","SceneViewStateIdentifier.isSceneViewStateId","SceneViewStateIdentifier.isSceneViewStateSuppliedId","sceneViewStateSuppliedId","value","buildQueryExpression","context","operand","itemCollection","expressions","exp","sceneItemQuery","buildSceneItemQuery","not","expression","item","root","sceneTreeRange","range","metadata","valueFilter","keys","exactMatch","override","selection","point","viewport","dimensions","volume","frustumByRectangle","rectangle","exclusive","buildSceneOperation","operations","operationTypes","buildOperationTypes","queryExpression","vertexvis","protobuf","core","Uuid","buildFlyToOperation","frameCorrelationId","options","animation","payload","toProtoDuration","milliseconds","flyTo","itemSuppliedId","itemId","camera","FrameCamera.toProtobuf","boundingBox","xmin","min","x","xmax","max","ymin","y","ymax","zmin","z","zmax","op","changeMaterial","material","d","ns","ka","kd","ks","ke","changeTransform","clearTransform","cascade","changeVisibility","visible","changeSelection","selected","changePhantom","phantom","phantomState","changeEndItem","endItem","endItemState","toPbSceneViewStateFeatures","features","feature","SceneViewStateFeature","SCENE_VIEW_STATE_FEATURE_CAMERA","SCENE_VIEW_STATE_FEATURE_MATERIAL_OVERRIDE","SCENE_VIEW_STATE_FEATURE_SELECTION","SCENE_VIEW_STATE_FEATURE_VISIBILITY","SCENE_VIEW_STATE_FEATURE_TRANSFORM","SCENE_VIEW_STATE_FEATURE_CROSS_SECTION","SCENE_VIEW_STATE_FEATURE_INVALID","PI_OVER_360","TerminalFlyToExecutor","flyToOptions","FlyToExecutor","Camera","aspect","distance","viewVector","vvec","Vector3","scale","normalize","lookAt","BoundingBox","center","position","subtract","update","withPositionAndViewVector","boundingBoxCenter","cameraToCenter","dot","magnitude","paramsOrQuery","updateFlyToOptions","buildFlyToType","build","fitToBoundingBox","renderOptions","corrId","UUID","flyToResponse","replaceCamera","e","console","warn","angleInRadians","axis","rotateAroundAxisAtPoint","normal","worldX","cross","up","positiveWorldY","worldY","angleTo","Math","PI","negate","localX","isEqual","transformedViewVector","transformMatrix","Matrix4","makeRotation","Quaternion","fromAxisAngle","lookAtRay","Ray","origin","direction","at","standardView","ClippingPlanes.fromBoundingBoxAndLookAtCamera","PerspectiveCamera","perspectiveData","super","delta","add","rotateAboutAxis","radius","hOverD","tan","fovY","abs","fitCameraToBoundingBox","FramePerspectiveCamera","near","far","aspectRatio","computeClippingPlanes","OrthographicCamera","orthographicData","updatedLookAt","updatedPosition","constrainViewVector","BoundingSphere","boundingSphere","fitAll","fovHeight","FrameOrthographicCamera","Raycaster","imageScaleProvider","res","hitItems","Point","includeMetadata","CrossSectioner","crossSectioning","updateCrossSectioning","sectionPlanes","highlightColor","lineWidth","SceneOperationBuilder","concat","matrix","TerminalQuery","inverted","queryExpressionBuilder","RootQuery","AllQuery","NotQuery","ids","BulkQuery","SingleQuery","SceneTreeRangeQuery","MetadataQuery","AllSelectedQuery","PointQuery","VolumeIntersectionQuery","AndQuery","OrQuery","SceneItemQueryExecutor","SceneItemOperationsBuilder","givenBuilder","builder","materialOverride","hide","show","select","deselect","clearMaterialOverrides","Array","isArray","InvalidArgumentError","r0","w","r1","r2","r3","clearTransforms","setPhantom","clearPhantom","setEndItem","clearEndItem","ItemsOperationExecutor","sceneViewId","queryOperations","executionOptions","pbOperations","suppliedCorrelationId","createSceneAlteration","Scene","frame","sceneId","opts","pbIdField","loadSceneViewState","featuresToApply","pbFeatures","sceneViewStateFeatureSubset","resetSceneView","includeCamera","sceneOperations","ops","operationList","reduce","acc","scene","isOrthographic","Dimensions","isPerspective","InvalidCameraError","crossSection"],"mappings":"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","sourcesContent":["import { Color } from '@vertexvis/utils';\n\n/**\n * The `ColorMaterial` interface is here.\n */\nexport interface ColorMaterial {\n opacity: number;\n glossiness: number;\n diffuse: Color.Color;\n ambient: Color.Color;\n specular: Color.Color;\n emissive: Color.Color;\n}\n\nexport const defaultColor: ColorMaterial = {\n opacity: 255,\n glossiness: 4,\n diffuse: {\n r: 0,\n g: 0,\n b: 0,\n a: 0,\n },\n ambient: {\n r: 0,\n g: 0,\n b: 0,\n a: 0,\n },\n\n specular: {\n r: 0,\n g: 0,\n b: 0,\n a: 0,\n },\n emissive: {\n r: 0,\n g: 0,\n b: 0,\n a: 0,\n },\n};\n\n/**\n * This helper creats an rgb value color\n * @param hex\n * @param opacity\n */\nexport const create = (\n r: number,\n g: number,\n b: number,\n opacity?: number\n): ColorMaterial => {\n return {\n ...defaultColor,\n opacity: opacity ?? defaultColor.opacity,\n diffuse: {\n r,\n g,\n b,\n a: 0,\n },\n };\n};\n\n/**\n * This helper converts a hex string to a ColorMaterial object\n * @param hex\n * @param opacity\n */\nexport const fromHex = (hex: string, opacity?: number): ColorMaterial => {\n const color = Color.fromHexString(hex);\n\n return {\n ...defaultColor,\n opacity: opacity ?? defaultColor.opacity,\n diffuse: color != null ? { ...color } : { ...defaultColor.diffuse },\n };\n};\n","import { Uri } from '@vertexvis/utils';\n\nimport { InvalidResourceUrnError } from '../errors';\n\ninterface StreamKeyResource {\n type: 'stream-key';\n id: string;\n}\n\nexport type LoadableResource = StreamKeyResource;\n\nexport interface Resource {\n resource: LoadableResource;\n subResource?: PathResource;\n queries: QueryValue[];\n}\n\nexport function fromUrn(urn: string): Resource {\n const uri = Uri.parse(urn);\n\n if (uri.scheme !== 'urn' || uri.path == null) {\n throw new Error('Invalid URN. Expected URN scheme.');\n }\n\n const [nid, resourceType, resourceId, ...subResourcePath] =\n uri.path.split(/[:/]/);\n\n if (nid !== 'vertexvis') {\n throw new Error('Invalid URN. Expected URN to be vertexvis namespace');\n }\n\n switch (resourceType) {\n case 'stream-key':\n const queries = fromQuery(uri.query);\n const subResource =\n fromSubResourcePath(subResourcePath.join('/')) ??\n (queries.find((q) => q.type === 'scene-view-state') as\n | SceneViewStateResource\n | undefined);\n\n return {\n resource: { type: 'stream-key', id: resourceId },\n subResource,\n queries: queries.filter((q) => q.type !== 'scene-view-state'),\n };\n default:\n throw new InvalidResourceUrnError(\n `Invalid URN. Unknown resource type ${resourceType}`\n );\n }\n}\n\nexport interface SceneViewStateResource {\n type: 'scene-view-state';\n id?: string;\n}\n\nexport type PathResource = SceneViewStateResource;\n\nfunction fromSubResourcePath(path?: string): PathResource | undefined {\n if (path != null) {\n const [subResourceType, subResourceId] = path.split('/');\n\n switch (subResourceType) {\n case 'scene-view-states':\n return {\n type: 'scene-view-state',\n id: subResourceId,\n };\n default:\n return undefined;\n }\n }\n}\n\nexport interface SuppliedIdQueryValue {\n type: 'supplied-id';\n id: string;\n}\n\nexport type QueryValue = SceneViewStateResource | SuppliedIdQueryValue;\n\nfunction fromQuery(query?: string): QueryValue[] {\n if (query != null) {\n return query.split('&').map((queryFragment) => {\n const [resourceType, resourceId] = queryFragment.split('=');\n\n switch (resourceType) {\n case 'supplied-id':\n return { type: 'supplied-id', id: resourceId };\n case 'scene-view-state':\n return { type: 'scene-view-state', id: resourceId };\n default:\n throw new Error('Invalid URN. Unknown query value type');\n }\n });\n } else {\n return [];\n }\n}\n","import { UUID } from '@vertexvis/utils';\n\nexport interface SceneViewStateId {\n id: UUID.UUID;\n}\n\nexport interface SceneViewStateSuppliedId {\n suppliedId: string;\n}\n\n/**\n * An object describing an ID for the scene view state. Can either be an\n * object containing the ID generated on creation, or an object containing\n * a supplied id provided during creation.\n */\nexport type SceneViewStateIdentifier =\n | SceneViewStateId\n | SceneViewStateSuppliedId;\n\nexport function isSceneViewStateId(\n identifier: SceneViewStateIdentifier\n): identifier is SceneViewStateId {\n return (identifier as SceneViewStateId).id != null;\n}\n\nexport function isSceneViewStateSuppliedId(\n identifier: SceneViewStateIdentifier\n): identifier is SceneViewStateSuppliedId {\n return (identifier as SceneViewStateSuppliedId).suppliedId != null;\n}\n","type Milliseconds = number;\n\n/**\n * A `SynchronizedClock` allows for approximating the time on a remote machine.\n *\n * During initialization, a known time of the remote host must be supplied. Once\n * the remote time is known, this class can approximate the time on the remote\n * machine from a date or duration.\n *\n * @example\n * ```\n * const knownRemoteTime = await getRemoteTime();\n * const clock = new SynchronizedClock(knownRemoteTime);\n *\n * const localDate = new Date();\n * const serverTime = clock.remoteTime(localDate);\n *\n * const remoteDate = await getRemoteTime();\n * const localTime = clock.localTime(remoteDate);\n *\n * const currentRemoteTime = clock.remoteNow();\n * ```\n */\nexport class SynchronizedClock {\n public constructor(\n public readonly knownRemoteTime: Date,\n public readonly knownLocalTime = new Date()\n ) {}\n\n /**\n * Computes an offset duration from when this clock was instantiated.\n */\n public localOffset(): Milliseconds {\n return this.duration(this.knownLocalTime, this.localNow());\n }\n\n /**\n * Approximates the local time from a timestamp originating from the remote\n * machine.\n *\n * @param remoteTime A remote timestamp.\n */\n public localTime(remoteTime: Date): Date;\n\n /**\n * Approximates the local from an offset duration originating from the remote\n * machine's last known time.\n *\n * @param remoteDurationInMs A remote duration, in milliseconds.\n */\n public localTime(remoteDurationInMs: Milliseconds): Date;\n\n /**\n * Approximates the local time from a remote timestamp or duration.\n *\n * @param remoteTimeOrDurationInMs A remote timestamp or duration.\n */\n public localTime(remoteTimeOrDurationInMs: Milliseconds | Date): Date {\n const remoteTime =\n typeof remoteTimeOrDurationInMs === 'number'\n ? new Date(this.knownLocalTime.getTime() + remoteTimeOrDurationInMs)\n : remoteTimeOrDurationInMs;\n const duration = this.duration(this.knownRemoteTime, remoteTime);\n return this.addDuration(this.knownLocalTime, duration);\n }\n\n /**\n * Approximates an offset duration on the remote machine.\n *\n * @param localTime A local timestamp. Defaults to the current local time.\n */\n public remoteOffset(localTime: Date = new Date()): Milliseconds {\n return this.duration(\n this.remoteTime(this.knownLocalTime),\n this.remoteTime(localTime)\n );\n }\n\n /**\n * Approximates the current time on the remote machine.\n */\n public remoteNow(): Date {\n return this.remoteTime(this.localNow());\n }\n\n /**\n * Approximates the remote time from a local timestamp.\n *\n * @param localTime A local timestamp.\n */\n public remoteTime(localTime: Date): Date;\n\n /**\n * Approximates the remote time from a local offset duration.\n *\n * @param localDurationInMs A local offset, in milliseconds.\n * @see #localOffset\n */\n public remoteTime(localDurationInMs: Milliseconds): Date;\n\n /**\n * Approximates the remote time from either a local timestamp or duration.\n *\n * @param localTimeOrDurationInMs A local timestamp or duration.\n */\n public remoteTime(localTimeOrDurationInMs: Milliseconds | Date): Date {\n const localTime =\n typeof localTimeOrDurationInMs === 'number'\n ? new Date(this.knownLocalTime.getTime() + localTimeOrDurationInMs)\n : localTimeOrDurationInMs;\n const duration = this.duration(this.knownLocalTime, localTime);\n return this.addDuration(this.knownRemoteTime, duration);\n }\n\n private addDuration(start: Date, duration: Milliseconds): Date {\n return new Date(start.getTime() + duration);\n }\n\n private duration(start: Date, end: Date): Milliseconds {\n return end.getTime() - start.getTime();\n }\n\n private localNow(): Date {\n return new Date(Date.now());\n }\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { StreamApi } from '@vertexvis/stream-api';\nimport { Async, Disposable, Listener } from '@vertexvis/utils';\n\nexport const DEFAULT_TIMEOUT_IN_MS = 1000 * 10;\n\nexport class StreamApiEventDispatcher<T> {\n private listeners: Array<Listener<T>> = [];\n private eventDisposable?: Disposable;\n private requestDisposable?: Disposable;\n\n public constructor(\n private stream: StreamApi,\n private predicate: (\n msg: vertexvis.protobuf.stream.IStreamMessage\n ) => boolean,\n private transform: (\n msg: vertexvis.protobuf.stream.IStreamMessage\n ) => T | undefined,\n private timeout: number = DEFAULT_TIMEOUT_IN_MS\n ) {\n this.handleMessage = this.handleMessage.bind(this);\n }\n\n public on(listener: Listener<T>): void {\n this.listeners = [...this.listeners, listener];\n if (this.eventDisposable == null || this.requestDisposable == null) {\n this.addListeners();\n }\n }\n\n public off(listener: Listener<T>): void {\n this.listeners = this.listeners.filter((l) => l !== listener);\n if (this.listeners.length === 0) {\n this.removeListeners();\n }\n }\n\n public once(): Promise<T> {\n let handler: (data: T) => void;\n return Async.timeout(\n this.timeout,\n new Promise<T>((resolve) => {\n handler = (data: T) => {\n resolve(data);\n this.off(handler);\n };\n\n this.on(handler);\n })\n ).finally(() => {\n this.off(handler);\n });\n }\n\n private handleMessage(msg: vertexvis.protobuf.stream.IStreamMessage): void {\n if (this.predicate(msg)) {\n const transformed = this.transform(msg);\n\n if (transformed != null) {\n this.listeners.forEach((l) => l(transformed));\n }\n }\n }\n\n private addListeners(): void {\n this.eventDisposable = this.stream.onEvent(this.handleMessage);\n this.requestDisposable = this.stream.onRequest(this.handleMessage);\n }\n\n private removeListeners(): void {\n this.eventDisposable?.dispose();\n this.requestDisposable?.dispose();\n }\n}\n","import { StreamApi } from '@vertexvis/stream-api';\n\nimport type { FrameDecoder } from '../mappers';\nimport { StreamApiEventDispatcher } from '../stream/dispatcher';\nimport { Result } from '../stream/result';\nimport { Frame } from '../types';\n\nexport interface RenderResultIds {\n animationId?: string;\n correlationId?: string;\n}\n\nexport class CameraRenderResult implements Result {\n public data = undefined;\n public onAnimationCompleted: StreamApiEventDispatcher<string>;\n public onFrameReceived: StreamApiEventDispatcher<Frame>;\n\n public constructor(\n stream: StreamApi,\n decodeFrame: FrameDecoder,\n { animationId, correlationId }: RenderResultIds,\n timeout?: number\n ) {\n this.onAnimationCompleted = new StreamApiEventDispatcher(\n stream,\n (msg) => msg.event?.animationCompleted?.animationId?.hex === animationId,\n (msg) => msg.event?.animationCompleted?.animationId?.hex || undefined,\n timeout\n );\n this.onFrameReceived = new StreamApiEventDispatcher<Frame>(\n stream,\n (msg) =>\n !!msg.request?.drawFrame?.frameCorrelationIds?.some(\n (id) => id === correlationId\n ),\n (msg) =>\n msg.request?.drawFrame != null\n ? decodeFrame(msg.request.drawFrame)\n : undefined,\n timeout\n );\n }\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { Dimensions } from '@vertexvis/geometry';\nimport { toProtoDuration } from '@vertexvis/stream-api';\nimport { UUID } from '@vertexvis/utils';\n\nimport {\n Animation,\n FlyTo,\n FrameCamera,\n SceneViewStateIdentifier,\n} from '../types';\nimport { ItemOperation } from './operations';\nimport { QueryExpression } from './queries';\nimport { SceneViewStateFeature } from './scene';\n\nexport interface BuildSceneOperationContext {\n dimensions: Dimensions.Dimensions;\n}\n\nexport function buildSceneViewStateIdentifier(\n identifier: UUID.UUID | SceneViewStateIdentifier.SceneViewStateIdentifier\n):\n | Pick<\n vertexvis.protobuf.stream.ILoadSceneViewStatePayload,\n 'sceneViewStateId'\n >\n | Pick<\n vertexvis.protobuf.stream.ILoadSceneViewStatePayload,\n 'sceneViewStateSuppliedId'\n > {\n if (typeof identifier === 'string') {\n return { sceneViewStateId: { hex: identifier } };\n } else if (SceneViewStateIdentifier.isSceneViewStateId(identifier)) {\n return { sceneViewStateId: { hex: identifier.id } };\n } else if (SceneViewStateIdentifier.isSceneViewStateSuppliedId(identifier)) {\n return { sceneViewStateSuppliedId: { value: identifier.suppliedId } };\n } else {\n throw new Error(\n 'Unable to build scene view state identifier, input must be a string or `SceneViewStateIdentifier`.'\n );\n }\n}\n\nexport function buildQueryExpression(\n query: QueryExpression,\n context: BuildSceneOperationContext\n): vertexvis.protobuf.stream.IQueryExpression {\n switch (query.type) {\n case 'and':\n case 'or':\n return {\n operand: {\n itemCollection: {\n queries: query.expressions.map((exp) => ({\n sceneItemQuery: buildSceneItemQuery(exp),\n })),\n },\n },\n };\n case 'not':\n return {\n not: {\n expression: buildQueryExpression(query.query, context),\n },\n };\n case 'item-id':\n case 'supplied-id':\n return {\n operand: {\n item: {\n sceneItemQuery: buildSceneItemQuery(query),\n },\n },\n };\n case 'all':\n return {\n operand: {\n root: {},\n },\n };\n case 'scene-tree-range':\n return {\n operand: {\n sceneTreeRange: {\n start: query.range.start,\n end: query.range.end,\n },\n },\n };\n case 'metadata':\n return {\n operand: {\n metadata: {\n valueFilter: query.filter,\n keys: query.keys,\n exactMatch: query.exactMatch,\n },\n },\n };\n case 'all-selected':\n return {\n operand: {\n override: {\n selection: {},\n },\n },\n };\n case 'point':\n return {\n operand: {\n point: {\n point: query.point,\n viewport: context.dimensions,\n },\n },\n };\n case 'volume-intersection':\n return {\n operand: {\n volume: {\n frustumByRectangle: {\n rectangle: query.rectangle,\n },\n exclusive: query.exclusive,\n viewport: context.dimensions,\n },\n },\n };\n default:\n return {};\n }\n}\n\nexport function buildSceneOperation(\n query: QueryExpression,\n operations: ItemOperation[],\n context: BuildSceneOperationContext\n): vertexvis.protobuf.stream.ISceneOperation {\n const operationTypes = buildOperationTypes(operations);\n\n const queryExpression = buildQueryExpression(query, context);\n\n return {\n queryExpression,\n operationTypes,\n };\n}\n\nfunction buildSceneItemQuery(\n item: QueryExpression\n): vertexvis.protobuf.stream.ISceneItemQuery {\n switch (item.type) {\n case 'item-id':\n return {\n id: new vertexvis.protobuf.core.Uuid({\n hex: item.value,\n }),\n };\n case 'supplied-id':\n return {\n suppliedId: item.value,\n };\n default:\n return {};\n }\n}\n\nexport function buildFlyToOperation(\n frameCorrelationId: UUID.UUID,\n options: FlyTo.FlyToOptions,\n animation?: Animation.Animation\n): vertexvis.protobuf.stream.IFlyToPayload {\n const payload = {\n frameCorrelationId: {\n value: frameCorrelationId,\n },\n animation: animation\n ? {\n duration: toProtoDuration(animation.milliseconds),\n }\n : undefined,\n };\n\n switch (options.flyTo.type) {\n case 'supplied': {\n return {\n ...payload,\n itemSuppliedId: options.flyTo.data,\n };\n }\n case 'internal': {\n return {\n ...payload,\n itemId: new vertexvis.protobuf.core.Uuid({\n hex: options.flyTo.data,\n }),\n };\n }\n case 'camera': {\n return {\n ...payload,\n camera: FrameCamera.toProtobuf(options.flyTo.data),\n };\n }\n\n case 'bounding-box': {\n return {\n ...payload,\n boundingBox: {\n xmin: options.flyTo.data.min.x,\n xmax: options.flyTo.data.max.x,\n ymin: options.flyTo.data.min.y,\n ymax: options.flyTo.data.max.y,\n zmin: options.flyTo.data.min.z,\n zmax: options.flyTo.data.max.z,\n },\n };\n }\n default:\n return {};\n }\n}\n\nfunction buildOperationTypes(\n operations: ItemOperation[]\n): vertexvis.protobuf.stream.IOperationType[] {\n return operations.map((op) => {\n switch (op.type) {\n case 'change-material':\n return {\n changeMaterial: {\n material: {\n d: op.material.opacity,\n ns: op.material.glossiness,\n ka: op.material.ambient,\n kd: op.material.diffuse,\n ks: op.material.specular,\n ke: op.material.emissive,\n },\n },\n };\n case 'clear-override':\n return {\n changeMaterial: {},\n };\n case 'change-transform':\n return {\n changeTransform: {\n transform: { ...op.transform },\n },\n };\n case 'clear-transform':\n return {\n clearTransform: {\n cascade: op.cascade,\n },\n };\n case 'hide':\n return {\n changeVisibility: {\n visible: false,\n },\n };\n case 'show':\n return {\n changeVisibility: {\n visible: true,\n },\n };\n case 'select':\n return {\n changeSelection: { selected: true },\n };\n case 'deselect':\n return {\n changeSelection: { selected: false },\n };\n case 'change-phantom':\n return {\n changePhantom: { phantom: op.phantomState ?? true },\n };\n case 'clear-phantom':\n return {\n changePhantom: { phantom: false },\n };\n case 'change-end-item':\n return {\n changeEndItem: { endItem: op.endItemState ?? true },\n };\n case 'clear-end-item':\n return {\n changeEndItem: { endItem: false },\n };\n default:\n return {};\n }\n });\n}\n\nexport function toPbSceneViewStateFeatures(\n features: SceneViewStateFeature[]\n): vertexvis.protobuf.stream.SceneViewStateFeature[] {\n return features.map((feature) => {\n switch (feature) {\n case 'camera':\n return vertexvis.protobuf.stream.SceneViewStateFeature\n .SCENE_VIEW_STATE_FEATURE_CAMERA;\n case 'material_overrides':\n return vertexvis.protobuf.stream.SceneViewStateFeature\n .SCENE_VIEW_STATE_FEATURE_MATERIAL_OVERRIDE;\n case 'selection':\n return vertexvis.protobuf.stream.SceneViewStateFeature\n .SCENE_VIEW_STATE_FEATURE_SELECTION;\n case 'visibility':\n return vertexvis.protobuf.stream.SceneViewStateFeature\n .SCENE_VIEW_STATE_FEATURE_VISIBILITY;\n case 'transforms':\n return vertexvis.protobuf.stream.SceneViewStateFeature\n .SCENE_VIEW_STATE_FEATURE_TRANSFORM;\n case 'cross_section':\n return vertexvis.protobuf.stream.SceneViewStateFeature\n .SCENE_VIEW_STATE_FEATURE_CROSS_SECTION;\n default:\n return vertexvis.protobuf.stream.SceneViewStateFeature\n .SCENE_VIEW_STATE_FEATURE_INVALID;\n }\n });\n}\n","import {\n BoundingBox,\n BoundingSphere,\n Matrix4,\n Quaternion,\n Ray,\n Vector3,\n} from '@vertexvis/geometry';\nimport { StreamApi } from '@vertexvis/stream-api';\nimport { UUID } from '@vertexvis/utils';\n\nimport { FrameDecoder } from '../mappers';\nimport { constrainViewVector } from '../rendering/vectors';\nimport { DEFAULT_TIMEOUT_IN_MS } from '../stream/dispatcher';\nimport {\n Animation,\n ClippingPlanes,\n FlyTo,\n FrameCamera,\n FrameCameraBase,\n FrameOrthographicCamera,\n FramePerspectiveCamera,\n StandardView,\n} from '../types';\nimport { withPositionAndViewVector } from '../types/frameCamera';\nimport { CameraRenderResult } from './cameraRenderResult';\nimport { buildFlyToOperation } from './mapper';\n\nconst PI_OVER_360 = 0.008726646259972;\n\ninterface CameraRenderOptions {\n animation?: Animation.Animation;\n}\n\nexport class TerminalFlyToExecutor {\n public constructor(private flyToOptions?: FlyTo.FlyToOptions) {}\n\n public build(): FlyTo.FlyToOptions | undefined {\n return this.flyToOptions;\n }\n}\n\nexport class FlyToExecutor {\n private flyToOptions?: FlyTo.FlyToOptions;\n\n public withItemId(id: string): TerminalFlyToExecutor {\n return new TerminalFlyToExecutor({\n flyTo: {\n type: 'internal',\n data: id,\n },\n });\n }\n\n public withSuppliedId(id: string): TerminalFlyToExecutor {\n return new TerminalFlyToExecutor({\n flyTo: {\n type: 'supplied',\n data: id,\n },\n });\n }\n\n public withCamera(camera: FrameCamera.FrameCamera): TerminalFlyToExecutor {\n return new TerminalFlyToExecutor({\n flyTo: {\n type: 'camera',\n data: camera,\n },\n });\n }\n\n public withBoundingBox(\n boundingBox: BoundingBox.BoundingBox\n ): TerminalFlyToExecutor {\n return new TerminalFlyToExecutor({\n flyTo: {\n type: 'bounding-box',\n data: boundingBox,\n },\n });\n }\n\n public build(): FlyTo.FlyToOptions | undefined {\n return this.flyToOptions;\n }\n}\n\nexport interface FlyToParams {\n itemId?: string;\n camera?: FrameCamera.FrameCamera;\n boundingBox?: BoundingBox.BoundingBox;\n itemSuppliedId?: string;\n}\n\n/**\n * The `Camera` class contains properties that reflect a world space position, a\n * view direction (lookAt), and normalized vector representing the up direction.\n *\n * It also provides utility methods to update orientation of the camera and\n * rerender the scene.\n *\n * This class in intended to treated as an immutable type. Any mutations return\n * a new instance of the class with the updated properties.\n */\nexport abstract class Camera {\n public constructor(\n protected stream: StreamApi,\n protected aspect: number,\n private data: FrameCamera.FrameCamera,\n protected boundingBox: BoundingBox.BoundingBox,\n protected decodeFrame: FrameDecoder,\n protected flyToOptions?: FlyTo.FlyToOptions\n ) {}\n\n protected fitCameraToBoundingBox(\n boundingBox: BoundingBox.BoundingBox,\n distance: number,\n viewVector: Vector3.Vector3\n ): Camera {\n const vvec = Vector3.scale(distance, Vector3.normalize(viewVector));\n\n const lookAt = BoundingBox.center(boundingBox);\n const position = Vector3.subtract(lookAt, vvec);\n\n return this.update({ lookAt, position, viewVector: vvec });\n }\n\n /**\n * Returns the distance from the camera's position to the center\n * of the provided bounding box (or the scene's visible bounding box if not provided).\n *\n * @param boundingBox - The bounding box to determine distance from.\n */\n public signedDistanceToBoundingBoxCenter(\n boundingBox?: BoundingBox.BoundingBox\n ): number {\n const { position, viewVector } = withPositionAndViewVector(this.data);\n\n const boundingBoxCenter = BoundingBox.center(\n boundingBox ?? this.boundingBox\n );\n const cameraToCenter = Vector3.subtract(boundingBoxCenter, position);\n\n return (\n Vector3.dot(viewVector, cameraToCenter) / Vector3.magnitude(viewVector)\n );\n }\n\n /**\n * Specifies that the next render of the camera will be repositioned to one of\n * the options specified in `options`.\n *\n * @param paramsOrQuery An object or query describing how the camera should\n * be positioned.\n */\n public flyTo(\n paramsOrQuery: FlyToParams | ((q: FlyToExecutor) => TerminalFlyToExecutor)\n ): Camera {\n if (typeof paramsOrQuery !== 'function') {\n return this.updateFlyToOptions({\n flyTo: this.buildFlyToType(paramsOrQuery),\n });\n } else {\n return this.updateFlyToOptions(\n paramsOrQuery(new FlyToExecutor()).build()\n );\n }\n }\n\n public viewAll(): Camera {\n return this.fitToBoundingBox(this.boundingBox);\n }\n\n /**\n * Queues the rendering for a new frame using this camera. The returned\n * promise will resolve when a frame is received that contains this camera.\n */\n public async render(\n renderOptions?: CameraRenderOptions\n ): Promise<CameraRenderResult> {\n if (this.flyToOptions == null && renderOptions != null) {\n this.flyToOptions = {\n flyTo: {\n type: 'camera',\n data: this.data,\n },\n };\n }\n\n try {\n const corrId = UUID.create();\n if (this.flyToOptions != null) {\n const payload = buildFlyToOperation(\n corrId,\n this.flyToOptions,\n renderOptions?.animation\n );\n const flyToResponse = await this.stream.flyTo(payload, true);\n\n return new CameraRenderResult(\n this.stream,\n this.decodeFrame,\n {\n correlationId: corrId,\n animationId: flyToResponse.flyTo?.animationId?.hex || undefined,\n },\n renderOptions?.animation?.milliseconds != null\n ? renderOptions.animation.milliseconds + DEFAULT_TIMEOUT_IN_MS\n : undefined\n );\n } else {\n this.stream.replaceCamera({\n camera: FrameCamera.toProtobuf(this.data),\n frameCorrelationId: { value: corrId },\n });\n\n return new CameraRenderResult(this.stream, this.decodeFrame, {\n correlationId: corrId,\n });\n }\n } catch (e) {\n console.warn('Error when performing render: ', e);\n throw e;\n }\n }\n\n /**\n * Repositions the camera by rotating its current position around an axis.\n *\n * @param angleInRadians The angle, in radians, to rotate.\n * @param axis A normalized vector to rotate around.\n */\n public rotateAroundAxis(\n angleInRadians: number,\n axis: Vector3.Vector3\n ): Camera {\n return this.rotateAroundAxisAtPoint(angleInRadians, this.data.lookAt, axis);\n }\n\n /**\n * Aligns the camera to the plane defined by the provided position and normal.\n * This will place the camera at the provided position, set the up vector to\n * the provided normal, and place the lookAt on the defined plane. The point\n * chosen for the lookAt will be determined using the current view vector.\n *\n * @param position The position to place the camera at.\n * @param normal The normal of the plane to align to.\n */\n public alignTo(position: Vector3.Vector3, normal: Vector3.Vector3): Camera {\n const worldX = Vector3.normalize(\n Vector3.cross(this.up, Vector3.normalize(this.viewVector))\n );\n const positiveWorldY = Vector3.normalize(\n Vector3.cross(Vector3.normalize(this.viewVector), worldX)\n );\n\n // Invert the world y axis if the provided normal is more than 90 degrees from it\n // to compute a proper angle to rotate the view vector by\n const worldY =\n Vector3.angleTo(normal, positiveWorldY) > Math.PI / 2\n ? Vector3.negate(positiveWorldY)\n : positiveWorldY;\n const localX = Vector3.isEqual(worldY, normal)\n ? worldX\n : Vector3.normalize(Vector3.cross(worldY, normal));\n\n const transformedViewVector = Vector3.transformMatrix(\n this.viewVector,\n Matrix4.makeRotation(\n Quaternion.fromAxisAngle(localX, Vector3.angleTo(normal, worldY))\n )\n );\n const lookAtRay = Ray.create({\n origin: position,\n direction: Vector3.normalize(transformedViewVector),\n });\n const lookAt = Ray.at(lookAtRay, Vector3.magnitude(this.viewVector));\n\n return this.update({\n position,\n lookAt,\n up: normal,\n });\n }\n\n /**\n * Updates the `position` and `up` vectors of the camera to the given standard\n * view.\n *\n * @param standardView The standard view to apply.\n * @returns A new camera.\n */\n public standardView(standardView: StandardView): Camera {\n return this.update({\n position: standardView.position,\n viewVector: Vector3.subtract(Vector3.origin(), standardView.position),\n lookAt: Vector3.origin(),\n up: standardView.up,\n });\n }\n\n private buildFlyToType(options: FlyToParams): FlyTo.FlyToType {\n if (options.boundingBox != null) {\n return { type: 'bounding-box', data: options.boundingBox };\n } else if (options.camera != null) {\n return { type: 'camera', data: options.camera };\n } else if (options.itemId != null) {\n return { type: 'internal', data: options.itemId };\n } else if (options.itemSuppliedId != null) {\n return { type: 'supplied', data: options.itemSuppliedId };\n } else {\n throw new Error('Fly to must specify at least one option.');\n }\n }\n\n protected computeClippingPlanes(\n camera: FrameCamera.FrameCamera\n ): ClippingPlanes.ClippingPlanes {\n return ClippingPlanes.fromBoundingBoxAndLookAtCamera(\n this.boundingBox,\n camera\n );\n }\n\n /**\n * Repositions the camera by rotating its current position around an axis\n * defined at a specific world point.\n *\n * @param angleInRadians The angle, in radians, to rotate.\n * @param point The point in world space to place the axis at.\n * @param axis A normalized vector to rotate around.\n */\n public abstract rotateAroundAxisAtPoint(\n angleInRadians: number,\n point: Vector3.Vector3,\n axis: Vector3.Vector3\n ): Camera;\n\n /**\n * Updates the position of the camera such that the given bounding box will\n * be contained within the camera's view.\n *\n * @param boundingBox The bounding box to position to.\n */\n public abstract fitToBoundingBox(\n boundingBox: BoundingBox.BoundingBox\n ): Camera;\n\n public abstract get position(): Vector3.Vector3;\n public abstract get lookAt(): Vector3.Vector3;\n public abstract get up(): Vector3.Vector3;\n public abstract get near(): number;\n public abstract get far(): number;\n public abstract get aspectRatio(): number;\n public abstract get viewVector(): Vector3.Vector3;\n\n /**\n * Shifts the position of the camera by the given delta.\n *\n * @param delta The number of units to shift the camera on the X, Y, and Z\n * axis.\n */\n public abstract moveBy(delta: Vector3.Vector3): Camera;\n\n /**\n * Updates the `position`, `lookAt` and/or `up` vectors of the camera.\n *\n * @param camera The values to update the camera to.\n */\n public abstract update(camera: Partial<FrameCamera.FrameCamera>): Camera;\n\n /**\n * Returns a `FrameCameraBase` representation.\n */\n public abstract toFrameCamera(): FrameCameraBase;\n\n protected abstract updateFlyToOptions(\n flyToOptions?: FlyTo.FlyToOptions\n ): Camera;\n}\n\nexport class PerspectiveCamera\n extends Camera\n implements FrameCamera.PerspectiveFrameCamera\n{\n public constructor(\n stream: StreamApi,\n aspect: number,\n private perspectiveData: FrameCamera.PerspectiveFrameCamera,\n boundingBox: BoundingBox.BoundingBox,\n decodeFrame: FrameDecoder,\n flyToOptions?: FlyTo.FlyToOptions\n ) {\n super(\n stream,\n aspect,\n perspectiveData,\n boundingBox,\n decodeFrame,\n flyToOptions\n );\n }\n\n /**\n * Shifts the position of the camera by the given delta.\n *\n * @param delta The number of units to shift the camera on the X, Y, and Z\n * axis.\n */\n public moveBy(delta: Vector3.Vector3): Camera {\n return this.update({\n position: Vector3.add(this.position, delta),\n lookAt: Vector3.add(this.lookAt, delta),\n });\n }\n\n public rotateAroundAxisAtPoint(\n angleInRadians: number,\n point: Vector3.Vector3,\n axis: Vector3.Vector3\n ): Camera {\n return this.update({\n position: Vector3.rotateAboutAxis(\n angleInRadians,\n this.position,\n axis,\n point\n ),\n lookAt: Vector3.rotateAboutAxis(angleInRadians, this.lookAt, axis, point),\n up: Vector3.rotateAboutAxis(\n angleInRadians,\n this.up,\n axis,\n Vector3.origin()\n ),\n });\n }\n\n public fitToBoundingBox(boundingBox: BoundingBox.BoundingBox): Camera {\n const radius =\n 1.1 *\n Vector3.magnitude(\n Vector3.subtract(boundingBox.max, BoundingBox.center(boundingBox))\n );\n\n // ratio of the height of the frustum to the distance along the view vector\n let hOverD = Math.tan((this.fovY ?? 45) * PI_OVER_360);\n\n if (this.aspect < 1.0) {\n hOverD *= this.aspect;\n }\n\n const distance = Math.abs(radius / hOverD);\n\n return super.fitCameraToBoundingBox(boundingBox, distance, this.viewVector);\n }\n\n public update(camera: Partial<FrameCamera.PerspectiveFrameCamera>): Camera {\n const fovY = camera.fovY ?? this.fovY;\n return new PerspectiveCamera(\n this.stream,\n this.aspect,\n { ...this.perspectiveData, ...camera, fovY },\n this.boundingBox,\n this.decodeFrame,\n this.flyToOptions\n );\n }\n\n public toFrameCamera(): FramePerspectiveCamera {\n return new FramePerspectiveCamera(\n this.position,\n this.lookAt,\n this.up,\n this.near,\n this.far,\n this.aspectRatio,\n this.fovY ?? 45\n );\n }\n\n public get viewVector(): Vector3.Vector3 {\n return Vector3.subtract(this.lookAt, this.position);\n }\n\n /**\n * The position vector for the camera, in world space coordinates.\n */\n public get position(): Vector3.Vector3 {\n return { ...this.perspectiveData.position };\n }\n\n /**\n * A normalized vector representing the up direction.\n */\n public get up(): Vector3.Vector3 {\n return { ...this.perspectiveData.up };\n }\n\n /**\n * A vector, in world space coordinates, of where the camera is pointed at.\n */\n public get lookAt(): Vector3.Vector3 {\n return { ...this.perspectiveData.lookAt };\n }\n\n /**\n * The camera's field of view.\n */\n public get fovY(): number | undefined {\n return this.perspectiveData.fovY;\n }\n\n /**\n * The aspect ratio of the camera.\n */\n public get aspectRatio(): number {\n return this.aspect;\n }\n\n /**\n * The camera's near clipping plane.\n */\n public get near(): number {\n const { near } = this.computeClippingPlanes(this.perspectiveData);\n return near;\n }\n\n /**\n * The camera's far clipping plane.\n */\n public get far(): number {\n const { far } = this.computeClippingPlanes(this.perspectiveData);\n return far;\n }\n\n protected updateFlyToOptions(\n flyToOptions?: FlyTo.FlyToOptions\n ): PerspectiveCamera {\n return new PerspectiveCamera(\n this.stream,\n this.aspect,\n this.perspectiveData,\n this.boundingBox,\n this.decodeFrame,\n flyToOptions\n );\n }\n}\n\nexport class OrthographicCamera\n extends Camera\n implements FrameCamera.OrthographicFrameCamera\n{\n public constructor(\n stream: StreamApi,\n aspect: number,\n private orthographicData: FrameCamera.OrthographicFrameCamera,\n boundingBox: BoundingBox.BoundingBox,\n decodeFrame: FrameDecoder,\n flyToOptions?: FlyTo.FlyToOptions\n ) {\n super(\n stream,\n aspect,\n orthographicData,\n boundingBox,\n decodeFrame,\n flyToOptions\n );\n }\n\n /**\n * Shifts the position of the camera by the given delta.\n *\n * @param delta The number of units to shift the camera on the X, Y, and Z\n * axis.\n */\n public moveBy(delta: Vector3.Vector3): Camera {\n return this.update({\n lookAt: Vector3.add(this.lookAt, delta),\n });\n }\n\n public rotateAroundAxisAtPoint(\n angleInRadians: number,\n point: Vector3.Vector3,\n axis: Vector3.Vector3\n ): Camera {\n const updatedLookAt = Vector3.rotateAboutAxis(\n angleInRadians,\n this.lookAt,\n axis,\n point\n );\n const updatedPosition = Vector3.rotateAboutAxis(\n angleInRadians,\n this.position,\n axis,\n point\n );\n const viewVector = constrainViewVector(\n Vector3.subtract(updatedLookAt, updatedPosition),\n BoundingSphere.create(this.boundingBox)\n );\n\n return this.update({\n viewVector: viewVector,\n lookAt: updatedLookAt,\n up: Vector3.rotateAboutAxis(\n angleInRadians,\n this.up,\n axis,\n Vector3.origin()\n ),\n });\n }\n\n public fitToBoundingBox(boundingBox: BoundingBox.BoundingBox): Camera {\n const boundingSphere = BoundingSphere.create(boundingBox);\n\n const fitAll = super.fitCameraToBoundingBox(\n boundingBox,\n boundingSphere.radius,\n this.viewVector\n );\n\n return this.update({\n lookAt: fitAll.lookAt,\n viewVector: fitAll.viewVector,\n fovHeight: boundingSphere.radius * 2,\n });\n }\n\n public update(camera: Partial<FrameCamera.FrameCamera>): Camera {\n return new OrthographicCamera(\n this.stream,\n this.aspect,\n { ...this.orthographicData, ...camera },\n this.boundingBox,\n this.decodeFrame,\n this.flyToOptions\n );\n }\n\n public toFrameCamera(): FrameOrthographicCamera {\n return new FrameOrthographicCamera(\n constrainViewVector(\n this.viewVector,\n BoundingSphere.create(this.boundingBox)\n ),\n this.lookAt,\n this.up,\n this.near,\n this.far,\n this.aspectRatio,\n this.fovHeight\n );\n }\n\n public get viewVector(): Vector3.Vector3 {\n return { ...this.orthographicData.viewVector };\n }\n\n public get position(): Vector3.Vector3 {\n return Vector3.add(this.lookAt, Vector3.negate(this.viewVector));\n }\n\n /**\n * A normalized vector representing the up direction.\n */\n public get up(): Vector3.Vector3 {\n return { ...this.orthographicData.up };\n }\n\n /**\n * A vector, in world space coordinates, of where the camera is pointed at.\n */\n public get lookAt(): Vector3.Vector3 {\n return { ...this.orthographicData.lookAt };\n }\n\n /**\n * The camera's field of view.\n */\n public get fovHeight(): number {\n return this.orthographicData.fovHeight;\n }\n\n /**\n * The aspect ratio of the camera.\n */\n public get aspectRatio(): number {\n return this.aspect;\n }\n\n /**\n * The camera's near clipping plane.\n */\n public get near(): number {\n const { near } = this.computeClippingPlanes(this.orthographicData);\n return near;\n }\n\n /**\n * The camera's far clipping plane.\n */\n public get far(): number {\n const { far } = this.computeClippingPlanes(this.orthographicData);\n return far;\n }\n\n protected updateFlyToOptions(\n flyToOptions?: FlyTo.FlyToOptions\n ): OrthographicCamera {\n return new OrthographicCamera(\n this.stream,\n this.aspect,\n this.orthographicData,\n this.boundingBox,\n this.decodeFrame,\n flyToOptions\n );\n }\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { Point } from '@vertexvis/geometry';\nimport { StreamApi } from '@vertexvis/stream-api';\n\nimport { ImageScaleProvider } from './scene';\n\n/**\n * Optional raycaster options available on a hit request.\n */\ninterface RaycasterOptions {\n includeMetadata: boolean;\n}\n\nexport interface RaycasterLike {\n hitItems(\n point: Point.Point,\n options?: RaycasterOptions\n ): Promise<vertexvis.protobuf.stream.IHitItemsResult | undefined>;\n}\n\n/**\n * The `Raycaster` class is here.\n */\nexport class Raycaster implements RaycasterLike {\n public constructor(\n private stream: StreamApi,\n private imageScaleProvider: ImageScaleProvider\n ) {}\n\n /**\n * Performs request on the stream to find items that intersect\n * the given point.\n *\n * @param point The point to cast from looking for intersections.\n */\n public async hitItems(\n point: Point.Point,\n options?: RaycasterOptions\n ): Promise<vertexvis.protobuf.stream.IHitItemsResult | undefined> {\n const scale = this.imageScaleProvider();\n const res = await this.stream.hitItems(\n {\n point: Point.scale(point, scale?.x || 1, scale?.y || 1),\n includeMetadata: options?.includeMetadata,\n },\n true\n );\n return res.hitItems || undefined;\n }\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { StreamApi } from '@vertexvis/stream-api';\n\nimport { CrossSectioning } from '../types';\n\n/**\n * The `CrossSectioner` class is here.\n */\nexport class CrossSectioner {\n public constructor(\n private stream: StreamApi,\n private data: CrossSectioning.CrossSectioning\n ) {}\n\n /**\n * Performs request on the stream to update the cross sectioning config.\n *\n * @param crossSectioning The new cross sectioning.\n */\n public async update(\n crossSectioning: CrossSectioning.CrossSectioning\n ): Promise<\n vertexvis.protobuf.stream.IUpdateCrossSectioningResult | undefined\n > {\n const res = await this.stream.updateCrossSectioning(\n {\n crossSectioning: {\n sectionPlanes: crossSectioning.sectionPlanes,\n highlightColor: crossSectioning.highlightColor,\n lineWidth:\n crossSectioning?.lineWidth != null\n ? { value: crossSectioning.lineWidth }\n : null,\n },\n },\n true\n );\n\n return res.updateCrossSectioning || undefined;\n }\n\n public current(): CrossSectioning.CrossSectioning {\n return this.data;\n }\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\n\nimport { ColorMaterial } from './colorMaterial';\n\ninterface ShowItemOperation {\n type: 'show';\n}\n\ninterface HideItemOperation {\n type: 'hide';\n}\n\ninterface SelectItemOperation {\n type: 'select';\n}\n\ninterface DeselectItemOperation {\n type: 'deselect';\n}\n\ninterface ClearItemOperation {\n type: 'clear-override';\n}\n\nexport interface ChangeMaterialOperation {\n type: 'change-material';\n material: ColorMaterial;\n}\n\nexport interface TransformOperation {\n type: 'change-transform';\n transform: vertexvis.protobuf.core.IMatrix4x4f;\n}\n\nexport interface ClearTransformOperation {\n type: 'clear-transform';\n cascade?: boolean;\n}\n\nexport interface ChangePhantomOperation {\n type: 'change-phantom';\n phantomState?: boolean;\n}\n\ninterface ClearPhantomOperation {\n type: 'clear-phantom';\n}\n\nexport interface ChangeEndItemOperation {\n type: 'change-end-item';\n endItemState?: boolean;\n}\n\ninterface ClearEndItemOperation {\n type: 'clear-end-item';\n}\n\nexport type ItemOperation =\n | ShowItemOperation\n | HideItemOperation\n | SelectItemOperation\n | DeselectItemOperation\n | ChangeMaterialOperation\n | ClearItemOperation\n | TransformOperation\n | ClearTransformOperation\n | ChangePhantomOperation\n | ClearPhantomOperation\n | ChangeEndItemOperation\n | ClearEndItemOperation;\n\nexport interface SceneItemOperations<T> {\n materialOverride(color: ColorMaterial): T;\n show(): T;\n hide(): T;\n select(color: ColorMaterial): T;\n deselect(): T;\n clearMaterialOverrides(): T;\n clearTransforms(): T;\n setPhantom(phantomState?: boolean): T;\n clearPhantom(): T;\n setEndItem(endItemState?: boolean): T;\n clearEndItem(): T;\n}\n\n/**\n * A class to handle the building of operations for a scene.\n */\nexport class SceneOperationBuilder\n implements SceneItemOperations<SceneOperationBuilder>\n{\n public constructor(private operations: ItemOperation[] = []) {}\n\n /**\n * Constructs the scene operations and returns a definition describing each\n * operation.\n */\n public build(): ItemOperation[] {\n return this.operations.concat();\n }\n\n public materialOverride(material: ColorMaterial): SceneOperationBuilder {\n return new SceneOperationBuilder(\n this.operations.concat([{ type: 'change-material', material }])\n );\n }\n\n public show(): SceneOperationBuilder {\n return new SceneOperationBuilder(\n this.operations.concat([{ type: 'show' }])\n );\n }\n\n public hide(): SceneOperationBuilder {\n return new SceneOperationBuilder(\n this.operations.concat([{ type: 'hide' }])\n );\n }\n\n public select(): SceneOperationBuilder {\n return new SceneOperationBuilder(\n this.operations.concat([{ type: 'select' }])\n );\n }\n\n public deselect(): SceneOperationBuilder {\n return new SceneOperationBuilder(\n this.operations.concat([{ type: 'deselect' }])\n );\n }\n\n public clearMaterialOverrides(): SceneOperationBuilder {\n return new SceneOperationBuilder(\n this.operations.concat([{ type: 'clear-override' }])\n );\n }\n\n public transform(\n matrix: vertexvis.protobuf.core.IMatrix4x4f\n ): SceneOperationBuilder {\n return new SceneOperationBuilder(\n this.operations.concat([{ type: 'change-transform', transform: matrix }])\n );\n }\n\n public clearTransforms(cascade = true): SceneOperationBuilder {\n return new SceneOperationBuilder(\n this.operations.concat([{ type: 'clear-transform', cascade }])\n );\n }\n\n public setPhantom(phantomState?: boolean): SceneOperationBuilder {\n return new SceneOperationBuilder(\n this.operations.concat([{ type: 'change-phantom', phantomState }])\n );\n }\n\n public clearPhantom(): SceneOperationBuilder {\n return new SceneOperationBuilder(\n this.operations.concat([{ type: 'clear-phantom' }])\n );\n }\n\n public setEndItem(endItemState?: boolean): SceneOperationBuilder {\n return new SceneOperationBuilder(\n this.operations.concat([{ type: 'change-end-item', endItemState }])\n );\n }\n\n public clearEndItem(): SceneOperationBuilder {\n return new SceneOperationBuilder(\n this.operations.concat([{ type: 'clear-end-item' }])\n );\n }\n}\n","import { Point, Rectangle } from '@vertexvis/geometry';\n\nimport { SceneItemOperationsBuilder } from './scene';\n\ninterface AllQueryExpression {\n type: 'all';\n}\n\nexport interface SceneTreeRange {\n start: number;\n end: number;\n}\n\ninterface ItemQueryExpression {\n type: 'item-id' | 'supplied-id';\n value: string;\n}\n\nexport interface AndExpression {\n type: 'and';\n expressions: QueryExpression[];\n}\n\nexport interface OrExpression {\n type: 'or';\n expressions: QueryExpression[];\n}\n\ninterface SceneTreeRangeQueryExpression {\n type: 'scene-tree-range';\n range: SceneTreeRange;\n}\n\ninterface NotQueryExpression {\n type: 'not';\n query: QueryExpression;\n}\ninterface MetadataQueryExpression {\n type: 'metadata';\n filter: string;\n keys: string[];\n exactMatch: boolean;\n}\n\ninterface AllSelectedQueryExpression {\n type: 'all-selected';\n}\n\ninterface PointQueryExpression {\n type: 'point';\n point: Point.Point;\n}\n\ninterface VolumeIntersectionQueryExpression {\n type: 'volume-intersection';\n rectangle: Rectangle.Rectangle;\n exclusive: boolean;\n}\n\n/**\n * Represents the sum of all possible types of expressions.\n */\nexport type QueryExpression =\n | AllQueryExpression\n | ItemQueryExpression\n | AndExpression\n | OrExpression\n | SceneTreeRangeQueryExpression\n | PointQueryExpression\n | VolumeIntersectionQueryExpression\n | MetadataQueryExpression\n | AllSelectedQueryExpression\n | NotQueryExpression;\n\n/**\n * An interface that represents a query is \"complete\" and can be turned into an\n * expression.\n */\nabstract class TerminalQuery {\n protected inverted: boolean;\n public constructor(inverted: boolean) {\n this.inverted = inverted;\n }\n\n public build(): QueryExpression {\n if (this.inverted) {\n return {\n type: 'not',\n query: this.queryExpressionBuilder(),\n };\n } else {\n return this.queryExpressionBuilder();\n }\n }\n\n public abstract queryExpressionBuilder(): QueryExpression;\n}\n\ninterface ItemQuery<N> {\n withItemId(id: string): N;\n\n withSuppliedId(id: string): N;\n}\n\ninterface BooleanQuery {\n and(): AndQuery;\n or(): OrQuery;\n}\n\nexport class RootQuery implements ItemQuery<SingleQuery> {\n public constructor(private inverted: boolean = false) {}\n public all(): AllQuery {\n return new AllQuery();\n }\n\n public not(): RootQuery {\n return new NotQuery(!this.inverted);\n }\n\n public withItemIds(ids: string[]): BulkQuery {\n return new BulkQuery(ids, 'item-id', this.inverted);\n }\n\n public withSuppliedIds(ids: string[]): BulkQuery {\n return new BulkQuery(ids, 'supplied-id', this.inverted);\n }\n\n public withItemId(id: string): SingleQuery {\n return new SingleQuery({ type: 'item-id', value: id }, this.inverted);\n }\n\n public withSuppliedId(id: string): SingleQuery {\n return new SingleQuery({ type: 'supplied-id', value: id }, this.inverted);\n }\n\n public withSceneTreeRange(range: SceneTreeRange): SceneTreeRangeQuery {\n return new SceneTreeRangeQuery(range, this.inverted);\n }\n\n public withMetadata(\n filter: string,\n keys: string[],\n exactMatch: boolean\n ): MetadataQuery {\n return new MetadataQuery(filter, keys, exactMatch, this.inverted);\n }\n\n public withSelected(): AllSelectedQuery {\n return new AllSelectedQuery(this.inverted);\n }\n\n public withPoint(point: Point.Point): PointQuery {\n return new PointQuery(point, this.inverted);\n }\n\n public withVolumeIntersection(\n rectangle: Rectangle.Rectangle,\n exclusive?: boolean\n ): VolumeIntersectionQuery {\n return new VolumeIntersectionQuery(rectangle, this.inverted, exclusive);\n }\n}\n\nexport class NotQuery extends RootQuery {\n public constructor(inverted: boolean) {\n super(inverted);\n }\n}\n\nexport class AllQuery extends TerminalQuery {\n public constructor(inverted = false) {\n super(inverted);\n }\n\n public queryExpressionBuilder(): QueryExpression {\n return { type: 'all' };\n }\n}\n\nexport class SceneTreeRangeQuery extends TerminalQuery {\n public constructor(private range: SceneTreeRange, inverted: boolean) {\n super(inverted);\n }\n\n public queryExpressionBuilder(): SceneTreeRangeQueryExpression {\n return {\n type: 'scene-tree-range',\n range: this.range,\n };\n }\n}\n\nexport class MetadataQuery extends TerminalQuery {\n public constructor(\n private filter: string,\n private keys: string[],\n private exactMatch: boolean,\n inverted: boolean\n ) {\n super(inverted);\n }\n\n public queryExpressionBuilder(): MetadataQueryExpression {\n return {\n type: 'metadata',\n filter: this.filter,\n keys: this.keys,\n exactMatch: this.exactMatch,\n };\n }\n}\n\nexport class AllSelectedQuery extends TerminalQuery {\n public constructor(inverted: boolean) {\n super(inverted);\n }\n\n public queryExpressionBuilder(): AllSelectedQueryExpression {\n return {\n type: 'all-selected',\n };\n }\n}\n\nexport class PointQuery extends TerminalQuery {\n public constructor(private point: Point.Point, inverted: boolean) {\n super(inverted);\n }\n\n public queryExpressionBuilder(): PointQueryExpression {\n return {\n type: 'point',\n point: this.point,\n };\n }\n}\n\nexport class VolumeIntersectionQuery extends TerminalQuery {\n public constructor(\n private rectangle: Rectangle.Rectangle,\n inverted: boolean,\n private exclusive?: boolean\n ) {\n super(inverted);\n }\n\n public queryExpressionBuilder(): VolumeIntersectionQueryExpression {\n return {\n type: 'volume-intersection',\n rectangle: this.rectangle,\n exclusive: !!this.exclusive,\n };\n }\n}\n\nexport class BulkQuery extends TerminalQuery {\n public constructor(\n private ids: string[],\n private type: 'item-id' | 'supplied-id',\n inverted: boolean\n ) {\n super(inverted);\n }\n\n public queryExpressionBuilder(): QueryExpression {\n return {\n type: 'or',\n expressions: this.ids.map((id) => {\n return {\n type: this.type,\n value: id,\n };\n }),\n };\n }\n}\n\nclass SingleQuery extends TerminalQuery implements BooleanQuery {\n public constructor(private query: QueryExpression, inverted: boolean) {\n super(inverted);\n }\n\n public queryExpressionBuilder(): QueryExpression {\n return { ...this.query };\n }\n\n public and(): AndQuery {\n return new AndQuery([this.query], this.inverted);\n }\n\n public or(): OrQuery {\n return new OrQuery([this.query], this.inverted);\n }\n}\n\nexport class OrQuery extends TerminalQuery implements ItemQuery<OrQuery> {\n public constructor(\n private expressions: QueryExpression[],\n inverted: boolean\n ) {\n super(inverted);\n }\n\n public queryExpressionBuilder(): QueryExpression {\n return { type: 'or', expressions: [...this.expressions] };\n }\n\n public withItemId(id: string): OrQuery {\n return new OrQuery(\n [...this.expressions, { type: 'item-id', value: id }],\n this.inverted\n );\n }\n\n public withSuppliedId(id: string): OrQuery {\n return new OrQuery(\n [...this.expressions, { type: 'supplied-id', value: id }],\n this.inverted\n );\n }\n\n public or(): OrQuery {\n return this;\n }\n}\n\nexport class AndQuery extends TerminalQuery implements ItemQuery<AndQuery> {\n public constructor(\n private expressions: QueryExpression[],\n inverted: boolean\n ) {\n super(inverted);\n }\n\n public queryExpressionBuilder(): QueryExpression {\n return { type: 'and', expressions: [...this.expressions] };\n }\n\n public withItemId(id: string): AndQuery {\n return new AndQuery(\n [...this.expressions, { type: 'item-id', value: id }],\n this.inverted\n );\n }\n\n public withSuppliedId(id: string): AndQuery {\n return new AndQuery(\n [...this.expressions, { type: 'supplied-id', value: id }],\n this.inverted\n );\n }\n\n public and(): AndQuery {\n return this;\n }\n}\n\nexport class SceneItemQueryExecutor {\n public where(\n query: (q: RootQuery) => TerminalQuery\n ): SceneItemOperationsBuilder {\n const expression: QueryExpression = query(new RootQuery()).build();\n\n return new SceneItemOperationsBuilder(expression);\n }\n}\n","import { vertexvis } from '@vertexvis/frame-streaming-protos';\nimport { BoundingBox, Dimensions, Point } from '@vertexvis/geometry';\nimport { StreamApi } from '@vertexvis/stream-api';\nimport { UUID } from '@vertexvis/utils';\n\nimport { InvalidArgumentError, InvalidCameraError } from '../errors';\nimport { FrameDecoder } from '../mappers';\nimport { SceneViewStateIdentifier } from '../types';\nimport { Frame } from '../types/frame';\nimport { Camera, OrthographicCamera, PerspectiveCamera } from '.';\nimport { ColorMaterial, fromHex } from './colorMaterial';\nimport { CrossSectioner } from './crossSectioner';\nimport {\n buildSceneOperation,\n buildSceneViewStateIdentifier,\n toPbSceneViewStateFeatures,\n} from './mapper';\nimport {\n ItemOperation,\n SceneItemOperations,\n SceneOperationBuilder,\n} from './operations';\nimport { QueryExpression, SceneItemQueryExecutor } from './queries';\nimport { Raycaster } from './raycaster';\n\ninterface SceneExecutionOptions {\n suppliedCorrelationId?: string;\n}\n\ninterface ResetViewOptions {\n includeCamera?: boolean;\n suppliedCorrelationId?: string;\n}\n\n/**\n * A class that is responsible for building operations for a specific scene.\n * This executor requires a query, and expects `execute()` to be invoked in order\n * for the changes to take effect.\n */\nexport class SceneItemOperationsBuilder\n implements SceneItemOperations<SceneItemOperationsBuilder>\n{\n private builder: SceneOperationBuilder;\n\n public constructor(\n private query: QueryExpression,\n givenBuilder?: SceneOperationBuilder\n ) {\n this.builder =\n givenBuilder != null ? givenBuilder : new SceneOperationBuilder();\n }\n\n public materialOverride(\n color: ColorMaterial | string\n ): SceneItemOperationsBuilder {\n if (typeof color === 'string') {\n return new SceneItemOperationsBuilder(\n this.query,\n this.builder.materialOverride(fromHex(color))\n );\n } else {\n return new SceneItemOperationsBuilder(\n this.query,\n this.builder.materialOverride(color)\n );\n }\n }\n\n public hide(): SceneItemOperationsBuilder {\n return new SceneItemOperationsBuilder(this.query, this.builder.hide());\n }\n\n public show(): SceneItemOperationsBuilder {\n return new SceneItemOperationsBuilder(this.query, this.builder.show());\n }\n\n public select(): SceneItemOperationsBuilder {\n return new SceneItemOperationsBuilder(this.query, this.builder.select());\n }\n\n public deselect(): SceneItemOperationsBuilder {\n return new SceneItemOperationsBuilder(this.query, this.builder.deselect());\n }\n\n public clearMaterialOverrides(): SceneItemOperationsBuilder {\n return new SceneItemOperationsBuilder(\n this.query,\n this.builder.clearMaterialOverrides()\n );\n }\n\n public transform(\n matrix: vertexvis.protobuf.core.IMatrix4x4f | number[]\n ): SceneItemOperationsBuilder {\n if (Array.isArray(matrix)) {\n if (matrix.length !== 16) {\n throw new InvalidArgumentError(\n 'Matrix provided must contain exactly 16 values (4x4).'\n );\n }\n\n return new SceneItemOperationsBuilder(\n this.query,\n this.builder.transform({\n r0: {\n x: matrix[0],\n y: matrix[1],\n z: matrix[2],\n w: matrix[3],\n },\n r1: {\n x: matrix[4],\n y: matrix[5],\n z: matrix[6],\n w: matrix[7],\n },\n r2: {\n x: matrix[8],\n y: matrix[9],\n z: matrix[10],\n w: matrix[11],\n },\n r3: {\n x: matrix[12],\n y: matrix[13],\n z: matrix[14],\n w: matrix[15],\n },\n })\n );\n } else {\n return new SceneItemOperationsBuilder(\n this.query,\n this.builder.transform(matrix)\n );\n }\n }\n\n public clearTransforms(cascade = true): SceneItemOperationsBuilder {\n return new SceneItemOperationsBuilder(\n this.query,\n this.builder.clearTransforms(cascade)\n );\n }\n\n public setPhantom(phantomState?: boolean): SceneItemOperationsBuilder {\n return new SceneItemOperationsBuilder(\n this.query,\n this.builder.setPhantom(phantomState)\n );\n }\n\n public clearPhantom(): SceneItemOperationsBuilder {\n return new SceneItemOperationsBuilder(\n this.query,\n this.builder.clearPhantom()\n );\n }\n\n public setEndItem(endItemState?: boolean): SceneItemOperationsBuilder {\n return new SceneItemOperationsBuilder(\n this.query,\n this.builder.setEndItem(endItemState)\n );\n }\n\n public clearEndItem(): SceneItemOperationsBuilder {\n return new SceneItemOperationsBuilder(\n this.query,\n this.builder.clearEndItem()\n );\n }\n\n public build(): QueryOperation {\n return {\n query: this.query,\n operations: this.builder.build(),\n };\n }\n}\n\nexport interface QueryOperation {\n query: QueryExpression;\n operations: ItemOperation[];\n}\n\nexport class ItemsOperationExecutor {\n public constructor(\n private sceneViewId: UUID.UUID,\n private stream: StreamApi,\n private dimensions: Dimensions.Dimensions,\n private queryOperations: QueryOperation[]\n ) {}\n\n public async execute(\n executionOptions?: SceneExecutionOptions\n ): Promise<void> {\n const pbOperations = this.queryOperations.map((op) =>\n buildSceneOperation(op.query, op.operations, {\n dimensions: this.dimensions,\n })\n );\n const request = {\n sceneViewId: {\n hex: this.sceneViewId,\n },\n operations: pbOperations,\n suppliedCorrelationId:\n executionOptions?.suppliedCorrelationId != null\n ? {\n value: executionOptions?.suppliedCorrelationId,\n }\n : undefined,\n };\n\n await this.stream.createSceneAlteration(request);\n }\n}\n\nexport type TerminalItemOperationBuilder =\n | SceneItemOperationsBuilder\n | SceneItemOperationsBuilder[];\n\nexport type ImageScaleProvider = () => Point.Point | undefined;\n\n/**\n * The features of a scene view state that can be applied to the current scene\n */\nexport type SceneViewStateFeature =\n | 'camera'\n | 'cross_section'\n | 'material_overrides'\n | 'selection'\n | 'transforms'\n | 'visibility';\n\n/**\n * A class that represents the `Scene` that has been loaded into the viewer. On\n * it, you can retrieve attributes of the scene, such as the camera. It also\n * contains methods for updating the scene and performing requests to rerender\n * the scene.\n */\nexport class Scene {\n public constructor(\n private stream: StreamApi,\n private frame: Frame,\n private decodeFrame: FrameDecoder,\n private imageScaleProvider: ImageScaleProvider,\n private dimensions: Dimensions.Dimensions,\n public readonly sceneId: UUID.UUID,\n public readonly sceneViewId: UUID.UUID\n ) {}\n\n /**\n * Applies the provided scene view state to the scene.\n */\n public async applySceneViewState(\n sceneViewStateId:\n | UUID.UUID\n | SceneViewStateIdentifier.SceneViewStateIdentifier,\n opts: SceneExecutionOptions = {}\n ): Promise<vertexvis.protobuf.stream.ILoadSceneViewStateResult | undefined> {\n const pbIdField = buildSceneViewStateIdentifier(sceneViewStateId);\n\n return await this.stream.loadSceneViewState(\n {\n ...pbIdField,\n frameCorrelationId: opts.suppliedCorrelationId\n ? { value: opts.suppliedCorrelationId }\n : undefined,\n },\n true\n );\n }\n\n /**\n * Applies the specified features of the provided scene view state to the scene.\n */\n public async applyPartialSceneViewState(\n sceneViewStateId:\n | UUID.UUID\n | SceneViewStateIdentifier.SceneViewStateIdentifier,\n featuresToApply: SceneViewStateFeature[],\n opts: SceneExecutionOptions = {}\n ): Promise<vertexvis.protobuf.stream.ILoadSceneViewStateResult | undefined> {\n const pbIdField = buildSceneViewStateIdentifier(sceneViewStateId);\n const pbFeatures = toPbSceneViewStateFeatures(featuresToApply);\n\n return await this.stream.loadSceneViewState(\n {\n ...pbIdField,\n frameCorrelationId: opts.suppliedCorrelationId\n ? { value: opts.suppliedCorrelationId }\n : undefined,\n sceneViewStateFeatureSubset: pbFeatures,\n },\n true\n );\n }\n\n /**\n * Resets the view to its default state, with the ability to reset the camera to that of the base scene.\n */\n public async reset(\n opts: ResetViewOptions = {}\n ): Promise<vertexvis.protobuf.stream.IResetViewResult | undefined> {\n return await this.stream.resetSceneView(\n {\n includeCamera: opts.includeCamera,\n frameCorrelationId: opts.suppliedCorrelationId\n ? { value: opts.suppliedCorrelationId }\n : undefined,\n },\n true\n );\n }\n\n /**\n * Returns an executor that accepts a function as a parameter that contains one or many operations to apply\n * to the scene view. The operations will be applied transactionally.\n * @param operations\n */\n public items(\n operations: (q: SceneItemQueryExecutor) => TerminalItemOperationBuilder\n ): ItemsOperationExecutor {\n const sceneOperations = operations(new SceneItemQueryExecutor());\n\n const ops = Array.isArray(sceneOperations)\n ? sceneOperations\n : [sceneOperations];\n const operationList = ops.reduce(\n (acc, builder: SceneItemOperationsBuilder) => acc.concat(builder.build()),\n [] as QueryOperation[]\n );\n return new ItemsOperationExecutor(\n this.sceneViewId,\n this.stream,\n this.dimensions,\n operationList\n );\n }\n\n /**\n * An instance of the current camera of the scene.\n */\n public camera(): Camera {\n const { scene } = this.frame;\n\n if (scene.camera.isOrthographic()) {\n return new OrthographicCamera(\n this.stream,\n Dimensions.aspectRatio(this.viewport()),\n {\n viewVector: scene.camera.viewVector,\n lookAt: scene.camera.lookAt,\n up: scene.camera.up,\n fovHeight: scene.camera.fovHeight,\n },\n this.frame.scene.boundingBox,\n this.decodeFrame\n );\n } else if (scene.camera.isPerspective()) {\n return new PerspectiveCamera(\n this.stream,\n Dimensions.aspectRatio(this.viewport()),\n {\n position: scene.camera.position,\n lookAt: scene.camera.lookAt,\n up: scene.camera.up,\n fovY: scene.camera.fovY,\n },\n this.frame.scene.boundingBox,\n this.decodeFrame\n );\n } else {\n throw new InvalidCameraError(\n 'Cannot retrieve camera. Scene has an unknown or invalid camera type.'\n );\n }\n }\n\n public boundingBox(): BoundingBox.BoundingBox {\n return this.frame.scene.boundingBox;\n }\n\n /**\n * CrossSectioner to update cross sectioning planes and get current configuration.\n */\n public crossSectioning(): CrossSectioner {\n return new CrossSectioner(this.stream, this.frame.scene.crossSection);\n }\n\n /**\n * Raycaster to request items that intersect a point.\n */\n public raycaster(): Raycaster {\n return new Raycaster(this.stream, this.imageScaleProvider);\n }\n\n /**\n * The current viewport of the scene, in pixels.\n */\n public viewport(): Dimensions.Dimensions {\n return this.frame.dimensions;\n }\n\n /**\n * The current x and y scale of the rendered image.\n */\n public scale(): Point.Point {\n return this.imageScaleProvider() || Point.create(1, 1);\n }\n}\n"]}
|
|
File without changes
|
|
File without changes
|