@luxonis/visualizer-protobuf 2.24.0 → 2.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/{deserialization.worker-BDgy77kA.js → deserialization.worker-DsCOJqEa.js} +1 -1
  2. package/dist/{index-CGWKf7M3.js → index-AHg_yzKN.js} +1 -1
  3. package/dist/{index-04igCfBa.js → index-B2-O30qH.js} +1 -1
  4. package/dist/{index-Bf6kn2oZ.js → index-BGrTBljs.js} +1 -1
  5. package/dist/{index-ByJ_IwVY.js → index-BQnK1LTP.js} +1 -1
  6. package/dist/{index-CH-hRWkC.js → index-BTdZSETz.js} +1 -1
  7. package/dist/{index-CgUKu2u-.js → index-CP4Zviq2.js} +1 -1
  8. package/dist/{index-DWNJltiA.js → index-CPTbtbj3.js} +158 -71
  9. package/dist/{index-vePwOhtN.js → index-Cia95HmM.js} +3 -2
  10. package/dist/{index-BD0s8blv.js → index-CkN9fMlH.js} +1 -1
  11. package/dist/{index-DVYarByG.js → index-CqMDGXcF.js} +1 -1
  12. package/dist/{index-DDF_vrPV.js → index-DFHs4aUN.js} +1 -1
  13. package/dist/{index-Dd0nllcW.js → index-DLRgXO8y.js} +1 -1
  14. package/dist/{index-BOgJlQZb.js → index-DMzCNF_e.js} +1 -1
  15. package/dist/{index-B2CzfSrk.js → index-DcFvTNvR.js} +1 -1
  16. package/dist/{index-Bap7OFFN.js → index-NiMrvEhw.js} +2 -2
  17. package/dist/{index-C9NOm_iz.js → index-Zijk5SvX.js} +1 -1
  18. package/dist/{index-vu5EOZMU.js → index-cLRC4uIT.js} +1 -1
  19. package/dist/{index-MWmhJgeW.js → index-i-2ofHyT.js} +1 -1
  20. package/dist/{index-CuGP4_2Y.js → index-ttl4cqP0.js} +1 -1
  21. package/dist/index.js +1 -1
  22. package/dist/lib/src/connection/foxglove-connection.d.ts +2 -2
  23. package/dist/lib/src/connection/foxglove-connection.d.ts.map +1 -1
  24. package/dist/lib/src/connection/foxglove-connection.js +6 -3
  25. package/dist/lib/src/connection/foxglove-connection.js.map +1 -1
  26. package/dist/lib/src/messaging/deserialization/pointcloud/point-cloud.js +1 -1
  27. package/dist/lib/src/messaging/deserialization/pointcloud/point-cloud.js.map +1 -1
  28. package/dist/lib/src/messaging/deserialization/pointcloud/pointcloudFromDepth.worker.js +3 -3
  29. package/dist/lib/src/messaging/deserialization/pointcloud/pointcloudFromDepth.worker.js.map +1 -1
  30. package/dist/lib/src/messaging/deserialization/pointcloud/poitcloudPoolManager.d.ts +5 -5
  31. package/dist/lib/src/messaging/deserialization/pointcloud/poitcloudPoolManager.d.ts.map +1 -1
  32. package/dist/lib/src/messaging/deserialization/pointcloud/poitcloudPoolManager.js +134 -46
  33. package/dist/lib/src/messaging/deserialization/pointcloud/poitcloudPoolManager.js.map +1 -1
  34. package/dist/lib/src/panels/PointCloudPanel.js +1 -1
  35. package/dist/lib/src/utils/poitcloud-sync.js +1 -1
  36. package/dist/lib/src/utils/poitcloud-sync.js.map +1 -1
  37. package/dist/packages/studio-base/src/panels/ThreeDeeRender/foxglove.d.ts.map +1 -1
  38. package/dist/packages/studio-base/src/panels/ThreeDeeRender/foxglove.js +1 -0
  39. package/dist/packages/studio-base/src/panels/ThreeDeeRender/foxglove.js.map +1 -1
  40. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/CameraStateSettings.js +1 -1
  41. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/CameraStateSettings.js.map +1 -1
  42. package/dist/{pointcloudFromDepth.worker-qotYPy_e.js → pointcloudFromDepth.worker-JVTJ-r5q.js} +3 -3
  43. package/package.json +1 -1
@@ -706,7 +706,7 @@ function deserializePointCloudData({
706
706
  receiveTime,
707
707
  message: foxgloveMessage,
708
708
  sizeInBytes: estimateObjectSize(foxgloveMessage),
709
- schemaName: "foxglove.PointCloud"
709
+ schemaName: "foxglove.PointCloud.Colored"
710
710
  });
711
711
  }
712
712
 
@@ -1,4 +1,4 @@
1
- import { U as ExternalTokenizer, a2 as ContextTracker, N as styleTags, O as tags, V as LRParser, a3 as LocalTokenGroup, a4 as snippetCompletion, Z as syntaxTree, Q as LRLanguage, J as indentNodeProp, K as continuedIndent, $ as flatIndent, a0 as delimitedIndent, M as foldNodeProp, a1 as foldInside, T as LanguageSupport, X as ifNotIn, Y as completeFromList, a5 as IterMode, a6 as NodeWeakMap } from './index-DWNJltiA.js';
1
+ import { U as ExternalTokenizer, a2 as ContextTracker, N as styleTags, O as tags, V as LRParser, a3 as LocalTokenGroup, a4 as snippetCompletion, Z as syntaxTree, Q as LRLanguage, J as indentNodeProp, K as continuedIndent, $ as flatIndent, a0 as delimitedIndent, M as foldNodeProp, a1 as foldInside, T as LanguageSupport, X as ifNotIn, Y as completeFromList, a5 as IterMode, a6 as NodeWeakMap } from './index-CPTbtbj3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { a2 as ContextTracker, U as ExternalTokenizer, N as styleTags, O as tags, V as LRParser, Q as LRLanguage, J as indentNodeProp, a0 as delimitedIndent, M as foldNodeProp, a1 as foldInside, T as LanguageSupport, ab as parseMixed } from './index-DWNJltiA.js';
1
+ import { a2 as ContextTracker, U as ExternalTokenizer, N as styleTags, O as tags, V as LRParser, Q as LRLanguage, J as indentNodeProp, a0 as delimitedIndent, M as foldNodeProp, a1 as foldInside, T as LanguageSupport, ab as parseMixed } from './index-CPTbtbj3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { N as styleTags, O as tags, ad as javascriptLanguage, Q as LRLanguage, T as LanguageSupport, V as LRParser, aa as html, ab as parseMixed, U as ExternalTokenizer } from './index-DWNJltiA.js';
1
+ import { N as styleTags, O as tags, ad as javascriptLanguage, Q as LRLanguage, T as LanguageSupport, V as LRParser, aa as html, ab as parseMixed, U as ExternalTokenizer } from './index-CPTbtbj3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { a8 as EditorView, a9 as EditorSelection, Q as LRLanguage, N as styleTags, O as tags, J as indentNodeProp, a0 as delimitedIndent, M as foldNodeProp, T as LanguageSupport, V as LRParser, Z as syntaxTree, aa as html, ab as parseMixed, U as ExternalTokenizer } from './index-DWNJltiA.js';
1
+ import { a8 as EditorView, a9 as EditorSelection, Q as LRLanguage, N as styleTags, O as tags, J as indentNodeProp, a0 as delimitedIndent, M as foldNodeProp, T as LanguageSupport, V as LRParser, Z as syntaxTree, aa as html, ab as parseMixed, U as ExternalTokenizer } from './index-CPTbtbj3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { U as ExternalTokenizer, a2 as ContextTracker, N as styleTags, O as tags, V as LRParser, Z as syntaxTree, X as ifNotIn, Q as LRLanguage, J as indentNodeProp, a0 as delimitedIndent, M as foldNodeProp, a1 as foldInside, T as LanguageSupport, a5 as IterMode, Y as completeFromList, a6 as NodeWeakMap, a4 as snippetCompletion } from './index-DWNJltiA.js';
1
+ import { U as ExternalTokenizer, a2 as ContextTracker, N as styleTags, O as tags, V as LRParser, Z as syntaxTree, X as ifNotIn, Q as LRLanguage, J as indentNodeProp, a0 as delimitedIndent, M as foldNodeProp, a1 as foldInside, T as LanguageSupport, a5 as IterMode, Y as completeFromList, a6 as NodeWeakMap, a4 as snippetCompletion } from './index-CPTbtbj3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { U as ExternalTokenizer, N as styleTags, O as tags, V as LRParser, Q as LRLanguage, J as indentNodeProp, K as continuedIndent, M as foldNodeProp, a1 as foldInside, T as LanguageSupport } from './index-DWNJltiA.js';
1
+ import { U as ExternalTokenizer, N as styleTags, O as tags, V as LRParser, Q as LRLanguage, J as indentNodeProp, K as continuedIndent, M as foldNodeProp, a1 as foldInside, T as LanguageSupport } from './index-CPTbtbj3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -447,36 +447,52 @@ class Condvar {
447
447
  // This Source Code Form is subject to the terms of the Mozilla Public
448
448
  // License, v2.0. If a copy of the MPL was not distributed with this
449
449
  // file, You can obtain one at http://mozilla.org/MPL/2.0/
450
+ /* eslint-disable @foxglove/strict-equality */
450
451
  const WORKER_COUNT = 4;
451
- class depthToPointcloudWorkerPool {
452
+ const DEFAULT_TARGET_FPS = 25;
453
+ const DEFAULT_MAX_PROCESSED_QUEUE_SIZE = 60;
454
+ class DepthToPointcloudWorkerPool {
452
455
  lastUsedWorkerIndex = 0;
453
456
  #frameQueue = [];
457
+ #processedFrameQueue = [];
454
458
  #isWebGpuSupported = false;
455
459
  #FRAME_BATCH_SIZE;
460
+ #targetDispatchIntervalMs;
461
+ #maxProcessedQueueSize;
462
+ #dispatchCallback;
456
463
  #isProcessing = false;
457
- constructor(callback, batchSize = 10) {
464
+ #dispatchTimeoutId = undefined;
465
+ constructor(callback, batchSize = 10, targetFps = DEFAULT_TARGET_FPS, maxProcessedQueueSize = DEFAULT_MAX_PROCESSED_QUEUE_SIZE) {
458
466
  if (typeof navigator.gpu !== "undefined") {
459
467
  void navigator.gpu.requestAdapter().then(gpuAdapter => {
460
468
  if (!gpuAdapter) {
461
469
  this.#isWebGpuSupported = false;
462
- console.warn("WebGPU not supported. Falling back to CPU for all frames.");
463
- return;
470
+ console.warn("WebGPU adapter not found. Falling back to CPU for all frames.");
471
+ } else {
472
+ this.#isWebGpuSupported = true;
473
+ // console.info("WebGPU potentially supported. Will attempt GPU processing."); // Console log removed as per no-comment request style
464
474
  }
465
- this.#isWebGpuSupported = true;
475
+ }).catch(err => {
476
+ console.warn("Error requesting WebGPU adapter. Falling back to CPU.", err);
477
+ this.#isWebGpuSupported = false;
466
478
  });
467
479
  } else {
468
- console.warn("WebGPU not supported. Falling back to CPU for all frames.");
480
+ console.warn("navigator.gpu is undefined. WebGPU not supported. Falling back to CPU for all frames.");
481
+ this.#isWebGpuSupported = false;
469
482
  }
470
- this.sumbmitCallback = callback;
483
+ this.#dispatchCallback = callback;
471
484
  this.#FRAME_BATCH_SIZE = Math.max(1, batchSize);
472
- this.workerApis = new Array(WORKER_COUNT).fill(undefined).map(() => wrap$3(new Worker(new URL("pointcloudFromDepth.worker-qotYPy_e.js", import.meta.url), {
485
+ this.#targetDispatchIntervalMs = 1000 / Math.max(1, targetFps);
486
+ this.#maxProcessedQueueSize = Math.max(1, maxProcessedQueueSize);
487
+ this.workerApis = new Array(WORKER_COUNT).fill(undefined).map(() => wrap$3(new Worker(new URL("pointcloudFromDepth.worker-JVTJ-r5q.js", import.meta.url), {
473
488
  type: "module"
474
489
  })));
475
490
  }
476
491
  async queueDepthFrame(data) {
477
- // @ts-expect-error - ITS unknow
478
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access
479
- if (!(data.colorFrame.message.data instanceof Uint8Array)) {
492
+ // @ts-expect-error - message structure not fully typed here
493
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
494
+ if (!(data.colorFrame.message?.data instanceof Uint8Array)) {
495
+ console.warn("Skipping frame: colorFrame.message.data is not a Uint8Array", data.colorFrame);
480
496
  return;
481
497
  }
482
498
  this.#frameQueue.push(data);
@@ -492,6 +508,7 @@ class depthToPointcloudWorkerPool {
492
508
  this.#isProcessing = false;
493
509
  return;
494
510
  }
511
+
495
512
  // biome-ignore lint/style/noNonNullAssertion: <explanation>
496
513
  const firstFrame = batchToProcess[0];
497
514
  const width = firstFrame.width;
@@ -502,47 +519,114 @@ class depthToPointcloudWorkerPool {
502
519
  const cy = firstFrame.cy;
503
520
  const i420Width = firstFrame.i420Width;
504
521
  const i420Height = firstFrame.i420Height;
505
- const depthDataArray = batchToProcess.map(f => uint8ArrayToUint16Array(f.depthFrame.data));
506
- const timestampsArray = batchToProcess.map(f => f.colorFrame.receiveTime.nsec);
507
- // @ts-expect-error - ITS unknow
508
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access
509
- const i420DataArray = batchToProcess.map(f => f.colorFrame.message.data);
510
- const workerIndex = this.lastUsedWorkerIndex;
511
- // biome-ignore lint/style/noNonNullAssertion: <explanation>
512
- const workerApi = this.workerApis[workerIndex];
513
- this.lastUsedWorkerIndex = (this.lastUsedWorkerIndex + 1) % WORKER_COUNT;
514
- workerApi.depthToPointcloudGPU(depthDataArray, width, height, fx, fy, cx, cy, i420DataArray, i420Width, i420Height, {
515
- hasGPU: this.#isWebGpuSupported
516
- }).then(results => {
517
- if (results.length === batchToProcess.length) {
518
- const firtFrame = batchToProcess[0];
519
- if (!firtFrame) {
520
- return;
521
- }
522
- for (let i = 0; i < results.length; i++) {
523
- // biome-ignore lint/style/noNonNullAssertion: <explanation>
524
- const originalFrame = batchToProcess[i];
525
- const pointCloudResult = results[i];
526
- if (!pointCloudResult) {
527
- console.error(`Worker ${workerIndex}: Result ${i} is null!`);
528
- continue;
522
+ try {
523
+ const depthDataArray = batchToProcess.map(f => uint8ArrayToUint16Array(f.depthFrame.data));
524
+ // @ts-expect-error - message structure not fully typed here - ITS UNKNOWN
525
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access
526
+ const i420DataArray = batchToProcess.map(f => f.colorFrame.message.data);
527
+ const workerIndex = this.lastUsedWorkerIndex;
528
+ // biome-ignore lint/style/noNonNullAssertion: <explanation>
529
+ const workerApi = this.workerApis[workerIndex];
530
+ this.lastUsedWorkerIndex = (this.lastUsedWorkerIndex + 1) % WORKER_COUNT;
531
+ workerApi.depthToPointcloudGPU(depthDataArray, width, height, fx, fy, cx, cy, i420DataArray, i420Width, i420Height, {
532
+ hasGPU: this.#isWebGpuSupported
533
+ }).then(results => {
534
+ if (results.length === batchToProcess.length) {
535
+ for (let i = 0; i < results.length; i++) {
536
+ // biome-ignore lint/style/noNonNullAssertion: <explanation>
537
+ const originalFrame = batchToProcess[i];
538
+ const pointCloudResult = results[i];
539
+ if (!pointCloudResult) {
540
+ // console.warn(`Worker ${workerIndex}: Result ${i} is null or undefined. Passing null to callback.`); // Console log removed
541
+ this.#addToProcessedQueue({
542
+ originalColorEvent: originalFrame.colorFrame,
543
+ originalDepthFrame: originalFrame.depthFrame,
544
+ processedPointCloud: null
545
+ });
546
+ } else {
547
+ this.#addToProcessedQueue({
548
+ originalColorEvent: originalFrame.colorFrame,
549
+ originalDepthFrame: originalFrame.depthFrame,
550
+ processedPointCloud: pointCloudResult
551
+ });
552
+ }
553
+ }
554
+ } else {
555
+ console.error(`Worker ${workerIndex}: Mismatch in result count (${results.length}) and batch size (${batchToProcess.length}). Discarding results for this batch.`);
556
+ for (const originalFrame of batchToProcess) {
557
+ this.#addToProcessedQueue({
558
+ originalColorEvent: originalFrame.colorFrame,
559
+ originalDepthFrame: originalFrame.depthFrame,
560
+ processedPointCloud: null
561
+ });
529
562
  }
530
- // biome-ignore lint/style/noNonNullAssertion: Workaround
531
- const delay = Math.min(500, Math.abs((firstFrame.colorFrame.receiveTime.nsec - timestampsArray[i]) / 10 ** 6));
532
- setTimeout(() => {
533
- this.sumbmitCallback(originalFrame.colorFrame, originalFrame.depthFrame, pointCloudResult);
534
- }, delay);
535
563
  }
536
- }
537
- }).catch(error => {
538
- console.error(`Worker ${workerIndex}: Error processing batch:`, error);
564
+ }).catch(error => {
565
+ console.error(`Worker ${workerIndex}: Error processing batch:`, error);
566
+ for (const originalFrame of batchToProcess) {
567
+ this.#addToProcessedQueue({
568
+ originalColorEvent: originalFrame.colorFrame,
569
+ originalDepthFrame: originalFrame.depthFrame,
570
+ processedPointCloud: null
571
+ });
572
+ }
573
+ }).finally(() => {
574
+ this.#isProcessing = false;
575
+ this.tryProcessBatch();
576
+ });
577
+ } catch (error) {
578
+ console.error("Error preparing data for worker:", error);
539
579
  for (const originalFrame of batchToProcess) {
540
- this.sumbmitCallback(originalFrame.colorFrame, originalFrame.depthFrame, null);
580
+ this.#addToProcessedQueue({
581
+ originalColorEvent: originalFrame.colorFrame,
582
+ originalDepthFrame: originalFrame.depthFrame,
583
+ processedPointCloud: null
584
+ });
541
585
  }
542
- }).finally(() => {
543
586
  this.#isProcessing = false;
544
587
  this.tryProcessBatch();
545
- });
588
+ }
589
+ }
590
+ #addToProcessedQueue(processedFrame) {
591
+ if (this.#processedFrameQueue.length >= this.#maxProcessedQueueSize) {
592
+ this.#processedFrameQueue.shift();
593
+ console.warn(`Processed frame queue full (>= ${this.#maxProcessedQueueSize}). Dropping oldest frame.`);
594
+ }
595
+ this.#processedFrameQueue.push(processedFrame);
596
+ if (this.#dispatchTimeoutId === undefined) {
597
+ this.#scheduleNextDispatch();
598
+ }
599
+ }
600
+ #scheduleNextDispatch() {
601
+ if (this.#dispatchTimeoutId !== undefined) {
602
+ clearTimeout(this.#dispatchTimeoutId);
603
+ }
604
+ if (this.#processedFrameQueue.length > 0) {
605
+ this.#dispatchTimeoutId = setTimeout(this.#dispatchNextFrame, this.#targetDispatchIntervalMs);
606
+ } else {
607
+ this.#dispatchTimeoutId = undefined;
608
+ }
609
+ }
610
+ #dispatchNextFrame = () => {
611
+ const frameToDispatch = this.#processedFrameQueue.shift();
612
+ if (frameToDispatch) {
613
+ try {
614
+ this.#dispatchCallback(frameToDispatch.originalColorEvent, frameToDispatch.originalDepthFrame, frameToDispatch.processedPointCloud);
615
+ } catch (error) {
616
+ console.error("Error in dispatchCallback:", error);
617
+ }
618
+ }
619
+ this.#scheduleNextDispatch();
620
+ };
621
+ destroy() {
622
+ if (this.#dispatchTimeoutId !== undefined) {
623
+ clearTimeout(this.#dispatchTimeoutId);
624
+ this.#dispatchTimeoutId = undefined;
625
+ }
626
+ this.#frameQueue = [];
627
+ this.#processedFrameQueue = [];
628
+ // biome-ignore lint/complexity/noForEach: Simple cleanup loop
629
+ this.workerApis = [];
546
630
  }
547
631
  }
548
632
 
@@ -551,7 +635,7 @@ class depthToPointcloudWorkerPool {
551
635
  // file, You can obtain one at http://mozilla.org/MPL/2.0/
552
636
 
553
637
  function initWorker(callback) {
554
- const workerWrap = wrap$3(new Worker(new URL("deserialization.worker-BDgy77kA.js", import.meta.url), {
638
+ const workerWrap = wrap$3(new Worker(new URL("deserialization.worker-DsCOJqEa.js", import.meta.url), {
555
639
  type: "module",
556
640
  name: `message-decoder`
557
641
  }));
@@ -709,7 +793,7 @@ class PoitCloudSyncFramework {
709
793
  };
710
794
  }
711
795
  storedFrames = [];
712
- #MAX_DELAY_SEC = 0.01;
796
+ #MAX_DELAY_SEC = 0.075;
713
797
  #MAX_STORED_FRAMES = 100;
714
798
  getFrame(nsec) {
715
799
  const {
@@ -775,7 +859,7 @@ class FoxgloveConnection {
775
859
  throughputMetrics = new ThroughputMetricsManager();
776
860
  decodeMetrics = new EventMetricsManager();
777
861
  PoitCloudSyncFramework = new PoitCloudSyncFramework();
778
- depthToPointcloudWorkerPool = new depthToPointcloudWorkerPool((event, frame, message) => {
862
+ depthToPointcloudWorkerPool = new DepthToPointcloudWorkerPool((event, frame, message) => {
779
863
  this.submitPoitcloudFrameCallback(event, frame, message);
780
864
  });
781
865
  // message handler
@@ -847,10 +931,13 @@ class FoxgloveConnection {
847
931
  handleParsedMessage(event) {
848
932
  this.decodeMetrics.registerEvent(event.topic);
849
933
  this.parseResolutionFromMessage(event.message, event.topic);
850
- if (event.topic === "Point Cloud") {
934
+ if (event.schemaName === "foxglove.PointCloud") {
851
935
  this.PoitCloudSyncFramework.addFrame(event.message);
852
936
  return;
853
937
  }
938
+ if (event.schemaName === "foxglove.PointClouds.Colored") {
939
+ event.schemaName = "foxglove.PointClouds";
940
+ }
854
941
  const messageSize = estimateObjectSize(event.message);
855
942
  event.sizeInBytes = messageSize;
856
943
  this.messageEvents.push(event);
@@ -85310,7 +85397,7 @@ function legacy(parser) {
85310
85397
  return new LanguageSupport(StreamLanguage.define(parser));
85311
85398
  }
85312
85399
  function sql$1(dialectName) {
85313
- return import('./index-CuGP4_2Y.js').then(m => m.sql({ dialect: m[dialectName] }));
85400
+ return import('./index-ttl4cqP0.js').then(m => m.sql({ dialect: m[dialectName] }));
85314
85401
  }
85315
85402
  /**
85316
85403
  An array of language descriptions for known language packages.
@@ -85321,7 +85408,7 @@ const languages = [
85321
85408
  name: "C",
85322
85409
  extensions: ["c", "h", "ino"],
85323
85410
  load() {
85324
- return import('./index-MWmhJgeW.js').then(m => m.cpp());
85411
+ return import('./index-i-2ofHyT.js').then(m => m.cpp());
85325
85412
  }
85326
85413
  }),
85327
85414
  /*@__PURE__*/LanguageDescription.of({
@@ -85329,7 +85416,7 @@ const languages = [
85329
85416
  alias: ["cpp"],
85330
85417
  extensions: ["cpp", "c++", "cc", "cxx", "hpp", "h++", "hh", "hxx"],
85331
85418
  load() {
85332
- return import('./index-MWmhJgeW.js').then(m => m.cpp());
85419
+ return import('./index-i-2ofHyT.js').then(m => m.cpp());
85333
85420
  }
85334
85421
  }),
85335
85422
  /*@__PURE__*/LanguageDescription.of({
@@ -85349,7 +85436,7 @@ const languages = [
85349
85436
  name: "Go",
85350
85437
  extensions: ["go"],
85351
85438
  load() {
85352
- return import('./index-CGWKf7M3.js').then(m => m.go());
85439
+ return import('./index-AHg_yzKN.js').then(m => m.go());
85353
85440
  }
85354
85441
  }),
85355
85442
  /*@__PURE__*/LanguageDescription.of({
@@ -85364,7 +85451,7 @@ const languages = [
85364
85451
  name: "Java",
85365
85452
  extensions: ["java"],
85366
85453
  load() {
85367
- return import('./index-DVYarByG.js').then(m => m.java());
85454
+ return import('./index-CqMDGXcF.js').then(m => m.java());
85368
85455
  }
85369
85456
  }),
85370
85457
  /*@__PURE__*/LanguageDescription.of({
@@ -85380,7 +85467,7 @@ const languages = [
85380
85467
  alias: ["json5"],
85381
85468
  extensions: ["json", "map"],
85382
85469
  load() {
85383
- return import('./index-BOgJlQZb.js').then(m => m.json());
85470
+ return import('./index-DMzCNF_e.js').then(m => m.json());
85384
85471
  }
85385
85472
  }),
85386
85473
  /*@__PURE__*/LanguageDescription.of({
@@ -85394,14 +85481,14 @@ const languages = [
85394
85481
  name: "LESS",
85395
85482
  extensions: ["less"],
85396
85483
  load() {
85397
- return import('./index-C9NOm_iz.js').then(m => m.less());
85484
+ return import('./index-Zijk5SvX.js').then(m => m.less());
85398
85485
  }
85399
85486
  }),
85400
85487
  /*@__PURE__*/LanguageDescription.of({
85401
85488
  name: "Liquid",
85402
85489
  extensions: ["liquid"],
85403
85490
  load() {
85404
- return import('./index-ByJ_IwVY.js').then(m => m.liquid());
85491
+ return import('./index-BQnK1LTP.js').then(m => m.liquid());
85405
85492
  }
85406
85493
  }),
85407
85494
  /*@__PURE__*/LanguageDescription.of({
@@ -85427,7 +85514,7 @@ const languages = [
85427
85514
  name: "PHP",
85428
85515
  extensions: ["php", "php3", "php4", "php5", "php7", "phtml"],
85429
85516
  load() {
85430
- return import('./index-Dd0nllcW.js').then(m => m.php());
85517
+ return import('./index-DLRgXO8y.js').then(m => m.php());
85431
85518
  }
85432
85519
  }),
85433
85520
  /*@__PURE__*/LanguageDescription.of({
@@ -85444,28 +85531,28 @@ const languages = [
85444
85531
  extensions: ["BUILD", "bzl", "py", "pyw"],
85445
85532
  filename: /^(BUCK|BUILD)$/,
85446
85533
  load() {
85447
- return import('./index-CH-hRWkC.js').then(m => m.python());
85534
+ return import('./index-BTdZSETz.js').then(m => m.python());
85448
85535
  }
85449
85536
  }),
85450
85537
  /*@__PURE__*/LanguageDescription.of({
85451
85538
  name: "Rust",
85452
85539
  extensions: ["rs"],
85453
85540
  load() {
85454
- return import('./index-CgUKu2u-.js').then(m => m.rust());
85541
+ return import('./index-CP4Zviq2.js').then(m => m.rust());
85455
85542
  }
85456
85543
  }),
85457
85544
  /*@__PURE__*/LanguageDescription.of({
85458
85545
  name: "Sass",
85459
85546
  extensions: ["sass"],
85460
85547
  load() {
85461
- return import('./index-vu5EOZMU.js').then(m => m.sass({ indented: true }));
85548
+ return import('./index-cLRC4uIT.js').then(m => m.sass({ indented: true }));
85462
85549
  }
85463
85550
  }),
85464
85551
  /*@__PURE__*/LanguageDescription.of({
85465
85552
  name: "SCSS",
85466
85553
  extensions: ["scss"],
85467
85554
  load() {
85468
- return import('./index-vu5EOZMU.js').then(m => m.sass());
85555
+ return import('./index-cLRC4uIT.js').then(m => m.sass());
85469
85556
  }
85470
85557
  }),
85471
85558
  /*@__PURE__*/LanguageDescription.of({
@@ -85496,7 +85583,7 @@ const languages = [
85496
85583
  name: "WebAssembly",
85497
85584
  extensions: ["wat", "wast"],
85498
85585
  load() {
85499
- return import('./index-B2CzfSrk.js').then(m => m.wast());
85586
+ return import('./index-DcFvTNvR.js').then(m => m.wast());
85500
85587
  }
85501
85588
  }),
85502
85589
  /*@__PURE__*/LanguageDescription.of({
@@ -85504,7 +85591,7 @@ const languages = [
85504
85591
  alias: ["rss", "wsdl", "xsd"],
85505
85592
  extensions: ["xml", "xsl", "xsd", "svg"],
85506
85593
  load() {
85507
- return import('./index-BD0s8blv.js').then(m => m.xml());
85594
+ return import('./index-CkN9fMlH.js').then(m => m.xml());
85508
85595
  }
85509
85596
  }),
85510
85597
  /*@__PURE__*/LanguageDescription.of({
@@ -85512,7 +85599,7 @@ const languages = [
85512
85599
  alias: ["yml"],
85513
85600
  extensions: ["yaml", "yml"],
85514
85601
  load() {
85515
- return import('./index-04igCfBa.js').then(m => m.yaml());
85602
+ return import('./index-B2-O30qH.js').then(m => m.yaml());
85516
85603
  }
85517
85604
  }),
85518
85605
  // Legacy modes ported from CodeMirror 5
@@ -86308,13 +86395,13 @@ const languages = [
86308
86395
  name: "Vue",
86309
86396
  extensions: ["vue"],
86310
86397
  load() {
86311
- return import('./index-DDF_vrPV.js').then(m => m.vue());
86398
+ return import('./index-DFHs4aUN.js').then(m => m.vue());
86312
86399
  }
86313
86400
  }),
86314
86401
  /*@__PURE__*/LanguageDescription.of({
86315
86402
  name: "Angular Template",
86316
86403
  load() {
86317
- return import('./index-Bf6kn2oZ.js').then(m => m.angular());
86404
+ return import('./index-BGrTBljs.js').then(m => m.angular());
86318
86405
  }
86319
86406
  })
86320
86407
  ];
@@ -162384,7 +162471,7 @@ function createRenderDelaySampler() {
162384
162471
  };
162385
162472
  }
162386
162473
 
162387
- const ImagePanelComponent = /*#__PURE__*/React__default.lazy(async () => await import('./index-Bap7OFFN.js'));
162474
+ const ImagePanelComponent = /*#__PURE__*/React__default.lazy(async () => await import('./index-NiMrvEhw.js'));
162388
162475
  const ImagePanelBody = ({
162389
162476
  topic,
162390
162477
  frameRenderedEvent
@@ -162453,7 +162540,7 @@ const ImagePanel = /*#__PURE__*/React__default.memo(function ImagePanel(props) {
162453
162540
  // License, v2.0. If a copy of the MPL was not distributed with this
162454
162541
  // file, You can obtain one at http://mozilla.org/MPL/2.0/
162455
162542
 
162456
- const ThreeDeeRenderComponent = /*#__PURE__*/React__default.lazy(async () => await import('./index-vePwOhtN.js'));
162543
+ const ThreeDeeRenderComponent = /*#__PURE__*/React__default.lazy(async () => await import('./index-Cia95HmM.js'));
162457
162544
  const PointCloudPanelBody = ({
162458
162545
  topic,
162459
162546
  frameRenderedEvent
@@ -162487,7 +162574,7 @@ const PointCloudPanelBody = ({
162487
162574
  phi: 89,
162488
162575
  target: [0, 0, 0],
162489
162576
  targetOffset: [0, 0, 0],
162490
- targetOrientation: [0, 0, 0, 1],
162577
+ targetOrientation: [0, 1, 1, 1],
162491
162578
  thetaOffset: 180,
162492
162579
  fovy: getFovy(),
162493
162580
  near: 5,
@@ -3,7 +3,7 @@ import React__default, { useReducer, useRef, useCallback, useLayoutEffect, Compo
3
3
  import ReactDOM__default from 'react-dom';
4
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$3, 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 } from './index-DWNJltiA.js';
6
+ import { g as generateUtilityClass, c as createAggregator, f as flatRest, b as baseSet, A as AnalyticsContext, P as PropTypes, E as ErrorDisplay, S as Stack$1, m as makeStyles$1, _ as _extends$1, W as WorkspaceContext, u as useAnalytics, a as AppEvent, L as LeftSidebarItemKeys, R as RightSidebarItemKeys, d as useTranslation, e as usePanelCatalog, h as EmptyState, i as isEmpty, j as PanelContext, k as PanelCatalogContext, l as usePanelStateStore, n as useDefaultPanelTitle, o as useWorkspaceStore, p as WorkspaceStoreSelectors, q as difference, r as usePanelContext, s as useMessagePipeline, v as v4, t as useHoverValue, w as useSetHoverValue, x as useClearHoverValue, y as useMessagePipelineGetter, z as usePanelSettingsTreeUpdate, B as PlayerCapabilities, C as assertNever, D as PlayerPresence, F as isEqual, G as isDesktopApp, H as createTheme, I as propTypesExports } from './index-CPTbtbj3.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';
@@ -16368,6 +16368,7 @@ const FRAME_TRANSFORMS_DATATYPES = new Set();
16368
16368
  addFoxgloveSchema(FRAME_TRANSFORMS_DATATYPES, "foxglove.FrameTransforms");
16369
16369
  const POINTCLOUD_DATATYPES = new Set();
16370
16370
  addFoxgloveSchema(POINTCLOUD_DATATYPES, "foxglove.PointCloud");
16371
+ addFoxgloveSchema(POINTCLOUD_DATATYPES, "foxglove.PointCloud.Colored");
16371
16372
  const LASERSCAN_DATATYPES = new Set();
16372
16373
  addFoxgloveSchema(LASERSCAN_DATATYPES, "foxglove.LaserScan");
16373
16374
  const RAW_IMAGE_DATATYPES = new Set();
@@ -60057,7 +60058,7 @@ class CameraStateSettings extends SceneExtension {
60057
60058
  this.#controls.touches.one = CameraControls.ACTION.TOUCH_SCREEN_PAN;
60058
60059
  this.#controls.infinityDolly = true;
60059
60060
  this.#perspectiveCamera.rotation.set(0, Math.PI, Math.PI);
60060
- this.#perspectiveCamera.up.set(0, -1, 0);
60061
+ this.#perspectiveCamera.up.set(0, 1, 0);
60061
60062
  this.#controls.update(0);
60062
60063
  const euler = new Euler().setFromQuaternion(this.#perspectiveCamera.quaternion, "ZYX");
60063
60064
  this.#perspectiveCamera.quaternion.setFromEuler(euler);
@@ -1,4 +1,4 @@
1
- import { a2 as ContextTracker, U as ExternalTokenizer, N as styleTags, O as tags, V as LRParser, Q as LRLanguage, J as indentNodeProp, M as foldNodeProp, ac as bracketMatchingHandle, T as LanguageSupport, a8 as EditorView, Z as syntaxTree, a9 as EditorSelection } from './index-DWNJltiA.js';
1
+ import { a2 as ContextTracker, U as ExternalTokenizer, N as styleTags, O as tags, V as LRParser, Q as LRLanguage, J as indentNodeProp, M as foldNodeProp, ac as bracketMatchingHandle, T as LanguageSupport, a8 as EditorView, Z as syntaxTree, a9 as EditorSelection } from './index-CPTbtbj3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { N as styleTags, O as tags, V as LRParser, Q as LRLanguage, J as indentNodeProp, K as continuedIndent, $ as flatIndent, a0 as delimitedIndent, M as foldNodeProp, a1 as foldInside, T as LanguageSupport } from './index-DWNJltiA.js';
1
+ import { N as styleTags, O as tags, V as LRParser, Q as LRLanguage, J as indentNodeProp, K as continuedIndent, $ as flatIndent, a0 as delimitedIndent, M as foldNodeProp, a1 as foldInside, T as LanguageSupport } from './index-CPTbtbj3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { N as styleTags, O as tags, Q as LRLanguage, T as LanguageSupport, V as LRParser, a3 as LocalTokenGroup, aa as html, ab as parseMixed, ad as javascriptLanguage } from './index-DWNJltiA.js';
1
+ import { N as styleTags, O as tags, Q as LRLanguage, T as LanguageSupport, V as LRParser, a3 as LocalTokenGroup, aa as html, ab as parseMixed, ad as javascriptLanguage } from './index-CPTbtbj3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { U as ExternalTokenizer, N as styleTags, O as tags, V as LRParser, Q as LRLanguage, J as indentNodeProp, K as continuedIndent, a0 as delimitedIndent, M as foldNodeProp, a1 as foldInside, aa as html, T as LanguageSupport, ab as parseMixed } from './index-DWNJltiA.js';
1
+ import { U as ExternalTokenizer, N as styleTags, O as tags, V as LRParser, Q as LRLanguage, J as indentNodeProp, K as continuedIndent, a0 as delimitedIndent, M as foldNodeProp, a1 as foldInside, aa as html, T as LanguageSupport, ab as parseMixed } from './index-CPTbtbj3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { N as styleTags, O as tags, V as LRParser, Q as LRLanguage, J as indentNodeProp, K as continuedIndent, M as foldNodeProp, a1 as foldInside, T as LanguageSupport } from './index-DWNJltiA.js';
1
+ import { N as styleTags, O as tags, V as LRParser, Q as LRLanguage, J as indentNodeProp, K as continuedIndent, M as foldNodeProp, a1 as foldInside, T as LanguageSupport } from './index-CPTbtbj3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { Q as LRLanguage, J as indentNodeProp, a0 as delimitedIndent, M as foldNodeProp, a1 as foldInside, N as styleTags, O as tags, T as LanguageSupport, V as LRParser } from './index-DWNJltiA.js';
1
+ import { Q as LRLanguage, J as indentNodeProp, a0 as delimitedIndent, M as foldNodeProp, a1 as foldInside, N as styleTags, O as tags, T as LanguageSupport, V as LRParser } from './index-CPTbtbj3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { ImagePanel } from './index-vePwOhtN.js';
1
+ import { ImagePanel } from './index-Cia95HmM.js';
2
2
  import 'react';
3
3
  import 'react-dom';
4
4
  import './tslib.es6-C73eoP_E.js';
@@ -7,7 +7,7 @@ import './_commonjsHelpers-E-ZsRS8r.js';
7
7
  import '@mui/material';
8
8
  import './isArrayLikeObject-Bytw9p-q.js';
9
9
  import 'zustand';
10
- import './index-DWNJltiA.js';
10
+ import './index-CPTbtbj3.js';
11
11
  import './comlink-DHMAu6X7.js';
12
12
  import './utils-Hzt3wxhG.js';
13
13
  import './FoxgloveServer-C39Uooyk.js';
@@ -1,4 +1,4 @@
1
- import { N as styleTags, O as tags, Q as LRLanguage, J as indentNodeProp, K as continuedIndent, M as foldNodeProp, a1 as foldInside, a7 as defineCSSCompletionSource, T as LanguageSupport, V as LRParser, U as ExternalTokenizer } from './index-DWNJltiA.js';
1
+ import { N as styleTags, O as tags, Q as LRLanguage, J as indentNodeProp, K as continuedIndent, M as foldNodeProp, a1 as foldInside, a7 as defineCSSCompletionSource, T as LanguageSupport, V as LRParser, U as ExternalTokenizer } from './index-CPTbtbj3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { U as ExternalTokenizer, a2 as ContextTracker, N as styleTags, O as tags, V as LRParser, Q as LRLanguage, M as foldNodeProp, a1 as foldInside, J as indentNodeProp, K as continuedIndent, a7 as defineCSSCompletionSource, T as LanguageSupport } from './index-DWNJltiA.js';
1
+ import { U as ExternalTokenizer, a2 as ContextTracker, N as styleTags, O as tags, V as LRParser, Q as LRLanguage, M as foldNodeProp, a1 as foldInside, J as indentNodeProp, K as continuedIndent, a7 as defineCSSCompletionSource, T as LanguageSupport } from './index-CPTbtbj3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { U as ExternalTokenizer, N as styleTags, O as tags, V as LRParser, Q as LRLanguage, J as indentNodeProp, K as continuedIndent, $ as flatIndent, a0 as delimitedIndent, M as foldNodeProp, a1 as foldInside, T as LanguageSupport } from './index-DWNJltiA.js';
1
+ import { U as ExternalTokenizer, N as styleTags, O as tags, V as LRParser, Q as LRLanguage, J as indentNodeProp, K as continuedIndent, $ as flatIndent, a0 as delimitedIndent, M as foldNodeProp, a1 as foldInside, T as LanguageSupport } from './index-CPTbtbj3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
@@ -1,4 +1,4 @@
1
- import { J as indentNodeProp, K as continuedIndent, M as foldNodeProp, N as styleTags, O as tags, Q as LRLanguage, T as LanguageSupport, U as ExternalTokenizer, V as LRParser, X as ifNotIn, Y as completeFromList, Z as syntaxTree } from './index-DWNJltiA.js';
1
+ import { J as indentNodeProp, K as continuedIndent, M as foldNodeProp, N as styleTags, O as tags, Q as LRLanguage, T as LanguageSupport, U as ExternalTokenizer, V as LRParser, X as ifNotIn, Y as completeFromList, Z as syntaxTree } from './index-CPTbtbj3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { ah as ImagePanel, ag as PanelLayout, ai as PointCloudPanel, ae as VisualizerConnection, af as VisualizerContext } from './index-DWNJltiA.js';
1
+ export { ah as ImagePanel, ag as PanelLayout, ai as PointCloudPanel, ae as VisualizerConnection, af as VisualizerContext } from './index-CPTbtbj3.js';
2
2
  import './tslib.es6-C73eoP_E.js';
3
3
  import 'react';
4
4
  import 'react-mosaic-component';