@luxonis/visualizer-protobuf 2.22.0 → 2.23.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 (48) hide show
  1. package/dist/{WorkerImageDecoder.worker-tkX9-IYo.js → WorkerImageDecoder.worker-C3ZBQ2Wk.js} +1 -1
  2. package/dist/{decodeImage-C8kB6T3V.js → decodeImage-CxUhz2gE.js} +14278 -2893
  3. package/dist/{index-P-f_cKZS.js → index-B9Zf3rrb.js} +2 -2
  4. package/dist/{index-BQ24Upp_.js → index-BJOK4X3d.js} +2 -2
  5. package/dist/{index-DMvr0-pP.js → index-BTO4og7t.js} +2 -2
  6. package/dist/{index-DTCT-lVn.js → index-BqTw2FSJ.js} +4 -4
  7. package/dist/{index-CH1TUS48.js → index-Bw0fCcF0.js} +2 -2
  8. package/dist/{index-DDVf76z9.js → index-CCWfhL1j.js} +2 -2
  9. package/dist/{index-BHXfMPMv.js → index-CFz07x1R.js} +2 -2
  10. package/dist/{index-Bvet1xE9.js → index-CM0J0Tip.js} +2 -2
  11. package/dist/{index-DtzTeqB7.js → index-D3by772J.js} +2 -2
  12. package/dist/{index-DzyYicoH.js → index-DMmaMUCD.js} +2813 -1608
  13. package/dist/{index-C-cGIa0r.js → index-DQ_hdLpb.js} +2 -2
  14. package/dist/{index-yfiGMPtK.js → index-DRmoIUFd.js} +2 -2
  15. package/dist/{index-Dcus_L6F.js → index-DWgnF3_o.js} +156 -57
  16. package/dist/{index-DYpNYj7G.js → index-Db42Qzy_.js} +2 -2
  17. package/dist/{index-C_ioBAtk.js → index-DgisSKDf.js} +2 -2
  18. package/dist/{index-CV57d9Tz.js → index-DjOkSXUO.js} +2 -2
  19. package/dist/{index-D5F-PpU5.js → index-DqqFhpKC.js} +2 -2
  20. package/dist/{index-RKZ-F77P.js → index-Wr3SUBO9.js} +2 -2
  21. package/dist/{index-DHgo3Ne_.js → index-oTzD1_p-.js} +2 -2
  22. package/dist/index.js +2 -2
  23. package/dist/lib/src/connection/foxglove-connection.d.ts +3 -1
  24. package/dist/lib/src/connection/foxglove-connection.d.ts.map +1 -1
  25. package/dist/lib/src/connection/foxglove-connection.js +16 -32
  26. package/dist/lib/src/connection/foxglove-connection.js.map +1 -1
  27. package/dist/lib/src/messaging/deserialization/pointcloud/pointcloudFromDepth.worker.js +373 -247
  28. package/dist/lib/src/messaging/deserialization/pointcloud/pointcloudFromDepth.worker.js.map +1 -1
  29. package/dist/lib/src/messaging/deserialization/pointcloud/poitcloudPoolManager.d.ts +30 -0
  30. package/dist/lib/src/messaging/deserialization/pointcloud/poitcloudPoolManager.d.ts.map +1 -0
  31. package/dist/lib/src/messaging/deserialization/pointcloud/poitcloudPoolManager.js +106 -0
  32. package/dist/lib/src/messaging/deserialization/pointcloud/poitcloudPoolManager.js.map +1 -0
  33. package/dist/lib/src/messaging/deserialization/pointcloud/utils.d.ts +0 -9
  34. package/dist/lib/src/messaging/deserialization/pointcloud/utils.d.ts.map +1 -1
  35. package/dist/lib/src/messaging/deserialization/pointcloud/utils.js +0 -16
  36. package/dist/lib/src/messaging/deserialization/pointcloud/utils.js.map +1 -1
  37. package/dist/lib/src/panels/PointCloudPanel.js +3 -3
  38. package/dist/lib/src/panels/PointCloudPanel.js.map +1 -1
  39. package/dist/lib/src/utils/poitcloud-sync.js +1 -1
  40. package/dist/lib/src/utils/poitcloud-sync.js.map +1 -1
  41. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/CameraStateSettings.d.ts +1 -0
  42. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/CameraStateSettings.d.ts.map +1 -1
  43. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/CameraStateSettings.js +243 -154
  44. package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/CameraStateSettings.js.map +1 -1
  45. package/dist/pointcloudFromDepth.worker-qotYPy_e.js +450 -0
  46. package/dist/{utils-Cmsz3FxA.js → utils-Hzt3wxhG.js} +2 -20
  47. package/package.json +2 -1
  48. package/dist/pointcloudFromDepth.worker-CNKyMUU-.js +0 -326
@@ -1,326 +0,0 @@
1
- import { e as expose } from './comlink-DHMAu6X7.js';
2
- import { i as i420ToRgbaToPointcloud } from './utils-Cmsz3FxA.js';
3
-
4
- // This Source Code Form is subject to the terms of the Mozilla Public
5
- // License, v2.0. If a copy of the MPL was not distributed with this
6
- // file, You can obtain one at http://mozilla.org/MPL/2.0/
7
- /// <reference types="@webgpu/types" />
8
- function depthToPointCloudBuffer(uint16Array, width, height, fx, fy, cx, cy) {
9
- const depthData = Array.from({
10
- length: height
11
- }, () => new Array(width));
12
- for (let v = 0; v < height; v++) {
13
- depthData[v] = depthData[v] ?? [];
14
- for (let u = 0; u < width; u++) {
15
- const d = uint16Array[v * width + u] ?? -1;
16
- // biome-ignore lint/style/noNonNullAssertion: <explanation>
17
- depthData[v][u] = d > 0 ? d : -1;
18
- }
19
- }
20
- const points = [];
21
- // Accumulate the x, y, z values for each pixel.
22
- for (let v = 0; v < height; v++) {
23
- const row = depthData[v];
24
- if (!row) {
25
- continue;
26
- }
27
- for (let u = 0; u < width; u++) {
28
- const z = row[u] ?? 0;
29
- const x = (cx - u) * z / fx;
30
- const y = (cy - v) * z / fy;
31
- points.push(x, y, z);
32
- }
33
- }
34
- const pointCount = points.length / 3;
35
- const buffer = new ArrayBuffer(pointCount * 16);
36
- const view = new DataView(buffer);
37
- for (let i = 0; i < pointCount; i++) {
38
- const offset = i * 16;
39
- view.setFloat32(offset, points[i * 3] ?? 0, true); //X
40
- view.setFloat32(offset + 4, points[i * 3 + 1] ?? 0, true); //Y
41
- view.setFloat32(offset + 8, points[i * 3 + 2] ?? 0, true); //Z
42
- view.setUint8(offset + 12, 0); // R
43
- view.setUint8(offset + 13, 0); // G
44
- view.setUint8(offset + 14, 0); // B
45
- view.setUint8(offset + 15, 255); // A
46
- }
47
- return new Uint8Array(buffer);
48
- }
49
- const shader = `
50
- @group(0) @binding(1) var<storage, read> intrinsics: array<f32>;
51
-
52
- struct PointOutput {
53
- x: f32,
54
- y: f32,
55
- z: f32,
56
- color: u32,
57
- };
58
-
59
- @group(0) @binding(0) var<storage, read> depthBuffer: array<u32>;
60
- @group(0) @binding(2) var<storage, read_write> xyzColorBuffer: array<PointOutput>;
61
- @group(0) @binding(3) var<storage, read> i420Buffer: array<u32>; // Correct type
62
-
63
- @compute @workgroup_size(256, 1, 1)
64
- fn main(@builtin(global_invocation_id) global_id: vec3<u32>) {
65
- let i = global_id.x;
66
-
67
- // Read dimensions
68
- let depthWidth = intrinsics[5];
69
- let depthHeight = intrinsics[6];
70
- let numPixels = u32(depthWidth * depthHeight);
71
-
72
- // Bounds check
73
- if (i >= numPixels || depthWidth <= 0.0 || depthHeight <= 0.0 ) { return; }
74
-
75
- // Read other intrinsics
76
- let fx = intrinsics[0];
77
- let fy = intrinsics[1];
78
- let cx = intrinsics[2];
79
- let cy = intrinsics[3];
80
- let depthScale = intrinsics[4]; // Make sure this is correct (e.g., 0.001)
81
- let i420Width = intrinsics[7];
82
- let i420Height = intrinsics[8];
83
-
84
- let u = f32(i % u32(depthWidth));
85
- let v = f32(i / u32(depthWidth));
86
-
87
- // --- Extract u16 depth from u32 buffer ---
88
- let depthIndex32 = i / 2u;
89
- // Add bounds check for safety, though numPixels check should cover it
90
- if (depthIndex32 >= arrayLength(&depthBuffer)) { return; }
91
- let packedDepthU32 = depthBuffer[depthIndex32];
92
- var rawDepthU32 : u32;
93
- if (i % 2u == 0u) {
94
- rawDepthU32 = packedDepthU32 & 0xFFFFu; // Lower 16 bits
95
- } else {
96
- rawDepthU32 = (packedDepthU32 >> 16) & 0xFFFFu; // Upper 16 bits
97
- }
98
- // --- End depth extraction ---
99
-
100
- // Default point output (black, opaque)
101
- var outputPoint: PointOutput;
102
- outputPoint.x = 0.0;
103
- outputPoint.y = 0.0;
104
- outputPoint.z = 0.0;
105
- outputPoint.color = 0u | (0u << 8) | (0u << 16) | (255u << 24);
106
-
107
- // Process only valid depth pixels and valid intrinsics
108
- if (rawDepthU32 > 0u && fx != 0.0 && fy != 0.0 && depthScale > 0.0) {
109
- let z = f32(rawDepthU32) * depthScale;
110
- outputPoint.x = (cx- u) * z / fx;
111
- outputPoint.y = (cy- v) * z / fy;
112
- outputPoint.z = z;
113
-
114
- // --- I420 Color Calculation with u8 extraction from u32 buffer ---
115
- if (i420Width > 0.0 && i420Height > 0.0) {
116
- let i420WidthU = u32(i420Width);
117
- let i420HeightU = u32(i420Height);
118
-
119
- let i420X = min(i420WidthU - 1u, u32( floor(u * (i420Width / depthWidth)) ));
120
- let i420Y = min(i420HeightU - 1u, u32( floor(v * (i420Height / depthHeight)) ));
121
-
122
- // Calculate original byte indices
123
- let frameSize = i420WidthU * i420HeightU;
124
- let uvWidth = (i420WidthU + 1u) / 2u;
125
- let uvHeight = (i420HeightU + 1u) / 2u;
126
- let uOffset = frameSize;
127
- let vOffset = frameSize + uvWidth * uvHeight;
128
-
129
- let yIndex = i420Y * i420WidthU + i420X;
130
- let uvX = i420X / 2u;
131
- let uvY = i420Y / 2u;
132
- let uvIndex = uvY * uvWidth + uvX;
133
- let uIndex = uOffset + uvIndex;
134
- let vIndex = vOffset + uvIndex;
135
-
136
- // --- Extract Y byte ---
137
- let yIndex32 = yIndex / 4u;
138
- let yOffsetIn32 = yIndex % 4u;
139
- // Bounds check (use original byte length concept for check)
140
- let bufferByteLength = arrayLength(&i420Buffer) * 4u; // Conceptual byte length
141
- if (yIndex32 < arrayLength(&i420Buffer) && yIndex < bufferByteLength) { // Check index and conceptual byte index
142
- let packedY = i420Buffer[yIndex32];
143
- let y_byte = (packedY >> (yOffsetIn32 * 8u)) & 0xFFu;
144
- let y_f = f32(y_byte);
145
-
146
- // --- Extract U byte ---
147
- let uIndex32 = uIndex / 4u;
148
- let uOffsetIn32 = uIndex % 4u;
149
- if (uIndex32 < arrayLength(&i420Buffer) && uIndex < bufferByteLength) { // Check index and conceptual byte index
150
- let packedU = i420Buffer[uIndex32];
151
- let u_byte = (packedU >> (uOffsetIn32 * 8u)) & 0xFFu;
152
- let u_f = f32(u_byte) - 128.0;
153
-
154
- // --- Extract V byte ---
155
- let vIndex32 = vIndex / 4u;
156
- let vOffsetIn32 = vIndex % 4u;
157
- if (vIndex32 < arrayLength(&i420Buffer) && vIndex < bufferByteLength) { // Check index and conceptual byte index
158
- let packedV = i420Buffer[vIndex32];
159
- let v_byte = (packedV >> (vOffsetIn32 * 8u)) & 0xFFu;
160
- let v_f = f32(v_byte) - 128.0;
161
-
162
- // --- YUV to RGB ---
163
- var r_f = y_f + 1.402 * v_f;
164
- var g_f = y_f - 0.344136 * u_f - 0.714136 * v_f;
165
- var b_f = y_f + 1.772 * u_f;
166
-
167
- let r = u32(clamp(r_f, 0.0, 255.0));
168
- let g = u32(clamp(g_f, 0.0, 255.0));
169
- let b = u32(clamp(b_f, 0.0, 255.0));
170
- let a = 255u;
171
-
172
- outputPoint.color = (r & 0xFFu) | ((g & 0xFFu) << 8) | ((b & 0xFFu) << 16) | (a << 24);
173
- } // End V valid
174
- } // End U valid
175
- } // End Y valid
176
- } // End if i420 dimensions valid
177
- } // End if rawDepth valid
178
-
179
- xyzColorBuffer[i] = outputPoint;
180
- }
181
- `;
182
- async function depthToPointcloudGPU(depthArray, depthWidth, depthHeight, fx, fy, cx, cy, i420Data, i420Width, i420Height) {
183
- const depthScale = 1;
184
- if (depthWidth <= 0 || depthHeight <= 0) {
185
- throw new Error("Invalid depth dimensions!");
186
- }
187
-
188
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
189
- if (!navigator.gpu) {
190
- const xyzData = depthToPointCloudBuffer(depthArray, depthWidth, depthHeight, fx, fy, cx, cy);
191
- return i420ToRgbaToPointcloud(i420Data, i420Width, i420Height, depthWidth, depthHeight, xyzData);
192
- }
193
- const adapter = await navigator.gpu.requestAdapter();
194
- if (!adapter) {
195
- const xyzData = depthToPointCloudBuffer(depthArray, depthWidth, depthHeight, fx, fy, cx, cy);
196
- return i420ToRgbaToPointcloud(i420Data, i420Width, i420Height, depthWidth, depthHeight, xyzData);
197
- }
198
- const device = await adapter.requestDevice();
199
- const queue = device.queue;
200
- const numPixels = depthWidth * depthHeight;
201
- const outputBufferSize = numPixels * 16;
202
- const depthBuffer = device.createBuffer({
203
- size: depthArray.byteLength,
204
- usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
205
- mappedAtCreation: true
206
- });
207
- new Uint16Array(depthBuffer.getMappedRange()).set(depthArray);
208
- depthBuffer.unmap();
209
- const intrinsicsData = new Float32Array([fx, fy, cx, cy, depthScale, depthWidth, depthHeight, i420Width, i420Height]);
210
- const intrinsicsBufferSize = Math.max(intrinsicsData.byteLength, 40);
211
- const intrinsicsBuffer = device.createBuffer({
212
- size: intrinsicsBufferSize,
213
- usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST
214
- });
215
- queue.writeBuffer(intrinsicsBuffer, 0, intrinsicsData);
216
- const i420BufferSize = i420Data.byteLength;
217
- const i420GpuBuffer = device.createBuffer({
218
- size: i420BufferSize,
219
- usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,
220
- mappedAtCreation: true
221
- });
222
- new Uint8Array(i420GpuBuffer.getMappedRange()).set(i420Data);
223
- i420GpuBuffer.unmap();
224
- const xyzColorBuffer = device.createBuffer({
225
- size: outputBufferSize,
226
- usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC
227
- });
228
- const bindGroupLayout = device.createBindGroupLayout({
229
- entries: [{
230
- binding: 0,
231
- visibility: GPUShaderStage.COMPUTE,
232
- buffer: {
233
- type: "read-only-storage"
234
- }
235
- }, {
236
- binding: 1,
237
- visibility: GPUShaderStage.COMPUTE,
238
- buffer: {
239
- type: "read-only-storage"
240
- }
241
- }, {
242
- binding: 2,
243
- visibility: GPUShaderStage.COMPUTE,
244
- buffer: {
245
- type: "storage"
246
- }
247
- }, {
248
- binding: 3,
249
- visibility: GPUShaderStage.COMPUTE,
250
- buffer: {
251
- type: "read-only-storage"
252
- }
253
- }]
254
- });
255
- const bindGroup = device.createBindGroup({
256
- layout: bindGroupLayout,
257
- entries: [{
258
- binding: 0,
259
- resource: {
260
- buffer: depthBuffer
261
- }
262
- }, {
263
- binding: 1,
264
- resource: {
265
- buffer: intrinsicsBuffer
266
- }
267
- }, {
268
- binding: 2,
269
- resource: {
270
- buffer: xyzColorBuffer
271
- }
272
- }, {
273
- binding: 3,
274
- resource: {
275
- buffer: i420GpuBuffer
276
- }
277
- }]
278
- });
279
- const shaderModule = device.createShaderModule({
280
- code: shader
281
- });
282
- const pipeline = device.createComputePipeline({
283
- layout: device.createPipelineLayout({
284
- bindGroupLayouts: [bindGroupLayout]
285
- }),
286
- compute: {
287
- module: shaderModule,
288
- entryPoint: "main"
289
- }
290
- });
291
- const commandEncoder = device.createCommandEncoder();
292
- const passEncoder = commandEncoder.beginComputePass();
293
- passEncoder.setPipeline(pipeline);
294
- passEncoder.setBindGroup(0, bindGroup);
295
- const workgroupSize = 256;
296
- const numWorkgroups = Math.ceil(numPixels / workgroupSize);
297
- passEncoder.dispatchWorkgroups(numWorkgroups);
298
- passEncoder.end();
299
- const readbackBuffer = device.createBuffer({
300
- size: outputBufferSize,
301
- usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ
302
- });
303
- commandEncoder.copyBufferToBuffer(xyzColorBuffer, 0, readbackBuffer, 0, outputBufferSize);
304
- queue.submit([commandEncoder.finish()]);
305
- try {
306
- await readbackBuffer.mapAsync(GPUMapMode.READ);
307
- const mappedRange = readbackBuffer.getMappedRange();
308
- const result = new Uint8Array(mappedRange.byteLength);
309
- result.set(new Uint8Array(mappedRange));
310
- readbackBuffer.unmap();
311
- depthBuffer.destroy();
312
- intrinsicsBuffer.destroy();
313
- i420GpuBuffer.destroy();
314
- xyzColorBuffer.destroy();
315
- readbackBuffer.destroy();
316
- return result;
317
- } catch (error) {
318
- console.error("Error mapping readback buffer:", error);
319
- console.warn("GPU processing failed during readback. Falling back to CPU.");
320
- const xyzData = depthToPointCloudBuffer(depthArray, depthWidth, depthHeight, fx, fy, cx, cy);
321
- return i420ToRgbaToPointcloud(i420Data, i420Width, i420Height, depthWidth, depthHeight, xyzData);
322
- }
323
- }
324
- expose({
325
- depthToPointcloudGPU
326
- });