@luxonis/visualizer-protobuf 2.64.0 → 2.66.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/dist/{index-C2I0SvM_.js → index-8i6rZL1F.js} +1 -1
  2. package/dist/{index-b8JQ8FbB.js → index-B5saAz5y.js} +1 -1
  3. package/dist/{index-CuBQ8sfd.js → index-BOiGPesM.js} +1 -1
  4. package/dist/{index-D7jkC67I.js → index-BPoYkz5D.js} +1 -1
  5. package/dist/{index-BnLSHvn1.js → index-BVdBdL0y.js} +2 -2
  6. package/dist/{index-btWll_X8.js → index-BVhURReD.js} +20 -20
  7. package/dist/{index-STYyVl4n.js → index-BjqPJJVm.js} +1 -1
  8. package/dist/{index-CTUZw7U6.js → index-C6EEuWeT.js} +1 -1
  9. package/dist/{index-Bt8NKGgQ.js → index-C8keT4BV.js} +125 -64
  10. package/dist/{index-B53S6byS.js → index-CB4uR2F1.js} +1 -1
  11. package/dist/{index-CJ0ouF_X.js → index-CGtvEVA-.js} +1 -1
  12. package/dist/{index-PCEpYVVD.js → index-COTQtzxD.js} +1 -1
  13. package/dist/{index-fCMuSW-j.js → index-CmOcsIv5.js} +1 -1
  14. package/dist/{index-Dy0KZSfH.js → index-CxsQZNfY.js} +1 -1
  15. package/dist/{index-B86puxfC.js → index-DON7EBVW.js} +1 -1
  16. package/dist/{index-B1iI7RoB.js → index-LwsDo_d_.js} +1 -1
  17. package/dist/{index-BxkJ2Rkh.js → index-YH3sx_bg.js} +1 -1
  18. package/dist/{index-B7nNBAQK.js → index-eLC_hXQ5.js} +1 -1
  19. package/dist/{index-DvvaZvBj.js → index-nm8ZXnLm.js} +1 -1
  20. package/dist/index.js +1 -1
  21. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/ImageMode/MessageHandler.d.ts +4 -5
  22. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/ImageMode/MessageHandler.d.ts.map +1 -1
  23. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/ImageMode/MessageHandler.js +109 -55
  24. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/ImageMode/MessageHandler.js.map +1 -1
  25. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { Y as styleTags, Z as tags, $ as LRLanguage, a0 as LanguageSupport, a2 as LRParser, aa as LocalTokenGroup, ah as html, ai as parseMixed, ak as javascriptLanguage } from './index-btWll_X8.js';
1
+ import { Y as styleTags, Z as tags, $ as LRLanguage, a0 as LanguageSupport, a2 as LRParser, aa as LocalTokenGroup, ah as html, ai as parseMixed, ak as javascriptLanguage } from './index-BVhURReD.js';
2
2
  import './depth-CgtekUia.js';
3
3
  import './protobuf-B55JS-Px.js';
4
4
  import 'protobufjs/minimal';
@@ -1,4 +1,4 @@
1
- import { $ as LRLanguage, U as indentNodeProp, a7 as delimitedIndent, X as foldNodeProp, a8 as foldInside, Y as styleTags, Z as tags, a0 as LanguageSupport, a2 as LRParser } from './index-btWll_X8.js';
1
+ import { $ as LRLanguage, U as indentNodeProp, a7 as delimitedIndent, X as foldNodeProp, a8 as foldInside, Y as styleTags, Z as tags, a0 as LanguageSupport, a2 as LRParser } from './index-BVhURReD.js';
2
2
  import './depth-CgtekUia.js';
3
3
  import './protobuf-B55JS-Px.js';
4
4
  import 'protobufjs/minimal';
@@ -1,4 +1,4 @@
1
- import { a1 as ExternalTokenizer, Y as styleTags, Z as tags, a2 as LRParser, $ as LRLanguage, U as indentNodeProp, V as continuedIndent, a6 as flatIndent, a7 as delimitedIndent, X as foldNodeProp, a8 as foldInside, a0 as LanguageSupport } from './index-btWll_X8.js';
1
+ import { a1 as ExternalTokenizer, Y as styleTags, Z as tags, a2 as LRParser, $ as LRLanguage, U as indentNodeProp, V as continuedIndent, a6 as flatIndent, a7 as delimitedIndent, X as foldNodeProp, a8 as foldInside, a0 as LanguageSupport } from './index-BVhURReD.js';
2
2
  import './depth-CgtekUia.js';
3
3
  import './protobuf-B55JS-Px.js';
4
4
  import 'protobufjs/minimal';
@@ -1,4 +1,4 @@
1
- import { Y as styleTags, Z as tags, a2 as LRParser, $ as LRLanguage, U as indentNodeProp, V as continuedIndent, X as foldNodeProp, a8 as foldInside, a0 as LanguageSupport } from './index-btWll_X8.js';
1
+ import { Y as styleTags, Z as tags, a2 as LRParser, $ as LRLanguage, U as indentNodeProp, V as continuedIndent, X as foldNodeProp, a8 as foldInside, a0 as LanguageSupport } from './index-BVhURReD.js';
2
2
  import './depth-CgtekUia.js';
3
3
  import './protobuf-B55JS-Px.js';
4
4
  import 'protobufjs/minimal';
@@ -1,4 +1,4 @@
1
- import { ImagePanel } from './index-Bt8NKGgQ.js';
1
+ import { ImagePanel } from './index-C8keT4BV.js';
2
2
  import 'react';
3
3
  import 'react-dom';
4
4
  import './depth-CgtekUia.js';
@@ -8,7 +8,7 @@ import 'zustand';
8
8
  import 'react-mosaic-component';
9
9
  import '@mui/material';
10
10
  import './isArrayLikeObject-Bytw9p-q.js';
11
- import './index-btWll_X8.js';
11
+ import './index-BVhURReD.js';
12
12
  import './comlink-DHMAu6X7.js';
13
13
  import './utils-Hzt3wxhG.js';
14
14
  import './FoxgloveServer-MMAMiqqQ.js';
@@ -86796,7 +86796,7 @@ function legacy(parser) {
86796
86796
  return new LanguageSupport(StreamLanguage.define(parser));
86797
86797
  }
86798
86798
  function sql$1(dialectName) {
86799
- return import('./index-CJ0ouF_X.js').then(m => m.sql({ dialect: m[dialectName] }));
86799
+ return import('./index-CGtvEVA-.js').then(m => m.sql({ dialect: m[dialectName] }));
86800
86800
  }
86801
86801
  /**
86802
86802
  An array of language descriptions for known language packages.
@@ -86807,7 +86807,7 @@ const languages = [
86807
86807
  name: "C",
86808
86808
  extensions: ["c", "h", "ino"],
86809
86809
  load() {
86810
- return import('./index-CuBQ8sfd.js').then(m => m.cpp());
86810
+ return import('./index-BOiGPesM.js').then(m => m.cpp());
86811
86811
  }
86812
86812
  }),
86813
86813
  /*@__PURE__*/LanguageDescription.of({
@@ -86815,7 +86815,7 @@ const languages = [
86815
86815
  alias: ["cpp"],
86816
86816
  extensions: ["cpp", "c++", "cc", "cxx", "hpp", "h++", "hh", "hxx"],
86817
86817
  load() {
86818
- return import('./index-CuBQ8sfd.js').then(m => m.cpp());
86818
+ return import('./index-BOiGPesM.js').then(m => m.cpp());
86819
86819
  }
86820
86820
  }),
86821
86821
  /*@__PURE__*/LanguageDescription.of({
@@ -86835,7 +86835,7 @@ const languages = [
86835
86835
  name: "Go",
86836
86836
  extensions: ["go"],
86837
86837
  load() {
86838
- return import('./index-CTUZw7U6.js').then(m => m.go());
86838
+ return import('./index-C6EEuWeT.js').then(m => m.go());
86839
86839
  }
86840
86840
  }),
86841
86841
  /*@__PURE__*/LanguageDescription.of({
@@ -86850,7 +86850,7 @@ const languages = [
86850
86850
  name: "Java",
86851
86851
  extensions: ["java"],
86852
86852
  load() {
86853
- return import('./index-BxkJ2Rkh.js').then(m => m.java());
86853
+ return import('./index-YH3sx_bg.js').then(m => m.java());
86854
86854
  }
86855
86855
  }),
86856
86856
  /*@__PURE__*/LanguageDescription.of({
@@ -86866,7 +86866,7 @@ const languages = [
86866
86866
  alias: ["json5"],
86867
86867
  extensions: ["json", "map"],
86868
86868
  load() {
86869
- return import('./index-D7jkC67I.js').then(m => m.json());
86869
+ return import('./index-BPoYkz5D.js').then(m => m.json());
86870
86870
  }
86871
86871
  }),
86872
86872
  /*@__PURE__*/LanguageDescription.of({
@@ -86880,14 +86880,14 @@ const languages = [
86880
86880
  name: "LESS",
86881
86881
  extensions: ["less"],
86882
86882
  load() {
86883
- return import('./index-PCEpYVVD.js').then(m => m.less());
86883
+ return import('./index-COTQtzxD.js').then(m => m.less());
86884
86884
  }
86885
86885
  }),
86886
86886
  /*@__PURE__*/LanguageDescription.of({
86887
86887
  name: "Liquid",
86888
86888
  extensions: ["liquid"],
86889
86889
  load() {
86890
- return import('./index-B53S6byS.js').then(m => m.liquid());
86890
+ return import('./index-CB4uR2F1.js').then(m => m.liquid());
86891
86891
  }
86892
86892
  }),
86893
86893
  /*@__PURE__*/LanguageDescription.of({
@@ -86913,7 +86913,7 @@ const languages = [
86913
86913
  name: "PHP",
86914
86914
  extensions: ["php", "php3", "php4", "php5", "php7", "phtml"],
86915
86915
  load() {
86916
- return import('./index-B86puxfC.js').then(m => m.php());
86916
+ return import('./index-DON7EBVW.js').then(m => m.php());
86917
86917
  }
86918
86918
  }),
86919
86919
  /*@__PURE__*/LanguageDescription.of({
@@ -86930,28 +86930,28 @@ const languages = [
86930
86930
  extensions: ["BUILD", "bzl", "py", "pyw"],
86931
86931
  filename: /^(BUCK|BUILD)$/,
86932
86932
  load() {
86933
- return import('./index-fCMuSW-j.js').then(m => m.python());
86933
+ return import('./index-CmOcsIv5.js').then(m => m.python());
86934
86934
  }
86935
86935
  }),
86936
86936
  /*@__PURE__*/LanguageDescription.of({
86937
86937
  name: "Rust",
86938
86938
  extensions: ["rs"],
86939
86939
  load() {
86940
- return import('./index-B7nNBAQK.js').then(m => m.rust());
86940
+ return import('./index-eLC_hXQ5.js').then(m => m.rust());
86941
86941
  }
86942
86942
  }),
86943
86943
  /*@__PURE__*/LanguageDescription.of({
86944
86944
  name: "Sass",
86945
86945
  extensions: ["sass"],
86946
86946
  load() {
86947
- return import('./index-STYyVl4n.js').then(m => m.sass({ indented: true }));
86947
+ return import('./index-BjqPJJVm.js').then(m => m.sass({ indented: true }));
86948
86948
  }
86949
86949
  }),
86950
86950
  /*@__PURE__*/LanguageDescription.of({
86951
86951
  name: "SCSS",
86952
86952
  extensions: ["scss"],
86953
86953
  load() {
86954
- return import('./index-STYyVl4n.js').then(m => m.sass());
86954
+ return import('./index-BjqPJJVm.js').then(m => m.sass());
86955
86955
  }
86956
86956
  }),
86957
86957
  /*@__PURE__*/LanguageDescription.of({
@@ -86982,7 +86982,7 @@ const languages = [
86982
86982
  name: "WebAssembly",
86983
86983
  extensions: ["wat", "wast"],
86984
86984
  load() {
86985
- return import('./index-b8JQ8FbB.js').then(m => m.wast());
86985
+ return import('./index-B5saAz5y.js').then(m => m.wast());
86986
86986
  }
86987
86987
  }),
86988
86988
  /*@__PURE__*/LanguageDescription.of({
@@ -86990,7 +86990,7 @@ const languages = [
86990
86990
  alias: ["rss", "wsdl", "xsd"],
86991
86991
  extensions: ["xml", "xsl", "xsd", "svg"],
86992
86992
  load() {
86993
- return import('./index-B1iI7RoB.js').then(m => m.xml());
86993
+ return import('./index-LwsDo_d_.js').then(m => m.xml());
86994
86994
  }
86995
86995
  }),
86996
86996
  /*@__PURE__*/LanguageDescription.of({
@@ -86998,7 +86998,7 @@ const languages = [
86998
86998
  alias: ["yml"],
86999
86999
  extensions: ["yaml", "yml"],
87000
87000
  load() {
87001
- return import('./index-Dy0KZSfH.js').then(m => m.yaml());
87001
+ return import('./index-CxsQZNfY.js').then(m => m.yaml());
87002
87002
  }
87003
87003
  }),
87004
87004
  // Legacy modes ported from CodeMirror 5
@@ -87794,13 +87794,13 @@ const languages = [
87794
87794
  name: "Vue",
87795
87795
  extensions: ["vue"],
87796
87796
  load() {
87797
- return import('./index-C2I0SvM_.js').then(m => m.vue());
87797
+ return import('./index-8i6rZL1F.js').then(m => m.vue());
87798
87798
  }
87799
87799
  }),
87800
87800
  /*@__PURE__*/LanguageDescription.of({
87801
87801
  name: "Angular Template",
87802
87802
  load() {
87803
- return import('./index-DvvaZvBj.js').then(m => m.angular());
87803
+ return import('./index-nm8ZXnLm.js').then(m => m.angular());
87804
87804
  }
87805
87805
  })
87806
87806
  ];
@@ -166509,7 +166509,7 @@ function createRenderDelaySampler() {
166509
166509
  };
166510
166510
  }
166511
166511
 
166512
- const ImagePanelComponent = /*#__PURE__*/React__default.lazy(async () => await import('./index-BnLSHvn1.js'));
166512
+ const ImagePanelComponent = /*#__PURE__*/React__default.lazy(async () => await import('./index-BVdBdL0y.js'));
166513
166513
  const ImagePanelBody = ({
166514
166514
  topic,
166515
166515
  frameRenderedEvent,
@@ -166604,7 +166604,7 @@ const DEFAULT_CAMERA_STATE = {
166604
166604
  // License, v2.0. If a copy of the MPL was not distributed with this
166605
166605
  // file, You can obtain one at http://mozilla.org/MPL/2.0/
166606
166606
 
166607
- const ThreeDeeRenderComponent = /*#__PURE__*/React__default.lazy(async () => await import('./index-Bt8NKGgQ.js'));
166607
+ const ThreeDeeRenderComponent = /*#__PURE__*/React__default.lazy(async () => await import('./index-C8keT4BV.js'));
166608
166608
  const PointCloudPanelBody = ({
166609
166609
  topic,
166610
166610
  frameRenderedEvent,
@@ -1,4 +1,4 @@
1
- import { a1 as ExternalTokenizer, a9 as ContextTracker, Y as styleTags, Z as tags, a2 as LRParser, $ as LRLanguage, X as foldNodeProp, a8 as foldInside, U as indentNodeProp, V as continuedIndent, ae as defineCSSCompletionSource, a0 as LanguageSupport } from './index-btWll_X8.js';
1
+ import { a1 as ExternalTokenizer, a9 as ContextTracker, Y as styleTags, Z as tags, a2 as LRParser, $ as LRLanguage, X as foldNodeProp, a8 as foldInside, U as indentNodeProp, V as continuedIndent, ae as defineCSSCompletionSource, a0 as LanguageSupport } from './index-BVhURReD.js';
2
2
  import './depth-CgtekUia.js';
3
3
  import './protobuf-B55JS-Px.js';
4
4
  import 'protobufjs/minimal';
@@ -1,4 +1,4 @@
1
- import { a1 as ExternalTokenizer, a9 as ContextTracker, Y as styleTags, Z as tags, a2 as LRParser, aa as LocalTokenGroup, ab as snippetCompletion, a5 as syntaxTree, $ as LRLanguage, U as indentNodeProp, V as continuedIndent, a6 as flatIndent, a7 as delimitedIndent, X as foldNodeProp, a8 as foldInside, a0 as LanguageSupport, a3 as ifNotIn, a4 as completeFromList, ac as IterMode, ad as NodeWeakMap } from './index-btWll_X8.js';
1
+ import { a1 as ExternalTokenizer, a9 as ContextTracker, Y as styleTags, Z as tags, a2 as LRParser, aa as LocalTokenGroup, ab as snippetCompletion, a5 as syntaxTree, $ as LRLanguage, U as indentNodeProp, V as continuedIndent, a6 as flatIndent, a7 as delimitedIndent, X as foldNodeProp, a8 as foldInside, a0 as LanguageSupport, a3 as ifNotIn, a4 as completeFromList, ac as IterMode, ad as NodeWeakMap } from './index-BVhURReD.js';
2
2
  import './depth-CgtekUia.js';
3
3
  import './protobuf-B55JS-Px.js';
4
4
  import 'protobufjs/minimal';
@@ -3,7 +3,7 @@ import React__default, { useReducer, useRef, useCallback, useLayoutEffect, Compo
3
3
  import ReactDOM__default from 'react-dom';
4
4
  import { Z as isSymbol, $ as toString, a0 as keys, a1 as getSymbols$1, a2 as stubArray, a3 as arrayPush, a4 as baseGetAllKeys, g as getTag, a5 as getAllKeys, k as baseGet, c as baseIteratee, j as castPath, t as toKey, a6 as arrayMap$1, a7 as baseUniq, b as baseFlatten, a8 as useMustNotChange, a9 as useCurrentLayoutActions, aa as useCurrentLayoutSelector, r as reportError, A as AppError, L as Logger, u as useGuaranteedContext, ab as usePanelMosaicId, ac as useSelectedPanels, ad as PANEL_TITLE_CONFIG_KEY, ae as noop$4, o as getPanelTypeFromId, M as useShallowMemo, T as TAB_PANEL_TYPE, J as filterMap, d as dist$2, af as useAppConfiguration, ag as useValueChangedDebugLog, V as typescript, ah as useJsonTreeTheme } from './depth-CgtekUia.js';
5
5
  import { createStore, useStore } from 'zustand';
6
- import { g as generateUtilityClass, c as createAggregator, f as flatRest, b as baseSet, A as AnalyticsContext, P as PropTypes, E as ErrorDisplay, S as Stack$1, m as makeStyles$1, _ as _extends$1, W as WorkspaceContext, u as useAnalytics, a as AppEvent, L as LeftSidebarItemKeys, R as RightSidebarItemKeys, d as useTranslation, e as usePanelCatalog, h as EmptyState, i as isEmpty, j as PanelContext, k as PanelCatalogContext, l as usePanelStateStore, n as useDefaultPanelTitle, o as useWorkspaceStore, p as WorkspaceStoreSelectors, q as difference, r as usePanelContext, s as useMessagePipeline, v as v4, t as useHoverValue, w as useSetHoverValue, x as useClearHoverValue, y as useMessagePipelineGetter, z as usePanelSettingsTreeUpdate, B as PlayerCapabilities, C as assertNever, D as PlayerPresence, F as isEqual, G as isDesktopApp, H as createTheme, I as propTypesExports, J as DEFAULT_CAMERA_STATE$1, K as format$1, M as z, N as serializeError, O as stringify$1, Q as createIntl, T as createIntlCache } from './index-btWll_X8.js';
6
+ import { g as generateUtilityClass, c as createAggregator, f as flatRest, b as baseSet, A as AnalyticsContext, P as PropTypes, E as ErrorDisplay, S as Stack$1, m as makeStyles$1, _ as _extends$1, W as WorkspaceContext, u as useAnalytics, a as AppEvent, L as LeftSidebarItemKeys, R as RightSidebarItemKeys, d as useTranslation, e as usePanelCatalog, h as EmptyState, i as isEmpty, j as PanelContext, k as PanelCatalogContext, l as usePanelStateStore, n as useDefaultPanelTitle, o as useWorkspaceStore, p as WorkspaceStoreSelectors, q as difference, r as usePanelContext, s as useMessagePipeline, v as v4, t as useHoverValue, w as useSetHoverValue, x as useClearHoverValue, y as useMessagePipelineGetter, z as usePanelSettingsTreeUpdate, B as PlayerCapabilities, C as assertNever, D as PlayerPresence, F as isEqual, G as isDesktopApp, H as createTheme, I as propTypesExports, J as DEFAULT_CAMERA_STATE$1, K as format$1, M as z, N as serializeError, O as stringify$1, Q as createIntl, T as createIntlCache } from './index-BVhURReD.js';
7
7
  import { MosaicDragType, MosaicContext, MosaicWindowContext, getOtherBranch, getNodeAtPath } from 'react-mosaic-component';
8
8
  import { g as getDefaultExportFromCjs, c as commonjsGlobal, d as getAugmentedNamespace } from './protobuf-B55JS-Px.js';
9
9
  import { Link, Button, alpha, IconButton, Card, CardActionArea, CardMedia, CardContent, Typography, Container, Tooltip, Fade, ListItem, ListItemButton, ListItemText, List, TextField, InputAdornment, Popper, Grow, Paper, ClickAwayListener, Menu, MenuItem, Divider, buttonClasses, Backdrop, Chip, useTheme, alertClasses, darken, lighten, inputBaseClasses, autocompleteClasses, inputClasses, Checkbox, dialogActionsClasses, filledInputClasses, inputAdornmentClasses, listSubheaderClasses, selectClasses, tableCellClasses, ThemeProvider as ThemeProvider$1, SvgIcon, tabsClasses as tabsClasses$1, tabClasses, Tabs, Tab, ListItemIcon } from '@mui/material';
@@ -31965,6 +31965,13 @@ function getFrameIdFromImage(image) {
31965
31965
  return image.frame_id;
31966
31966
  }
31967
31967
  }
31968
+ function getTimestampFromImage(image) {
31969
+ if ("header" in image) {
31970
+ return image.header.stamp;
31971
+ } else {
31972
+ return image.timestamp;
31973
+ }
31974
+ }
31968
31975
 
31969
31976
  // This Source Code Form is subject to the terms of the Mozilla Public
31970
31977
  // License, v2.0. If a copy of the MPL was not distributed with this
@@ -32499,6 +32506,15 @@ function getAnnotationAtPath(message, path) {
32499
32506
  // License, v2.0. If a copy of the MPL was not distributed with this
32500
32507
  // file, You can obtain one at http://mozilla.org/MPL/2.0/
32501
32508
 
32509
+ const syncToleranceSec = Number(localStorage.getItem('viewer-syncToleranceSec')) || 0.15; // maximum acceptable time difference for selecting a “closest” annotation.
32510
+ const maxStalenessSec = Number(localStorage.getItem('viewer-maxStalenessSec')) || 1.1; // how long we can hold the last older annotation if no better match is available. 1s corresponds to 1 FPS + 100ms window for jitter.
32511
+ const hysteresisSec = Number(localStorage.getItem('viewer-hysteresisSec')) || 0.1; // how much “stickiness” we allow before switching candidates.
32512
+
32513
+ console.log("Synchronization parameters:", {
32514
+ syncToleranceSec,
32515
+ maxStalenessSec,
32516
+ hysteresisSec
32517
+ });
32502
32518
  // Have constants for the HUD items so that they don't need to be recreated and GCed every message
32503
32519
  const WAITING_FOR_BOTH_HUD_ITEM = {
32504
32520
  id: WAITING_FOR_BOTH_MESSAGES_HUD_ID,
@@ -32555,13 +32571,14 @@ class MessageHandler {
32555
32571
 
32556
32572
  #onAnnotationReceivedEvent;
32557
32573
  #annotationsFpsRefreshInterval = null;
32574
+ // Store a small buffer of recent annotations per topic with computed seconds timestamps
32558
32575
  annotationsMap = new Map();
32559
- ghostAnnotationsMap = new Map();
32560
- syncToleranceMs = 150;
32561
- ghostTimeoutMs = 1000;
32576
+ // Track last selected annotation per topic to add hysteresis and reduce flicker
32577
+ lastSelectedByTopic = new Map();
32562
32578
  /**
32563
- *
32564
- * @param config - subset of ImageMode settings required for message handling
32579
+ * Create a MessageHandler
32580
+ * @param {Immutable<Config>} config - subset of ImageMode settings required for message handling
32581
+ * @param {HUDItemManager} hud - HUD manager used to display informational messages on the canvas
32565
32582
  */
32566
32583
  constructor(config, hud) {
32567
32584
  this.#config = config;
@@ -32570,6 +32587,17 @@ class MessageHandler {
32570
32587
  annotationsByTopic: new Map()
32571
32588
  };
32572
32589
  this.availableAnnotationTopics = new Set();
32590
+
32591
+ // Set default values for synchronization to local storage if they're not already set
32592
+ if (localStorage.getItem('viewer-syncToleranceSec') === null) {
32593
+ localStorage.setItem('viewer-syncToleranceSec', syncToleranceSec.toString());
32594
+ }
32595
+ if (localStorage.getItem('viewer-maxStalenessSec') === null) {
32596
+ localStorage.setItem('viewer-maxStalenessSec', maxStalenessSec.toString());
32597
+ }
32598
+ if (localStorage.getItem('viewer-hysteresisSec') === null) {
32599
+ localStorage.setItem('viewer-hysteresisSec', hysteresisSec.toString());
32600
+ }
32573
32601
  }
32574
32602
  dispose() {
32575
32603
  if (this.#annotationsFpsRefreshInterval) {
@@ -32598,54 +32626,59 @@ class MessageHandler {
32598
32626
  this.handleImage(messageEvent, normalizeCompressedImage(messageEvent.message));
32599
32627
  };
32600
32628
  handleImage(message, image) {
32601
- const normalized = {
32629
+ this.lastImage = {
32602
32630
  ...message,
32603
32631
  message: image
32604
32632
  };
32605
- this.lastImage = normalized;
32606
32633
  this.#emitState();
32607
32634
  }
32608
32635
  handleCameraInfo = message => {
32609
- const cameraInfo = normalizeCameraInfo(message.message);
32610
- this.#lastReceivedMessages.cameraInfo = cameraInfo;
32636
+ this.#lastReceivedMessages.cameraInfo = normalizeCameraInfo(message.message);
32611
32637
  this.#emitState();
32612
32638
  };
32613
32639
  handleAnnotations = messageEvent => {
32614
32640
  const list = normalizeAnnotations(messageEvent.message, messageEvent.schemaName);
32615
- const timestamp = performance.now();
32641
+ const arrivalSec = performance.now() / 1000;
32616
32642
  if (list.length > 0 && messageEvent.topic) {
32617
32643
  this.#onAnnotationReceivedEvent?.();
32618
- this.annotationsMap.set(messageEvent.topic, {
32619
- annotation: {
32620
- originalMessage: messageEvent,
32621
- annotations: list
32622
- },
32623
- timestamp: timestamp
32624
- });
32625
- this.ghostAnnotationsMap.set(messageEvent.topic, {
32644
+
32645
+ // Prefer timestamps embedded in the annotations themselves
32646
+ const stampTimes = [];
32647
+ for (const a of list) {
32648
+ const sec = a.stamp?.sec;
32649
+ const nsec = a.stamp?.nsec;
32650
+ if (typeof sec === "number" && typeof nsec === "number") {
32651
+ stampTimes.push(sec + nsec / 1e9);
32652
+ }
32653
+ }
32654
+ const timeSec = stampTimes.length > 0 ? Math.max(...stampTimes) : arrivalSec;
32655
+ const entry = {
32626
32656
  annotation: {
32627
32657
  originalMessage: messageEvent,
32628
32658
  annotations: list
32629
32659
  },
32630
- timestamp: timestamp
32631
- });
32660
+ timeSec,
32661
+ arrivalSec
32662
+ };
32663
+ const topic = messageEvent.topic;
32664
+ const buffer = this.annotationsMap.get(topic) ?? [];
32665
+ buffer.push(entry);
32666
+
32667
+ // Keep unlimited buffer length, but drop entries older than 20 seconds based on arrival time
32668
+ const retentionSec = 20;
32669
+ const nowSec = performance.now() / 1000;
32670
+ const cutoffArrival = nowSec - retentionSec;
32671
+ const trimmed = buffer.filter(e => e.arrivalSec >= cutoffArrival);
32672
+ this.annotationsMap.set(topic, trimmed);
32632
32673
  }
32674
+
32675
+ // Always emit; render selection logic will pick appropriate annotations for the last image
32676
+ this.#emitState();
32633
32677
  if (this.#config.synchronize === false) {
32634
- this.#emitState();
32635
- return;
32636
- }
32637
- if (list.length === 0 && messageEvent.topic) {
32638
- for (const [topic, annotation] of this.ghostAnnotationsMap.entries()) {
32639
- if (Math.abs(timestamp - annotation.timestamp) <= this.syncToleranceMs) {
32640
- this.annotationsMap.set(topic, {
32641
- annotation: annotation.annotation,
32642
- timestamp
32643
- });
32644
- }
32645
- }
32646
- this.#emitState();
32647
32678
  return;
32648
32679
  }
32680
+
32681
+ // synchronized mode does selection in #getRenderState
32649
32682
  };
32650
32683
  setConfig(newConfig) {
32651
32684
  let changed = false;
@@ -32688,6 +32721,9 @@ class MessageHandler {
32688
32721
  this.#lastReceivedMessages = {
32689
32722
  annotationsByTopic: new Map()
32690
32723
  };
32724
+ this.annotationsMap.clear();
32725
+ this.lastSelectedByTopic.clear();
32726
+ this.lastImage = undefined;
32691
32727
  this.#oldRenderState = undefined;
32692
32728
  this.#emitState();
32693
32729
  }
@@ -32727,40 +32763,65 @@ class MessageHandler {
32727
32763
  image: this.lastImage,
32728
32764
  annotationsByTopic: new Map()
32729
32765
  };
32730
- const imageTimestamp = this.lastImage.receiveTime ? Number(`${this.lastImage.receiveTime.sec}.${this.lastImage.receiveTime.nsec}`) : performance.now();
32731
- const now = performance.now();
32732
- for (const [topic, annotation] of this.annotationsMap.entries()) {
32733
- // FIXME: We can liekly get this value better from the annotation message itself
32734
- const annotationTimestamp = Number.parseFloat(`${annotation.annotation.originalMessage.receiveTime?.sec}.${annotation.annotation.originalMessage.receiveTime?.nsec}`);
32735
-
32736
- // In case the annotation timestamp is not available, we just continue
32737
- if (Number.isNaN(annotationTimestamp)) {
32738
- console.warn("Skipping annotation with no/invalid timestamp", annotation);
32739
- continue;
32766
+ const imageTimestampSec = (() => {
32767
+ const stamp = getTimestampFromImage(this.lastImage.message);
32768
+ const sec = stamp?.sec;
32769
+ const nsec = stamp?.nsec;
32770
+ if (typeof sec === "number" && typeof nsec === "number") {
32771
+ return sec + nsec / 1e9;
32772
+ }
32773
+ return performance.now() / 1000;
32774
+ })();
32775
+ for (const [topic, buffer] of this.annotationsMap.entries()) {
32776
+ if (buffer.length === 0) continue;
32777
+
32778
+ // Prefer newest annotation older than the image within staleness window
32779
+ let preferred;
32780
+ for (let i = buffer.length - 1; i >= 0; i--) {
32781
+ const entry = buffer[i];
32782
+ const age = imageTimestampSec - entry.timeSec;
32783
+ if (age >= 0 && age <= maxStalenessSec) {
32784
+ preferred = entry;
32785
+ break;
32786
+ }
32740
32787
  }
32741
32788
 
32742
- // We only want to show annotations that are older (or same) than the image frame with 100ms tolerance
32743
- const isAnnotationOlderThanImageFrame = annotationTimestamp <= imageTimestamp + 0.1;
32744
-
32745
- //console.log({
32746
- // annotation,
32747
- // imageTimestamp,
32748
- // annotationTimestamp,
32749
- // isAnnotationOlderThanImageFrame,
32750
- //});
32751
-
32752
- const annotationGhost = now - annotation.timestamp < this.ghostTimeoutMs;
32753
-
32754
- // console.log({ now, annotationTimestamp: annotation.timestamp, annotationGhost });
32789
+ // If none older within staleness, fall back to closest within tolerance
32790
+ let fallback = buffer[0];
32791
+ let fallbackDelta = Math.abs(fallback.timeSec - imageTimestampSec);
32792
+ for (let i = 1; i < buffer.length; i++) {
32793
+ const entry = buffer[i];
32794
+ const delta = Math.abs(entry.timeSec - imageTimestampSec);
32795
+ if (delta < fallbackDelta) {
32796
+ fallback = entry;
32797
+ fallbackDelta = delta;
32798
+ }
32799
+ }
32800
+ let candidate = preferred ?? fallback;
32801
+ if (!candidate) continue;
32802
+ const candidateDelta = Math.abs(candidate.timeSec - imageTimestampSec);
32803
+ const candidateAge = imageTimestampSec - candidate.timeSec;
32804
+ const acceptable = preferred != undefined && candidateAge >= 0 && candidateAge <= maxStalenessSec || preferred == undefined && candidateDelta <= syncToleranceSec;
32805
+ const notFutureFar = candidate.timeSec <= imageTimestampSec + syncToleranceSec;
32806
+ if (!acceptable || !notFutureFar) {
32807
+ continue;
32808
+ }
32755
32809
 
32756
- if ((Math.abs(imageTimestamp - annotation.timestamp) <= this.syncToleranceMs ||
32757
- // within tolerance
32758
- annotationGhost) &&
32759
- // I think this says "or annotation is newer than 1s"
32760
- isAnnotationOlderThanImageFrame // annotation has to be older than image frame within 100ms tolerance
32761
- ) {
32762
- state.annotationsByTopic.set(topic, annotation.annotation);
32810
+ // Hysteresis: if previous selection is very close and still valid, keep it to avoid flicker
32811
+ const prevTime = this.lastSelectedByTopic.get(topic);
32812
+ if (prevTime != undefined) {
32813
+ const prevEntry = buffer.find(e => Math.abs(e.timeSec - prevTime) < 1e-6);
32814
+ if (prevEntry) {
32815
+ const prevDelta = Math.abs(prevEntry.timeSec - imageTimestampSec);
32816
+ const prevAge = imageTimestampSec - prevEntry.timeSec;
32817
+ const prevValid = prevAge >= 0 && prevAge <= maxStalenessSec || prevDelta <= syncToleranceSec;
32818
+ if (prevValid && Math.abs(prevEntry.timeSec - candidate.timeSec) <= hysteresisSec) {
32819
+ candidate = prevEntry;
32820
+ }
32821
+ }
32763
32822
  }
32823
+ state.annotationsByTopic.set(topic, candidate.annotation);
32824
+ this.lastSelectedByTopic.set(topic, candidate.timeSec);
32764
32825
  }
32765
32826
  return state;
32766
32827
  }
@@ -1,4 +1,4 @@
1
- import { af as EditorView, ag as EditorSelection, $ as LRLanguage, Y as styleTags, Z as tags, U as indentNodeProp, a7 as delimitedIndent, X as foldNodeProp, a0 as LanguageSupport, a2 as LRParser, a5 as syntaxTree, ah as html, ai as parseMixed, a1 as ExternalTokenizer } from './index-btWll_X8.js';
1
+ import { af as EditorView, ag as EditorSelection, $ as LRLanguage, Y as styleTags, Z as tags, U as indentNodeProp, a7 as delimitedIndent, X as foldNodeProp, a0 as LanguageSupport, a2 as LRParser, a5 as syntaxTree, ah as html, ai as parseMixed, a1 as ExternalTokenizer } from './index-BVhURReD.js';
2
2
  import './depth-CgtekUia.js';
3
3
  import './protobuf-B55JS-Px.js';
4
4
  import 'protobufjs/minimal';
@@ -1,4 +1,4 @@
1
- import { U as indentNodeProp, V as continuedIndent, X as foldNodeProp, Y as styleTags, Z as tags, $ as LRLanguage, a0 as LanguageSupport, a1 as ExternalTokenizer, a2 as LRParser, a3 as ifNotIn, a4 as completeFromList, a5 as syntaxTree } from './index-btWll_X8.js';
1
+ import { U as indentNodeProp, V as continuedIndent, X as foldNodeProp, Y as styleTags, Z as tags, $ as LRLanguage, a0 as LanguageSupport, a1 as ExternalTokenizer, a2 as LRParser, a3 as ifNotIn, a4 as completeFromList, a5 as syntaxTree } from './index-BVhURReD.js';
2
2
  import './depth-CgtekUia.js';
3
3
  import './protobuf-B55JS-Px.js';
4
4
  import 'protobufjs/minimal';
@@ -1,4 +1,4 @@
1
- import { Y as styleTags, Z as tags, $ as LRLanguage, U as indentNodeProp, V as continuedIndent, X as foldNodeProp, a8 as foldInside, ae as defineCSSCompletionSource, a0 as LanguageSupport, a2 as LRParser, a1 as ExternalTokenizer } from './index-btWll_X8.js';
1
+ import { Y as styleTags, Z as tags, $ as LRLanguage, U as indentNodeProp, V as continuedIndent, X as foldNodeProp, a8 as foldInside, ae as defineCSSCompletionSource, a0 as LanguageSupport, a2 as LRParser, a1 as ExternalTokenizer } from './index-BVhURReD.js';
2
2
  import './depth-CgtekUia.js';
3
3
  import './protobuf-B55JS-Px.js';
4
4
  import 'protobufjs/minimal';
@@ -1,4 +1,4 @@
1
- import { a1 as ExternalTokenizer, a9 as ContextTracker, Y as styleTags, Z as tags, a2 as LRParser, a5 as syntaxTree, a3 as ifNotIn, $ as LRLanguage, U as indentNodeProp, a7 as delimitedIndent, X as foldNodeProp, a8 as foldInside, a0 as LanguageSupport, ac as IterMode, a4 as completeFromList, ad as NodeWeakMap, ab as snippetCompletion } from './index-btWll_X8.js';
1
+ import { a1 as ExternalTokenizer, a9 as ContextTracker, Y as styleTags, Z as tags, a2 as LRParser, a5 as syntaxTree, a3 as ifNotIn, $ as LRLanguage, U as indentNodeProp, a7 as delimitedIndent, X as foldNodeProp, a8 as foldInside, a0 as LanguageSupport, ac as IterMode, a4 as completeFromList, ad as NodeWeakMap, ab as snippetCompletion } from './index-BVhURReD.js';
2
2
  import './depth-CgtekUia.js';
3
3
  import './protobuf-B55JS-Px.js';
4
4
  import 'protobufjs/minimal';
@@ -1,4 +1,4 @@
1
- import { a9 as ContextTracker, a1 as ExternalTokenizer, Y as styleTags, Z as tags, a2 as LRParser, $ as LRLanguage, U as indentNodeProp, a7 as delimitedIndent, X as foldNodeProp, a8 as foldInside, a0 as LanguageSupport, ai as parseMixed } from './index-btWll_X8.js';
1
+ import { a9 as ContextTracker, a1 as ExternalTokenizer, Y as styleTags, Z as tags, a2 as LRParser, $ as LRLanguage, U as indentNodeProp, a7 as delimitedIndent, X as foldNodeProp, a8 as foldInside, a0 as LanguageSupport, ai as parseMixed } from './index-BVhURReD.js';
2
2
  import './depth-CgtekUia.js';
3
3
  import './protobuf-B55JS-Px.js';
4
4
  import 'protobufjs/minimal';
@@ -1,4 +1,4 @@
1
- import { a1 as ExternalTokenizer, Y as styleTags, Z as tags, a2 as LRParser, $ as LRLanguage, U as indentNodeProp, V as continuedIndent, a7 as delimitedIndent, X as foldNodeProp, a8 as foldInside, ah as html, a0 as LanguageSupport, ai as parseMixed } from './index-btWll_X8.js';
1
+ import { a1 as ExternalTokenizer, Y as styleTags, Z as tags, a2 as LRParser, $ as LRLanguage, U as indentNodeProp, V as continuedIndent, a7 as delimitedIndent, X as foldNodeProp, a8 as foldInside, ah as html, a0 as LanguageSupport, ai as parseMixed } from './index-BVhURReD.js';
2
2
  import './depth-CgtekUia.js';
3
3
  import './protobuf-B55JS-Px.js';
4
4
  import 'protobufjs/minimal';
@@ -1,4 +1,4 @@
1
- import { a9 as ContextTracker, a1 as ExternalTokenizer, Y as styleTags, Z as tags, a2 as LRParser, $ as LRLanguage, U as indentNodeProp, X as foldNodeProp, aj as bracketMatchingHandle, a0 as LanguageSupport, af as EditorView, a5 as syntaxTree, ag as EditorSelection } from './index-btWll_X8.js';
1
+ import { a9 as ContextTracker, a1 as ExternalTokenizer, Y as styleTags, Z as tags, a2 as LRParser, $ as LRLanguage, U as indentNodeProp, X as foldNodeProp, aj as bracketMatchingHandle, a0 as LanguageSupport, af as EditorView, a5 as syntaxTree, ag as EditorSelection } from './index-BVhURReD.js';
2
2
  import './depth-CgtekUia.js';
3
3
  import './protobuf-B55JS-Px.js';
4
4
  import 'protobufjs/minimal';
@@ -1,4 +1,4 @@
1
- import { Y as styleTags, Z as tags, a2 as LRParser, $ as LRLanguage, U as indentNodeProp, V as continuedIndent, a6 as flatIndent, a7 as delimitedIndent, X as foldNodeProp, a8 as foldInside, a0 as LanguageSupport } from './index-btWll_X8.js';
1
+ import { Y as styleTags, Z as tags, a2 as LRParser, $ as LRLanguage, U as indentNodeProp, V as continuedIndent, a6 as flatIndent, a7 as delimitedIndent, X as foldNodeProp, a8 as foldInside, a0 as LanguageSupport } from './index-BVhURReD.js';
2
2
  import './depth-CgtekUia.js';
3
3
  import './protobuf-B55JS-Px.js';
4
4
  import 'protobufjs/minimal';
@@ -1,4 +1,4 @@
1
- import { a1 as ExternalTokenizer, Y as styleTags, Z as tags, a2 as LRParser, $ as LRLanguage, U as indentNodeProp, V as continuedIndent, X as foldNodeProp, a8 as foldInside, a0 as LanguageSupport } from './index-btWll_X8.js';
1
+ import { a1 as ExternalTokenizer, Y as styleTags, Z as tags, a2 as LRParser, $ as LRLanguage, U as indentNodeProp, V as continuedIndent, X as foldNodeProp, a8 as foldInside, a0 as LanguageSupport } from './index-BVhURReD.js';
2
2
  import './depth-CgtekUia.js';
3
3
  import './protobuf-B55JS-Px.js';
4
4
  import 'protobufjs/minimal';
@@ -1,4 +1,4 @@
1
- import { Y as styleTags, Z as tags, ak as javascriptLanguage, $ as LRLanguage, a0 as LanguageSupport, a2 as LRParser, ah as html, ai as parseMixed, a1 as ExternalTokenizer } from './index-btWll_X8.js';
1
+ import { Y as styleTags, Z as tags, ak as javascriptLanguage, $ as LRLanguage, a0 as LanguageSupport, a2 as LRParser, ah as html, ai as parseMixed, a1 as ExternalTokenizer } from './index-BVhURReD.js';
2
2
  import './depth-CgtekUia.js';
3
3
  import './protobuf-B55JS-Px.js';
4
4
  import 'protobufjs/minimal';
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { av as FrameStore, ao as ImagePanel, an as PanelLayout, ap as PointCloudPanel, al as VisualizerConnection, am as VisualizerContext, aq as constructKeyForTopicRenderMetrics, as as globalDecodeMetricsManager, ar as globalInputEventMetricsManager, at as globalRenderMetricsManager, au as globalThroughputMetricsManager } from './index-btWll_X8.js';
1
+ export { av as FrameStore, ao as ImagePanel, an as PanelLayout, ap as PointCloudPanel, al as VisualizerConnection, am as VisualizerContext, aq as constructKeyForTopicRenderMetrics, as as globalDecodeMetricsManager, ar as globalInputEventMetricsManager, at as globalRenderMetricsManager, au as globalThroughputMetricsManager } from './index-BVhURReD.js';
2
2
  export { S as getDistanceFromDepthDataForOffset } from './depth-CgtekUia.js';
3
3
  import './comlink-DHMAu6X7.js';
4
4
  import './utils-Hzt3wxhG.js';
@@ -39,13 +39,12 @@ export declare class MessageHandler implements IMessageHandler {
39
39
  #private;
40
40
  private lastImage?;
41
41
  private annotationsMap;
42
- private ghostAnnotationsMap;
43
- private syncToleranceMs;
44
- private ghostTimeoutMs;
42
+ private lastSelectedByTopic;
45
43
  availableAnnotationTopics: Set<string>;
46
44
  /**
47
- *
48
- * @param config - subset of ImageMode settings required for message handling
45
+ * Create a MessageHandler
46
+ * @param {Immutable<Config>} config - subset of ImageMode settings required for message handling
47
+ * @param {HUDItemManager} hud - HUD manager used to display informational messages on the canvas
49
48
  */
50
49
  constructor(config: Immutable<Config>, hud: HUDItemManager);
51
50
  dispose(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"MessageHandler.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/studio-base/src/panels/ThreeDeeRender/renderables/ImageMode/MessageHandler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MessageHandler.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/studio-base/src/panels/ThreeDeeRender/renderables/ImageMode/MessageHandler.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,16 @@
1
1
  // This Source Code Form is subject to the terms of the Mozilla Public
2
2
  // License, v2.0. If a copy of the MPL was not distributed with this
3
3
  // file, You can obtain one at http://mozilla.org/MPL/2.0/
4
+ import { getTimestampFromImage } from "@foxglove/studio-base/panels/ThreeDeeRender/renderables/Images/ImageTypes";
4
5
  import { normalizeCompressedImage, normalizeRawImage, normalizeRosCompressedImage, normalizeRosImage, } from "@foxglove/studio-base/panels/ThreeDeeRender/renderables/Images/imageNormalizers";
5
6
  import { normalizeCameraInfo } from "@foxglove/studio-base/panels/ThreeDeeRender/renderables/projections";
6
7
  import { normalizeAnnotations } from "./annotations/normalizeAnnotations";
7
8
  import { IMAGE_MODE_HUD_GROUP_ID, WAITING_FOR_BOTH_MESSAGES_HUD_ID, WAITING_FOR_CALIBRATION_HUD_ID, WAITING_FOR_IMAGES_EMPTY_HUD_ID, WAITING_FOR_IMAGES_NOTICE_ID, WAITING_FOR_SYNC_EMPTY_HUD_ID, WAITING_FOR_SYNC_NOTICE_HUD_ID, } from "./constants";
8
9
  import { t3D } from "../../t3D";
10
+ const syncToleranceSec = Number(localStorage.getItem('viewer-syncToleranceSec')) || 0.15; // maximum acceptable time difference for selecting a “closest” annotation.
11
+ const maxStalenessSec = Number(localStorage.getItem('viewer-maxStalenessSec')) || 1.1; // how long we can hold the last older annotation if no better match is available. 1s corresponds to 1 FPS + 100ms window for jitter.
12
+ const hysteresisSec = Number(localStorage.getItem('viewer-hysteresisSec')) || 0.1; // how much “stickiness” we allow before switching candidates.
13
+ console.log("Synchronization parameters:", { syncToleranceSec, maxStalenessSec, hysteresisSec });
9
14
  // Have constants for the HUD items so that they don't need to be recreated and GCed every message
10
15
  export const WAITING_FOR_BOTH_HUD_ITEM = {
11
16
  id: WAITING_FOR_BOTH_MESSAGES_HUD_ID,
@@ -68,14 +73,15 @@ export class MessageHandler {
68
73
  #onAnnotationReceivedEvent;
69
74
  #annotationsFpsRefreshInterval = null;
70
75
  lastImage;
76
+ // Store a small buffer of recent annotations per topic with computed seconds timestamps
71
77
  annotationsMap = new Map();
72
- ghostAnnotationsMap = new Map();
73
- syncToleranceMs = 150;
74
- ghostTimeoutMs = 1000;
78
+ // Track last selected annotation per topic to add hysteresis and reduce flicker
79
+ lastSelectedByTopic = new Map();
75
80
  availableAnnotationTopics;
76
81
  /**
77
- *
78
- * @param config - subset of ImageMode settings required for message handling
82
+ * Create a MessageHandler
83
+ * @param {Immutable<Config>} config - subset of ImageMode settings required for message handling
84
+ * @param {HUDItemManager} hud - HUD manager used to display informational messages on the canvas
79
85
  */
80
86
  constructor(config, hud) {
81
87
  this.#config = config;
@@ -84,6 +90,16 @@ export class MessageHandler {
84
90
  annotationsByTopic: new Map(),
85
91
  };
86
92
  this.availableAnnotationTopics = new Set();
93
+ // Set default values for synchronization to local storage if they're not already set
94
+ if (localStorage.getItem('viewer-syncToleranceSec') === null) {
95
+ localStorage.setItem('viewer-syncToleranceSec', syncToleranceSec.toString());
96
+ }
97
+ if (localStorage.getItem('viewer-maxStalenessSec') === null) {
98
+ localStorage.setItem('viewer-maxStalenessSec', maxStalenessSec.toString());
99
+ }
100
+ if (localStorage.getItem('viewer-hysteresisSec') === null) {
101
+ localStorage.setItem('viewer-hysteresisSec', hysteresisSec.toString());
102
+ }
87
103
  }
88
104
  dispose() {
89
105
  if (this.#annotationsFpsRefreshInterval) {
@@ -112,51 +128,55 @@ export class MessageHandler {
112
128
  this.handleImage(messageEvent, normalizeCompressedImage(messageEvent.message));
113
129
  };
114
130
  handleImage(message, image) {
115
- const normalized = {
131
+ this.lastImage = {
116
132
  ...message,
117
133
  message: image,
118
134
  };
119
- this.lastImage = normalized;
120
135
  this.#emitState();
121
136
  }
122
137
  handleCameraInfo = (message) => {
123
- const cameraInfo = normalizeCameraInfo(message.message);
124
- this.#lastReceivedMessages.cameraInfo = cameraInfo;
138
+ this.#lastReceivedMessages.cameraInfo = normalizeCameraInfo(message.message);
125
139
  this.#emitState();
126
140
  };
127
141
  handleAnnotations = (messageEvent) => {
128
142
  const list = normalizeAnnotations(messageEvent.message, messageEvent.schemaName);
129
- const timestamp = performance.now();
143
+ const arrivalSec = performance.now() / 1000;
130
144
  if (list.length > 0 && messageEvent.topic) {
131
145
  this.#onAnnotationReceivedEvent?.();
132
- this.annotationsMap.set(messageEvent.topic, {
133
- annotation: {
134
- originalMessage: messageEvent,
135
- annotations: list,
136
- },
137
- timestamp: timestamp,
138
- });
139
- this.ghostAnnotationsMap.set(messageEvent.topic, {
146
+ // Prefer timestamps embedded in the annotations themselves
147
+ const stampTimes = [];
148
+ for (const a of list) {
149
+ const sec = a.stamp?.sec;
150
+ const nsec = a.stamp?.nsec;
151
+ if (typeof sec === "number" && typeof nsec === "number") {
152
+ stampTimes.push(sec + nsec / 1e9);
153
+ }
154
+ }
155
+ const timeSec = stampTimes.length > 0 ? Math.max(...stampTimes) : arrivalSec;
156
+ const entry = {
140
157
  annotation: {
141
158
  originalMessage: messageEvent,
142
159
  annotations: list,
143
160
  },
144
- timestamp: timestamp,
145
- });
161
+ timeSec,
162
+ arrivalSec,
163
+ };
164
+ const topic = messageEvent.topic;
165
+ const buffer = this.annotationsMap.get(topic) ?? [];
166
+ buffer.push(entry);
167
+ // Keep unlimited buffer length, but drop entries older than 20 seconds based on arrival time
168
+ const retentionSec = 20;
169
+ const nowSec = performance.now() / 1000;
170
+ const cutoffArrival = nowSec - retentionSec;
171
+ const trimmed = buffer.filter((e) => e.arrivalSec >= cutoffArrival);
172
+ this.annotationsMap.set(topic, trimmed);
146
173
  }
174
+ // Always emit; render selection logic will pick appropriate annotations for the last image
175
+ this.#emitState();
147
176
  if (this.#config.synchronize === false) {
148
- this.#emitState();
149
- return;
150
- }
151
- if (list.length === 0 && messageEvent.topic) {
152
- for (const [topic, annotation] of this.ghostAnnotationsMap.entries()) {
153
- if (Math.abs(timestamp - annotation.timestamp) <= this.syncToleranceMs) {
154
- this.annotationsMap.set(topic, { annotation: annotation.annotation, timestamp });
155
- }
156
- }
157
- this.#emitState();
158
177
  return;
159
178
  }
179
+ // synchronized mode does selection in #getRenderState
160
180
  };
161
181
  setConfig(newConfig) {
162
182
  let changed = false;
@@ -201,6 +221,9 @@ export class MessageHandler {
201
221
  this.#lastReceivedMessages = {
202
222
  annotationsByTopic: new Map(),
203
223
  };
224
+ this.annotationsMap.clear();
225
+ this.lastSelectedByTopic.clear();
226
+ this.lastImage = undefined;
204
227
  this.#oldRenderState = undefined;
205
228
  this.#emitState();
206
229
  }
@@ -239,34 +262,65 @@ export class MessageHandler {
239
262
  image: this.lastImage,
240
263
  annotationsByTopic: new Map(),
241
264
  };
242
- const imageTimestamp = this.lastImage.receiveTime
243
- ? Number(`${this.lastImage.receiveTime.sec}.${this.lastImage.receiveTime.nsec}`)
244
- : performance.now();
245
- const now = performance.now();
246
- for (const [topic, annotation] of this.annotationsMap.entries()) {
247
- // FIXME: We can liekly get this value better from the annotation message itself
248
- const annotationTimestamp = Number.parseFloat(`${annotation.annotation.originalMessage.receiveTime?.sec}.${annotation.annotation.originalMessage.receiveTime?.nsec}`);
249
- // In case the annotation timestamp is not available, we just continue
250
- if (Number.isNaN(annotationTimestamp)) {
251
- console.warn("Skipping annotation with no/invalid timestamp", annotation);
265
+ const imageTimestampSec = (() => {
266
+ const stamp = getTimestampFromImage(this.lastImage.message);
267
+ const sec = stamp?.sec;
268
+ const nsec = stamp?.nsec;
269
+ if (typeof sec === "number" && typeof nsec === "number") {
270
+ return sec + nsec / 1e9;
271
+ }
272
+ return performance.now() / 1000;
273
+ })();
274
+ for (const [topic, buffer] of this.annotationsMap.entries()) {
275
+ if (buffer.length === 0)
276
+ continue;
277
+ // Prefer newest annotation older than the image within staleness window
278
+ let preferred;
279
+ for (let i = buffer.length - 1; i >= 0; i--) {
280
+ const entry = buffer[i];
281
+ const age = imageTimestampSec - entry.timeSec;
282
+ if (age >= 0 && age <= maxStalenessSec) {
283
+ preferred = entry;
284
+ break;
285
+ }
286
+ }
287
+ // If none older within staleness, fall back to closest within tolerance
288
+ let fallback = buffer[0];
289
+ let fallbackDelta = Math.abs(fallback.timeSec - imageTimestampSec);
290
+ for (let i = 1; i < buffer.length; i++) {
291
+ const entry = buffer[i];
292
+ const delta = Math.abs(entry.timeSec - imageTimestampSec);
293
+ if (delta < fallbackDelta) {
294
+ fallback = entry;
295
+ fallbackDelta = delta;
296
+ }
297
+ }
298
+ let candidate = preferred ?? fallback;
299
+ if (!candidate)
300
+ continue;
301
+ const candidateDelta = Math.abs(candidate.timeSec - imageTimestampSec);
302
+ const candidateAge = imageTimestampSec - candidate.timeSec;
303
+ const acceptable = (preferred != undefined && candidateAge >= 0 && candidateAge <= maxStalenessSec) ||
304
+ (preferred == undefined && candidateDelta <= syncToleranceSec);
305
+ const notFutureFar = candidate.timeSec <= imageTimestampSec + syncToleranceSec;
306
+ if (!acceptable || !notFutureFar) {
252
307
  continue;
253
308
  }
254
- // We only want to show annotations that are older (or same) than the image frame with 100ms tolerance
255
- const isAnnotationOlderThanImageFrame = annotationTimestamp <= imageTimestamp + 0.1;
256
- //console.log({
257
- // annotation,
258
- // imageTimestamp,
259
- // annotationTimestamp,
260
- // isAnnotationOlderThanImageFrame,
261
- //});
262
- const annotationGhost = now - annotation.timestamp < this.ghostTimeoutMs;
263
- // console.log({ now, annotationTimestamp: annotation.timestamp, annotationGhost });
264
- if ((Math.abs(imageTimestamp - annotation.timestamp) <= this.syncToleranceMs || // within tolerance
265
- annotationGhost) && // I think this says "or annotation is newer than 1s"
266
- isAnnotationOlderThanImageFrame // annotation has to be older than image frame within 100ms tolerance
267
- ) {
268
- state.annotationsByTopic.set(topic, annotation.annotation);
309
+ // Hysteresis: if previous selection is very close and still valid, keep it to avoid flicker
310
+ const prevTime = this.lastSelectedByTopic.get(topic);
311
+ if (prevTime != undefined) {
312
+ const prevEntry = buffer.find((e) => Math.abs(e.timeSec - prevTime) < 1e-6);
313
+ if (prevEntry) {
314
+ const prevDelta = Math.abs(prevEntry.timeSec - imageTimestampSec);
315
+ const prevAge = imageTimestampSec - prevEntry.timeSec;
316
+ const prevValid = (prevAge >= 0 && prevAge <= maxStalenessSec) || prevDelta <= syncToleranceSec;
317
+ if (prevValid && Math.abs(prevEntry.timeSec - candidate.timeSec) <= hysteresisSec) {
318
+ candidate = prevEntry;
319
+ }
320
+ }
269
321
  }
322
+ state.annotationsByTopic.set(topic, candidate.annotation);
323
+ this.lastSelectedByTopic.set(topic, candidate.timeSec);
270
324
  }
271
325
  return state;
272
326
  }
@@ -1 +1 @@
1
- {"version":3,"file":"MessageHandler.js","sourceRoot":"","sources":["../../../../../../../../../packages/studio-base/src/panels/ThreeDeeRender/renderables/ImageMode/MessageHandler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MessageHandler.js","sourceRoot":"","sources":["../../../../../../../../../packages/studio-base/src/panels/ThreeDeeRender/renderables/ImageMode/MessageHandler.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,oEAAoE;AACpE,0DAA0D;AAa1D,OAAO,EAAY,qBAAqB,EAAE,MAAM,2EAA2E,CAAC;AAC5H,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,2BAA2B,EAC3B,iBAAiB,GAClB,MAAM,iFAAiF,CAAC;AACzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qEAAqE,CAAC;AAM1G,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAE1E,OAAO,EACL,uBAAuB,EACvB,gCAAgC,EAChC,8BAA8B,EAC9B,+BAA+B,EAC/B,4BAA4B,EAC5B,6BAA6B,EAC7B,8BAA8B,GAC/B,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGhC,MAAM,gBAAgB,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,2EAA2E;AACrK,MAAM,eAAe,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,qIAAqI;AAC5N,MAAM,aAAa,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,8DAA8D;AAEjJ,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,CAAC,CAAC;AA8BjG,kGAAkG;AAClG,MAAM,CAAC,MAAM,yBAAyB,GAAY;IAChD,EAAE,EAAE,gCAAgC;IACpC,KAAK,EAAE,uBAAuB;IAC9B,UAAU,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,gCAAgC,CAAC;IACvD,WAAW,EAAE,OAAO;CACrB,CAAC;AAEF,MAAM,CAAC,MAAM,gCAAgC,GAAY;IACvD,EAAE,EAAE,8BAA8B;IAClC,KAAK,EAAE,uBAAuB;IAC9B,UAAU,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,uBAAuB,CAAC;IAC9C,WAAW,EAAE,OAAO;CACrB,CAAC;AAEF,MAAM,CAAC,MAAM,iCAAiC,GAAY;IACxD,EAAE,EAAE,4BAA4B;IAChC,KAAK,EAAE,uBAAuB;IAC9B,UAAU,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACzC,WAAW,EAAE,QAAQ;CACtB,CAAC;AAEF,MAAM,CAAC,MAAM,gCAAgC,GAAY;IACvD,EAAE,EAAE,+BAA+B;IACnC,KAAK,EAAE,uBAAuB;IAC9B,UAAU,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC;IACzC,WAAW,EAAE,OAAO;CACrB,CAAC;AAEF,MAAM,CAAC,MAAM,gCAAgC,GAAY;IACvD,EAAE,EAAE,8BAA8B;IAClC,KAAK,EAAE,uBAAuB;IAC9B,UAAU,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,2BAA2B,CAAC;IAClD,WAAW,EAAE,QAAQ;CACtB,CAAC;AAEF,MAAM,CAAC,MAAM,+BAA+B,GAAY;IACtD,EAAE,EAAE,6BAA6B;IACjC,KAAK,EAAE,uBAAuB;IAC9B,UAAU,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,2BAA2B,CAAC;IAClD,WAAW,EAAE,OAAO;CACrB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,OAAO,cAAc;IACzB,qDAAqD;IACrD,OAAO,CAAoB;IAE3B,2EAA2E;IAC3E,IAAI,CAAiB;IAErB,qCAAqC;IACrC,eAAe,CAAiC;IAEhD,+CAA+C;IAC/C,qBAAqB,CAAsB;IAE3C,iEAAiE;IACjE,UAAU,GAA0B,EAAE,CAAC;IAEvC;;;;OAIG;IAEH,0BAA0B,CAAc;IAExC,8BAA8B,GAA0B,IAAI,CAAC;IAErD,SAAS,CAA0B;IAC3C,wFAAwF;IAChF,cAAc,GAIhB,IAAI,GAAG,EAAE,CAAC;IAChB,gFAAgF;IACxE,mBAAmB,GAAwB,IAAI,GAAG,EAAE,CAAC;IAC7D,yBAAyB,CAAc;IAEvC;;;;OAIG;IACH,YAAmB,MAAyB,EAAE,GAAmB;QAC/D,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,qBAAqB,GAAG;YAC3B,kBAAkB,EAAE,IAAI,GAAG,EAAE;SAC9B,CAAC;QACF,IAAI,CAAC,yBAAyB,GAAG,IAAI,GAAG,EAAE,CAAC;QAE3C,qFAAqF;QACrF,IAAI,YAAY,CAAC,OAAO,CAAC,yBAAyB,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7D,YAAY,CAAC,OAAO,CAAC,yBAAyB,EAAE,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,YAAY,CAAC,OAAO,CAAC,wBAAwB,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5D,YAAY,CAAC,OAAO,CAAC,wBAAwB,EAAE,eAAe,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,YAAY,CAAC,OAAO,CAAC,sBAAsB,CAAC,KAAK,IAAI,EAAE,CAAC;YAC1D,YAAY,CAAC,OAAO,CAAC,sBAAsB,EAAE,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAEM,OAAO;QACZ,IAAI,IAAI,CAAC,8BAA8B,EAAE,CAAC;YACxC,aAAa,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAEM,WAAW,CAAC,QAA6B;QAC9C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAEM,iCAAiC,CAAC,OAAmB;QAC1D,IAAI,CAAC,0BAA0B,GAAG,OAAO,CAAC;IAC5C,CAAC;IAEM,cAAc,CAAC,QAA6B;QACjD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;IACpE,CAAC;IAEM,iBAAiB,GAAG,CAAC,YAA2C,EAAQ,EAAE;QAC/E,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,iBAAiB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC;IAEK,wBAAwB,GAAG,CAChC,YAAqD,EAC/C,EAAE;QACR,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,2BAA2B,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IACpF,CAAC,CAAC;IAEK,cAAc,GAAG,CAAC,YAA2C,EAAQ,EAAE;QAC5E,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,iBAAiB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1E,CAAC,CAAC;IAEK,qBAAqB,GAAG,CAAC,YAAkD,EAAQ,EAAE;QAC1F,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,wBAAwB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IACjF,CAAC,CAAC;IAEQ,WAAW,CAAC,OAAsC,EAAE,KAAe;QAC3E,IAAI,CAAC,SAAS,GAAG;YACf,GAAG,OAAO;YACV,OAAO,EAAE,KAAK;SACW,CAAC;QAC5B,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEM,gBAAgB,GAAG,CAAC,OAAwC,EAAQ,EAAE;QAC3E,IAAI,CAAC,qBAAqB,CAAC,UAAU,GAAG,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7E,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC,CAAC;IAEK,iBAAiB,GAAG,CACzB,YAA2F,EAC3F,EAAE;QACF,MAAM,IAAI,GAAG,oBAAoB,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,UAAU,CAAC,CAAC;QAEjF,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAE5C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,KAAK,EAAE,CAAC;YAC1C,IAAI,CAAC,0BAA0B,EAAE,EAAE,CAAC;YAEpC,2DAA2D;YAC3D,MAAM,UAAU,GAAa,EAAE,CAAC;YAChC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,MAAM,GAAG,GAAI,CAAC,CAAC,KAAa,EAAE,GAAyB,CAAC;gBACxD,MAAM,IAAI,GAAI,CAAC,CAAC,KAAa,EAAE,IAA0B,CAAC;gBAE1D,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACxD,UAAU,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;gBACpC,CAAC;YACH,CAAC;YACD,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;YAE7E,MAAM,KAAK,GAAG;gBACZ,UAAU,EAAE;oBACV,eAAe,EAAE,YAAY;oBAC7B,WAAW,EAAE,IAAI;iBAClB;gBACD,OAAO;gBACP,UAAU;aACX,CAAC;YAEF,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEnB,6FAA6F;YAC7F,MAAM,YAAY,GAAG,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YACxC,MAAM,aAAa,GAAG,MAAM,GAAG,YAAY,CAAC;YAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,IAAI,aAAa,CAAC,CAAC;YAEpE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;QAED,2FAA2F;QAC3F,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YACvC,OAAO;QACT,CAAC;QAED,sDAAsD;IACxD,CAAC,CAAC;IAEK,SAAS,CAAC,SAAqC;QACpD,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,IAAI,SAAS,CAAC,WAAW,IAAI,SAAS,IAAI,SAAS,CAAC,WAAW,KAAK,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC7F,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;YAEjC,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QAED,IAAI,YAAY,IAAI,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,UAAU,EAAE,CAAC;YAClF,IAAI,CAAC,qBAAqB,CAAC,KAAK,GAAG,SAAS,CAAC;YAC7C,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,KAAK,SAAS,CAAC,gBAAgB,EAAE,CAAC;YACjE,IAAI,CAAC,qBAAqB,CAAC,UAAU,GAAG,SAAS,CAAC;YAClD,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QAED,IACE,SAAS,CAAC,WAAW,IAAI,SAAS;YAClC,IAAI,CAAC,OAAO,CAAC,WAAW;YACxB,IAAI,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC,WAAW,EAClD,CAAC;YACD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;YAE3C,KAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;gBACtE,IAAI,QAAQ,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;oBAC/B,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;YAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,IAAI,EAAE,EAAE,CAAC;gBACzE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;oBACjC,IAAI,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAC5D,OAAO,GAAG,IAAI,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;QAEzB,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAEM,4BAA4B,CAAC,UAAoB;QACtD,IAAI,CAAC,yBAAyB,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;QACrD,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,qBAAqB,GAAG;YAC3B,kBAAkB,EAAE,IAAI,GAAG,EAAE;SAC9B,CAAC;QACF,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC5B,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QACjC,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED,UAAU;QACR,MAAM,KAAK,GAAG,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAEhD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;YAC7B,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,0CAA0C;IACnC,0BAA0B;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACrC,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,mBAAmB,CAAC,KAAyB;QAC3C,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,SAAS,CAAC;QAEvE,MAAM,eAAe,GACnB,IAAI,CAAC,qBAAqB,CAAC,KAAK,IAAI,SAAS,IAAI,KAAK,CAAC,KAAK,IAAI,SAAS,CAAC;QAE5E,MAAM,qBAAqB,GAAG,mBAAmB,IAAI,KAAK,CAAC,UAAU,IAAI,SAAS,CAAC;QAEnF,MAAM,cAAc,GAAG,eAAe,IAAI,qBAAqB,CAAC;QAEhE,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,yBAAyB,CAAC,CAAC;QAEnE,IAAI,CAAC,IAAI,CAAC,aAAa,CACrB,qBAAqB,IAAI,CAAC,cAAc,EACxC,gCAAgC,CACjC,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,aAAa,CACrB,eAAe,IAAI,CAAC,mBAAmB,IAAI,CAAC,cAAc,EAC1D,gCAAgC,CACjC,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,aAAa,CACrB,eAAe,IAAI,mBAAmB,EACtC,iCAAiC,CAClC,CAAC;IACJ,CAAC;IAED,eAAe;QACb,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO;gBACL,kBAAkB,EAAE,IAAI,GAAG,EAAE;gBAC7B,uBAAuB,EAAE,SAAS;gBAClC,uBAAuB,EAAE,SAAS;aACnC,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAuB;YAChC,KAAK,EAAE,IAAI,CAAC,SAAS;YACrB,kBAAkB,EAAE,IAAI,GAAG,EAAE;SAC9B,CAAC;QAEF,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE;YAC9B,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,SAAU,CAAC,OAAO,CAAC,CAAC;YAC7D,MAAM,GAAG,GAAI,KAAa,EAAE,GAAyB,CAAC;YACtD,MAAM,IAAI,GAAI,KAAa,EAAE,IAA0B,CAAC;YACxD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACxD,OAAO,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;YAC1B,CAAC;YACD,OAAO,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;QAClC,CAAC,CAAC,EAAE,CAAC;QAEL,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAElC,wEAAwE;YACxE,IAAI,SAA8C,CAAC;YACnD,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;gBACzB,MAAM,GAAG,GAAG,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAC;gBAC9C,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;oBACvC,SAAS,GAAG,KAAK,CAAC;oBAClB,MAAM;gBACR,CAAC;YACH,CAAC;YAED,wEAAwE;YACxE,IAAI,QAAQ,GAAwC,MAAM,CAAC,CAAC,CAAE,CAAC;YAC/D,IAAI,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,GAAG,iBAAiB,CAAC,CAAC;YAEnE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;gBACzB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,GAAG,iBAAiB,CAAC,CAAC;gBAC1D,IAAI,KAAK,GAAG,aAAa,EAAE,CAAC;oBAC1B,QAAQ,GAAG,KAAK,CAAC;oBACjB,aAAa,GAAG,KAAK,CAAC;gBACxB,CAAC;YACH,CAAC;YAED,IAAI,SAAS,GAAG,SAAS,IAAI,QAAQ,CAAC;YACtC,IAAI,CAAC,SAAS;gBAAE,SAAS;YAEzB,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,GAAG,iBAAiB,CAAC,CAAC;YACvE,MAAM,YAAY,GAAG,iBAAiB,GAAG,SAAS,CAAC,OAAO,CAAC;YAC3D,MAAM,UAAU,GACd,CAAC,SAAS,IAAI,SAAS,IAAI,YAAY,IAAI,CAAC,IAAI,YAAY,IAAI,eAAe,CAAC;gBAChF,CAAC,SAAS,IAAI,SAAS,IAAI,cAAc,IAAI,gBAAgB,CAAC,CAAC;YACjE,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,IAAI,iBAAiB,GAAG,gBAAgB,CAAC;YAE/E,IAAI,CAAC,UAAU,IAAI,CAAC,YAAY,EAAE,CAAC;gBACjC,SAAS;YACX,CAAC;YAED,4FAA4F;YAC5F,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACrD,IAAI,QAAQ,IAAI,SAAS,EAAE,CAAC;gBAC1B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,GAAG,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;gBAC5E,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,GAAG,iBAAiB,CAAC,CAAC;oBAClE,MAAM,OAAO,GAAG,iBAAiB,GAAG,SAAS,CAAC,OAAO,CAAC;oBACtD,MAAM,SAAS,GACb,CAAC,OAAO,IAAI,CAAC,IAAI,OAAO,IAAI,eAAe,CAAC,IAAI,SAAS,IAAI,gBAAgB,CAAC;oBAChF,IAAI,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,aAAa,EAAE,CAAC;wBAClF,SAAS,GAAG,SAAS,CAAC;oBACxB,CAAC;gBACH,CAAC;YACH,CAAC;YAED,KAAK,CAAC,kBAAmB,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;YAC3D,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@luxonis/visualizer-protobuf",
3
- "version": "2.64.0",
3
+ "version": "2.66.0",
4
4
  "type": "module",
5
5
  "description": "RobotHub Visualizer Library",
6
6
  "author": "Luxonis Corp",