@luxonis/visualizer-protobuf 2.38.0 → 2.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{communicator-BjQGdkEF.js → communicator-Rs8pk0Io.js} +1 -1
- package/dist/{deserialization.worker-B4mbcVaD.js → deserialization.worker-BKq1x9xw.js} +16 -2
- package/dist/{encoding-BaoHXAPX.js → encoding-D95pQf33.js} +25 -10
- package/dist/{index-wJ2ZczEf.js → index--iQfQ_BM.js} +1 -1
- package/dist/{index-CVyLuyd1.js → index-9Tyh0kLM.js} +1 -1
- package/dist/{index-BXVV46N_.js → index-B6HlbGsq.js} +1 -1
- package/dist/{index-B0a8Fcsq.js → index-BF8y50SS.js} +145 -1093
- package/dist/{index-BtiKczUb.js → index-BVjYgfIS.js} +1 -1
- package/dist/{index-DV2Nx63w.js → index-BXw9XAtq.js} +1 -1
- package/dist/{index-B_YpX6mQ.js → index-CGKMb8B_.js} +1 -1
- package/dist/{index-Bju8N8aL.js → index-CVcETMbV.js} +1 -1
- package/dist/{index-FFoDQ871.js → index-CphhTBOZ.js} +1 -1
- package/dist/{index-CfastwMS.js → index-DCAb3slV.js} +1 -1
- package/dist/{index-Dss-letG.js → index-DGOR7UPX.js} +1 -1
- package/dist/{index-C4J2Ez3Z.js → index-DIvlB71Y.js} +1 -1
- package/dist/{index-CW07jSZd.js → index-DKBjhfFf.js} +1 -1
- package/dist/{index-BJQvzWXZ.js → index-DMwj27wf.js} +1 -1
- package/dist/{index-fCPVXmPm.js → index-DarWKW89.js} +1 -1
- package/dist/{index-CHQ8c72c.js → index-MXZP0RG4.js} +1 -1
- package/dist/{index-D4iLc9pG.js → index-Zf_aqI9D.js} +1 -1
- package/dist/{index-Dzy9H4eN.js → index-ok4WDE4X.js} +2 -2
- package/dist/{index-MWcjCcp7.js → index-xjxIYb7x.js} +25 -24
- package/dist/index.js +1 -1
- package/dist/lib/src/connection/connection.d.ts +2 -2
- package/dist/lib/src/connection/connection.d.ts.map +1 -1
- package/dist/lib/src/connection/connection.js.map +1 -1
- package/dist/lib/src/connection/foxglove-connection.d.ts +2 -2
- package/dist/lib/src/connection/foxglove-connection.d.ts.map +1 -1
- package/dist/lib/src/connection/foxglove-connection.js.map +1 -1
- package/dist/lib/src/messaging/deserialization.worker.d.ts +5 -2
- package/dist/lib/src/messaging/deserialization.worker.d.ts.map +1 -1
- package/dist/lib/src/messaging/deserialization.worker.js +10 -1
- package/dist/lib/src/messaging/deserialization.worker.js.map +1 -1
- package/dist/lib/src/messaging/message-handler.d.ts +2 -2
- package/dist/lib/src/messaging/message-handler.d.ts.map +1 -1
- package/dist/lib/src/messaging/message-handler.js +2 -1
- package/dist/lib/src/messaging/message-handler.js.map +1 -1
- package/dist/lib/src/protobuf.generated/EncodedFrame.js +1 -1
- package/dist/lib/src/protobuf.generated/Event.js +1 -1
- package/dist/lib/src/protobuf.generated/IMUData.js +1 -1
- package/dist/lib/src/protobuf.generated/ImageAnnotations.js +1 -1
- package/dist/lib/src/protobuf.generated/ImgDetections.d.ts +1 -0
- package/dist/lib/src/protobuf.generated/ImgDetections.d.ts.map +1 -1
- package/dist/lib/src/protobuf.generated/ImgDetections.js +16 -2
- package/dist/lib/src/protobuf.generated/ImgDetections.js.map +1 -1
- package/dist/lib/src/protobuf.generated/ImgFrame.js +1 -1
- package/dist/lib/src/protobuf.generated/PointCloudData.js +1 -1
- package/dist/lib/src/protobuf.generated/SpatialImgDetections.js +1 -1
- package/dist/lib/src/protobuf.generated/common.js +1 -1
- package/dist/lib/src/utils/encoding.js +1 -1
- package/dist/lib/src/utils/encoding.js.map +1 -1
- package/dist/lib/src/utils/error.d.ts +2 -0
- package/dist/lib/src/utils/error.d.ts.map +1 -1
- package/dist/lib/src/utils/error.js +3 -0
- package/dist/lib/src/utils/error.js.map +1 -1
- package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/ImageMode/MessageHandler.d.ts +6 -0
- package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/ImageMode/MessageHandler.d.ts.map +1 -1
- package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/ImageMode/MessageHandler.js +52 -233
- package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/ImageMode/MessageHandler.js.map +1 -1
- package/dist/{worker-5EVhuR0-.js → worker-BCJnECSn.js} +2 -2
- package/dist/{worker-4R8nuLc9.js → worker-ChOPGWcQ.js} +2 -2
- package/package.json +1 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import React__default, { useReducer, useRef, useCallback, useLayoutEffect, Component, useContext, useState, useEffect, createContext, forwardRef, createElement, cloneElement, useMemo, Profiler, StrictMode } from 'react';
|
|
3
3
|
import ReactDOM__default from 'react-dom';
|
|
4
|
-
import { S as isSymbol, U as toString, V as keys, W as getSymbols$1, X as stubArray, Y as arrayPush, Z as baseGetAllKeys, g as getTag, $ as getAllKeys, k as baseGet, c as baseIteratee, j as castPath, t as toKey, a0 as arrayMap$1, a1 as baseUniq, b as baseFlatten, a2 as useMustNotChange, a3 as useCurrentLayoutActions, a4 as useCurrentLayoutSelector, r as reportError, A as AppError, L as Logger, u as useGuaranteedContext, a5 as usePanelMosaicId, a6 as useSelectedPanels, a7 as PANEL_TITLE_CONFIG_KEY, a8 as noop$4, o as getPanelTypeFromId, M as useShallowMemo, T as TAB_PANEL_TYPE, J as filterMap, d as dist$
|
|
4
|
+
import { S as isSymbol, U as toString, V as keys, W as getSymbols$1, X as stubArray, Y as arrayPush, Z as baseGetAllKeys, g as getTag, $ as getAllKeys, k as baseGet, c as baseIteratee, j as castPath, t as toKey, a0 as arrayMap$1, a1 as baseUniq, b as baseFlatten, a2 as useMustNotChange, a3 as useCurrentLayoutActions, a4 as useCurrentLayoutSelector, r as reportError, A as AppError, L as Logger, u as useGuaranteedContext, a5 as usePanelMosaicId, a6 as useSelectedPanels, a7 as PANEL_TITLE_CONFIG_KEY, a8 as noop$4, o as getPanelTypeFromId, M as useShallowMemo, T as TAB_PANEL_TYPE, J as filterMap, d as dist$2, a9 as useAppConfiguration, aa as useValueChangedDebugLog, ab as useJsonTreeTheme } from './tslib.es6-C73eoP_E.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 } from './index-
|
|
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 } from './index-xjxIYb7x.js';
|
|
7
7
|
import { MosaicDragType, MosaicContext, MosaicWindowContext, getOtherBranch, getNodeAtPath } from 'react-mosaic-component';
|
|
8
8
|
import { t as typescript } from './useMessageReducer-jNx5e6JW.js';
|
|
9
9
|
import { g as getDefaultExportFromCjs, c as commonjsGlobal, a as getAugmentedNamespace } from './_commonjsHelpers-E-ZsRS8r.js';
|
|
@@ -10899,7 +10899,7 @@ function initRenderStateBuilder() {
|
|
|
10899
10899
|
|
|
10900
10900
|
// Given that messagesByTopic should be in order by receiveTime, we need to
|
|
10901
10901
|
// combine all of the messages into a single array and sorted by receive time.
|
|
10902
|
-
forEachSortedArrays(topicsToPreloadForPanel.map(topic => block.messagesByTopic[topic] ?? []), (a, b) => dist$
|
|
10902
|
+
forEachSortedArrays(topicsToPreloadForPanel.map(topic => block.messagesByTopic[topic] ?? []), (a, b) => dist$2.compare(a.receiveTime, b.receiveTime), messageEvent => {
|
|
10903
10903
|
// Message blocks may contain topics that we are not subscribed to so we
|
|
10904
10904
|
// need to filter those out. We use unconvertedSubscriptionTopics to
|
|
10905
10905
|
// determine if we should include the message event. Clients expect
|
|
@@ -10936,7 +10936,7 @@ function initRenderStateBuilder() {
|
|
|
10936
10936
|
if (watchedFields.has("previewTime")) {
|
|
10937
10937
|
const startTime = activeData?.startTime;
|
|
10938
10938
|
if (startTime != undefined && hoverValue != undefined) {
|
|
10939
|
-
const stamp = dist$
|
|
10939
|
+
const stamp = dist$2.toSec(startTime) + hoverValue.value;
|
|
10940
10940
|
if (stamp !== renderState.previewTime) {
|
|
10941
10941
|
shouldRender = true;
|
|
10942
10942
|
}
|
|
@@ -11212,7 +11212,7 @@ function PanelExtensionAdapter(props) {
|
|
|
11212
11212
|
if (!isMounted()) {
|
|
11213
11213
|
return;
|
|
11214
11214
|
}
|
|
11215
|
-
const seekTarget = typeof stamp === "object" ? stamp : dist$
|
|
11215
|
+
const seekTarget = typeof stamp === "object" ? stamp : dist$2.fromSec(stamp);
|
|
11216
11216
|
seekPlayback(seekTarget);
|
|
11217
11217
|
} : undefined,
|
|
11218
11218
|
dataSourceProfile,
|
|
@@ -11244,7 +11244,7 @@ function PanelExtensionAdapter(props) {
|
|
|
11244
11244
|
if (!startTime) {
|
|
11245
11245
|
return;
|
|
11246
11246
|
}
|
|
11247
|
-
const secondsFromStart = stamp - dist$
|
|
11247
|
+
const secondsFromStart = stamp - dist$2.toSec(startTime);
|
|
11248
11248
|
setHoverValue({
|
|
11249
11249
|
type: "PLAYBACK_SECONDS",
|
|
11250
11250
|
componentId: "PanelExtensionAdatper",
|
|
@@ -12841,7 +12841,7 @@ class RenderableMarker extends Renderable {
|
|
|
12841
12841
|
const hasLifetime = marker.lifetime.sec !== 0 || marker.lifetime.nsec !== 0;
|
|
12842
12842
|
super(name, renderer, {
|
|
12843
12843
|
receiveTime: receiveTime ?? 0n,
|
|
12844
|
-
messageTime: dist$
|
|
12844
|
+
messageTime: dist$2.toNanoSec(marker.header.stamp),
|
|
12845
12845
|
frameId: renderer.normalizeFrameId(marker.header.frame_id),
|
|
12846
12846
|
pose: marker.pose,
|
|
12847
12847
|
settingsPath: ["topics", topic],
|
|
@@ -12852,7 +12852,7 @@ class RenderableMarker extends Renderable {
|
|
|
12852
12852
|
topic,
|
|
12853
12853
|
marker,
|
|
12854
12854
|
originalMarker: marker,
|
|
12855
|
-
expiresIn: hasLifetime ? dist$
|
|
12855
|
+
expiresIn: hasLifetime ? dist$2.toNanoSec(marker.lifetime) : undefined
|
|
12856
12856
|
});
|
|
12857
12857
|
}
|
|
12858
12858
|
idFromMessage() {
|
|
@@ -12873,12 +12873,12 @@ class RenderableMarker extends Renderable {
|
|
|
12873
12873
|
if (receiveTime != undefined) {
|
|
12874
12874
|
this.userData.receiveTime = receiveTime;
|
|
12875
12875
|
}
|
|
12876
|
-
this.userData.messageTime = dist$
|
|
12876
|
+
this.userData.messageTime = dist$2.toNanoSec(marker.header.stamp);
|
|
12877
12877
|
this.userData.frameId = this.renderer.normalizeFrameId(marker.header.frame_id);
|
|
12878
12878
|
this.userData.pose = marker.pose;
|
|
12879
12879
|
this.userData.marker = this.#renderMarker(marker);
|
|
12880
12880
|
this.userData.originalMarker = marker;
|
|
12881
|
-
this.userData.expiresIn = hasLifetime ? dist$
|
|
12881
|
+
this.userData.expiresIn = hasLifetime ? dist$2.toNanoSec(marker.lifetime) : undefined;
|
|
12882
12882
|
}
|
|
12883
12883
|
|
|
12884
12884
|
// Convert sRGB values to linear
|
|
@@ -16607,10 +16607,10 @@ class Cameras extends SceneExtension {
|
|
|
16607
16607
|
#handleCameraInfo = messageEvent => {
|
|
16608
16608
|
const topic = messageEvent.topic;
|
|
16609
16609
|
const cameraInfo = normalizeCameraInfo(messageEvent.message);
|
|
16610
|
-
const receiveTime = dist$
|
|
16610
|
+
const receiveTime = dist$2.toNanoSec(messageEvent.receiveTime);
|
|
16611
16611
|
let renderable = this.renderables.get(topic);
|
|
16612
16612
|
if (!renderable) {
|
|
16613
|
-
const messageTime = dist$
|
|
16613
|
+
const messageTime = dist$2.toNanoSec(cameraInfo.header.stamp);
|
|
16614
16614
|
const frameId = this.renderer.normalizeFrameId(cameraInfo.header.frame_id);
|
|
16615
16615
|
|
|
16616
16616
|
// Set the initial settings from default values merged with any user settings
|
|
@@ -16646,7 +16646,7 @@ class Cameras extends SceneExtension {
|
|
|
16646
16646
|
const settingsEqual = newSettings.color === prevSettings.color && newSettings.distance === prevSettings.distance && newSettings.planarProjectionFactor === prevSettings.planarProjectionFactor && newSettings.width === prevSettings.width;
|
|
16647
16647
|
const topic = renderable.userData.topic;
|
|
16648
16648
|
renderable.userData.receiveTime = receiveTime;
|
|
16649
|
-
renderable.userData.messageTime = dist$
|
|
16649
|
+
renderable.userData.messageTime = dist$2.toNanoSec(cameraInfo.header.stamp);
|
|
16650
16650
|
renderable.userData.frameId = this.renderer.normalizeFrameId(cameraInfo.header.frame_id);
|
|
16651
16651
|
renderable.userData.settings = newSettings;
|
|
16652
16652
|
|
|
@@ -17311,7 +17311,7 @@ class FoxgloveGrid extends SceneExtension {
|
|
|
17311
17311
|
#handleFoxgloveGrid = messageEvent => {
|
|
17312
17312
|
const topic = messageEvent.topic;
|
|
17313
17313
|
const foxgloveGrid = normalizeFoxgloveGrid(messageEvent.message);
|
|
17314
|
-
const receiveTime = dist$
|
|
17314
|
+
const receiveTime = dist$2.toNanoSec(messageEvent.receiveTime);
|
|
17315
17315
|
let renderable = this.renderables.get(topic);
|
|
17316
17316
|
if (!this.#validateFoxgloveGrid(foxgloveGrid, messageEvent.topic)) {
|
|
17317
17317
|
if (renderable) {
|
|
@@ -17365,7 +17365,7 @@ class FoxgloveGrid extends SceneExtension {
|
|
|
17365
17365
|
// Create the renderable
|
|
17366
17366
|
renderable = new FoxgloveGridRenderable(topic, this.renderer, {
|
|
17367
17367
|
receiveTime,
|
|
17368
|
-
messageTime: dist$
|
|
17368
|
+
messageTime: dist$2.toNanoSec(foxgloveGrid.timestamp),
|
|
17369
17369
|
frameId: this.renderer.normalizeFrameId(foxgloveGrid.frame_id),
|
|
17370
17370
|
pose: foxgloveGrid.pose,
|
|
17371
17371
|
settingsPath: ["topics", topic],
|
|
@@ -17432,7 +17432,7 @@ class FoxgloveGrid extends SceneExtension {
|
|
|
17432
17432
|
renderable.userData.foxgloveGrid = foxgloveGrid;
|
|
17433
17433
|
renderable.userData.pose = foxgloveGrid.pose;
|
|
17434
17434
|
renderable.userData.receiveTime = receiveTime;
|
|
17435
|
-
renderable.userData.messageTime = dist$
|
|
17435
|
+
renderable.userData.messageTime = dist$2.toNanoSec(foxgloveGrid.timestamp);
|
|
17436
17436
|
renderable.userData.frameId = this.renderer.normalizeFrameId(foxgloveGrid.frame_id);
|
|
17437
17437
|
const {
|
|
17438
17438
|
row_stride,
|
|
@@ -31073,7 +31073,7 @@ const WAITING_FOR_BOTH_MESSAGES_HUD_ID = "WAITING_FOR_BOTH_MESSAGES";
|
|
|
31073
31073
|
const WAITING_FOR_CALIBRATION_HUD_ID = "WAITING_FOR_CALIBRATION";
|
|
31074
31074
|
const WAITING_FOR_IMAGES_NOTICE_ID = "WAITING_FOR_IMAGES_NOTICE";
|
|
31075
31075
|
|
|
31076
|
-
var dist$
|
|
31076
|
+
var dist$1 = {};
|
|
31077
31077
|
|
|
31078
31078
|
var primitive = {};
|
|
31079
31079
|
|
|
@@ -31458,7 +31458,7 @@ Object.defineProperty(awaited, "__esModule", { value: true });
|
|
|
31458
31458
|
// Build-in types
|
|
31459
31459
|
__exportStar(awaited, exports);
|
|
31460
31460
|
|
|
31461
|
-
} (dist$
|
|
31461
|
+
} (dist$1));
|
|
31462
31462
|
|
|
31463
31463
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
31464
31464
|
// License, v2.0. If a copy of the MPL was not distributed with this
|
|
@@ -31606,7 +31606,7 @@ class ImageRenderable extends Renderable {
|
|
|
31606
31606
|
super.dispose();
|
|
31607
31607
|
}
|
|
31608
31608
|
updateHeaderInfo() {
|
|
31609
|
-
dist$
|
|
31609
|
+
dist$1.assert(this.userData.image, "updateHeaderInfo called without image");
|
|
31610
31610
|
|
|
31611
31611
|
// If there is camera info, the frameId comes from the camera info since the user may have
|
|
31612
31612
|
// selected camera info with a different frame than our image frame.
|
|
@@ -31615,7 +31615,7 @@ class ImageRenderable extends Renderable {
|
|
|
31615
31615
|
const image = this.userData.image;
|
|
31616
31616
|
const rawFrameId = this.userData.cameraInfo?.header.frame_id ?? ("header" in image ? image.header.frame_id : image.frame_id);
|
|
31617
31617
|
this.userData.frameId = typeof rawFrameId === "string" ? this.renderer.normalizeFrameId(rawFrameId) : rawFrameId;
|
|
31618
|
-
this.userData.messageTime = dist$
|
|
31618
|
+
this.userData.messageTime = dist$2.toNanoSec("header" in image ? image.header.stamp : image.timestamp);
|
|
31619
31619
|
}
|
|
31620
31620
|
details() {
|
|
31621
31621
|
return {
|
|
@@ -31744,7 +31744,7 @@ class ImageRenderable extends Renderable {
|
|
|
31744
31744
|
this.#isUpdating = false;
|
|
31745
31745
|
}
|
|
31746
31746
|
#rebuildGeometry() {
|
|
31747
|
-
dist$
|
|
31747
|
+
dist$1.assert(this.userData.cameraModel, "Camera model must be set before geometry can be updated");
|
|
31748
31748
|
// Dispose of the current geometry if the settings have changed
|
|
31749
31749
|
this.userData.geometry?.dispose();
|
|
31750
31750
|
this.userData.geometry = undefined;
|
|
@@ -31753,7 +31753,7 @@ class ImageRenderable extends Renderable {
|
|
|
31753
31753
|
this.#meshNeedsUpdate = true;
|
|
31754
31754
|
}
|
|
31755
31755
|
#updateTexture() {
|
|
31756
|
-
dist$
|
|
31756
|
+
dist$1.assert(this.#decodedImage, "Decoded image must be set before texture can be updated or created");
|
|
31757
31757
|
const decodedImage = this.#decodedImage;
|
|
31758
31758
|
// Create or update the bitmap texture
|
|
31759
31759
|
if (decodedImage instanceof ImageBitmap) {
|
|
@@ -31825,8 +31825,8 @@ class ImageRenderable extends Renderable {
|
|
|
31825
31825
|
});
|
|
31826
31826
|
}
|
|
31827
31827
|
#updateMesh() {
|
|
31828
|
-
dist$
|
|
31829
|
-
dist$
|
|
31828
|
+
dist$1.assert(this.userData.geometry, "Geometry must be set before mesh can be updated or created");
|
|
31829
|
+
dist$1.assert(this.userData.material, "Material must be set before mesh can be updated or created");
|
|
31830
31830
|
if (!this.userData.mesh) {
|
|
31831
31831
|
this.userData.mesh = new Mesh(this.userData.geometry, this.userData.material);
|
|
31832
31832
|
this.add(this.userData.mesh);
|
|
@@ -32212,750 +32212,6 @@ class ImageModeCamera extends PerspectiveCamera {
|
|
|
32212
32212
|
}
|
|
32213
32213
|
}
|
|
32214
32214
|
|
|
32215
|
-
var dist$1 = {};
|
|
32216
|
-
|
|
32217
|
-
var AVLTree$1 = {};
|
|
32218
|
-
|
|
32219
|
-
var AVLNode = {};
|
|
32220
|
-
|
|
32221
|
-
Object.defineProperty(AVLNode, "__esModule", { value: true });
|
|
32222
|
-
AVLNode.printNodes = AVLNode.prevNode = AVLNode.nextNode = AVLNode.rotateRight = AVLNode.rotateLeft = void 0;
|
|
32223
|
-
/**
|
|
32224
|
-
* Single left rotation
|
|
32225
|
-
*/
|
|
32226
|
-
function rotateLeft(node) {
|
|
32227
|
-
const rightNode = node.right;
|
|
32228
|
-
node.right = rightNode.left;
|
|
32229
|
-
if (rightNode.left) {
|
|
32230
|
-
rightNode.left.parent = node;
|
|
32231
|
-
}
|
|
32232
|
-
rightNode.parent = node.parent;
|
|
32233
|
-
if (rightNode.parent) {
|
|
32234
|
-
if (rightNode.parent.left === node) {
|
|
32235
|
-
rightNode.parent.left = rightNode;
|
|
32236
|
-
}
|
|
32237
|
-
else {
|
|
32238
|
-
rightNode.parent.right = rightNode;
|
|
32239
|
-
}
|
|
32240
|
-
}
|
|
32241
|
-
node.parent = rightNode;
|
|
32242
|
-
rightNode.left = node;
|
|
32243
|
-
node.balanceFactor += 1;
|
|
32244
|
-
if (rightNode.balanceFactor < 0) {
|
|
32245
|
-
node.balanceFactor -= rightNode.balanceFactor;
|
|
32246
|
-
}
|
|
32247
|
-
rightNode.balanceFactor += 1;
|
|
32248
|
-
if (node.balanceFactor > 0) {
|
|
32249
|
-
rightNode.balanceFactor += node.balanceFactor;
|
|
32250
|
-
}
|
|
32251
|
-
return rightNode;
|
|
32252
|
-
}
|
|
32253
|
-
AVLNode.rotateLeft = rotateLeft;
|
|
32254
|
-
/**
|
|
32255
|
-
* Single right rotation
|
|
32256
|
-
*/
|
|
32257
|
-
function rotateRight(node) {
|
|
32258
|
-
const leftNode = node.left;
|
|
32259
|
-
node.left = leftNode.right;
|
|
32260
|
-
if (node.left) {
|
|
32261
|
-
node.left.parent = node;
|
|
32262
|
-
}
|
|
32263
|
-
leftNode.parent = node.parent;
|
|
32264
|
-
if (leftNode.parent) {
|
|
32265
|
-
if (leftNode.parent.left === node) {
|
|
32266
|
-
leftNode.parent.left = leftNode;
|
|
32267
|
-
}
|
|
32268
|
-
else {
|
|
32269
|
-
leftNode.parent.right = leftNode;
|
|
32270
|
-
}
|
|
32271
|
-
}
|
|
32272
|
-
node.parent = leftNode;
|
|
32273
|
-
leftNode.right = node;
|
|
32274
|
-
node.balanceFactor -= 1;
|
|
32275
|
-
if (leftNode.balanceFactor > 0) {
|
|
32276
|
-
node.balanceFactor -= leftNode.balanceFactor;
|
|
32277
|
-
}
|
|
32278
|
-
leftNode.balanceFactor -= 1;
|
|
32279
|
-
if (node.balanceFactor < 0) {
|
|
32280
|
-
leftNode.balanceFactor += node.balanceFactor;
|
|
32281
|
-
}
|
|
32282
|
-
return leftNode;
|
|
32283
|
-
}
|
|
32284
|
-
AVLNode.rotateRight = rotateRight;
|
|
32285
|
-
/**
|
|
32286
|
-
* Return the node immediately after the given node in the in-order traversal
|
|
32287
|
-
*/
|
|
32288
|
-
function nextNode(node) {
|
|
32289
|
-
let curNode = node;
|
|
32290
|
-
let successor = node;
|
|
32291
|
-
if (successor.right) {
|
|
32292
|
-
successor = successor.right;
|
|
32293
|
-
while (successor.left) {
|
|
32294
|
-
successor = successor.left;
|
|
32295
|
-
}
|
|
32296
|
-
}
|
|
32297
|
-
else {
|
|
32298
|
-
successor = curNode.parent;
|
|
32299
|
-
while (successor && successor.right === curNode) {
|
|
32300
|
-
curNode = successor;
|
|
32301
|
-
successor = successor.parent;
|
|
32302
|
-
}
|
|
32303
|
-
}
|
|
32304
|
-
return successor;
|
|
32305
|
-
}
|
|
32306
|
-
AVLNode.nextNode = nextNode;
|
|
32307
|
-
/**
|
|
32308
|
-
* Return the node immediately before the given node in the in-order traversal
|
|
32309
|
-
*/
|
|
32310
|
-
function prevNode(node) {
|
|
32311
|
-
let curNode = node;
|
|
32312
|
-
let predecessor = node;
|
|
32313
|
-
if (predecessor.left) {
|
|
32314
|
-
predecessor = predecessor.left;
|
|
32315
|
-
while (predecessor.right) {
|
|
32316
|
-
predecessor = predecessor.right;
|
|
32317
|
-
}
|
|
32318
|
-
}
|
|
32319
|
-
else {
|
|
32320
|
-
predecessor = curNode.parent;
|
|
32321
|
-
while (predecessor && predecessor.left === curNode) {
|
|
32322
|
-
curNode = predecessor;
|
|
32323
|
-
predecessor = predecessor.parent;
|
|
32324
|
-
}
|
|
32325
|
-
}
|
|
32326
|
-
return predecessor;
|
|
32327
|
-
}
|
|
32328
|
-
AVLNode.prevNode = prevNode;
|
|
32329
|
-
/**
|
|
32330
|
-
* Prints tree horizontally
|
|
32331
|
-
*/
|
|
32332
|
-
function printNodes(root, printEntry = (n) => String(n[0])) {
|
|
32333
|
-
const out = [];
|
|
32334
|
-
row(root, "", true, (v) => out.push(v), printEntry);
|
|
32335
|
-
return out.join("");
|
|
32336
|
-
}
|
|
32337
|
-
AVLNode.printNodes = printNodes;
|
|
32338
|
-
/**
|
|
32339
|
-
* Prints a level of the tree
|
|
32340
|
-
*/
|
|
32341
|
-
function row(root, prefix, isTail, callback, printEntry) {
|
|
32342
|
-
if (root) {
|
|
32343
|
-
callback(`${prefix}${isTail ? "└── " : "├── "}${printEntry([root.key, root.value])}\n`);
|
|
32344
|
-
const indent = prefix + (isTail ? " " : "│ ");
|
|
32345
|
-
if (root.left) {
|
|
32346
|
-
row(root.left, indent, false, callback, printEntry);
|
|
32347
|
-
}
|
|
32348
|
-
if (root.right) {
|
|
32349
|
-
row(root.right, indent, true, callback, printEntry);
|
|
32350
|
-
}
|
|
32351
|
-
}
|
|
32352
|
-
}
|
|
32353
|
-
|
|
32354
|
-
Object.defineProperty(AVLTree$1, "__esModule", { value: true });
|
|
32355
|
-
AVLTree$1.AVLTree = void 0;
|
|
32356
|
-
const AVLNode_1 = AVLNode;
|
|
32357
|
-
function DEFAULT_COMPARE(a, b) {
|
|
32358
|
-
return a > b ? 1 : a < b ? -1 : 0;
|
|
32359
|
-
}
|
|
32360
|
-
/**
|
|
32361
|
-
* Implements a Adelson-Velsky-Landis (AVL) tree, a self-balancing binary tree.
|
|
32362
|
-
* Lookup, insertion, and deletion all take O(log n) time in both the average
|
|
32363
|
-
* and worst cases, where n is the number of nodes in the tree prior to the
|
|
32364
|
-
* operation.
|
|
32365
|
-
*/
|
|
32366
|
-
class AVLTree {
|
|
32367
|
-
constructor(comparator) {
|
|
32368
|
-
this._comparator = comparator ?? DEFAULT_COMPARE;
|
|
32369
|
-
this._size = 0;
|
|
32370
|
-
}
|
|
32371
|
-
/**
|
|
32372
|
-
* Number of nodes
|
|
32373
|
-
*/
|
|
32374
|
-
get size() {
|
|
32375
|
-
return this._size;
|
|
32376
|
-
}
|
|
32377
|
-
/**
|
|
32378
|
-
* Clear the tree
|
|
32379
|
-
* @return {AVLTree}
|
|
32380
|
-
*/
|
|
32381
|
-
clear() {
|
|
32382
|
-
this._root = undefined;
|
|
32383
|
-
this._size = 0;
|
|
32384
|
-
return this;
|
|
32385
|
-
}
|
|
32386
|
-
/**
|
|
32387
|
-
* Whether the tree contains a node with the given key
|
|
32388
|
-
*/
|
|
32389
|
-
has(key) {
|
|
32390
|
-
if (this._root) {
|
|
32391
|
-
let node = this._root;
|
|
32392
|
-
const comparator = this._comparator;
|
|
32393
|
-
while (node) {
|
|
32394
|
-
const cmp = comparator(key, node.key);
|
|
32395
|
-
if (cmp === 0) {
|
|
32396
|
-
return true;
|
|
32397
|
-
}
|
|
32398
|
-
else if (cmp < 0) {
|
|
32399
|
-
node = node.left;
|
|
32400
|
-
}
|
|
32401
|
-
else {
|
|
32402
|
-
node = node.right;
|
|
32403
|
-
}
|
|
32404
|
-
}
|
|
32405
|
-
}
|
|
32406
|
-
return false;
|
|
32407
|
-
}
|
|
32408
|
-
/**
|
|
32409
|
-
* Returns all keys in order
|
|
32410
|
-
*/
|
|
32411
|
-
*keys() {
|
|
32412
|
-
let current = this._root;
|
|
32413
|
-
const s = [];
|
|
32414
|
-
let done = false;
|
|
32415
|
-
while (!done) {
|
|
32416
|
-
if (current) {
|
|
32417
|
-
s.push(current);
|
|
32418
|
-
current = current.left;
|
|
32419
|
-
}
|
|
32420
|
-
else {
|
|
32421
|
-
if (s.length > 0) {
|
|
32422
|
-
current = s.pop();
|
|
32423
|
-
yield current.key;
|
|
32424
|
-
current = current.right;
|
|
32425
|
-
}
|
|
32426
|
-
else {
|
|
32427
|
-
done = true;
|
|
32428
|
-
}
|
|
32429
|
-
}
|
|
32430
|
-
}
|
|
32431
|
-
}
|
|
32432
|
-
/**
|
|
32433
|
-
* Returns all values in order
|
|
32434
|
-
*/
|
|
32435
|
-
*values() {
|
|
32436
|
-
let current = this._root;
|
|
32437
|
-
const s = [];
|
|
32438
|
-
let done = false;
|
|
32439
|
-
while (!done) {
|
|
32440
|
-
if (current) {
|
|
32441
|
-
s.push(current);
|
|
32442
|
-
current = current.left;
|
|
32443
|
-
}
|
|
32444
|
-
else {
|
|
32445
|
-
if (s.length > 0) {
|
|
32446
|
-
current = s.pop();
|
|
32447
|
-
yield current.value;
|
|
32448
|
-
current = current.right;
|
|
32449
|
-
}
|
|
32450
|
-
else {
|
|
32451
|
-
done = true;
|
|
32452
|
-
}
|
|
32453
|
-
}
|
|
32454
|
-
}
|
|
32455
|
-
}
|
|
32456
|
-
/**
|
|
32457
|
-
* Returns all key/value pairs in order
|
|
32458
|
-
*/
|
|
32459
|
-
*entries() {
|
|
32460
|
-
let current = this._root;
|
|
32461
|
-
const s = [];
|
|
32462
|
-
let done = false;
|
|
32463
|
-
while (!done) {
|
|
32464
|
-
if (current) {
|
|
32465
|
-
s.push(current);
|
|
32466
|
-
current = current.left;
|
|
32467
|
-
}
|
|
32468
|
-
else {
|
|
32469
|
-
if (s.length > 0) {
|
|
32470
|
-
current = s.pop();
|
|
32471
|
-
yield [current.key, current.value];
|
|
32472
|
-
current = current.right;
|
|
32473
|
-
}
|
|
32474
|
-
else {
|
|
32475
|
-
done = true;
|
|
32476
|
-
}
|
|
32477
|
-
}
|
|
32478
|
-
}
|
|
32479
|
-
}
|
|
32480
|
-
/**
|
|
32481
|
-
* Returns the entry with the minimum key
|
|
32482
|
-
*/
|
|
32483
|
-
minEntry() {
|
|
32484
|
-
let node = this._root;
|
|
32485
|
-
if (!node) {
|
|
32486
|
-
return undefined;
|
|
32487
|
-
}
|
|
32488
|
-
while (node.left) {
|
|
32489
|
-
node = node.left;
|
|
32490
|
-
}
|
|
32491
|
-
return [node.key, node.value];
|
|
32492
|
-
}
|
|
32493
|
-
/**
|
|
32494
|
-
* Returns the entry with the maximum key
|
|
32495
|
-
*/
|
|
32496
|
-
maxEntry() {
|
|
32497
|
-
let node = this._root;
|
|
32498
|
-
if (!node) {
|
|
32499
|
-
return undefined;
|
|
32500
|
-
}
|
|
32501
|
-
while (node.right) {
|
|
32502
|
-
node = node.right;
|
|
32503
|
-
}
|
|
32504
|
-
return [node.key, node.value];
|
|
32505
|
-
}
|
|
32506
|
-
/**
|
|
32507
|
-
* Minimum key
|
|
32508
|
-
*/
|
|
32509
|
-
minKey() {
|
|
32510
|
-
let node = this._root;
|
|
32511
|
-
if (!node) {
|
|
32512
|
-
return undefined;
|
|
32513
|
-
}
|
|
32514
|
-
while (node.left) {
|
|
32515
|
-
node = node.left;
|
|
32516
|
-
}
|
|
32517
|
-
return node.key;
|
|
32518
|
-
}
|
|
32519
|
-
/**
|
|
32520
|
-
* Maximum key
|
|
32521
|
-
*/
|
|
32522
|
-
maxKey() {
|
|
32523
|
-
let node = this._root;
|
|
32524
|
-
if (!node) {
|
|
32525
|
-
return undefined;
|
|
32526
|
-
}
|
|
32527
|
-
while (node.right) {
|
|
32528
|
-
node = node.right;
|
|
32529
|
-
}
|
|
32530
|
-
return node.key;
|
|
32531
|
-
}
|
|
32532
|
-
/**
|
|
32533
|
-
* Removes and returns the entry with smallest key
|
|
32534
|
-
*/
|
|
32535
|
-
shift() {
|
|
32536
|
-
let node = this._root;
|
|
32537
|
-
let returnValue;
|
|
32538
|
-
if (node) {
|
|
32539
|
-
while (node.left) {
|
|
32540
|
-
node = node.left;
|
|
32541
|
-
}
|
|
32542
|
-
returnValue = [node.key, node.value];
|
|
32543
|
-
this.delete(node.key);
|
|
32544
|
-
}
|
|
32545
|
-
return returnValue;
|
|
32546
|
-
}
|
|
32547
|
-
/**
|
|
32548
|
-
* Removes and returns the entry with largest key
|
|
32549
|
-
*/
|
|
32550
|
-
pop() {
|
|
32551
|
-
let node = this._root;
|
|
32552
|
-
let returnValue;
|
|
32553
|
-
if (node) {
|
|
32554
|
-
while (node.right) {
|
|
32555
|
-
node = node.right;
|
|
32556
|
-
}
|
|
32557
|
-
returnValue = [node.key, node.value];
|
|
32558
|
-
this.delete(node.key);
|
|
32559
|
-
}
|
|
32560
|
-
return returnValue;
|
|
32561
|
-
}
|
|
32562
|
-
/**
|
|
32563
|
-
* Search for an entry by key
|
|
32564
|
-
*/
|
|
32565
|
-
get(key) {
|
|
32566
|
-
const compare = this._comparator;
|
|
32567
|
-
let node = this._root;
|
|
32568
|
-
while (node) {
|
|
32569
|
-
const cmp = compare(key, node.key);
|
|
32570
|
-
if (cmp === 0) {
|
|
32571
|
-
return node.value;
|
|
32572
|
-
}
|
|
32573
|
-
else if (cmp < 0) {
|
|
32574
|
-
node = node.left;
|
|
32575
|
-
}
|
|
32576
|
-
else {
|
|
32577
|
-
node = node.right;
|
|
32578
|
-
}
|
|
32579
|
-
}
|
|
32580
|
-
return undefined;
|
|
32581
|
-
}
|
|
32582
|
-
/**
|
|
32583
|
-
* Execute a callback for each key/value entry in order
|
|
32584
|
-
*/
|
|
32585
|
-
forEach(callbackfn) {
|
|
32586
|
-
let current = this._root;
|
|
32587
|
-
const s = [];
|
|
32588
|
-
let done = false;
|
|
32589
|
-
while (!done) {
|
|
32590
|
-
// Reach the left most Node of the current Node
|
|
32591
|
-
if (current) {
|
|
32592
|
-
// Place pointer to a tree node on the stack
|
|
32593
|
-
// before traversing the node's left subtree
|
|
32594
|
-
s.push(current);
|
|
32595
|
-
current = current.left;
|
|
32596
|
-
}
|
|
32597
|
-
else {
|
|
32598
|
-
// BackTrack from the empty subtree and visit the Node
|
|
32599
|
-
// at the top of the stack; however, if the stack is
|
|
32600
|
-
// empty you are done
|
|
32601
|
-
if (s.length > 0) {
|
|
32602
|
-
current = s.pop();
|
|
32603
|
-
callbackfn(current.value, current.key, this);
|
|
32604
|
-
// We have visited the node and its left
|
|
32605
|
-
// subtree. Now, it's right subtree's turn
|
|
32606
|
-
current = current.right;
|
|
32607
|
-
}
|
|
32608
|
-
else {
|
|
32609
|
-
done = true;
|
|
32610
|
-
}
|
|
32611
|
-
}
|
|
32612
|
-
}
|
|
32613
|
-
return this;
|
|
32614
|
-
}
|
|
32615
|
-
/**
|
|
32616
|
-
* Walk key range from `low` to `high` in order
|
|
32617
|
-
*/
|
|
32618
|
-
range(low, high, callbackfn) {
|
|
32619
|
-
const Q = [];
|
|
32620
|
-
const compare = this._comparator;
|
|
32621
|
-
let node = this._root;
|
|
32622
|
-
while (Q.length !== 0 || node) {
|
|
32623
|
-
if (node) {
|
|
32624
|
-
Q.push(node);
|
|
32625
|
-
if (compare(node.key, low) <= 0) {
|
|
32626
|
-
node = undefined;
|
|
32627
|
-
}
|
|
32628
|
-
else {
|
|
32629
|
-
node = node.left;
|
|
32630
|
-
}
|
|
32631
|
-
}
|
|
32632
|
-
else {
|
|
32633
|
-
node = Q.pop();
|
|
32634
|
-
if (compare(node.key, high) > 0) {
|
|
32635
|
-
break;
|
|
32636
|
-
}
|
|
32637
|
-
else if (compare(node.key, low) >= 0) {
|
|
32638
|
-
callbackfn(node.value, node.key, this);
|
|
32639
|
-
}
|
|
32640
|
-
node = node.right;
|
|
32641
|
-
}
|
|
32642
|
-
}
|
|
32643
|
-
return this;
|
|
32644
|
-
}
|
|
32645
|
-
findLessThan(key) {
|
|
32646
|
-
let node = this.findGreaterThanOrEqualNode(key);
|
|
32647
|
-
if (!node) {
|
|
32648
|
-
// Check if there is any key less than `key`
|
|
32649
|
-
node = this._root;
|
|
32650
|
-
if (!node) {
|
|
32651
|
-
return undefined;
|
|
32652
|
-
}
|
|
32653
|
-
while (node.right) {
|
|
32654
|
-
node = node.right;
|
|
32655
|
-
}
|
|
32656
|
-
return this._comparator(node.key, key) < 0 ? [node.key, node.value] : undefined;
|
|
32657
|
-
}
|
|
32658
|
-
// Return the node just before the first node with key greater than or equal to `key`, if any
|
|
32659
|
-
const lt = (0, AVLNode_1.prevNode)(node);
|
|
32660
|
-
return lt ? [lt.key, lt.value] : undefined;
|
|
32661
|
-
}
|
|
32662
|
-
findLessThanOrEqual(key) {
|
|
32663
|
-
let node = this.findGreaterThanOrEqualNode(key);
|
|
32664
|
-
if (!node) {
|
|
32665
|
-
// Check if there is any key less than `key`
|
|
32666
|
-
node = this._root;
|
|
32667
|
-
if (!node) {
|
|
32668
|
-
return undefined;
|
|
32669
|
-
}
|
|
32670
|
-
while (node.right) {
|
|
32671
|
-
node = node.right;
|
|
32672
|
-
}
|
|
32673
|
-
return this._comparator(node.key, key) < 0 ? [node.key, node.value] : undefined;
|
|
32674
|
-
}
|
|
32675
|
-
// Check if the found node is an exact match
|
|
32676
|
-
if (this._comparator(node.key, key) === 0) {
|
|
32677
|
-
return [node.key, node.value];
|
|
32678
|
-
}
|
|
32679
|
-
// Return the node just before the first node with key greater than or equal to `key`, if any
|
|
32680
|
-
const lt = (0, AVLNode_1.prevNode)(node);
|
|
32681
|
-
return lt ? [lt.key, lt.value] : undefined;
|
|
32682
|
-
}
|
|
32683
|
-
findGreaterThan(key) {
|
|
32684
|
-
const Q = [];
|
|
32685
|
-
const compare = this._comparator;
|
|
32686
|
-
let node = this._root;
|
|
32687
|
-
while (Q.length !== 0 || node) {
|
|
32688
|
-
if (node) {
|
|
32689
|
-
Q.push(node);
|
|
32690
|
-
if (compare(node.key, key) <= 0) {
|
|
32691
|
-
node = undefined;
|
|
32692
|
-
}
|
|
32693
|
-
else {
|
|
32694
|
-
node = node.left;
|
|
32695
|
-
}
|
|
32696
|
-
}
|
|
32697
|
-
else {
|
|
32698
|
-
node = Q.pop();
|
|
32699
|
-
if (compare(node.key, key) > 0) {
|
|
32700
|
-
return [node.key, node.value];
|
|
32701
|
-
}
|
|
32702
|
-
node = node.right;
|
|
32703
|
-
}
|
|
32704
|
-
}
|
|
32705
|
-
return undefined;
|
|
32706
|
-
}
|
|
32707
|
-
findGreaterThanOrEqual(key) {
|
|
32708
|
-
const node = this.findGreaterThanOrEqualNode(key);
|
|
32709
|
-
return node ? [node.key, node.value] : undefined;
|
|
32710
|
-
}
|
|
32711
|
-
findGreaterThanOrEqualNode(key) {
|
|
32712
|
-
const Q = [];
|
|
32713
|
-
const compare = this._comparator;
|
|
32714
|
-
let node = this._root;
|
|
32715
|
-
while (Q.length !== 0 || node) {
|
|
32716
|
-
if (node) {
|
|
32717
|
-
Q.push(node);
|
|
32718
|
-
if (compare(node.key, key) <= 0) {
|
|
32719
|
-
node = undefined;
|
|
32720
|
-
}
|
|
32721
|
-
else {
|
|
32722
|
-
node = node.left;
|
|
32723
|
-
}
|
|
32724
|
-
}
|
|
32725
|
-
else {
|
|
32726
|
-
node = Q.pop();
|
|
32727
|
-
if (compare(node.key, key) >= 0) {
|
|
32728
|
-
return node;
|
|
32729
|
-
}
|
|
32730
|
-
node = node.right;
|
|
32731
|
-
}
|
|
32732
|
-
}
|
|
32733
|
-
return undefined;
|
|
32734
|
-
}
|
|
32735
|
-
/**
|
|
32736
|
-
* Insert a new key/value pair into the tree or update an existing entry
|
|
32737
|
-
*/
|
|
32738
|
-
set(key, value) {
|
|
32739
|
-
if (!this._root) {
|
|
32740
|
-
this._root = {
|
|
32741
|
-
parent: undefined,
|
|
32742
|
-
left: undefined,
|
|
32743
|
-
right: undefined,
|
|
32744
|
-
balanceFactor: 0,
|
|
32745
|
-
key,
|
|
32746
|
-
value,
|
|
32747
|
-
};
|
|
32748
|
-
this._size++;
|
|
32749
|
-
return this;
|
|
32750
|
-
}
|
|
32751
|
-
const compare = this._comparator;
|
|
32752
|
-
let node = this._root;
|
|
32753
|
-
let parent;
|
|
32754
|
-
let cmp = 0;
|
|
32755
|
-
while (node) {
|
|
32756
|
-
cmp = compare(key, node.key);
|
|
32757
|
-
parent = node;
|
|
32758
|
-
if (cmp === 0) {
|
|
32759
|
-
node.value = value;
|
|
32760
|
-
return this;
|
|
32761
|
-
}
|
|
32762
|
-
else if (cmp < 0) {
|
|
32763
|
-
node = node.left;
|
|
32764
|
-
}
|
|
32765
|
-
else {
|
|
32766
|
-
node = node.right;
|
|
32767
|
-
}
|
|
32768
|
-
}
|
|
32769
|
-
if (parent == undefined) {
|
|
32770
|
-
throw new Error(`failed to find parent node for insert`);
|
|
32771
|
-
}
|
|
32772
|
-
const newNode = {
|
|
32773
|
-
left: undefined,
|
|
32774
|
-
right: undefined,
|
|
32775
|
-
balanceFactor: 0,
|
|
32776
|
-
parent,
|
|
32777
|
-
key,
|
|
32778
|
-
value,
|
|
32779
|
-
};
|
|
32780
|
-
if (cmp <= 0) {
|
|
32781
|
-
parent.left = newNode;
|
|
32782
|
-
}
|
|
32783
|
-
else {
|
|
32784
|
-
parent.right = newNode;
|
|
32785
|
-
}
|
|
32786
|
-
let newRoot;
|
|
32787
|
-
while (parent) {
|
|
32788
|
-
cmp = compare(parent.key, key);
|
|
32789
|
-
if (cmp < 0) {
|
|
32790
|
-
parent.balanceFactor -= 1;
|
|
32791
|
-
}
|
|
32792
|
-
else {
|
|
32793
|
-
parent.balanceFactor += 1;
|
|
32794
|
-
}
|
|
32795
|
-
if (parent.balanceFactor === 0) {
|
|
32796
|
-
break;
|
|
32797
|
-
}
|
|
32798
|
-
else if (parent.balanceFactor < -1) {
|
|
32799
|
-
if (parent.right?.balanceFactor === 1) {
|
|
32800
|
-
(0, AVLNode_1.rotateRight)(parent.right);
|
|
32801
|
-
}
|
|
32802
|
-
newRoot = (0, AVLNode_1.rotateLeft)(parent);
|
|
32803
|
-
if (parent === this._root) {
|
|
32804
|
-
this._root = newRoot;
|
|
32805
|
-
}
|
|
32806
|
-
break;
|
|
32807
|
-
}
|
|
32808
|
-
else if (parent.balanceFactor > 1) {
|
|
32809
|
-
if (parent.left?.balanceFactor === -1) {
|
|
32810
|
-
(0, AVLNode_1.rotateLeft)(parent.left);
|
|
32811
|
-
}
|
|
32812
|
-
newRoot = (0, AVLNode_1.rotateRight)(parent);
|
|
32813
|
-
if (parent === this._root) {
|
|
32814
|
-
this._root = newRoot;
|
|
32815
|
-
}
|
|
32816
|
-
break;
|
|
32817
|
-
}
|
|
32818
|
-
parent = parent.parent;
|
|
32819
|
-
}
|
|
32820
|
-
this._size++;
|
|
32821
|
-
return this;
|
|
32822
|
-
}
|
|
32823
|
-
/**
|
|
32824
|
-
* Finds the first matching node by key and removes it
|
|
32825
|
-
*/
|
|
32826
|
-
delete(key) {
|
|
32827
|
-
if (!this._root) {
|
|
32828
|
-
return false;
|
|
32829
|
-
}
|
|
32830
|
-
let node = this._root;
|
|
32831
|
-
const compare = this._comparator;
|
|
32832
|
-
let cmp = 0;
|
|
32833
|
-
while (node) {
|
|
32834
|
-
cmp = compare(key, node.key);
|
|
32835
|
-
if (cmp === 0) {
|
|
32836
|
-
break;
|
|
32837
|
-
}
|
|
32838
|
-
else if (cmp < 0) {
|
|
32839
|
-
node = node.left;
|
|
32840
|
-
}
|
|
32841
|
-
else {
|
|
32842
|
-
node = node.right;
|
|
32843
|
-
}
|
|
32844
|
-
}
|
|
32845
|
-
if (!node) {
|
|
32846
|
-
return false;
|
|
32847
|
-
}
|
|
32848
|
-
let max, min;
|
|
32849
|
-
if (node.left) {
|
|
32850
|
-
max = node.left;
|
|
32851
|
-
while (max.left || max.right) {
|
|
32852
|
-
while (max.right) {
|
|
32853
|
-
max = max.right;
|
|
32854
|
-
}
|
|
32855
|
-
node.key = max.key;
|
|
32856
|
-
node.value = max.value;
|
|
32857
|
-
if (max.left) {
|
|
32858
|
-
node = max;
|
|
32859
|
-
max = max.left;
|
|
32860
|
-
}
|
|
32861
|
-
}
|
|
32862
|
-
node.key = max.key;
|
|
32863
|
-
node.value = max.value;
|
|
32864
|
-
node = max;
|
|
32865
|
-
}
|
|
32866
|
-
if (node.right) {
|
|
32867
|
-
min = node.right;
|
|
32868
|
-
while (min.left || min.right) {
|
|
32869
|
-
while (min.left) {
|
|
32870
|
-
min = min.left;
|
|
32871
|
-
}
|
|
32872
|
-
node.key = min.key;
|
|
32873
|
-
node.value = min.value;
|
|
32874
|
-
if (min.right) {
|
|
32875
|
-
node = min;
|
|
32876
|
-
min = min.right;
|
|
32877
|
-
}
|
|
32878
|
-
}
|
|
32879
|
-
node.key = min.key;
|
|
32880
|
-
node.value = min.value;
|
|
32881
|
-
node = min;
|
|
32882
|
-
}
|
|
32883
|
-
let parent = node.parent;
|
|
32884
|
-
let pp = node;
|
|
32885
|
-
let newRoot;
|
|
32886
|
-
while (parent) {
|
|
32887
|
-
if (parent.left === pp) {
|
|
32888
|
-
parent.balanceFactor -= 1;
|
|
32889
|
-
}
|
|
32890
|
-
else {
|
|
32891
|
-
parent.balanceFactor += 1;
|
|
32892
|
-
}
|
|
32893
|
-
if (parent.balanceFactor < -1) {
|
|
32894
|
-
if (parent.right?.balanceFactor === 1) {
|
|
32895
|
-
(0, AVLNode_1.rotateRight)(parent.right);
|
|
32896
|
-
}
|
|
32897
|
-
newRoot = (0, AVLNode_1.rotateLeft)(parent);
|
|
32898
|
-
if (parent === this._root) {
|
|
32899
|
-
this._root = newRoot;
|
|
32900
|
-
}
|
|
32901
|
-
parent = newRoot;
|
|
32902
|
-
}
|
|
32903
|
-
else if (parent.balanceFactor > 1) {
|
|
32904
|
-
if (parent.left?.balanceFactor === -1) {
|
|
32905
|
-
(0, AVLNode_1.rotateLeft)(parent.left);
|
|
32906
|
-
}
|
|
32907
|
-
newRoot = (0, AVLNode_1.rotateRight)(parent);
|
|
32908
|
-
if (parent === this._root) {
|
|
32909
|
-
this._root = newRoot;
|
|
32910
|
-
}
|
|
32911
|
-
parent = newRoot;
|
|
32912
|
-
}
|
|
32913
|
-
const parentBalanceFactor = parent?.balanceFactor;
|
|
32914
|
-
if (parentBalanceFactor === -1 || parentBalanceFactor === 1) {
|
|
32915
|
-
break;
|
|
32916
|
-
}
|
|
32917
|
-
pp = parent;
|
|
32918
|
-
parent = parent?.parent;
|
|
32919
|
-
}
|
|
32920
|
-
if (node.parent) {
|
|
32921
|
-
if (node.parent.left === node) {
|
|
32922
|
-
node.parent.left = undefined;
|
|
32923
|
-
}
|
|
32924
|
-
else {
|
|
32925
|
-
node.parent.right = undefined;
|
|
32926
|
-
}
|
|
32927
|
-
}
|
|
32928
|
-
if (node === this._root) {
|
|
32929
|
-
this._root = undefined;
|
|
32930
|
-
}
|
|
32931
|
-
this._size--;
|
|
32932
|
-
return true;
|
|
32933
|
-
}
|
|
32934
|
-
/**
|
|
32935
|
-
* Returns a string representation of the tree - primitive horizontal print-out
|
|
32936
|
-
*/
|
|
32937
|
-
toString(printEntry) {
|
|
32938
|
-
return (0, AVLNode_1.printNodes)(this._root, printEntry).trimEnd();
|
|
32939
|
-
}
|
|
32940
|
-
}
|
|
32941
|
-
AVLTree$1.AVLTree = AVLTree;
|
|
32942
|
-
|
|
32943
|
-
(function (exports) {
|
|
32944
|
-
var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
32945
|
-
if (k2 === undefined) k2 = k;
|
|
32946
|
-
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
32947
|
-
}) : (function(o, m, k, k2) {
|
|
32948
|
-
if (k2 === undefined) k2 = k;
|
|
32949
|
-
o[k2] = m[k];
|
|
32950
|
-
}));
|
|
32951
|
-
var __exportStar = (commonjsGlobal && commonjsGlobal.__exportStar) || function(m, exports) {
|
|
32952
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
32953
|
-
};
|
|
32954
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32955
|
-
__exportStar(AVLTree$1, exports);
|
|
32956
|
-
|
|
32957
|
-
} (dist$1));
|
|
32958
|
-
|
|
32959
32215
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
32960
32216
|
// License, v2.0. If a copy of the MPL was not distributed with this
|
|
32961
32217
|
// file, You can obtain one at http://mozilla.org/MPL/2.0/
|
|
@@ -33119,7 +32375,7 @@ function normalizeFoxgloveImageAnnotations(message) {
|
|
|
33119
32375
|
return annotations;
|
|
33120
32376
|
}
|
|
33121
32377
|
function normalizeTimestamp(stamp) {
|
|
33122
|
-
return typeof stamp === "bigint" ? dist$
|
|
32378
|
+
return typeof stamp === "bigint" ? dist$2.fromNanoSec(stamp) : stamp;
|
|
33123
32379
|
}
|
|
33124
32380
|
function normalizeRosImageMarkerArray(message) {
|
|
33125
32381
|
return filterMap(message.markers, (marker, i) => normalizeRosImageMarker(marker, ["markers", i]));
|
|
@@ -33275,8 +32531,6 @@ class EventMetricsManager {
|
|
|
33275
32531
|
const fps = 1_000 / (totalInterval / (topicMetrics.length - 1));
|
|
33276
32532
|
return Math.round(fps);
|
|
33277
32533
|
}
|
|
33278
|
-
|
|
33279
|
-
// Remove events which are older than CLEANUP_EVENTS_OLDER_THAN_MS
|
|
33280
32534
|
removeOldEvents(topic) {
|
|
33281
32535
|
const now = performance.now();
|
|
33282
32536
|
if (this.metrics[topic]) {
|
|
@@ -33288,26 +32542,6 @@ class EventMetricsManager {
|
|
|
33288
32542
|
}
|
|
33289
32543
|
}
|
|
33290
32544
|
}
|
|
33291
|
-
const TIMESTAMP_ERROR_NS = 100_000_000n; // 0.1 seconds
|
|
33292
|
-
|
|
33293
|
-
function timeEqualWithError(left, right) {
|
|
33294
|
-
// Convert both timestamps to nanoseconds
|
|
33295
|
-
const leftNs = dist$3.toNanoSec({
|
|
33296
|
-
sec: left.sec,
|
|
33297
|
-
nsec: left.nsec
|
|
33298
|
-
});
|
|
33299
|
-
const rightNs = dist$3.toNanoSec({
|
|
33300
|
-
sec: right.sec,
|
|
33301
|
-
nsec: right.nsec
|
|
33302
|
-
});
|
|
33303
|
-
|
|
33304
|
-
// Get absolute difference while staying in bigint
|
|
33305
|
-
const diffNs = leftNs > rightNs ? leftNs - rightNs : rightNs - leftNs;
|
|
33306
|
-
|
|
33307
|
-
// Convert TIMESTAMP_ERROR_NS to bigint for comparison
|
|
33308
|
-
return diffNs <= TIMESTAMP_ERROR_NS;
|
|
33309
|
-
}
|
|
33310
|
-
|
|
33311
32545
|
// Have constants for the HUD items so that they don't need to be recreated and GCed every message
|
|
33312
32546
|
const WAITING_FOR_BOTH_HUD_ITEM = {
|
|
33313
32547
|
id: WAITING_FOR_BOTH_MESSAGES_HUD_ID,
|
|
@@ -33353,9 +32587,6 @@ class MessageHandler {
|
|
|
33353
32587
|
/** internal state of last received messages */
|
|
33354
32588
|
#lastReceivedMessages;
|
|
33355
32589
|
|
|
33356
|
-
/** sorted tree that holds state for synchronized messages. Used to find most recent synchronized set of image and annotations. */
|
|
33357
|
-
#tree;
|
|
33358
|
-
|
|
33359
32590
|
/** listener functions that are called when the state changes. */
|
|
33360
32591
|
#listeners = [];
|
|
33361
32592
|
|
|
@@ -33364,13 +32595,14 @@ class MessageHandler {
|
|
|
33364
32595
|
* This can cause synchronized annotations to never resolve if the source does not have the annotation topic
|
|
33365
32596
|
* with no indication to the user that the annotation is not available.
|
|
33366
32597
|
*/
|
|
33367
|
-
|
|
32598
|
+
|
|
33368
32599
|
#onAnnotationsFpsUpdate;
|
|
33369
32600
|
#annotationsFpsMetrics = new EventMetricsManager();
|
|
33370
32601
|
#annotationsFpsRefreshInterval = null;
|
|
33371
|
-
|
|
33372
|
-
|
|
33373
|
-
|
|
32602
|
+
annotationsMap = new Map();
|
|
32603
|
+
ghostAnnotationsMap = new Map();
|
|
32604
|
+
syncToleranceMs = 150;
|
|
32605
|
+
ghostTimeoutMs = 1000;
|
|
33374
32606
|
/**
|
|
33375
32607
|
*
|
|
33376
32608
|
* @param config - subset of ImageMode settings required for message handling
|
|
@@ -33381,11 +32613,9 @@ class MessageHandler {
|
|
|
33381
32613
|
this.#lastReceivedMessages = {
|
|
33382
32614
|
annotationsByTopic: new Map()
|
|
33383
32615
|
};
|
|
33384
|
-
this
|
|
33385
|
-
this.#availableAnnotationTopics = new Set();
|
|
32616
|
+
this.availableAnnotationTopics = new Set();
|
|
33386
32617
|
this.#annotationsFpsRefreshInterval = setInterval(() => {
|
|
33387
32618
|
const newAverageAnnotationsFps = this.#annotationsFpsMetrics.calculate(ANNOTATIONS_METRICS_KEY);
|
|
33388
|
-
this.#averageAnnotationsFps = newAverageAnnotationsFps;
|
|
33389
32619
|
if (this.#onAnnotationsFpsUpdate) {
|
|
33390
32620
|
this.#onAnnotationsFpsUpdate(newAverageAnnotationsFps);
|
|
33391
32621
|
}
|
|
@@ -33418,125 +32648,62 @@ class MessageHandler {
|
|
|
33418
32648
|
this.handleImage(messageEvent, normalizeCompressedImage(messageEvent.message));
|
|
33419
32649
|
};
|
|
33420
32650
|
handleImage(message, image) {
|
|
33421
|
-
const
|
|
32651
|
+
const normalized = {
|
|
33422
32652
|
...message,
|
|
33423
32653
|
message: image
|
|
33424
32654
|
};
|
|
33425
|
-
this
|
|
33426
|
-
if (this.#config.synchronize !== true) {
|
|
33427
|
-
this.#emitState();
|
|
33428
|
-
return;
|
|
33429
|
-
}
|
|
33430
|
-
// Update the image at the stamp time
|
|
33431
|
-
this.#addImageToTree(normalizedImageMessage);
|
|
32655
|
+
this.lastImage = normalized;
|
|
33432
32656
|
this.#emitState();
|
|
33433
32657
|
}
|
|
33434
|
-
#normalizeTimestamp(stamp) {
|
|
33435
|
-
if (this.#tree.has(stamp)) {
|
|
33436
|
-
return [stamp];
|
|
33437
|
-
}
|
|
33438
|
-
const matches = [];
|
|
33439
|
-
for (const [time] of this.#tree.entries()) {
|
|
33440
|
-
if (timeEqualWithError(stamp, time)) {
|
|
33441
|
-
matches.push(time);
|
|
33442
|
-
}
|
|
33443
|
-
}
|
|
33444
|
-
return matches.length > 0 ? matches : [stamp];
|
|
33445
|
-
}
|
|
33446
|
-
#addImageToTree(message) {
|
|
33447
|
-
const timestamps = this.#normalizeTimestamp(message.receiveTime);
|
|
33448
|
-
for (const stamp of timestamps) {
|
|
33449
|
-
const item = this.#tree.get(stamp);
|
|
33450
|
-
if (item) {
|
|
33451
|
-
item.image = message;
|
|
33452
|
-
} else {
|
|
33453
|
-
this.#tree.set(stamp, {
|
|
33454
|
-
image: message,
|
|
33455
|
-
annotationsByTopic: new Map()
|
|
33456
|
-
});
|
|
33457
|
-
}
|
|
33458
|
-
}
|
|
33459
|
-
}
|
|
33460
|
-
#visibleAnnotations() {
|
|
33461
|
-
const visibleAnnotations = new Set();
|
|
33462
|
-
for (const [topic, settings] of Object.entries(this.#config.annotations ?? {})) {
|
|
33463
|
-
if (settings?.visible === true && this.#availableAnnotationTopics.has(topic)) {
|
|
33464
|
-
visibleAnnotations.add(topic);
|
|
33465
|
-
}
|
|
33466
|
-
}
|
|
33467
|
-
return visibleAnnotations;
|
|
33468
|
-
}
|
|
33469
32658
|
handleCameraInfo = message => {
|
|
33470
32659
|
const cameraInfo = normalizeCameraInfo(message.message);
|
|
33471
32660
|
this.#lastReceivedMessages.cameraInfo = cameraInfo;
|
|
33472
32661
|
this.#emitState();
|
|
33473
32662
|
};
|
|
33474
32663
|
handleAnnotations = messageEvent => {
|
|
33475
|
-
const
|
|
33476
|
-
|
|
33477
|
-
|
|
33478
|
-
if (annotations.length > 0) {
|
|
32664
|
+
const list = normalizeAnnotations(messageEvent.message, messageEvent.schemaName);
|
|
32665
|
+
const timestamp = performance.now();
|
|
32666
|
+
if (list.length > 0 && messageEvent.topic) {
|
|
33479
32667
|
this.#annotationsFpsMetrics.registerEvent(ANNOTATIONS_METRICS_KEY);
|
|
33480
|
-
|
|
33481
|
-
|
|
33482
|
-
|
|
33483
|
-
|
|
33484
|
-
|
|
33485
|
-
|
|
33486
|
-
originalMessage: messageEvent,
|
|
33487
|
-
annotations
|
|
32668
|
+
this.annotationsMap.set(messageEvent.topic, {
|
|
32669
|
+
annotation: {
|
|
32670
|
+
originalMessage: messageEvent,
|
|
32671
|
+
annotations: list
|
|
32672
|
+
},
|
|
32673
|
+
timestamp: timestamp
|
|
33488
32674
|
});
|
|
32675
|
+
this.ghostAnnotationsMap.set(messageEvent.topic, {
|
|
32676
|
+
annotation: {
|
|
32677
|
+
originalMessage: messageEvent,
|
|
32678
|
+
annotations: list
|
|
32679
|
+
},
|
|
32680
|
+
timestamp: timestamp
|
|
32681
|
+
});
|
|
32682
|
+
}
|
|
32683
|
+
if (this.#config.synchronize === false) {
|
|
33489
32684
|
this.#emitState();
|
|
33490
32685
|
return;
|
|
33491
32686
|
}
|
|
33492
|
-
|
|
33493
|
-
|
|
33494
|
-
|
|
33495
|
-
|
|
33496
|
-
|
|
33497
|
-
|
|
33498
|
-
|
|
33499
|
-
arr.push(annotation);
|
|
33500
|
-
continue;
|
|
33501
|
-
}
|
|
33502
|
-
groups.set(key, [annotation]);
|
|
33503
|
-
}
|
|
33504
|
-
for (const [stampNsec, group] of groups) {
|
|
33505
|
-
const timestamps = this.#normalizeTimestamp(dist$3.fromNanoSec(stampNsec));
|
|
33506
|
-
for (const stamp of timestamps) {
|
|
33507
|
-
let item = this.#tree.get(stamp);
|
|
33508
|
-
if (!item) {
|
|
33509
|
-
item = {
|
|
33510
|
-
image: undefined,
|
|
33511
|
-
annotationsByTopic: new Map()
|
|
33512
|
-
};
|
|
33513
|
-
this.#tree.set(stamp, item);
|
|
32687
|
+
if (list.length === 0 && messageEvent.topic) {
|
|
32688
|
+
for (const [topic, data] of this.ghostAnnotationsMap.entries()) {
|
|
32689
|
+
if (Math.abs(timestamp - data.timestamp) <= this.syncToleranceMs) {
|
|
32690
|
+
this.annotationsMap.set(topic, {
|
|
32691
|
+
annotation: data.annotation,
|
|
32692
|
+
timestamp
|
|
32693
|
+
});
|
|
33514
32694
|
}
|
|
33515
|
-
item.annotationsByTopic.set(topic, {
|
|
33516
|
-
originalMessage: messageEvent,
|
|
33517
|
-
annotations: group
|
|
33518
|
-
});
|
|
33519
32695
|
}
|
|
32696
|
+
this.#emitState();
|
|
32697
|
+
return;
|
|
33520
32698
|
}
|
|
33521
|
-
|
|
33522
|
-
//console.error("Tree after adding annotations", [...this.#tree.entries()]);
|
|
33523
|
-
|
|
33524
|
-
this.#emitState();
|
|
33525
32699
|
};
|
|
33526
32700
|
setConfig(newConfig) {
|
|
33527
32701
|
let changed = false;
|
|
33528
32702
|
if (newConfig.synchronize != undefined && newConfig.synchronize !== this.#config.synchronize) {
|
|
33529
32703
|
this.#oldRenderState = undefined;
|
|
33530
|
-
this.#tree.clear();
|
|
33531
|
-
if (newConfig.synchronize && this.#lastReceivedMessages.image != undefined) {
|
|
33532
|
-
this.#addImageToTree(this.#lastReceivedMessages.image);
|
|
33533
|
-
}
|
|
33534
32704
|
changed = true;
|
|
33535
32705
|
}
|
|
33536
32706
|
if ("imageTopic" in newConfig && this.#config.imageTopic !== newConfig.imageTopic) {
|
|
33537
|
-
for (const item of this.#tree.values()) {
|
|
33538
|
-
item.image = undefined;
|
|
33539
|
-
}
|
|
33540
32707
|
this.#lastReceivedMessages.image = undefined;
|
|
33541
32708
|
changed = true;
|
|
33542
32709
|
}
|
|
@@ -33557,14 +32724,6 @@ class MessageHandler {
|
|
|
33557
32724
|
changed = true;
|
|
33558
32725
|
}
|
|
33559
32726
|
}
|
|
33560
|
-
for (const syncEntry of this.#tree.values()) {
|
|
33561
|
-
for (const topic of syncEntry.annotationsByTopic.keys()) {
|
|
33562
|
-
if (!newVisibleTopics.has(topic)) {
|
|
33563
|
-
syncEntry.annotationsByTopic.delete(topic);
|
|
33564
|
-
changed = true;
|
|
33565
|
-
}
|
|
33566
|
-
}
|
|
33567
|
-
}
|
|
33568
32727
|
}
|
|
33569
32728
|
this.#config = newConfig;
|
|
33570
32729
|
if (changed) {
|
|
@@ -33572,14 +32731,13 @@ class MessageHandler {
|
|
|
33572
32731
|
}
|
|
33573
32732
|
}
|
|
33574
32733
|
setAvailableAnnotationTopics(topicNames) {
|
|
33575
|
-
this
|
|
32734
|
+
this.availableAnnotationTopics = new Set(topicNames);
|
|
33576
32735
|
this.#emitState();
|
|
33577
32736
|
}
|
|
33578
32737
|
clear() {
|
|
33579
32738
|
this.#lastReceivedMessages = {
|
|
33580
32739
|
annotationsByTopic: new Map()
|
|
33581
32740
|
};
|
|
33582
|
-
this.#tree.clear();
|
|
33583
32741
|
this.#oldRenderState = undefined;
|
|
33584
32742
|
this.#emitState();
|
|
33585
32743
|
}
|
|
@@ -33603,137 +32761,31 @@ class MessageHandler {
|
|
|
33603
32761
|
const waitingForCalibration = calibrationRequired && state.cameraInfo == undefined;
|
|
33604
32762
|
const waitingForBoth = waitingForImage && waitingForCalibration;
|
|
33605
32763
|
this.#hud.displayIfTrue(waitingForBoth, WAITING_FOR_BOTH_HUD_ITEM);
|
|
33606
|
-
|
|
33607
|
-
// don't show other empty states when waiting for both to reduce noise
|
|
33608
32764
|
this.#hud.displayIfTrue(waitingForCalibration && !waitingForBoth, WAITING_FOR_CALIBRATION_HUD_ITEM);
|
|
33609
32765
|
this.#hud.displayIfTrue(waitingForImage && !calibrationRequired && !waitingForBoth, WAITING_FOR_IMAGE_EMPTY_HUD_ITEM);
|
|
33610
32766
|
this.#hud.displayIfTrue(waitingForImage && calibrationRequired, WAITING_FOR_IMAGE_NOTICE_HUD_ITEM);
|
|
33611
32767
|
}
|
|
33612
32768
|
#getRenderState() {
|
|
33613
|
-
if (this
|
|
32769
|
+
if (!this.lastImage) {
|
|
33614
32770
|
return {
|
|
33615
|
-
|
|
32771
|
+
annotationsByTopic: new Map(),
|
|
32772
|
+
presentAnnotationTopics: undefined,
|
|
32773
|
+
missingAnnotationTopics: undefined
|
|
33616
32774
|
};
|
|
33617
32775
|
}
|
|
33618
|
-
const
|
|
33619
|
-
|
|
33620
|
-
|
|
33621
|
-
const now = performance.now();
|
|
33622
|
-
if (result.found && result.messages.annotationsByTopic.size > 0) {
|
|
33623
|
-
//console.warn("Registering ghost annotation", result.messages.annotationsByTopic);
|
|
33624
|
-
this.#ghostAnnotation = {
|
|
33625
|
-
annotations: result.messages.annotationsByTopic,
|
|
33626
|
-
createdAtMs: now
|
|
33627
|
-
};
|
|
33628
|
-
}
|
|
33629
|
-
const renderState = result.found ? {
|
|
33630
|
-
cameraInfo: this.#lastReceivedMessages.cameraInfo,
|
|
33631
|
-
image: result.messages.image,
|
|
33632
|
-
annotationsByTopic: result.messages.annotationsByTopic
|
|
33633
|
-
} : {
|
|
33634
|
-
cameraInfo: this.#lastReceivedMessages.cameraInfo,
|
|
33635
|
-
presentAnnotationTopics: result.presentAnnotationTopics,
|
|
33636
|
-
missingAnnotationTopics: result.missingAnnotationTopics
|
|
32776
|
+
const state = {
|
|
32777
|
+
image: this.lastImage,
|
|
32778
|
+
annotationsByTopic: new Map()
|
|
33637
32779
|
};
|
|
33638
|
-
const
|
|
33639
|
-
|
|
33640
|
-
|
|
33641
|
-
|
|
33642
|
-
|
|
33643
|
-
// } ms, ghostTimeMs = ${ghostTimeMs} ms) - returning ghost annotation`,
|
|
33644
|
-
//);
|
|
33645
|
-
renderState.annotationsByTopic = this.#ghostAnnotation.annotations;
|
|
33646
|
-
}
|
|
33647
|
-
return renderState;
|
|
33648
|
-
}
|
|
33649
|
-
}
|
|
33650
|
-
const ACCEPT_LAST_INDEX = 5;
|
|
33651
|
-
|
|
33652
|
-
/**
|
|
33653
|
-
* Find the newest entry where we have everything synchronized and remove all older entries from tree.
|
|
33654
|
-
* @param tree - AVL tree that stores a [image?, annotations?] in sorted order by timestamp.
|
|
33655
|
-
* @param visibleAnnotations - visible annotation topics
|
|
33656
|
-
* @returns - the newest synchronized item with all active annotations and image, or set of missing annotations if synchronization failed
|
|
33657
|
-
*/
|
|
33658
|
-
function findSynchronizedSetAndRemoveOlderItems(tree, visibleAnnotations) {
|
|
33659
|
-
let lastEntry = undefined;
|
|
33660
|
-
let lastAnnotationsOrphanEntry = undefined;
|
|
33661
|
-
let validEntry = undefined;
|
|
33662
|
-
let imageEntries = 0;
|
|
33663
|
-
|
|
33664
|
-
// Calculate number of entries that have images
|
|
33665
|
-
for (const entry of tree.entries()) {
|
|
33666
|
-
if (entry[1].image) {
|
|
33667
|
-
imageEntries += 1;
|
|
33668
|
-
lastEntry = entry;
|
|
33669
|
-
} else if (entry[1].annotationsByTopic.size > 0) {
|
|
33670
|
-
// If there are annotations we want to use the last entry with annotations
|
|
33671
|
-
lastAnnotationsOrphanEntry = entry;
|
|
33672
|
-
}
|
|
33673
|
-
}
|
|
33674
|
-
|
|
33675
|
-
// If there are no annotations active we use the newest entry with image
|
|
33676
|
-
if (visibleAnnotations.size === 0) {
|
|
33677
|
-
validEntry = lastEntry;
|
|
33678
|
-
} else {
|
|
33679
|
-
// Else we try to find first
|
|
33680
|
-
let acceptableIndex = imageEntries - ACCEPT_LAST_INDEX + 1;
|
|
33681
|
-
// console.warn("acceptableIndex", acceptableIndex);
|
|
33682
|
-
|
|
33683
|
-
if (acceptableIndex < 0) {
|
|
33684
|
-
acceptableIndex = 0;
|
|
33685
|
-
}
|
|
33686
|
-
let index = 0;
|
|
33687
|
-
|
|
33688
|
-
// Go throught the tree in order and find first entry that has image and all annotations
|
|
33689
|
-
for (const entry of tree.entries()) {
|
|
33690
|
-
// Skip entries with no images
|
|
33691
|
-
if (!entry[1].image) {
|
|
33692
|
-
continue;
|
|
33693
|
-
}
|
|
33694
|
-
|
|
33695
|
-
// When we encounter the first acceptable index we use that as the entry
|
|
33696
|
-
if (index === acceptableIndex) {
|
|
33697
|
-
validEntry = entry;
|
|
33698
|
-
} else if (index > acceptableIndex) {
|
|
33699
|
-
// Any bigger index with all annotations which is newer than already used index is the better option
|
|
33700
|
-
const hasAllAnnotations = Array.from(visibleAnnotations).every(topic => entry[1].annotationsByTopic.has(topic));
|
|
33701
|
-
if (hasAllAnnotations) {
|
|
33702
|
-
validEntry = entry;
|
|
33703
|
-
}
|
|
32780
|
+
const imageTimestamp = this.lastImage.receiveTime ? Number(this.lastImage.receiveTime) : performance.now();
|
|
32781
|
+
const now = performance.now();
|
|
32782
|
+
for (const [topic, data] of this.annotationsMap.entries()) {
|
|
32783
|
+
if (Math.abs(imageTimestamp - data.timestamp) <= this.syncToleranceMs || now - data.timestamp < this.ghostTimeoutMs) {
|
|
32784
|
+
state.annotationsByTopic.set(topic, data.annotation);
|
|
33704
32785
|
}
|
|
33705
|
-
index += 1;
|
|
33706
32786
|
}
|
|
32787
|
+
return state;
|
|
33707
32788
|
}
|
|
33708
|
-
if (validEntry) {
|
|
33709
|
-
if (validEntry[1].annotationsByTopic.size === 0 && lastAnnotationsOrphanEntry) {
|
|
33710
|
-
// console.warn("Using annotationsByTopic from lastAnnotationsEntry orphan");
|
|
33711
|
-
validEntry[1].annotationsByTopic = lastAnnotationsOrphanEntry[1].annotationsByTopic;
|
|
33712
|
-
}
|
|
33713
|
-
|
|
33714
|
-
// Drop older messages
|
|
33715
|
-
let minKey = tree.minKey();
|
|
33716
|
-
while (minKey && dist$3.isLessThan(minKey, validEntry[0])) {
|
|
33717
|
-
tree.shift();
|
|
33718
|
-
minKey = tree.minKey();
|
|
33719
|
-
}
|
|
33720
|
-
return {
|
|
33721
|
-
found: true,
|
|
33722
|
-
messages: validEntry[1]
|
|
33723
|
-
};
|
|
33724
|
-
}
|
|
33725
|
-
return {
|
|
33726
|
-
found: false,
|
|
33727
|
-
missingAnnotationTopics: [],
|
|
33728
|
-
presentAnnotationTopics: []
|
|
33729
|
-
};
|
|
33730
|
-
}
|
|
33731
|
-
function annoationsFpsToGhostTimeMs(annotationsFps) {
|
|
33732
|
-
if (annotationsFps === undefined || annotationsFps === 0 || !Number.isFinite(annotationsFps)) {
|
|
33733
|
-
return 1_000; // If there is no annotations fps, we want set the ghost time to 1 second
|
|
33734
|
-
}
|
|
33735
|
-
const period = 1 / annotationsFps;
|
|
33736
|
-
return period * 1_000 * 2; // To miliseconds times two
|
|
33737
32789
|
}
|
|
33738
32790
|
|
|
33739
32791
|
// This Source Code Form is subject to the terms of the Mozilla Public
|
|
@@ -35419,7 +34471,7 @@ class ImageMode extends SceneExtension {
|
|
|
35419
34471
|
};
|
|
35420
34472
|
#handleImageChange = (messageEvent, image) => {
|
|
35421
34473
|
const topic = messageEvent.topic;
|
|
35422
|
-
const receiveTime = dist$
|
|
34474
|
+
const receiveTime = dist$2.toNanoSec(messageEvent.receiveTime);
|
|
35423
34475
|
const frameId = "header" in image ? image.header.frame_id : image.frame_id;
|
|
35424
34476
|
if ("width" in image) {
|
|
35425
34477
|
this.#imageSize.width = image.width;
|
|
@@ -35497,7 +34549,7 @@ class ImageMode extends SceneExtension {
|
|
|
35497
34549
|
};
|
|
35498
34550
|
renderable = this.initRenderable(topicName, {
|
|
35499
34551
|
receiveTime,
|
|
35500
|
-
messageTime: image ? dist$
|
|
34552
|
+
messageTime: image ? dist$2.toNanoSec("header" in image ? image.header.stamp : image.timestamp) : 0n,
|
|
35501
34553
|
frameId: this.renderer.normalizeFrameId(frameId),
|
|
35502
34554
|
pose: makePose(),
|
|
35503
34555
|
settingsPath: IMAGE_TOPIC_PATH,
|
|
@@ -35985,7 +35037,7 @@ class Images extends SceneExtension {
|
|
|
35985
35037
|
};
|
|
35986
35038
|
handleImage = (messageEvent, image) => {
|
|
35987
35039
|
const imageTopic = messageEvent.topic;
|
|
35988
|
-
const receiveTime = dist$
|
|
35040
|
+
const receiveTime = dist$2.toNanoSec(messageEvent.receiveTime);
|
|
35989
35041
|
const frameId = "header" in image ? image.header.frame_id : image.frame_id;
|
|
35990
35042
|
const renderable = this.#getImageRenderable(imageTopic, receiveTime, image, frameId);
|
|
35991
35043
|
renderable.userData.receiveTime = receiveTime;
|
|
@@ -36019,7 +35071,7 @@ class Images extends SceneExtension {
|
|
|
36019
35071
|
});
|
|
36020
35072
|
this.updateSettingsTree();
|
|
36021
35073
|
}
|
|
36022
|
-
dist$
|
|
35074
|
+
dist$1.assert(settings.cameraInfoTopic != undefined);
|
|
36023
35075
|
this.#cameraInfoToImageTopics.set(settings.cameraInfoTopic, imageTopic);
|
|
36024
35076
|
|
|
36025
35077
|
// Look up the camera info for our renderable
|
|
@@ -36092,7 +35144,7 @@ class Images extends SceneExtension {
|
|
|
36092
35144
|
const userSettings = this.renderer.config.topics[imageTopic];
|
|
36093
35145
|
renderable = this.initRenderable(imageTopic, {
|
|
36094
35146
|
receiveTime,
|
|
36095
|
-
messageTime: image ? dist$
|
|
35147
|
+
messageTime: image ? dist$2.toNanoSec("header" in image ? image.header.stamp : image.timestamp) : 0n,
|
|
36096
35148
|
frameId: this.renderer.normalizeFrameId(frameId),
|
|
36097
35149
|
pose: makePose(),
|
|
36098
35150
|
settingsPath: ["topics", imageTopic],
|
|
@@ -36593,7 +35645,7 @@ class LaserScanHistoryRenderable extends Renderable {
|
|
|
36593
35645
|
super.dispose();
|
|
36594
35646
|
}
|
|
36595
35647
|
updateLaserScan(laserScan, originalMessage, settings, receiveTime) {
|
|
36596
|
-
const messageTime = dist$
|
|
35648
|
+
const messageTime = dist$2.toNanoSec(laserScan.timestamp);
|
|
36597
35649
|
this.userData.receiveTime = receiveTime;
|
|
36598
35650
|
this.userData.messageTime = messageTime;
|
|
36599
35651
|
this.userData.frameId = this.renderer.normalizeFrameId(laserScan.frame_id);
|
|
@@ -36821,7 +35873,7 @@ class LaserScans extends SceneExtension {
|
|
|
36821
35873
|
#handleLaserScan = messageEvent => {
|
|
36822
35874
|
const topic = messageEvent.topic;
|
|
36823
35875
|
const laserScan = "header" in messageEvent.message ? normalizeRosLaserScan(messageEvent.message) : normalizeFoxgloveLaserScan(messageEvent.message);
|
|
36824
|
-
const receiveTime = dist$
|
|
35876
|
+
const receiveTime = dist$2.toNanoSec(messageEvent.receiveTime);
|
|
36825
35877
|
let renderable = this.renderables.get(topic);
|
|
36826
35878
|
if (!renderable) {
|
|
36827
35879
|
// Set the initial settings from default values merged with any user settings
|
|
@@ -36846,7 +35898,7 @@ class LaserScans extends SceneExtension {
|
|
|
36846
35898
|
draft.topics[topic] = updatedUserSettings;
|
|
36847
35899
|
});
|
|
36848
35900
|
}
|
|
36849
|
-
const messageTime = dist$
|
|
35901
|
+
const messageTime = dist$2.toNanoSec(laserScan.timestamp);
|
|
36850
35902
|
renderable = new LaserScanHistoryRenderable(topic, this.renderer, {
|
|
36851
35903
|
receiveTime,
|
|
36852
35904
|
messageTime,
|
|
@@ -37482,7 +36534,7 @@ class Markers extends SceneExtension {
|
|
|
37482
36534
|
#handleMarkerArray = messageEvent => {
|
|
37483
36535
|
const topic = messageEvent.topic;
|
|
37484
36536
|
const markerArray = messageEvent.message;
|
|
37485
|
-
const receiveTime = dist$
|
|
36537
|
+
const receiveTime = dist$2.toNanoSec(messageEvent.receiveTime);
|
|
37486
36538
|
for (const markerMsg of markerArray.markers ?? []) {
|
|
37487
36539
|
if (markerMsg) {
|
|
37488
36540
|
const marker = normalizeMarker(markerMsg);
|
|
@@ -37493,7 +36545,7 @@ class Markers extends SceneExtension {
|
|
|
37493
36545
|
#handleMarker = messageEvent => {
|
|
37494
36546
|
const topic = messageEvent.topic;
|
|
37495
36547
|
const marker = normalizeMarker(messageEvent.message);
|
|
37496
|
-
const receiveTime = dist$
|
|
36548
|
+
const receiveTime = dist$2.toNanoSec(messageEvent.receiveTime);
|
|
37497
36549
|
this.#addMarker(topic, marker, receiveTime);
|
|
37498
36550
|
};
|
|
37499
36551
|
#addMarker(topic, marker, receiveTime) {
|
|
@@ -37528,7 +36580,7 @@ class Markers extends SceneExtension {
|
|
|
37528
36580
|
const userSettings = this.renderer.config.topics[topic];
|
|
37529
36581
|
topicMarkers = new TopicMarkers(topic, this.renderer, {
|
|
37530
36582
|
receiveTime,
|
|
37531
|
-
messageTime: dist$
|
|
36583
|
+
messageTime: dist$2.toNanoSec(marker.header.stamp),
|
|
37532
36584
|
frameId: this.renderer.normalizeFrameId(marker.header.frame_id),
|
|
37533
36585
|
pose: makePose(),
|
|
37534
36586
|
settingsPath: ["topics", topic],
|
|
@@ -37759,7 +36811,7 @@ class OccupancyGrids extends SceneExtension {
|
|
|
37759
36811
|
#handleOccupancyGrid = messageEvent => {
|
|
37760
36812
|
const topic = messageEvent.topic;
|
|
37761
36813
|
const occupancyGrid = normalizeOccupancyGrid(messageEvent.message);
|
|
37762
|
-
const receiveTime = dist$
|
|
36814
|
+
const receiveTime = dist$2.toNanoSec(messageEvent.receiveTime);
|
|
37763
36815
|
let renderable = this.renderables.get(topic);
|
|
37764
36816
|
if (!renderable) {
|
|
37765
36817
|
// Set the initial settings from default values merged with any user settings
|
|
@@ -37777,7 +36829,7 @@ class OccupancyGrids extends SceneExtension {
|
|
|
37777
36829
|
// Create the renderable
|
|
37778
36830
|
renderable = new OccupancyGridRenderable(topic, this.renderer, {
|
|
37779
36831
|
receiveTime,
|
|
37780
|
-
messageTime: dist$
|
|
36832
|
+
messageTime: dist$2.toNanoSec(occupancyGrid.header.stamp),
|
|
37781
36833
|
frameId: this.renderer.normalizeFrameId(occupancyGrid.header.frame_id),
|
|
37782
36834
|
pose: occupancyGrid.info.origin,
|
|
37783
36835
|
settingsPath: ["topics", topic],
|
|
@@ -37799,7 +36851,7 @@ class OccupancyGrids extends SceneExtension {
|
|
|
37799
36851
|
renderable.userData.occupancyGrid = occupancyGrid;
|
|
37800
36852
|
renderable.userData.pose = occupancyGrid.info.origin;
|
|
37801
36853
|
renderable.userData.receiveTime = receiveTime;
|
|
37802
|
-
renderable.userData.messageTime = dist$
|
|
36854
|
+
renderable.userData.messageTime = dist$2.toNanoSec(occupancyGrid.header.stamp);
|
|
37803
36855
|
renderable.userData.frameId = this.renderer.normalizeFrameId(occupancyGrid.header.frame_id);
|
|
37804
36856
|
const size = occupancyGrid.info.width * occupancyGrid.info.height;
|
|
37805
36857
|
if (occupancyGrid.data.length !== size) {
|
|
@@ -38257,7 +37309,7 @@ class PointCloudHistoryRenderable extends Renderable {
|
|
|
38257
37309
|
super.dispose();
|
|
38258
37310
|
}
|
|
38259
37311
|
updatePointCloud(pointCloud, originalMessage, settings, receiveTime) {
|
|
38260
|
-
const messageTime = dist$
|
|
37312
|
+
const messageTime = dist$2.toNanoSec(getTimestamp(pointCloud));
|
|
38261
37313
|
this.userData.receiveTime = receiveTime;
|
|
38262
37314
|
this.userData.messageTime = messageTime;
|
|
38263
37315
|
this.userData.frameId = this.renderer.normalizeFrameId(getFrameId(pointCloud));
|
|
@@ -38344,7 +37396,7 @@ class PointCloudHistoryRenderable extends Renderable {
|
|
|
38344
37396
|
}
|
|
38345
37397
|
}
|
|
38346
37398
|
pushHistory(pointCloud, originalMessage, settings, receiveTime) {
|
|
38347
|
-
const messageTime = dist$
|
|
37399
|
+
const messageTime = dist$2.toNanoSec(getTimestamp(pointCloud));
|
|
38348
37400
|
const pointsHistory = this.#pointsHistory;
|
|
38349
37401
|
const stixelsHistory = this.#stixelsHistory;
|
|
38350
37402
|
const material = this.userData.material;
|
|
@@ -38750,8 +37802,8 @@ class PointClouds extends SceneExtension {
|
|
|
38750
37802
|
schemaName
|
|
38751
37803
|
} = messageEvent;
|
|
38752
37804
|
const pointCloud = normalizePointCloud(messageEvent.message);
|
|
38753
|
-
const receiveTime = dist$
|
|
38754
|
-
const messageTime = dist$
|
|
37805
|
+
const receiveTime = dist$2.toNanoSec(messageEvent.receiveTime);
|
|
37806
|
+
const messageTime = dist$2.toNanoSec(pointCloud.timestamp);
|
|
38755
37807
|
const frameId = pointCloud.frame_id;
|
|
38756
37808
|
this.#handlePointCloud(topic, schemaName, pointCloud, receiveTime, messageTime, messageEvent.message, frameId);
|
|
38757
37809
|
};
|
|
@@ -38761,8 +37813,8 @@ class PointClouds extends SceneExtension {
|
|
|
38761
37813
|
schemaName
|
|
38762
37814
|
} = messageEvent;
|
|
38763
37815
|
const pointCloud = normalizePointCloud2(messageEvent.message);
|
|
38764
|
-
const receiveTime = dist$
|
|
38765
|
-
const messageTime = dist$
|
|
37816
|
+
const receiveTime = dist$2.toNanoSec(messageEvent.receiveTime);
|
|
37817
|
+
const messageTime = dist$2.toNanoSec(pointCloud.header.stamp);
|
|
38766
37818
|
const frameId = pointCloud.header.frame_id;
|
|
38767
37819
|
this.#handlePointCloud(topic, schemaName, pointCloud, receiveTime, messageTime, messageEvent.message, frameId);
|
|
38768
37820
|
};
|
|
@@ -39215,7 +38267,7 @@ class Polygons extends SceneExtension {
|
|
|
39215
38267
|
#handlePolygon = messageEvent => {
|
|
39216
38268
|
const topic = messageEvent.topic;
|
|
39217
38269
|
const polygonStamped = normalizePolygonStamped(messageEvent.message);
|
|
39218
|
-
const receiveTime = dist$
|
|
38270
|
+
const receiveTime = dist$2.toNanoSec(messageEvent.receiveTime);
|
|
39219
38271
|
let renderable = this.renderables.get(topic);
|
|
39220
38272
|
if (!renderable) {
|
|
39221
38273
|
// Set the initial settings from default values merged with any user settings
|
|
@@ -39226,7 +38278,7 @@ class Polygons extends SceneExtension {
|
|
|
39226
38278
|
};
|
|
39227
38279
|
renderable = new PolygonRenderable(topic, this.renderer, {
|
|
39228
38280
|
receiveTime,
|
|
39229
|
-
messageTime: dist$
|
|
38281
|
+
messageTime: dist$2.toNanoSec(polygonStamped.header.stamp),
|
|
39230
38282
|
frameId: this.renderer.normalizeFrameId(polygonStamped.header.frame_id),
|
|
39231
38283
|
pose: makePose(),
|
|
39232
38284
|
settingsPath: ["topics", topic],
|
|
@@ -39243,7 +38295,7 @@ class Polygons extends SceneExtension {
|
|
|
39243
38295
|
#updatePolygonRenderable(renderable, polygonStamped, receiveTime) {
|
|
39244
38296
|
const settings = renderable.userData.settings;
|
|
39245
38297
|
renderable.userData.receiveTime = receiveTime;
|
|
39246
|
-
renderable.userData.messageTime = dist$
|
|
38298
|
+
renderable.userData.messageTime = dist$2.toNanoSec(polygonStamped.header.stamp);
|
|
39247
38299
|
renderable.userData.frameId = this.renderer.normalizeFrameId(polygonStamped.header.frame_id);
|
|
39248
38300
|
renderable.userData.polygonStamped = polygonStamped;
|
|
39249
38301
|
const topic = renderable.userData.topic;
|
|
@@ -39659,17 +38711,17 @@ class Poses extends SceneExtension {
|
|
|
39659
38711
|
};
|
|
39660
38712
|
#handlePoseStamped = messageEvent => {
|
|
39661
38713
|
const poseMessage = normalizePoseStamped(messageEvent.message);
|
|
39662
|
-
const receiveTime = dist$
|
|
38714
|
+
const receiveTime = dist$2.toNanoSec(messageEvent.receiveTime);
|
|
39663
38715
|
this.#addPose(messageEvent.topic, poseMessage, messageEvent.message, receiveTime);
|
|
39664
38716
|
};
|
|
39665
38717
|
#handlePoseInFrame = messageEvent => {
|
|
39666
38718
|
const poseMessage = normalizePoseInFrameToPoseStamped(messageEvent.message);
|
|
39667
|
-
const receiveTime = dist$
|
|
38719
|
+
const receiveTime = dist$2.toNanoSec(messageEvent.receiveTime);
|
|
39668
38720
|
this.#addPose(messageEvent.topic, poseMessage, messageEvent.message, receiveTime);
|
|
39669
38721
|
};
|
|
39670
38722
|
#handlePoseWithCovariance = messageEvent => {
|
|
39671
38723
|
const poseMessage = normalizePoseWithCovarianceStamped(messageEvent.message);
|
|
39672
|
-
const receiveTime = dist$
|
|
38724
|
+
const receiveTime = dist$2.toNanoSec(messageEvent.receiveTime);
|
|
39673
38725
|
this.#addPose(messageEvent.topic, poseMessage, messageEvent.message, receiveTime);
|
|
39674
38726
|
};
|
|
39675
38727
|
#addPose(topic, poseMessage, originalMessage, receiveTime) {
|
|
@@ -39683,7 +38735,7 @@ class Poses extends SceneExtension {
|
|
|
39683
38735
|
};
|
|
39684
38736
|
renderable = new PoseRenderable(topic, this.renderer, {
|
|
39685
38737
|
receiveTime,
|
|
39686
|
-
messageTime: dist$
|
|
38738
|
+
messageTime: dist$2.toNanoSec(poseMessage.header.stamp),
|
|
39687
38739
|
frameId: this.renderer.normalizeFrameId(poseMessage.header.frame_id),
|
|
39688
38740
|
pose: makePose(),
|
|
39689
38741
|
settingsPath: ["topics", topic],
|
|
@@ -39702,7 +38754,7 @@ class Poses extends SceneExtension {
|
|
|
39702
38754
|
}
|
|
39703
38755
|
#updatePoseRenderable(renderable, poseMessage, originalMessage, receiveTime, settings) {
|
|
39704
38756
|
renderable.userData.receiveTime = receiveTime;
|
|
39705
|
-
renderable.userData.messageTime = dist$
|
|
38757
|
+
renderable.userData.messageTime = dist$2.toNanoSec(poseMessage.header.stamp);
|
|
39706
38758
|
renderable.userData.frameId = this.renderer.normalizeFrameId(poseMessage.header.frame_id);
|
|
39707
38759
|
renderable.userData.poseMessage = poseMessage;
|
|
39708
38760
|
renderable.userData.originalMessage = originalMessage;
|
|
@@ -40057,7 +39109,7 @@ class PoseArrays extends SceneExtension {
|
|
|
40057
39109
|
};
|
|
40058
39110
|
#handlePoseArray = messageEvent => {
|
|
40059
39111
|
const poseArrayMessage = normalizePoseArray(messageEvent.message);
|
|
40060
|
-
const receiveTime = dist$
|
|
39112
|
+
const receiveTime = dist$2.toNanoSec(messageEvent.receiveTime);
|
|
40061
39113
|
this.#addPoseArray(messageEvent.topic, poseArrayMessage, messageEvent.message, receiveTime);
|
|
40062
39114
|
};
|
|
40063
39115
|
#handleNavPath = messageEvent => {
|
|
@@ -40065,12 +39117,12 @@ class PoseArrays extends SceneExtension {
|
|
|
40065
39117
|
return;
|
|
40066
39118
|
}
|
|
40067
39119
|
const poseArrayMessage = normalizeNavPathToPoseArray(messageEvent.message);
|
|
40068
|
-
const receiveTime = dist$
|
|
39120
|
+
const receiveTime = dist$2.toNanoSec(messageEvent.receiveTime);
|
|
40069
39121
|
this.#addPoseArray(messageEvent.topic, poseArrayMessage, messageEvent.message, receiveTime);
|
|
40070
39122
|
};
|
|
40071
39123
|
#handlePosesInFrame = messageEvent => {
|
|
40072
39124
|
const poseArrayMessage = normalizePosesInFrameToPoseArray(messageEvent.message);
|
|
40073
|
-
const receiveTime = dist$
|
|
39125
|
+
const receiveTime = dist$2.toNanoSec(messageEvent.receiveTime);
|
|
40074
39126
|
this.#addPoseArray(messageEvent.topic, poseArrayMessage, messageEvent.message, receiveTime);
|
|
40075
39127
|
};
|
|
40076
39128
|
#addPoseArray(topic, poseArrayMessage, originalMessage, receiveTime) {
|
|
@@ -40088,7 +39140,7 @@ class PoseArrays extends SceneExtension {
|
|
|
40088
39140
|
};
|
|
40089
39141
|
renderable = new PoseArrayRenderable(topic, this.renderer, {
|
|
40090
39142
|
receiveTime,
|
|
40091
|
-
messageTime: dist$
|
|
39143
|
+
messageTime: dist$2.toNanoSec(poseArrayMessage.header.stamp),
|
|
40092
39144
|
frameId: this.renderer.normalizeFrameId(poseArrayMessage.header.frame_id),
|
|
40093
39145
|
pose: makePose(),
|
|
40094
39146
|
settingsPath: ["topics", topic],
|
|
@@ -40163,7 +39215,7 @@ class PoseArrays extends SceneExtension {
|
|
|
40163
39215
|
}
|
|
40164
39216
|
#updatePoseArrayRenderable(renderable, poseArrayMessage, originalMessage, receiveTime, settings) {
|
|
40165
39217
|
renderable.userData.receiveTime = receiveTime;
|
|
40166
|
-
renderable.userData.messageTime = dist$
|
|
39218
|
+
renderable.userData.messageTime = dist$2.toNanoSec(poseArrayMessage.header.stamp);
|
|
40167
39219
|
renderable.userData.frameId = this.renderer.normalizeFrameId(poseArrayMessage.header.frame_id);
|
|
40168
39220
|
renderable.userData.poseArrayMessage = poseArrayMessage;
|
|
40169
39221
|
renderable.userData.originalMessage = originalMessage;
|
|
@@ -40515,7 +39567,7 @@ class TopicEntities extends Renderable {
|
|
|
40515
39567
|
break;
|
|
40516
39568
|
}
|
|
40517
39569
|
const frameId = this.renderer.normalizeFrameId(entity.frame_id);
|
|
40518
|
-
const srcTime = entity.frame_locked ? currentTime : dist$
|
|
39570
|
+
const srcTime = entity.frame_locked ? currentTime : dist$2.toNanoSec(entity.timestamp);
|
|
40519
39571
|
const updated = updatePose(renderable, this.renderer.transformTree, renderFrameId, fixedFrameId, frameId, currentTime, srcTime);
|
|
40520
39572
|
renderable.visible = updated;
|
|
40521
39573
|
const topic = this.userData.topic;
|
|
@@ -40842,7 +39894,7 @@ class RenderableArrows extends RenderablePrimitive {
|
|
|
40842
39894
|
update(topic, entity, settings, receiveTime) {
|
|
40843
39895
|
super.update(topic, entity, settings, receiveTime);
|
|
40844
39896
|
if (entity) {
|
|
40845
|
-
const lifetimeNs = dist$
|
|
39897
|
+
const lifetimeNs = dist$2.toNanoSec(entity.lifetime);
|
|
40846
39898
|
this.userData.expiresAt = lifetimeNs === 0n ? undefined : receiveTime + lifetimeNs;
|
|
40847
39899
|
this.#updateMesh(entity.arrows);
|
|
40848
39900
|
this.#headOutline.visible = settings.showOutlines ?? true;
|
|
@@ -40998,7 +40050,7 @@ class RenderableCubes extends RenderablePrimitive {
|
|
|
40998
40050
|
update(topic, entity, settings, receiveTime) {
|
|
40999
40051
|
super.update(topic, entity, settings, receiveTime);
|
|
41000
40052
|
if (entity) {
|
|
41001
|
-
const lifetimeNs = dist$
|
|
40053
|
+
const lifetimeNs = dist$2.toNanoSec(entity.lifetime);
|
|
41002
40054
|
this.userData.expiresAt = lifetimeNs === 0n ? undefined : receiveTime + lifetimeNs;
|
|
41003
40055
|
this.#updateMesh(entity.cubes);
|
|
41004
40056
|
this.#outline.visible = settings.showOutlines ?? true;
|
|
@@ -41158,7 +40210,7 @@ class RenderableCylinders extends RenderablePrimitive {
|
|
|
41158
40210
|
update(topic, entity, settings, receiveTime) {
|
|
41159
40211
|
super.update(topic, entity, settings, receiveTime);
|
|
41160
40212
|
if (entity) {
|
|
41161
|
-
const lifetimeNs = dist$
|
|
40213
|
+
const lifetimeNs = dist$2.toNanoSec(entity.lifetime);
|
|
41162
40214
|
this.userData.expiresAt = lifetimeNs === 0n ? undefined : receiveTime + lifetimeNs;
|
|
41163
40215
|
this.#updateMesh(entity.cylinders);
|
|
41164
40216
|
this.#outline.visible = settings.showOutlines ?? true;
|
|
@@ -41275,7 +40327,7 @@ class RenderableLines extends RenderablePrimitive {
|
|
|
41275
40327
|
update(topic, entity, settings, receiveTime) {
|
|
41276
40328
|
super.update(topic, entity, settings, receiveTime);
|
|
41277
40329
|
if (entity) {
|
|
41278
|
-
const lifetimeNs = dist$
|
|
40330
|
+
const lifetimeNs = dist$2.toNanoSec(entity.lifetime);
|
|
41279
40331
|
this.userData.expiresAt = lifetimeNs === 0n ? undefined : receiveTime + lifetimeNs;
|
|
41280
40332
|
this.#updateLines(entity.lines);
|
|
41281
40333
|
}
|
|
@@ -41371,8 +40423,8 @@ class LinePrimitiveRenderable extends Object3D {
|
|
|
41371
40423
|
this.userData.pickingMaterial = this.#pickingMaterial;
|
|
41372
40424
|
this.add(this.#line);
|
|
41373
40425
|
}
|
|
41374
|
-
dist$
|
|
41375
|
-
dist$
|
|
40426
|
+
dist$1.assert(this.#positionBuffer, "Position buffer must be initialized");
|
|
40427
|
+
dist$1.assert(this.#geometry, "Geometry must be initialized");
|
|
41376
40428
|
|
|
41377
40429
|
// Set an explicit instance count, because three.js ignores attribute offsets when
|
|
41378
40430
|
// automatically computing the instance count (and results differ across browsers because they
|
|
@@ -41393,7 +40445,7 @@ class LinePrimitiveRenderable extends Object3D {
|
|
|
41393
40445
|
if (this.#colorChanged || this.#primitiveChanged) {
|
|
41394
40446
|
const singleColor = this.#color ? stringToRgba(tempRgba$4, this.#color) : this.#primitive.colors.length === 0 ? this.#primitive.color : undefined;
|
|
41395
40447
|
if (singleColor == undefined) {
|
|
41396
|
-
dist$
|
|
40448
|
+
dist$1.assert(this.#geometry, "Line Group geometry must exist");
|
|
41397
40449
|
this.#material.color.setRGB(1, 1, 1);
|
|
41398
40450
|
const necessaryColorBufferSize = numVertices * 4;
|
|
41399
40451
|
if (this.#colorBuffer == undefined || this.#colorBuffer.length < necessaryColorBufferSize) {
|
|
@@ -41445,7 +40497,7 @@ class LinePrimitiveRenderable extends Object3D {
|
|
|
41445
40497
|
}
|
|
41446
40498
|
function serializePositions(positionsOut, primitive) {
|
|
41447
40499
|
let i = 0;
|
|
41448
|
-
dist$
|
|
40500
|
+
dist$1.assert(positionsOut.length >= primitive.points.length * 3, `positionsOut must have a length (${positionsOut.length}) >= to primitive.points.length (${primitive.points.length}) * 3`);
|
|
41449
40501
|
for (const {
|
|
41450
40502
|
x,
|
|
41451
40503
|
y,
|
|
@@ -41462,7 +40514,7 @@ function serializePositions(positionsOut, primitive) {
|
|
|
41462
40514
|
}
|
|
41463
40515
|
function serializePositionsWithIndices(positionsOut, primitive) {
|
|
41464
40516
|
const indices = primitive.indices;
|
|
41465
|
-
dist$
|
|
40517
|
+
dist$1.assert(positionsOut.length >= primitive.indices.length * 3, `positionsOut must have a length (${positionsOut.length}) >= to primitive.indices.length (${primitive.indices.length}) * 3`);
|
|
41466
40518
|
let i = 0;
|
|
41467
40519
|
for (const idx of indices) {
|
|
41468
40520
|
const {
|
|
@@ -41480,8 +40532,8 @@ function serializePositionsWithIndices(positionsOut, primitive) {
|
|
|
41480
40532
|
}
|
|
41481
40533
|
}
|
|
41482
40534
|
function serializeColors(colorsOut, primitive) {
|
|
41483
|
-
dist$
|
|
41484
|
-
dist$
|
|
40535
|
+
dist$1.assert(colorsOut.length >= primitive.colors.length * 4, `colorsOut buffer must have a length (${colorsOut.length}) >= to the primitive.colors.length (${primitive.colors.length}) * 4`);
|
|
40536
|
+
dist$1.assert(primitive.colors.length > 0, "invariant: expected not to be using vertex colors");
|
|
41485
40537
|
let i = 0;
|
|
41486
40538
|
for (const {
|
|
41487
40539
|
r,
|
|
@@ -41501,9 +40553,9 @@ function serializeColors(colorsOut, primitive) {
|
|
|
41501
40553
|
}
|
|
41502
40554
|
function serializeColorsWithIndices(colorsOut, primitive) {
|
|
41503
40555
|
const indices = primitive.indices;
|
|
41504
|
-
dist$
|
|
41505
|
-
dist$
|
|
41506
|
-
dist$
|
|
40556
|
+
dist$1.assert(indices.length > 0, "Indices must have length");
|
|
40557
|
+
dist$1.assert(colorsOut.length >= indices.length * 4, `colorsOut buffer must have a length (${colorsOut.length}) >= to primitive.indices.length (${primitive.indices.length}) * 4`);
|
|
40558
|
+
dist$1.assert(primitive.colors.length > 0, "Invariant: expected not to be using vertex colors");
|
|
41507
40559
|
let i = 0;
|
|
41508
40560
|
for (const idx of indices) {
|
|
41509
40561
|
const {
|
|
@@ -41938,7 +40990,7 @@ class RenderableModels extends RenderablePrimitive {
|
|
|
41938
40990
|
update(topic, entity, settings, receiveTime) {
|
|
41939
40991
|
super.update(topic, entity, settings, receiveTime);
|
|
41940
40992
|
if (entity) {
|
|
41941
|
-
const lifetimeNs = dist$
|
|
40993
|
+
const lifetimeNs = dist$2.toNanoSec(entity.lifetime);
|
|
41942
40994
|
this.userData.expiresAt = lifetimeNs === 0n ? undefined : receiveTime + lifetimeNs;
|
|
41943
40995
|
this.#updateModels(entity.models);
|
|
41944
40996
|
}
|
|
@@ -42106,7 +41158,7 @@ class RenderableSpheres extends RenderablePrimitive {
|
|
|
42106
41158
|
update(topic, entity, settings, receiveTime) {
|
|
42107
41159
|
super.update(topic, entity, settings, receiveTime);
|
|
42108
41160
|
if (entity) {
|
|
42109
|
-
const lifetimeNs = dist$
|
|
41161
|
+
const lifetimeNs = dist$2.toNanoSec(entity.lifetime);
|
|
42110
41162
|
this.userData.expiresAt = lifetimeNs === 0n ? undefined : receiveTime + lifetimeNs;
|
|
42111
41163
|
this.#updateMesh(entity.spheres);
|
|
42112
41164
|
}
|
|
@@ -42187,7 +41239,7 @@ class RenderableTexts extends RenderablePrimitive {
|
|
|
42187
41239
|
update(topic, entity, settings, receiveTime) {
|
|
42188
41240
|
super.update(topic, entity, settings, receiveTime);
|
|
42189
41241
|
if (entity) {
|
|
42190
|
-
const lifetimeNs = dist$
|
|
41242
|
+
const lifetimeNs = dist$2.toNanoSec(entity.lifetime);
|
|
42191
41243
|
this.userData.expiresAt = lifetimeNs === 0n ? undefined : receiveTime + lifetimeNs;
|
|
42192
41244
|
this.#updateTexts(entity.texts);
|
|
42193
41245
|
}
|
|
@@ -42363,7 +41415,7 @@ class RenderableTriangles extends RenderablePrimitive {
|
|
|
42363
41415
|
update(topic, entity, settings, receiveTime) {
|
|
42364
41416
|
super.update(topic, entity, settings, receiveTime);
|
|
42365
41417
|
if (entity) {
|
|
42366
|
-
const lifetimeNs = dist$
|
|
41418
|
+
const lifetimeNs = dist$2.toNanoSec(entity.lifetime);
|
|
42367
41419
|
this.userData.expiresAt = lifetimeNs === 0n ? undefined : receiveTime + lifetimeNs;
|
|
42368
41420
|
this.#updateTriangleMeshes(entity.triangles);
|
|
42369
41421
|
}
|
|
@@ -42561,7 +41613,7 @@ class FoxgloveSceneEntities extends SceneExtension {
|
|
|
42561
41613
|
for (const entityMsg of sceneUpdates.entities ?? []) {
|
|
42562
41614
|
if (entityMsg) {
|
|
42563
41615
|
const entity = normalizeSceneEntity(entityMsg);
|
|
42564
|
-
this.#getTopicEntities(topic).addOrUpdateEntity(entity, dist$
|
|
41616
|
+
this.#getTopicEntities(topic).addOrUpdateEntity(entity, dist$2.toNanoSec(messageEvent.receiveTime));
|
|
42565
41617
|
}
|
|
42566
41618
|
}
|
|
42567
41619
|
};
|
|
@@ -46535,7 +45587,7 @@ class Urdfs extends SceneExtension {
|
|
|
46535
45587
|
const msg = messageEvent.message;
|
|
46536
45588
|
const names = msg.name ?? [];
|
|
46537
45589
|
const positions = msg.position ?? [];
|
|
46538
|
-
const timestamp = dist$
|
|
45590
|
+
const timestamp = dist$2.toNanoSec(messageEvent.receiveTime);
|
|
46539
45591
|
for (let i = 0; i < names.length; i++) {
|
|
46540
45592
|
const name = names[i];
|
|
46541
45593
|
const position = positions[i] ?? 0;
|
|
@@ -53454,7 +52506,7 @@ class VelodyneCloudConverter {
|
|
|
53454
52506
|
if (model == undefined) {
|
|
53455
52507
|
return undefined;
|
|
53456
52508
|
}
|
|
53457
|
-
const stamp = dist$
|
|
52509
|
+
const stamp = dist$2.toSec(scan.header.stamp);
|
|
53458
52510
|
const maxPoints = dist.RawPacket.MAX_POINTS_PER_PACKET * scan.packets.length;
|
|
53459
52511
|
const cloud = new dist.PointCloud({
|
|
53460
52512
|
stamp,
|
|
@@ -53462,7 +52514,7 @@ class VelodyneCloudConverter {
|
|
|
53462
52514
|
});
|
|
53463
52515
|
const transformer = this.getTransformer(model);
|
|
53464
52516
|
for (const packet of scan.packets) {
|
|
53465
|
-
transformer.unpack(new dist.RawPacket(packet.data), stamp, dist$
|
|
52517
|
+
transformer.unpack(new dist.RawPacket(packet.data), stamp, dist$2.toSec(packet.stamp), cloud);
|
|
53466
52518
|
}
|
|
53467
52519
|
cloud.trim();
|
|
53468
52520
|
if (cloud.width === 0 || cloud.height === 0) {
|
|
@@ -53587,7 +52639,7 @@ class VelodyneScans extends SceneExtension {
|
|
|
53587
52639
|
const {
|
|
53588
52640
|
topic
|
|
53589
52641
|
} = messageEvent;
|
|
53590
|
-
const receiveTime = dist$
|
|
52642
|
+
const receiveTime = dist$2.toNanoSec(messageEvent.receiveTime);
|
|
53591
52643
|
const pointCloud = this.#velodyneCloudConverter.decode(messageEvent.message);
|
|
53592
52644
|
if (!pointCloud) {
|
|
53593
52645
|
return;
|
|
@@ -53630,7 +52682,7 @@ class VelodyneScans extends SceneExtension {
|
|
|
53630
52682
|
const pickingMaterial = createPickingMaterial$1(settings);
|
|
53631
52683
|
const instancePickingMaterial = createInstancePickingMaterial(settings);
|
|
53632
52684
|
const stixelMaterial = createStixelMaterial(settings);
|
|
53633
|
-
const messageTime = dist$
|
|
52685
|
+
const messageTime = dist$2.toNanoSec(pointCloud.timestamp);
|
|
53634
52686
|
renderable = new PointCloudHistoryRenderable(topic, this.renderer, {
|
|
53635
52687
|
receiveTime,
|
|
53636
52688
|
messageTime,
|
|
@@ -56912,7 +55964,7 @@ class Picker {
|
|
|
56912
55964
|
return (this.#pixelBuffer[0] << 24) + (this.#pixelBuffer[1] << 16) + (this.#pixelBuffer[2] << 8) + this.#pixelBuffer[3];
|
|
56913
55965
|
}
|
|
56914
55966
|
#updateCameraForPickAndGetPickCoordsInView(x, y, options) {
|
|
56915
|
-
dist$
|
|
55967
|
+
dist$1.assert(this.#camera, "camera must be set before updating for pick");
|
|
56916
55968
|
const w = this.#gl.domElement.width;
|
|
56917
55969
|
const h = this.#gl.domElement.height;
|
|
56918
55970
|
const pixelRatio = this.#gl.getPixelRatio();
|
|
@@ -56940,7 +55992,7 @@ class Picker {
|
|
|
56940
55992
|
}
|
|
56941
55993
|
}
|
|
56942
55994
|
#resetCameraFromPick(options) {
|
|
56943
|
-
dist$
|
|
55995
|
+
dist$1.assert(this.#camera, "camera must be set before resetting from pick");
|
|
56944
55996
|
if (options.disableSetViewOffset !== true) {
|
|
56945
55997
|
this.#camera.clearViewOffset();
|
|
56946
55998
|
}
|
|
@@ -72793,14 +71845,14 @@ function formatDate(stamp, timezone) {
|
|
|
72793
71845
|
console.error("Times are not allowed to be negative");
|
|
72794
71846
|
return "(invalid negative time)";
|
|
72795
71847
|
}
|
|
72796
|
-
return moment$1.tz(dist$
|
|
71848
|
+
return moment$1.tz(dist$2.toDate(stamp), timezone ?? moment$1.tz.guess()).format("YYYY-MM-DD");
|
|
72797
71849
|
}
|
|
72798
71850
|
function formatTime(stamp, timezone) {
|
|
72799
71851
|
if (stamp.sec < 0 || stamp.nsec < 0) {
|
|
72800
71852
|
console.error("Times are not allowed to be negative");
|
|
72801
71853
|
return "(invalid negative time)";
|
|
72802
71854
|
}
|
|
72803
|
-
return moment$1.tz(dist$
|
|
71855
|
+
return moment$1.tz(dist$2.toDate(stamp), timezone ?? moment$1.tz.guess()).format("h:mm:ss.SSS A z");
|
|
72804
71856
|
}
|
|
72805
71857
|
function formatDuration(stamp) {
|
|
72806
71858
|
return moment$1.duration(Math.round(stamp.sec * 1000 + stamp.nsec / 1e6)).format("h:mm:ss.SSS", {
|
|
@@ -75016,7 +74068,7 @@ class Renderer extends EventEmitter {
|
|
|
75016
74068
|
if (!allFrames || allFrames.length === 0) {
|
|
75017
74069
|
return false;
|
|
75018
74070
|
}
|
|
75019
|
-
const currentTime = dist$
|
|
74071
|
+
const currentTime = dist$2.fromNanoSec(this.currentTime);
|
|
75020
74072
|
|
|
75021
74073
|
/**
|
|
75022
74074
|
* Assumptions about allFrames needed by allFramesCursor:
|
|
@@ -75045,7 +74097,7 @@ class Renderer extends EventEmitter {
|
|
|
75045
74097
|
cursor++;
|
|
75046
74098
|
message = allFrames[cursor];
|
|
75047
74099
|
// read messages until we reach the current time
|
|
75048
|
-
if (dist$
|
|
74100
|
+
if (dist$2.isLessThan(currentTime, message.receiveTime)) {
|
|
75049
74101
|
cursorTimeReached = currentTime;
|
|
75050
74102
|
// reset cursor to last read message index
|
|
75051
74103
|
cursor--;
|
|
@@ -75168,7 +74220,7 @@ class Renderer extends EventEmitter {
|
|
|
75168
74220
|
* prevents the 3D aspects of the scene from being rendered from an insufficient camera info.
|
|
75169
74221
|
*/
|
|
75170
74222
|
enableImageOnlySubscriptionMode = () => {
|
|
75171
|
-
dist$
|
|
74223
|
+
dist$1.assert(this.#imageModeExtension, "Image mode extension should be defined when calling enable Image only mode");
|
|
75172
74224
|
this.clear({
|
|
75173
74225
|
clearTransforms: true,
|
|
75174
74226
|
resetAllFramesCursor: true,
|
|
@@ -75421,7 +74473,7 @@ class Renderer extends EventEmitter {
|
|
|
75421
74473
|
const parentId = transform.parent_frame_id;
|
|
75422
74474
|
const childId = transform.child_frame_id;
|
|
75423
74475
|
try {
|
|
75424
|
-
const stamp = dist$
|
|
74476
|
+
const stamp = dist$2.toNanoSec(transform.timestamp);
|
|
75425
74477
|
const t = transform.translation;
|
|
75426
74478
|
const q = transform.rotation;
|
|
75427
74479
|
this.addTransform(parentId, childId, stamp, t, q);
|
|
@@ -75433,7 +74485,7 @@ class Renderer extends EventEmitter {
|
|
|
75433
74485
|
const normalizedParentId = this.normalizeFrameId(tf.header.frame_id);
|
|
75434
74486
|
const normalizedChildId = this.normalizeFrameId(tf.child_frame_id);
|
|
75435
74487
|
try {
|
|
75436
|
-
const stamp = dist$
|
|
74488
|
+
const stamp = dist$2.toNanoSec(tf.header.stamp);
|
|
75437
74489
|
const t = tf.transform.translation;
|
|
75438
74490
|
const q = tf.transform.rotation;
|
|
75439
74491
|
this.addTransform(normalizedParentId, normalizedChildId, stamp, t, q);
|
|
@@ -79027,7 +78079,7 @@ const ros2galacticDefinitions = {
|
|
|
79027
78079
|
const PublishRos1Datatypes = new Map(["geometry_msgs/Point", "geometry_msgs/PointStamped", "geometry_msgs/Pose", "geometry_msgs/PoseStamped", "geometry_msgs/PoseWithCovariance", "geometry_msgs/PoseWithCovarianceStamped", "geometry_msgs/Quaternion", "std_msgs/Header"].map(type => [type, ros1Definitions[type]]));
|
|
79028
78080
|
const PublishRos2Datatypes = new Map(["geometry_msgs/Point", "geometry_msgs/PointStamped", "geometry_msgs/Pose", "geometry_msgs/PoseStamped", "geometry_msgs/PoseWithCovariance", "geometry_msgs/PoseWithCovarianceStamped", "geometry_msgs/Quaternion", "std_msgs/Header"].map(type => [type, ros2galacticDefinitions[type]]));
|
|
79029
78081
|
function makePointMessage(point, frameId) {
|
|
79030
|
-
const time = dist$
|
|
78082
|
+
const time = dist$2.fromDate(new Date());
|
|
79031
78083
|
return {
|
|
79032
78084
|
// seq is omitted since it is not present in ros2
|
|
79033
78085
|
header: {
|
|
@@ -79042,7 +78094,7 @@ function makePointMessage(point, frameId) {
|
|
|
79042
78094
|
};
|
|
79043
78095
|
}
|
|
79044
78096
|
function makePoseMessage(pose, frameId) {
|
|
79045
|
-
const time = dist$
|
|
78097
|
+
const time = dist$2.fromDate(new Date());
|
|
79046
78098
|
return {
|
|
79047
78099
|
// seq is omitted since it is not present in ros2
|
|
79048
78100
|
header: {
|
|
@@ -79053,7 +78105,7 @@ function makePoseMessage(pose, frameId) {
|
|
|
79053
78105
|
};
|
|
79054
78106
|
}
|
|
79055
78107
|
function makePoseEstimateMessage(pose, frameId, xDev, yDev, thetaDev) {
|
|
79056
|
-
const time = dist$
|
|
78108
|
+
const time = dist$2.fromDate(new Date());
|
|
79057
78109
|
return {
|
|
79058
78110
|
// seq is omitted since it is not present in ros2
|
|
79059
78111
|
header: {
|
|
@@ -79440,7 +78492,7 @@ function ThreeDeeRender(props) {
|
|
|
79440
78492
|
|
|
79441
78493
|
// Keep the renderer currentTime up to date and handle seeking
|
|
79442
78494
|
useEffect(() => {
|
|
79443
|
-
const newTimeNs = currentTime ? dist$
|
|
78495
|
+
const newTimeNs = currentTime ? dist$2.toNanoSec(currentTime) : undefined;
|
|
79444
78496
|
|
|
79445
78497
|
/*
|
|
79446
78498
|
* NOTE AROUND SEEK HANDLING
|