@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.
- package/dist/{WorkerImageDecoder.worker-tkX9-IYo.js → WorkerImageDecoder.worker-C3ZBQ2Wk.js} +1 -1
- package/dist/{decodeImage-C8kB6T3V.js → decodeImage-CxUhz2gE.js} +14278 -2893
- package/dist/{index-P-f_cKZS.js → index-B9Zf3rrb.js} +2 -2
- package/dist/{index-BQ24Upp_.js → index-BJOK4X3d.js} +2 -2
- package/dist/{index-DMvr0-pP.js → index-BTO4og7t.js} +2 -2
- package/dist/{index-DTCT-lVn.js → index-BqTw2FSJ.js} +4 -4
- package/dist/{index-CH1TUS48.js → index-Bw0fCcF0.js} +2 -2
- package/dist/{index-DDVf76z9.js → index-CCWfhL1j.js} +2 -2
- package/dist/{index-BHXfMPMv.js → index-CFz07x1R.js} +2 -2
- package/dist/{index-Bvet1xE9.js → index-CM0J0Tip.js} +2 -2
- package/dist/{index-DtzTeqB7.js → index-D3by772J.js} +2 -2
- package/dist/{index-DzyYicoH.js → index-DMmaMUCD.js} +2813 -1608
- package/dist/{index-C-cGIa0r.js → index-DQ_hdLpb.js} +2 -2
- package/dist/{index-yfiGMPtK.js → index-DRmoIUFd.js} +2 -2
- package/dist/{index-Dcus_L6F.js → index-DWgnF3_o.js} +156 -57
- package/dist/{index-DYpNYj7G.js → index-Db42Qzy_.js} +2 -2
- package/dist/{index-C_ioBAtk.js → index-DgisSKDf.js} +2 -2
- package/dist/{index-CV57d9Tz.js → index-DjOkSXUO.js} +2 -2
- package/dist/{index-D5F-PpU5.js → index-DqqFhpKC.js} +2 -2
- package/dist/{index-RKZ-F77P.js → index-Wr3SUBO9.js} +2 -2
- package/dist/{index-DHgo3Ne_.js → index-oTzD1_p-.js} +2 -2
- package/dist/index.js +2 -2
- package/dist/lib/src/connection/foxglove-connection.d.ts +3 -1
- package/dist/lib/src/connection/foxglove-connection.d.ts.map +1 -1
- package/dist/lib/src/connection/foxglove-connection.js +16 -32
- package/dist/lib/src/connection/foxglove-connection.js.map +1 -1
- package/dist/lib/src/messaging/deserialization/pointcloud/pointcloudFromDepth.worker.js +373 -247
- package/dist/lib/src/messaging/deserialization/pointcloud/pointcloudFromDepth.worker.js.map +1 -1
- package/dist/lib/src/messaging/deserialization/pointcloud/poitcloudPoolManager.d.ts +30 -0
- package/dist/lib/src/messaging/deserialization/pointcloud/poitcloudPoolManager.d.ts.map +1 -0
- package/dist/lib/src/messaging/deserialization/pointcloud/poitcloudPoolManager.js +106 -0
- package/dist/lib/src/messaging/deserialization/pointcloud/poitcloudPoolManager.js.map +1 -0
- package/dist/lib/src/messaging/deserialization/pointcloud/utils.d.ts +0 -9
- package/dist/lib/src/messaging/deserialization/pointcloud/utils.d.ts.map +1 -1
- package/dist/lib/src/messaging/deserialization/pointcloud/utils.js +0 -16
- package/dist/lib/src/messaging/deserialization/pointcloud/utils.js.map +1 -1
- package/dist/lib/src/panels/PointCloudPanel.js +3 -3
- package/dist/lib/src/panels/PointCloudPanel.js.map +1 -1
- package/dist/lib/src/utils/poitcloud-sync.js +1 -1
- package/dist/lib/src/utils/poitcloud-sync.js.map +1 -1
- package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/CameraStateSettings.d.ts +1 -0
- package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/CameraStateSettings.d.ts.map +1 -1
- package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/CameraStateSettings.js +243 -154
- package/dist/packages/studio-base/src/panels/ThreeDeeRender/renderables/CameraStateSettings.js.map +1 -1
- package/dist/pointcloudFromDepth.worker-qotYPy_e.js +450 -0
- package/dist/{utils-Cmsz3FxA.js → utils-Hzt3wxhG.js} +2 -20
- package/package.json +2 -1
- 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
|
-
});
|