@luxonis/visualizer-protobuf 2.12.0 → 2.14.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 (81) hide show
  1. package/dist/WorkerImageDecoder.worker-DCoSYoLL.js +31 -0
  2. package/dist/{decodeImage-BBqnjJjE.js → decodeImage-NYPkamnK.js} +29 -363
  3. package/dist/{index-Bm-sfjxA.js → index-BHzFgL5N.js} +1 -1
  4. package/dist/{index-DBIBZoxL.js → index-BJofTpil.js} +1 -1
  5. package/dist/{index-BQ-DVAKf.js → index-BPWE58mB.js} +85 -56
  6. package/dist/{index-DlZBtd34.js → index-BTNGGXoa.js} +1 -1
  7. package/dist/{index-BPvLkg91.js → index-BwoyZPjj.js} +1 -1
  8. package/dist/{index-Wtqlsb8j.js → index-C1eH0RCy.js} +1 -1
  9. package/dist/{index-CnJXVxDI.js → index-CIfIw1LQ.js} +1 -1
  10. package/dist/{index-DeuAC1JS.js → index-Cq7so9Q9.js} +1 -1
  11. package/dist/{index-qgG8SIsl.js → index-D7jNrXVP.js} +1 -1
  12. package/dist/{index-Daz5hiMP.js → index-D8jKQuGu.js} +388 -73
  13. package/dist/{index-CzaJSWor.js → index-D9d5kqGf.js} +1 -1
  14. package/dist/{index-BND59L-_.js → index-DAXpEznJ.js} +3 -3
  15. package/dist/{index-DXqNhUgR.js → index-DCh-Eobo.js} +1 -1
  16. package/dist/{index-DZWFfAzL.js → index-DI5QHg2x.js} +1 -1
  17. package/dist/{index-WQ5HqEqM.js → index-DM9oCkXH.js} +1 -1
  18. package/dist/{index-DujAeBia.js → index-DY6zQP_F.js} +1 -1
  19. package/dist/{index-IH42B4Mg.js → index-Di_-JfGf.js} +1 -1
  20. package/dist/{index-BNgQTecN.js → index-Zivk6fee.js} +1 -1
  21. package/dist/{index-DQBNcZG9.js → index-d8vRrHr4.js} +1 -1
  22. package/dist/index.js +1 -1
  23. package/dist/lib/src/components/PanelToolbar.d.ts.map +1 -1
  24. package/dist/lib/src/components/PanelToolbar.js +1 -1
  25. package/dist/lib/src/components/PanelToolbar.js.map +1 -1
  26. package/dist/lib/src/connection/foxglove-connection.d.ts +1 -0
  27. package/dist/lib/src/connection/foxglove-connection.d.ts.map +1 -1
  28. package/dist/lib/src/connection/foxglove-connection.js +15 -0
  29. package/dist/lib/src/connection/foxglove-connection.js.map +1 -1
  30. package/dist/lib/src/connection/webrtc/bridge.d.ts +1 -1
  31. package/dist/lib/src/connection/webrtc/bridge.d.ts.map +1 -1
  32. package/dist/lib/src/connection/webrtc/bridge.js +1 -1
  33. package/dist/lib/src/connection/webrtc/bridge.js.map +1 -1
  34. package/dist/lib/src/connection/webrtc/comms-proxy.d.ts.map +1 -1
  35. package/dist/lib/src/connection/webrtc/comms-proxy.js +4 -1
  36. package/dist/lib/src/connection/webrtc/comms-proxy.js.map +1 -1
  37. package/dist/lib/src/messaging/deserialization/pointcloud/utils.d.ts +19 -0
  38. package/dist/lib/src/messaging/deserialization/pointcloud/utils.d.ts.map +1 -0
  39. package/dist/lib/src/messaging/deserialization/pointcloud/utils.js +97 -0
  40. package/dist/lib/src/messaging/deserialization/pointcloud/utils.js.map +1 -0
  41. package/dist/lib/src/messaging/deserialization/video/depth.d.ts +6 -1
  42. package/dist/lib/src/messaging/deserialization/video/depth.d.ts.map +1 -1
  43. package/dist/lib/src/messaging/deserialization/video/depth.js +185 -7
  44. package/dist/lib/src/messaging/deserialization/video/depth.js.map +1 -1
  45. package/dist/lib/src/messaging/deserialization.js +1 -1
  46. package/dist/lib/src/messaging/deserialization.js.map +1 -1
  47. package/dist/lib/src/messaging/message-handler.d.ts.map +1 -1
  48. package/dist/lib/src/messaging/message-handler.js.map +1 -1
  49. package/dist/lib/src/panels/PointCloudPanel.js +2 -2
  50. package/dist/lib/src/panels/PointCloudPanel.js.map +1 -1
  51. package/dist/lib/src/protobuf.generated/IMUData.d.ts +122 -0
  52. package/dist/lib/src/protobuf.generated/IMUData.d.ts.map +1 -0
  53. package/dist/lib/src/protobuf.generated/IMUData.js +691 -0
  54. package/dist/lib/src/protobuf.generated/IMUData.js.map +1 -0
  55. package/dist/packages/studio-base/src/panels/ThreeDeeRender/Renderer.d.ts +1 -1
  56. package/dist/packages/studio-base/src/panels/ThreeDeeRender/Renderer.d.ts.map +1 -1
  57. package/dist/packages/studio-base/src/panels/ThreeDeeRender/Renderer.js +6 -7
  58. package/dist/packages/studio-base/src/panels/ThreeDeeRender/Renderer.js.map +1 -1
  59. package/dist/packages/studio-base/src/panels/ThreeDeeRender/ThreeDeeRender.d.ts.map +1 -1
  60. package/dist/packages/studio-base/src/panels/ThreeDeeRender/ThreeDeeRender.js +2 -3
  61. package/dist/packages/studio-base/src/panels/ThreeDeeRender/ThreeDeeRender.js.map +1 -1
  62. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/ImageMode/ImageMode.d.ts.map +1 -1
  63. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/ImageMode/ImageMode.js.map +1 -1
  64. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/Images/ImageRenderable.d.ts +1 -1
  65. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/Images/ImageRenderable.d.ts.map +1 -1
  66. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/Images/ImageRenderable.js +8 -3
  67. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/Images/ImageRenderable.js.map +1 -1
  68. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/Images/WorkerImageDecoder.d.ts +10 -2
  69. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/Images/WorkerImageDecoder.d.ts.map +1 -1
  70. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/Images/WorkerImageDecoder.js +69 -10
  71. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/Images/WorkerImageDecoder.js.map +1 -1
  72. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/Images/decodeImage.d.ts +1 -1
  73. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/Images/decodeImage.d.ts.map +1 -1
  74. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/Images/decodeImage.js +29 -21
  75. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/Images/decodeImage.js.map +1 -1
  76. package/package.json +4 -1
  77. package/dist/WorkerImageDecoder.worker-DjK2q36W.js +0 -18
  78. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/Images/WorkerImageDecoder.worker.d.ts +0 -9
  79. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/Images/WorkerImageDecoder.worker.d.ts.map +0 -1
  80. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/Images/WorkerImageDecoder.worker.js +0 -15
  81. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/Images/WorkerImageDecoder.worker.js.map +0 -1
@@ -1048,6 +1048,69 @@ function estimateObjectSize(obj) {
1048
1048
  return SMALL_INTEGER_SIZE;
1049
1049
  }
1050
1050
 
1051
+ // This Source Code Form is subject to the terms of the Mozilla Public
1052
+ // License, v2.0. If a copy of the MPL was not distributed with this
1053
+ // file, You can obtain one at http://mozilla.org/MPL/2.0/
1054
+ /// <reference types="@webgpu/types" />
1055
+
1056
+ function uint8ArrayToUint16Array(uint8Array) {
1057
+ if (uint8Array.length % 2 !== 0) {
1058
+ throw new Error("Uint8Array length must be a multiple of 2 for conversion to Uint16Array");
1059
+ }
1060
+ const uint16Array = new Uint16Array(uint8Array.length / 2);
1061
+ for (let i = 0; i < uint16Array.length; i++) {
1062
+ const lowByte = uint8Array[i * 2];
1063
+ const highByte = uint8Array[i * 2 + 1];
1064
+
1065
+ // eslint-disable-next-line @foxglove/strict-equality
1066
+ if (highByte === undefined || lowByte === undefined) {
1067
+ throw new Error("Invalid data in uint8Array");
1068
+ }
1069
+ uint16Array[i] = highByte << 8 | lowByte;
1070
+ }
1071
+ return uint16Array;
1072
+ }
1073
+
1074
+ /* H264 (i420) to RGBA */
1075
+ function i420ToRgbaToPointcloud(i420Data, i420Width, i420Height, depthWidth, depthHeight, data) {
1076
+ const frameSize = i420Width * i420Height;
1077
+ const uOffset = frameSize;
1078
+ const vOffset = frameSize + frameSize / 4;
1079
+ const pointCount = data.byteLength / 16;
1080
+ const buffer = new ArrayBuffer(data.byteLength);
1081
+ const view = new DataView(buffer);
1082
+ const dataView = new DataView(data.buffer);
1083
+ for (let i = 0; i < pointCount; i++) {
1084
+ const depthX = i % depthWidth;
1085
+ const depthY = Math.floor(i / depthWidth);
1086
+ const i420X = Math.round(depthX * (i420Width / depthWidth));
1087
+ const i420Y = Math.round(depthY * (i420Height / depthHeight));
1088
+ if (i420X >= i420Width || i420Y >= i420Height) {
1089
+ continue;
1090
+ }
1091
+ const index = i420Y * i420Width + i420X;
1092
+ const uvIndex = Math.floor(i420Y / 2) * (i420Width / 2) + Math.floor(i420X / 2);
1093
+ const Y = i420Data[index] ?? 0;
1094
+ const U = (i420Data[uOffset + uvIndex] ?? 128) - 128;
1095
+ const V = (i420Data[vOffset + uvIndex] ?? 128) - 128;
1096
+ let R = Y + 1.402 * V;
1097
+ let G = Y - 0.344136 * U - 0.714136 * V;
1098
+ let B = Y + 1.772 * U;
1099
+ R = Math.min(255, Math.max(0, R));
1100
+ G = Math.min(255, Math.max(0, G));
1101
+ B = Math.min(255, Math.max(0, B));
1102
+ const offset = i * 16;
1103
+ view.setFloat32(offset, dataView.getFloat32(offset, true), true); // x
1104
+ view.setFloat32(offset + 4, dataView.getFloat32(offset + 4, true), true); // y
1105
+ view.setFloat32(offset + 8, dataView.getFloat32(offset + 8, true), true); // z
1106
+ view.setUint8(offset + 12, R); // Red
1107
+ view.setUint8(offset + 13, G); // Green
1108
+ view.setUint8(offset + 14, B); // Blue
1109
+ view.setUint8(offset + 15, 255); // Alpha (fully opaque)
1110
+ }
1111
+ return new Uint8Array(buffer);
1112
+ }
1113
+
1051
1114
  var typescript$1 = {};
1052
1115
 
1053
1116
  /******************************************************************************
@@ -11357,34 +11420,270 @@ function deserializeColorFrame({
11357
11420
  // This Source Code Form is subject to the terms of the Mozilla Public
11358
11421
  // License, v2.0. If a copy of the MPL was not distributed with this
11359
11422
  // file, You can obtain one at http://mozilla.org/MPL/2.0/
11360
-
11361
- function deserializeDepthFrame({
11423
+ /* eslint-disable no-underscore-dangle */
11424
+
11425
+ const shader = `
11426
+ @group(0) @binding(0) var<storage, read> depthBuffer: array<u32>; // Uint16 stored as u32
11427
+ @group(0) @binding(1) var<storage, read> intrinsicsBuffer: array<f32>;
11428
+ @group(0) @binding(2) var<storage, read_write> xyzColorBuffer: array<u32>; // Stores XYZ + RGBA
11429
+
11430
+ @compute @workgroup_size(256, 1, 1)
11431
+ fn main(@builtin(global_invocation_id) global_id: vec3<u32>) {
11432
+ let i = global_id.x;
11433
+ let fx = intrinsicsBuffer[0];
11434
+ let fy = intrinsicsBuffer[1];
11435
+ let cx = intrinsicsBuffer[2];
11436
+ let cy = intrinsicsBuffer[3];
11437
+ let scale = intrinsicsBuffer[4];
11438
+ let width = intrinsicsBuffer[5];
11439
+ let height = intrinsicsBuffer[6];
11440
+
11441
+ if (i >= u32(width * height)) { return; }
11442
+
11443
+ let u = i % u32(width);
11444
+ let v = i / u32(width);
11445
+
11446
+ // Convert uint16 depth value to float (stored as u32, so we bitwise mask)
11447
+ let rawDepth = depthBuffer[i] & 0xFFFFu;
11448
+ let z = f32(rawDepth) * scale;
11449
+
11450
+ let x = (cx - f32(u)) * z / fx;
11451
+ let y = (cy - f32(v)) * z / fy;
11452
+
11453
+ let base = i * 4u; // 4 values per point (X, Y, Z, Color)
11454
+
11455
+ // Convert floats to u32 representation for storage
11456
+ xyzColorBuffer[base] = bitcast<u32>(x);
11457
+ xyzColorBuffer[base + 1u] = bitcast<u32>(y);
11458
+ xyzColorBuffer[base + 2u] = bitcast<u32>(z);
11459
+
11460
+ // Example: RGB set based on depth, Alpha is fixed at 255
11461
+ let r = u32(clamp(z * 255.0, 0.0, 255.0));
11462
+ let g = u32(clamp(y * 255.0, 0.0, 255.0));
11463
+ let b = u32(clamp(x * 255.0, 0.0, 255.0));
11464
+ xyzColorBuffer[base + 3u] = (r & 0xFFu) | ((g & 0xFFu) << 8) | ((b & 0xFFu) << 16) | (255u << 24);
11465
+ }
11466
+ `;
11467
+ async function depthToPointcloudGPU(depthArray, width, height, fx, fy, cx, cy) {
11468
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
11469
+ if (!navigator.gpu) {
11470
+ console.warn("WebGPU not supported.");
11471
+ return depthToPointCloudBuffer(depthArray, width, height, fx, fy, cx, cy);
11472
+ }
11473
+ const adapter = await navigator.gpu.requestAdapter();
11474
+ if (!adapter) {
11475
+ console.warn("Couldn't request WebGPU adapter.");
11476
+ return depthToPointCloudBuffer(depthArray, width, height, fx, fy, cx, cy);
11477
+ }
11478
+ const device = await adapter.requestDevice();
11479
+ const queue = device.queue;
11480
+ const scale = 1.0;
11481
+ const numPixels = width * height;
11482
+ const outputSize = numPixels * 16;
11483
+ const depthData32 = new Uint32Array(depthArray);
11484
+ const intrinsics = new Float32Array([fx, fy, cx, cy, scale, width, height]);
11485
+ const depthBuffer = device.createBuffer({
11486
+ size: depthData32.byteLength,
11487
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST
11488
+ });
11489
+ const intrinsicsBuffer = device.createBuffer({
11490
+ size: intrinsics.byteLength,
11491
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST
11492
+ });
11493
+ const xyzColorBuffer = device.createBuffer({
11494
+ size: outputSize,
11495
+ usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC
11496
+ });
11497
+ queue.writeBuffer(depthBuffer, 0, depthData32);
11498
+ queue.writeBuffer(intrinsicsBuffer, 0, intrinsics);
11499
+ const bindGroupLayout = device.createBindGroupLayout({
11500
+ entries: [{
11501
+ binding: 0,
11502
+ visibility: GPUShaderStage.COMPUTE,
11503
+ buffer: {
11504
+ type: "read-only-storage"
11505
+ }
11506
+ }, {
11507
+ binding: 1,
11508
+ visibility: GPUShaderStage.COMPUTE,
11509
+ buffer: {
11510
+ type: "read-only-storage"
11511
+ }
11512
+ }, {
11513
+ binding: 2,
11514
+ visibility: GPUShaderStage.COMPUTE,
11515
+ buffer: {
11516
+ type: "storage"
11517
+ }
11518
+ }]
11519
+ });
11520
+ const bindGroup = device.createBindGroup({
11521
+ layout: bindGroupLayout,
11522
+ entries: [{
11523
+ binding: 0,
11524
+ resource: {
11525
+ buffer: depthBuffer
11526
+ }
11527
+ }, {
11528
+ binding: 1,
11529
+ resource: {
11530
+ buffer: intrinsicsBuffer
11531
+ }
11532
+ }, {
11533
+ binding: 2,
11534
+ resource: {
11535
+ buffer: xyzColorBuffer
11536
+ }
11537
+ }]
11538
+ });
11539
+ const shaderModule = device.createShaderModule({
11540
+ code: shader
11541
+ });
11542
+ const pipeline = device.createComputePipeline({
11543
+ layout: device.createPipelineLayout({
11544
+ bindGroupLayouts: [bindGroupLayout]
11545
+ }),
11546
+ compute: {
11547
+ module: shaderModule,
11548
+ entryPoint: "main"
11549
+ }
11550
+ });
11551
+ const commandEncoder = device.createCommandEncoder();
11552
+ const passEncoder = commandEncoder.beginComputePass();
11553
+ passEncoder.setPipeline(pipeline);
11554
+ passEncoder.setBindGroup(0, bindGroup);
11555
+ passEncoder.dispatchWorkgroups(Math.ceil(numPixels / 256));
11556
+ passEncoder.end();
11557
+ device.queue.submit([commandEncoder.finish()]);
11558
+ const outputBuffer = device.createBuffer({
11559
+ size: xyzColorBuffer.size,
11560
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
11561
+ });
11562
+ const copyEncoder = device.createCommandEncoder();
11563
+ copyEncoder.copyBufferToBuffer(xyzColorBuffer, 0, outputBuffer, 0, xyzColorBuffer.size);
11564
+ device.queue.submit([copyEncoder.finish()]);
11565
+
11566
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
11567
+ await outputBuffer.mapAsync(GPUMapMode.READ);
11568
+ const mappedRange = outputBuffer.getMappedRange();
11569
+ const result = new Uint8Array(mappedRange.byteLength);
11570
+ result.set(new Uint8Array(mappedRange));
11571
+ outputBuffer.unmap();
11572
+ return result;
11573
+ }
11574
+ function depthToPointCloudBuffer(uint16Array, width, height, fx, fy, cx, cy) {
11575
+ const depthData = Array.from({
11576
+ length: height
11577
+ }, () => new Array(width));
11578
+ for (let v = 0; v < height; v++) {
11579
+ depthData[v] = depthData[v] ?? [];
11580
+ for (let u = 0; u < width; u++) {
11581
+ const d = uint16Array[v * width + u] ?? -1;
11582
+ depthData[v][u] = d > 0 ? d : -1;
11583
+ }
11584
+ }
11585
+ const points = [];
11586
+ // Accumulate the x, y, z values for each pixel.
11587
+ for (let v = 0; v < height; v++) {
11588
+ const row = depthData[v];
11589
+ if (!row) {
11590
+ continue;
11591
+ }
11592
+ for (let u = 0; u < width; u++) {
11593
+ const z = row[u] ?? 0;
11594
+ const x = (cx - u) * z / fx;
11595
+ const y = (cy - v) * z / fy;
11596
+ points.push(x, y, z);
11597
+ }
11598
+ }
11599
+ const pointCount = points.length / 3;
11600
+ const buffer = new ArrayBuffer(pointCount * 16);
11601
+ const view = new DataView(buffer);
11602
+ for (let i = 0; i < pointCount; i++) {
11603
+ const offset = i * 16;
11604
+ view.setFloat32(offset, points[i * 3] ?? 0, true); //X
11605
+ view.setFloat32(offset + 4, points[i * 3 + 1] ?? 0, true); //Y
11606
+ view.setFloat32(offset + 8, points[i * 3 + 2] ?? 0, true); //Z
11607
+ view.setUint8(offset + 12, 0); // R
11608
+ view.setUint8(offset + 13, 0); // G
11609
+ view.setUint8(offset + 14, 0); // B
11610
+ view.setUint8(offset + 15, 255); // A
11611
+ }
11612
+ return new Uint8Array(buffer);
11613
+ }
11614
+ async function deserializeDepthFrame({
11362
11615
  topic,
11363
11616
  message,
11364
11617
  callback
11365
11618
  }) {
11366
11619
  const {
11367
11620
  receiveTime,
11368
- encoding,
11369
- step,
11370
11621
  width,
11371
11622
  height
11372
11623
  } = parseMessage(message);
11624
+ const neuralCameraIntrinsics = JSON.parse(localStorage.getItem("neuralCameraIntrinsics") ?? "{}");
11625
+ const uint16Array = uint8ArrayToUint16Array(message.data);
11626
+ const fx = neuralCameraIntrinsics.right.focalLenght.x;
11627
+ const fy = neuralCameraIntrinsics.right.focalLenght.y;
11628
+ const cx = neuralCameraIntrinsics.right.principalPoint.x;
11629
+ const cy = neuralCameraIntrinsics.right.principalPoint.y;
11630
+ const pointCloudBufferGPU = depthToPointcloudGPU(uint16Array, width, height, fx, fy, cx, cy);
11373
11631
  const foxgloveMessage = {
11374
11632
  timestamp: receiveTime,
11375
- frame_id: `depth-${topic}-frame`,
11633
+ frame_id: `pointcloud-${topic}-frame`,
11634
+ point_stride: 16,
11635
+ pose: {
11636
+ position: {
11637
+ x: 0,
11638
+ y: 0,
11639
+ z: 0
11640
+ },
11641
+ orientation: {
11642
+ x: 0,
11643
+ y: 0,
11644
+ z: 1,
11645
+ w: 0
11646
+ }
11647
+ },
11376
11648
  width,
11377
11649
  height,
11378
- encoding,
11379
- step: width * step,
11380
- data: message.data
11650
+ fields: [{
11651
+ name: "x",
11652
+ offset: 0,
11653
+ type: typescript$1.NumericType.FLOAT32
11654
+ }, {
11655
+ name: "y",
11656
+ offset: 4,
11657
+ type: typescript$1.NumericType.FLOAT32
11658
+ }, {
11659
+ name: "z",
11660
+ offset: 8,
11661
+ type: typescript$1.NumericType.FLOAT32
11662
+ }, {
11663
+ name: "red",
11664
+ offset: 12,
11665
+ type: typescript$1.NumericType.UINT8
11666
+ }, {
11667
+ name: "green",
11668
+ offset: 13,
11669
+ type: typescript$1.NumericType.UINT8
11670
+ }, {
11671
+ name: "blue",
11672
+ offset: 14,
11673
+ type: typescript$1.NumericType.UINT8
11674
+ }, {
11675
+ name: "alpha",
11676
+ offset: 15,
11677
+ type: typescript$1.NumericType.UINT8
11678
+ }],
11679
+ data: await pointCloudBufferGPU
11381
11680
  };
11382
11681
  callback({
11383
11682
  topic,
11384
11683
  receiveTime,
11385
11684
  message: foxgloveMessage,
11386
11685
  sizeInBytes: estimateObjectSize(foxgloveMessage),
11387
- schemaName: "foxglove.RawImage"
11686
+ schemaName: "foxglove.PointCloud"
11388
11687
  });
11389
11688
  }
11390
11689
 
@@ -11599,7 +11898,7 @@ async function deserializeDepthAiMessage(args) {
11599
11898
  }
11600
11899
  case Type$1.RAW16:
11601
11900
  {
11602
- deserializeDepthFrame({
11901
+ await deserializeDepthFrame({
11603
11902
  topic,
11604
11903
  message,
11605
11904
  callback
@@ -11788,6 +12087,18 @@ class FoxgloveConnection {
11788
12087
  }
11789
12088
  handleParsedMessage(event) {
11790
12089
  this.decodeMetrics.registerEvent(event.topic);
12090
+ if (event.topic === "H.264 Stream") {
12091
+ this.lastEncodedFrame = event;
12092
+ }
12093
+ if (event.topic === "Point Cloud") {
12094
+ if (!this.lastEncodedFrame) {
12095
+ console.warn("didnt find H.264 Stream");
12096
+ } else {
12097
+ // @ts-expect-error - ITS unknow
12098
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
12099
+ event.message.data = i420ToRgbaToPointcloud(this.lastEncodedFrame.message.data, this.lastEncodedFrame.message.width, this.lastEncodedFrame.message.height, event.message.width, event.message.height, event.message.data);
12100
+ }
12101
+ }
11791
12102
  const messageSize = estimateObjectSize(event.message);
11792
12103
  event.sizeInBytes = messageSize;
11793
12104
  this.messageEvents.push(event);
@@ -12329,44 +12640,6 @@ class WebRtcClient {
12329
12640
  on = this.events.on.bind(this.events);
12330
12641
  }
12331
12642
 
12332
- // This Source Code Form is subject to the terms of the Mozilla Public
12333
- // License, v2.0. If a copy of the MPL was not distributed with this
12334
- // file, You can obtain one at http://mozilla.org/MPL/2.0/
12335
-
12336
- class ArtificialWorker extends EventTarget {
12337
- #selfTarget = new EventTarget();
12338
-
12339
- // Post message from main to worker
12340
- // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
12341
- postMessage(data, _transferable) {
12342
- const event = new MessageEvent('message', {
12343
- data
12344
- });
12345
- this.#selfTarget.dispatchEvent(event);
12346
- }
12347
-
12348
- // Listen for worker-to-main messages
12349
- // @ts-expect-error Make it typed
12350
- addEventListener(type, callback) {
12351
- super.addEventListener(type, callback);
12352
- }
12353
-
12354
- // Post message from worker to main
12355
- // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
12356
- postMessageToMain(data, _transferable) {
12357
- const event = new MessageEvent('message', {
12358
- data
12359
- });
12360
- super.dispatchEvent(event);
12361
- }
12362
-
12363
- // Listen for main-to-worker messages
12364
- // @ts-expect-error Make it typed
12365
- addEventListenerFromMain(type, callback) {
12366
- this.#selfTarget.addEventListener(type, callback);
12367
- }
12368
- }
12369
-
12370
12643
  var safeStableStringify = {exports: {}};
12371
12644
 
12372
12645
  (function (module, exports) {
@@ -29852,6 +30125,10 @@ const uuidv7 = () => uuidv7obj().toString();
29852
30125
  /** Generates a UUIDv7 object. */
29853
30126
  const uuidv7obj = () => (defaultGenerator$1 || (defaultGenerator$1 = new V7Generator())).generate();
29854
30127
 
30128
+ // This Source Code Form is subject to the terms of the Mozilla Public
30129
+ // License, v2.0. If a copy of the MPL was not distributed with this
30130
+ // file, You can obtain one at http://mozilla.org/MPL/2.0/
30131
+
29855
30132
  const GET_APP_CONNECTION = () => ({
29856
30133
  GetAppConnection: {}
29857
30134
  });
@@ -29905,7 +30182,7 @@ class WebRtcCommsProxy {
29905
30182
  }
29906
30183
  }
29907
30184
  #isAppConnectionResponse(message) {
29908
- return message.data.Ok?.GetAppConnection !== undefined;
30185
+ return message.data.Ok.GetAppConnection !== undefined;
29909
30186
  }
29910
30187
  #startRefreshInterval() {
29911
30188
  this.#refreshIntervalId = setInterval(() => {
@@ -29918,6 +30195,44 @@ class WebRtcCommsProxy {
29918
30195
  // License, v2.0. If a copy of the MPL was not distributed with this
29919
30196
  // file, You can obtain one at http://mozilla.org/MPL/2.0/
29920
30197
 
30198
+ class ArtificialWorker extends EventTarget {
30199
+ #selfTarget = new EventTarget();
30200
+
30201
+ // Post message from main to worker
30202
+ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
30203
+ postMessage(data, _transferable) {
30204
+ const event = new MessageEvent('message', {
30205
+ data
30206
+ });
30207
+ this.#selfTarget.dispatchEvent(event);
30208
+ }
30209
+
30210
+ // Listen for worker-to-main messages
30211
+ // @ts-expect-error Make it typed
30212
+ addEventListener(type, callback) {
30213
+ super.addEventListener(type, callback);
30214
+ }
30215
+
30216
+ // Post message from worker to main
30217
+ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
30218
+ postMessageToMain(data, _transferable) {
30219
+ const event = new MessageEvent('message', {
30220
+ data
30221
+ });
30222
+ super.dispatchEvent(event);
30223
+ }
30224
+
30225
+ // Listen for main-to-worker messages
30226
+ // @ts-expect-error Make it typed
30227
+ addEventListenerFromMain(type, callback) {
30228
+ this.#selfTarget.addEventListener(type, callback);
30229
+ }
30230
+ }
30231
+
30232
+ // This Source Code Form is subject to the terms of the Mozilla Public
30233
+ // License, v2.0. If a copy of the MPL was not distributed with this
30234
+ // file, You can obtain one at http://mozilla.org/MPL/2.0/
30235
+
29921
30236
  const MESSAGE_CHANNEL_NAME = "message";
29922
30237
  const SYSTEM_CHANNEL_NAME = "system";
29923
30238
  const COMMS_CHANNEL_NAME = "comms";
@@ -90253,7 +90568,7 @@ function legacy(parser) {
90253
90568
  return new LanguageSupport(StreamLanguage.define(parser));
90254
90569
  }
90255
90570
  function sql$1(dialectName) {
90256
- return import('./index-DeuAC1JS.js').then(m => m.sql({ dialect: m[dialectName] }));
90571
+ return import('./index-Cq7so9Q9.js').then(m => m.sql({ dialect: m[dialectName] }));
90257
90572
  }
90258
90573
  /**
90259
90574
  An array of language descriptions for known language packages.
@@ -90264,7 +90579,7 @@ const languages = [
90264
90579
  name: "C",
90265
90580
  extensions: ["c", "h", "ino"],
90266
90581
  load() {
90267
- return import('./index-DZWFfAzL.js').then(m => m.cpp());
90582
+ return import('./index-DI5QHg2x.js').then(m => m.cpp());
90268
90583
  }
90269
90584
  }),
90270
90585
  /*@__PURE__*/LanguageDescription.of({
@@ -90272,7 +90587,7 @@ const languages = [
90272
90587
  alias: ["cpp"],
90273
90588
  extensions: ["cpp", "c++", "cc", "cxx", "hpp", "h++", "hh", "hxx"],
90274
90589
  load() {
90275
- return import('./index-DZWFfAzL.js').then(m => m.cpp());
90590
+ return import('./index-DI5QHg2x.js').then(m => m.cpp());
90276
90591
  }
90277
90592
  }),
90278
90593
  /*@__PURE__*/LanguageDescription.of({
@@ -90292,7 +90607,7 @@ const languages = [
90292
90607
  name: "Go",
90293
90608
  extensions: ["go"],
90294
90609
  load() {
90295
- return import('./index-WQ5HqEqM.js').then(m => m.go());
90610
+ return import('./index-DM9oCkXH.js').then(m => m.go());
90296
90611
  }
90297
90612
  }),
90298
90613
  /*@__PURE__*/LanguageDescription.of({
@@ -90307,7 +90622,7 @@ const languages = [
90307
90622
  name: "Java",
90308
90623
  extensions: ["java"],
90309
90624
  load() {
90310
- return import('./index-CnJXVxDI.js').then(m => m.java());
90625
+ return import('./index-CIfIw1LQ.js').then(m => m.java());
90311
90626
  }
90312
90627
  }),
90313
90628
  /*@__PURE__*/LanguageDescription.of({
@@ -90323,7 +90638,7 @@ const languages = [
90323
90638
  alias: ["json5"],
90324
90639
  extensions: ["json", "map"],
90325
90640
  load() {
90326
- return import('./index-qgG8SIsl.js').then(m => m.json());
90641
+ return import('./index-D7jNrXVP.js').then(m => m.json());
90327
90642
  }
90328
90643
  }),
90329
90644
  /*@__PURE__*/LanguageDescription.of({
@@ -90337,14 +90652,14 @@ const languages = [
90337
90652
  name: "LESS",
90338
90653
  extensions: ["less"],
90339
90654
  load() {
90340
- return import('./index-DQBNcZG9.js').then(m => m.less());
90655
+ return import('./index-d8vRrHr4.js').then(m => m.less());
90341
90656
  }
90342
90657
  }),
90343
90658
  /*@__PURE__*/LanguageDescription.of({
90344
90659
  name: "Liquid",
90345
90660
  extensions: ["liquid"],
90346
90661
  load() {
90347
- return import('./index-DXqNhUgR.js').then(m => m.liquid());
90662
+ return import('./index-DCh-Eobo.js').then(m => m.liquid());
90348
90663
  }
90349
90664
  }),
90350
90665
  /*@__PURE__*/LanguageDescription.of({
@@ -90370,7 +90685,7 @@ const languages = [
90370
90685
  name: "PHP",
90371
90686
  extensions: ["php", "php3", "php4", "php5", "php7", "phtml"],
90372
90687
  load() {
90373
- return import('./index-DBIBZoxL.js').then(m => m.php());
90688
+ return import('./index-BJofTpil.js').then(m => m.php());
90374
90689
  }
90375
90690
  }),
90376
90691
  /*@__PURE__*/LanguageDescription.of({
@@ -90387,28 +90702,28 @@ const languages = [
90387
90702
  extensions: ["BUILD", "bzl", "py", "pyw"],
90388
90703
  filename: /^(BUCK|BUILD)$/,
90389
90704
  load() {
90390
- return import('./index-BNgQTecN.js').then(m => m.python());
90705
+ return import('./index-Zivk6fee.js').then(m => m.python());
90391
90706
  }
90392
90707
  }),
90393
90708
  /*@__PURE__*/LanguageDescription.of({
90394
90709
  name: "Rust",
90395
90710
  extensions: ["rs"],
90396
90711
  load() {
90397
- return import('./index-BPvLkg91.js').then(m => m.rust());
90712
+ return import('./index-BwoyZPjj.js').then(m => m.rust());
90398
90713
  }
90399
90714
  }),
90400
90715
  /*@__PURE__*/LanguageDescription.of({
90401
90716
  name: "Sass",
90402
90717
  extensions: ["sass"],
90403
90718
  load() {
90404
- return import('./index-IH42B4Mg.js').then(m => m.sass({ indented: true }));
90719
+ return import('./index-Di_-JfGf.js').then(m => m.sass({ indented: true }));
90405
90720
  }
90406
90721
  }),
90407
90722
  /*@__PURE__*/LanguageDescription.of({
90408
90723
  name: "SCSS",
90409
90724
  extensions: ["scss"],
90410
90725
  load() {
90411
- return import('./index-IH42B4Mg.js').then(m => m.sass());
90726
+ return import('./index-Di_-JfGf.js').then(m => m.sass());
90412
90727
  }
90413
90728
  }),
90414
90729
  /*@__PURE__*/LanguageDescription.of({
@@ -90439,7 +90754,7 @@ const languages = [
90439
90754
  name: "WebAssembly",
90440
90755
  extensions: ["wat", "wast"],
90441
90756
  load() {
90442
- return import('./index-Bm-sfjxA.js').then(m => m.wast());
90757
+ return import('./index-BHzFgL5N.js').then(m => m.wast());
90443
90758
  }
90444
90759
  }),
90445
90760
  /*@__PURE__*/LanguageDescription.of({
@@ -90447,7 +90762,7 @@ const languages = [
90447
90762
  alias: ["rss", "wsdl", "xsd"],
90448
90763
  extensions: ["xml", "xsl", "xsd", "svg"],
90449
90764
  load() {
90450
- return import('./index-Wtqlsb8j.js').then(m => m.xml());
90765
+ return import('./index-C1eH0RCy.js').then(m => m.xml());
90451
90766
  }
90452
90767
  }),
90453
90768
  /*@__PURE__*/LanguageDescription.of({
@@ -90455,7 +90770,7 @@ const languages = [
90455
90770
  alias: ["yml"],
90456
90771
  extensions: ["yaml", "yml"],
90457
90772
  load() {
90458
- return import('./index-DujAeBia.js').then(m => m.yaml());
90773
+ return import('./index-DY6zQP_F.js').then(m => m.yaml());
90459
90774
  }
90460
90775
  }),
90461
90776
  // Legacy modes ported from CodeMirror 5
@@ -91251,13 +91566,13 @@ const languages = [
91251
91566
  name: "Vue",
91252
91567
  extensions: ["vue"],
91253
91568
  load() {
91254
- return import('./index-DlZBtd34.js').then(m => m.vue());
91569
+ return import('./index-BTNGGXoa.js').then(m => m.vue());
91255
91570
  }
91256
91571
  }),
91257
91572
  /*@__PURE__*/LanguageDescription.of({
91258
91573
  name: "Angular Template",
91259
91574
  load() {
91260
- return import('./index-CzaJSWor.js').then(m => m.angular());
91575
+ return import('./index-D9d5kqGf.js').then(m => m.angular());
91261
91576
  }
91262
91577
  })
91263
91578
  ];
@@ -162184,13 +162499,13 @@ const PanelToolbar = ({
162184
162499
  align: "start",
162185
162500
  justify: "start"
162186
162501
  }, /*#__PURE__*/React__default.createElement(Label$3, {
162502
+ text: `Camera: ${targetFps ? `${targetFps} FPS` : "-"}`
162503
+ }), /*#__PURE__*/React__default.createElement(Label$3, {
162187
162504
  text: `Network: ${metrics?.incomingMessagesFps ? `${metrics.incomingMessagesFps} FPS` : "-"}`
162188
162505
  }), /*#__PURE__*/React__default.createElement(Label$3, {
162189
162506
  text: `Decoding: ${metrics?.decodedMessagesFps ? `${metrics.decodedMessagesFps} FPS` : "-"}`
162190
162507
  }), /*#__PURE__*/React__default.createElement(Label$3, {
162191
162508
  text: `Rendering: ${renderedFps ? `${Math.round(renderedFps / 2)} FPS` : "-"}`
162192
- }), /*#__PURE__*/React__default.createElement(Label$3, {
162193
- text: `Camera: ${targetFps ? `${targetFps} FPS` : "-"}`
162194
162509
  }), /*#__PURE__*/React__default.createElement(Label$3, {
162195
162510
  text: `Frontend Delay: ${eventLoopDelay ? `${Math.ceil(eventLoopDelay)} ms` : "-"}`
162196
162511
  }))), !disableAnnotations && kind === "image" && /*#__PURE__*/React__default.createElement(DropdownMenu, {
@@ -162329,7 +162644,7 @@ function createRenderDelaySampler() {
162329
162644
  };
162330
162645
  }
162331
162646
 
162332
- const ImagePanelComponent = /*#__PURE__*/React__default.lazy(async () => await import('./index-BND59L-_.js'));
162647
+ const ImagePanelComponent = /*#__PURE__*/React__default.lazy(async () => await import('./index-DAXpEznJ.js'));
162333
162648
  const ImagePanelBody = ({
162334
162649
  topic,
162335
162650
  frameRenderedEvent
@@ -162395,7 +162710,7 @@ const ImagePanel = /*#__PURE__*/React__default.memo(function ImagePanel(props) {
162395
162710
  // License, v2.0. If a copy of the MPL was not distributed with this
162396
162711
  // file, You can obtain one at http://mozilla.org/MPL/2.0/
162397
162712
 
162398
- const ThreeDeeRenderComponent = /*#__PURE__*/React__default.lazy(async () => await import('./index-BQ-DVAKf.js'));
162713
+ const ThreeDeeRenderComponent = /*#__PURE__*/React__default.lazy(async () => await import('./index-BPWE58mB.js'));
162399
162714
  const PointCloudPanelBody = ({
162400
162715
  topic
162401
162716
  }) => {
@@ -162413,8 +162728,8 @@ const PointCloudPanelBody = ({
162413
162728
  distance: -2000,
162414
162729
  perspective: true,
162415
162730
  phi: 0,
162416
- target: [0, 0, 0],
162417
- targetOffset: [0, 0, 0],
162731
+ target: [-2000, 0, 0],
162732
+ targetOffset: [-500, -500, 0],
162418
162733
  targetOrientation: [0, 0, 0, 1],
162419
162734
  thetaOffset: 0,
162420
162735
  fovy: 45,
@@ -1,4 +1,4 @@
1
- import { aq as styleTags, ar as tags, aN as javascriptLanguage, as as LRLanguage, at as LanguageSupport, av as LRParser, aK as html, aL as parseMixed, au as ExternalTokenizer } from './index-Daz5hiMP.js';
1
+ import { aq as styleTags, ar as tags, aN as javascriptLanguage, as as LRLanguage, at as LanguageSupport, av as LRParser, aK as html, aL as parseMixed, au as ExternalTokenizer } from './index-D8jKQuGu.js';
2
2
  import './FoxgloveServer-DiLI7KZU.js';
3
3
  import 'protobufjs/minimal';
4
4
  import 'ms';