@loaders.gl/pcd 3.1.3 → 4.0.0-alpha.5

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 (49) hide show
  1. package/dist/bundle.js +2 -2
  2. package/dist/bundle.js.map +1 -0
  3. package/dist/index.js +8 -17
  4. package/dist/index.js.map +1 -0
  5. package/dist/lib/decompress-lzf.js +43 -54
  6. package/dist/lib/decompress-lzf.js.map +1 -0
  7. package/dist/lib/get-pcd-schema.js +19 -24
  8. package/dist/lib/get-pcd-schema.js.map +1 -0
  9. package/dist/lib/parse-pcd.js +261 -260
  10. package/dist/lib/parse-pcd.js.map +1 -0
  11. package/dist/lib/pcd-types.js +2 -2
  12. package/dist/{es5/lib → lib}/pcd-types.js.map +0 -0
  13. package/dist/pcd-loader.js +14 -21
  14. package/dist/pcd-loader.js.map +1 -0
  15. package/dist/pcd-worker.js +1 -1
  16. package/dist/workers/pcd-worker.js +4 -5
  17. package/dist/workers/pcd-worker.js.map +1 -0
  18. package/package.json +7 -7
  19. package/dist/es5/bundle.js +0 -7
  20. package/dist/es5/bundle.js.map +0 -1
  21. package/dist/es5/index.js +0 -59
  22. package/dist/es5/index.js.map +0 -1
  23. package/dist/es5/lib/decompress-lzf.js +0 -51
  24. package/dist/es5/lib/decompress-lzf.js.map +0 -1
  25. package/dist/es5/lib/get-pcd-schema.js +0 -28
  26. package/dist/es5/lib/get-pcd-schema.js.map +0 -1
  27. package/dist/es5/lib/parse-pcd.js +0 -304
  28. package/dist/es5/lib/parse-pcd.js.map +0 -1
  29. package/dist/es5/lib/pcd-types.js +0 -2
  30. package/dist/es5/pcd-loader.js +0 -23
  31. package/dist/es5/pcd-loader.js.map +0 -1
  32. package/dist/es5/workers/pcd-worker.js +0 -8
  33. package/dist/es5/workers/pcd-worker.js.map +0 -1
  34. package/dist/esm/bundle.js +0 -5
  35. package/dist/esm/bundle.js.map +0 -1
  36. package/dist/esm/index.js +0 -9
  37. package/dist/esm/index.js.map +0 -1
  38. package/dist/esm/lib/decompress-lzf.js +0 -44
  39. package/dist/esm/lib/decompress-lzf.js.map +0 -1
  40. package/dist/esm/lib/get-pcd-schema.js +0 -20
  41. package/dist/esm/lib/get-pcd-schema.js.map +0 -1
  42. package/dist/esm/lib/parse-pcd.js +0 -289
  43. package/dist/esm/lib/parse-pcd.js.map +0 -1
  44. package/dist/esm/lib/pcd-types.js +0 -2
  45. package/dist/esm/lib/pcd-types.js.map +0 -1
  46. package/dist/esm/pcd-loader.js +0 -15
  47. package/dist/esm/pcd-loader.js.map +0 -1
  48. package/dist/esm/workers/pcd-worker.js +0 -4
  49. package/dist/esm/workers/pcd-worker.js.map +0 -1
@@ -1,250 +1,244 @@
1
- "use strict";
2
- // PCD Loader, adapted from THREE.js (MIT license)
3
- // Description: A loader for PCD ascii and binary files.
4
- // Limitations: Compressed binary files are not supported.
5
- //
6
- // Attributions per original THREE.js source file:
7
- // @author Filipe Caixeta / http://filipecaixeta.com.br
8
- // @author Mugen87 / https://github.com/Mugen87
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- const schema_1 = require("@loaders.gl/schema");
11
- const decompress_lzf_1 = require("./decompress-lzf");
12
- const get_pcd_schema_1 = require("./get-pcd-schema");
1
+ import { getMeshBoundingBox } from '@loaders.gl/schema';
2
+ import { decompressLZF } from './decompress-lzf';
3
+ import { getPCDSchema } from './get-pcd-schema';
13
4
  const LITTLE_ENDIAN = true;
14
- /**
15
- *
16
- * @param data
17
- * @returns
18
- */
19
- function parsePCD(data) {
20
- // parse header (always ascii format)
21
- const textData = new TextDecoder().decode(data);
22
- const pcdHeader = parsePCDHeader(textData);
23
- let attributes = {};
24
- // parse data
25
- switch (pcdHeader.data) {
26
- case 'ascii':
27
- attributes = parsePCDASCII(pcdHeader, textData);
28
- break;
29
- case 'binary':
30
- attributes = parsePCDBinary(pcdHeader, data);
31
- break;
32
- case 'binary_compressed':
33
- attributes = parsePCDBinaryCompressed(pcdHeader, data);
34
- break;
35
- default:
36
- throw new Error(`PCD: ${pcdHeader.data} files are not supported`);
37
- }
38
- attributes = getMeshAttributes(attributes);
39
- const header = getMeshHeader(pcdHeader, attributes);
40
- const metadata = new Map([
41
- ['mode', '0'],
42
- ['boundingBox', JSON.stringify(header.boundingBox)]
43
- ]);
44
- const schema = (0, get_pcd_schema_1.getPCDSchema)(pcdHeader, metadata);
45
- return {
46
- loaderData: {
47
- header: pcdHeader
48
- },
49
- header,
50
- schema,
51
- mode: 0,
52
- indices: null,
53
- attributes
54
- };
5
+ export default function parsePCD(data) {
6
+ const textData = new TextDecoder().decode(data);
7
+ const pcdHeader = parsePCDHeader(textData);
8
+ let attributes = {};
9
+
10
+ switch (pcdHeader.data) {
11
+ case 'ascii':
12
+ attributes = parsePCDASCII(pcdHeader, textData);
13
+ break;
14
+
15
+ case 'binary':
16
+ attributes = parsePCDBinary(pcdHeader, data);
17
+ break;
18
+
19
+ case 'binary_compressed':
20
+ attributes = parsePCDBinaryCompressed(pcdHeader, data);
21
+ break;
22
+
23
+ default:
24
+ throw new Error("PCD: ".concat(pcdHeader.data, " files are not supported"));
25
+ }
26
+
27
+ attributes = getMeshAttributes(attributes);
28
+ const header = getMeshHeader(pcdHeader, attributes);
29
+ const metadata = new Map([['mode', '0'], ['boundingBox', JSON.stringify(header.boundingBox)]]);
30
+ const schema = getPCDSchema(pcdHeader, metadata);
31
+ return {
32
+ loaderData: {
33
+ header: pcdHeader
34
+ },
35
+ header,
36
+ schema,
37
+ mode: 0,
38
+ indices: null,
39
+ attributes
40
+ };
55
41
  }
56
- exports.default = parsePCD;
57
- // Create a header that contains common data for PointCloud category loaders
42
+
58
43
  function getMeshHeader(pcdHeader, attributes) {
59
- if (typeof pcdHeader.width === 'number' && typeof pcdHeader.height === 'number') {
60
- const pointCount = pcdHeader.width * pcdHeader.height; // Supports "organized" point sets
61
- return {
62
- vertexCount: pointCount,
63
- boundingBox: (0, schema_1.getMeshBoundingBox)(attributes)
64
- };
65
- }
66
- return pcdHeader;
44
+ if (typeof pcdHeader.width === 'number' && typeof pcdHeader.height === 'number') {
45
+ const pointCount = pcdHeader.width * pcdHeader.height;
46
+ return {
47
+ vertexCount: pointCount,
48
+ boundingBox: getMeshBoundingBox(attributes)
49
+ };
50
+ }
51
+
52
+ return pcdHeader;
67
53
  }
68
- /**
69
- * @param attributes
70
- * @returns Normalized attributes
71
- */
54
+
72
55
  function getMeshAttributes(attributes) {
73
- const normalizedAttributes = {
74
- POSITION: {
75
- // Binary PCD is only 32 bit
76
- value: new Float32Array(attributes.position),
77
- size: 3
78
- }
79
- };
80
- if (attributes.normal && attributes.normal.length > 0) {
81
- normalizedAttributes.NORMAL = {
82
- value: new Float32Array(attributes.normal),
83
- size: 3
84
- };
56
+ const normalizedAttributes = {
57
+ POSITION: {
58
+ value: new Float32Array(attributes.position),
59
+ size: 3
85
60
  }
86
- if (attributes.color && attributes.color.length > 0) {
87
- // TODO - RGBA
88
- normalizedAttributes.COLOR_0 = {
89
- value: new Uint8Array(attributes.color),
90
- size: 3
91
- };
92
- }
93
- return normalizedAttributes;
61
+ };
62
+
63
+ if (attributes.normal && attributes.normal.length > 0) {
64
+ normalizedAttributes.NORMAL = {
65
+ value: new Float32Array(attributes.normal),
66
+ size: 3
67
+ };
68
+ }
69
+
70
+ if (attributes.color && attributes.color.length > 0) {
71
+ normalizedAttributes.COLOR_0 = {
72
+ value: new Uint8Array(attributes.color),
73
+ size: 3
74
+ };
75
+ }
76
+
77
+ return normalizedAttributes;
94
78
  }
95
- /**
96
- * Incoming data parsing
97
- * @param data
98
- * @returns Header
99
- */
100
- /* eslint-disable complexity, max-statements */
79
+
101
80
  function parsePCDHeader(data) {
102
- const result1 = data.search(/[\r\n]DATA\s(\S*)\s/i);
103
- const result2 = /[\r\n]DATA\s(\S*)\s/i.exec(data.substr(result1 - 1));
104
- const pcdHeader = {};
105
- pcdHeader.data = result2 && result2[1];
106
- if (result2 !== null) {
107
- pcdHeader.headerLen = (result2 && result2[0].length) + result1;
108
- }
109
- pcdHeader.str = data.substr(0, pcdHeader.headerLen);
110
- // remove comments
111
- pcdHeader.str = pcdHeader.str.replace(/\#.*/gi, '');
112
- // parse
113
- pcdHeader.version = /VERSION (.*)/i.exec(pcdHeader.str);
114
- pcdHeader.fields = /FIELDS (.*)/i.exec(pcdHeader.str);
115
- pcdHeader.size = /SIZE (.*)/i.exec(pcdHeader.str);
116
- pcdHeader.type = /TYPE (.*)/i.exec(pcdHeader.str);
117
- pcdHeader.count = /COUNT (.*)/i.exec(pcdHeader.str);
118
- pcdHeader.width = /WIDTH (.*)/i.exec(pcdHeader.str);
119
- pcdHeader.height = /HEIGHT (.*)/i.exec(pcdHeader.str);
120
- pcdHeader.viewpoint = /VIEWPOINT (.*)/i.exec(pcdHeader.str);
121
- pcdHeader.points = /POINTS (.*)/i.exec(pcdHeader.str);
122
- // evaluate
123
- if (pcdHeader.version !== null) {
124
- pcdHeader.version = parseFloat(pcdHeader.version[1]);
125
- }
81
+ const result1 = data.search(/[\r\n]DATA\s(\S*)\s/i);
82
+ const result2 = /[\r\n]DATA\s(\S*)\s/i.exec(data.substr(result1 - 1));
83
+ const pcdHeader = {};
84
+ pcdHeader.data = result2 && result2[1];
85
+
86
+ if (result2 !== null) {
87
+ pcdHeader.headerLen = (result2 && result2[0].length) + result1;
88
+ }
89
+
90
+ pcdHeader.str = data.substr(0, pcdHeader.headerLen);
91
+ pcdHeader.str = pcdHeader.str.replace(/\#.*/gi, '');
92
+ pcdHeader.version = /VERSION (.*)/i.exec(pcdHeader.str);
93
+ pcdHeader.fields = /FIELDS (.*)/i.exec(pcdHeader.str);
94
+ pcdHeader.size = /SIZE (.*)/i.exec(pcdHeader.str);
95
+ pcdHeader.type = /TYPE (.*)/i.exec(pcdHeader.str);
96
+ pcdHeader.count = /COUNT (.*)/i.exec(pcdHeader.str);
97
+ pcdHeader.width = /WIDTH (.*)/i.exec(pcdHeader.str);
98
+ pcdHeader.height = /HEIGHT (.*)/i.exec(pcdHeader.str);
99
+ pcdHeader.viewpoint = /VIEWPOINT (.*)/i.exec(pcdHeader.str);
100
+ pcdHeader.points = /POINTS (.*)/i.exec(pcdHeader.str);
101
+
102
+ if (pcdHeader.version !== null) {
103
+ pcdHeader.version = parseFloat(pcdHeader.version[1]);
104
+ }
105
+
106
+ if (pcdHeader.fields !== null) {
107
+ pcdHeader.fields = pcdHeader.fields[1].split(' ');
108
+ }
109
+
110
+ if (pcdHeader.type !== null) {
111
+ pcdHeader.type = pcdHeader.type[1].split(' ');
112
+ }
113
+
114
+ if (pcdHeader.width !== null) {
115
+ pcdHeader.width = parseInt(pcdHeader.width[1], 10);
116
+ }
117
+
118
+ if (pcdHeader.height !== null) {
119
+ pcdHeader.height = parseInt(pcdHeader.height[1], 10);
120
+ }
121
+
122
+ if (pcdHeader.viewpoint !== null) {
123
+ pcdHeader.viewpoint = pcdHeader.viewpoint[1];
124
+ }
125
+
126
+ if (pcdHeader.points !== null) {
127
+ pcdHeader.points = parseInt(pcdHeader.points[1], 10);
128
+ }
129
+
130
+ if (pcdHeader.points === null && typeof pcdHeader.width === 'number' && typeof pcdHeader.height === 'number') {
131
+ pcdHeader.points = pcdHeader.width * pcdHeader.height;
132
+ }
133
+
134
+ if (pcdHeader.size !== null) {
135
+ pcdHeader.size = pcdHeader.size[1].split(' ').map(x => parseInt(x, 10));
136
+ }
137
+
138
+ if (pcdHeader.count !== null) {
139
+ pcdHeader.count = pcdHeader.count[1].split(' ').map(x => parseInt(x, 10));
140
+ } else {
141
+ pcdHeader.count = [];
142
+
126
143
  if (pcdHeader.fields !== null) {
127
- pcdHeader.fields = pcdHeader.fields[1].split(' ');
128
- }
129
- if (pcdHeader.type !== null) {
130
- pcdHeader.type = pcdHeader.type[1].split(' ');
131
- }
132
- if (pcdHeader.width !== null) {
133
- pcdHeader.width = parseInt(pcdHeader.width[1], 10);
134
- }
135
- if (pcdHeader.height !== null) {
136
- pcdHeader.height = parseInt(pcdHeader.height[1], 10);
144
+ for (let i = 0; i < pcdHeader.fields.length; i++) {
145
+ pcdHeader.count.push(1);
146
+ }
137
147
  }
138
- if (pcdHeader.viewpoint !== null) {
139
- pcdHeader.viewpoint = pcdHeader.viewpoint[1];
148
+ }
149
+
150
+ pcdHeader.offset = {};
151
+ let sizeSum = 0;
152
+
153
+ if (pcdHeader.fields !== null && pcdHeader.size !== null) {
154
+ for (let i = 0; i < pcdHeader.fields.length; i++) {
155
+ if (pcdHeader.data === 'ascii') {
156
+ pcdHeader.offset[pcdHeader.fields[i]] = i;
157
+ } else {
158
+ pcdHeader.offset[pcdHeader.fields[i]] = sizeSum;
159
+ sizeSum += pcdHeader.size[i];
160
+ }
140
161
  }
141
- if (pcdHeader.points !== null) {
142
- pcdHeader.points = parseInt(pcdHeader.points[1], 10);
143
- }
144
- if (pcdHeader.points === null &&
145
- typeof pcdHeader.width === 'number' &&
146
- typeof pcdHeader.height === 'number') {
147
- pcdHeader.points = pcdHeader.width * pcdHeader.height;
148
- }
149
- if (pcdHeader.size !== null) {
150
- pcdHeader.size = pcdHeader.size[1].split(' ').map((x) => parseInt(x, 10));
151
- }
152
- if (pcdHeader.count !== null) {
153
- pcdHeader.count = pcdHeader.count[1].split(' ').map((x) => parseInt(x, 10));
154
- }
155
- else {
156
- pcdHeader.count = [];
157
- if (pcdHeader.fields !== null) {
158
- for (let i = 0; i < pcdHeader.fields.length; i++) {
159
- pcdHeader.count.push(1);
160
- }
161
- }
162
- }
163
- pcdHeader.offset = {};
164
- let sizeSum = 0;
165
- if (pcdHeader.fields !== null && pcdHeader.size !== null) {
166
- for (let i = 0; i < pcdHeader.fields.length; i++) {
167
- if (pcdHeader.data === 'ascii') {
168
- pcdHeader.offset[pcdHeader.fields[i]] = i;
169
- }
170
- else {
171
- pcdHeader.offset[pcdHeader.fields[i]] = sizeSum;
172
- sizeSum += pcdHeader.size[i];
173
- }
174
- }
175
- }
176
- // for binary only
177
- pcdHeader.rowSize = sizeSum;
178
- return pcdHeader;
162
+ }
163
+
164
+ pcdHeader.rowSize = sizeSum;
165
+ return pcdHeader;
179
166
  }
180
- /**
181
- * @param pcdHeader
182
- * @param textData
183
- * @returns [attributes]
184
- */
185
- /* eslint-enable complexity, max-statements */
167
+
186
168
  function parsePCDASCII(pcdHeader, textData) {
187
- const position = [];
188
- const normal = [];
189
- const color = [];
190
- const offset = pcdHeader.offset;
191
- const pcdData = textData.substr(pcdHeader.headerLen);
192
- const lines = pcdData.split('\n');
193
- for (let i = 0; i < lines.length; i++) {
194
- if (lines[i] !== '') {
195
- const line = lines[i].split(' ');
196
- if (offset.x !== undefined) {
197
- position.push(parseFloat(line[offset.x]));
198
- position.push(parseFloat(line[offset.y]));
199
- position.push(parseFloat(line[offset.z]));
200
- }
201
- if (offset.rgb !== undefined) {
202
- const floatValue = parseFloat(line[offset.rgb]);
203
- const binaryColor = new Float32Array([floatValue]);
204
- const dataview = new DataView(binaryColor.buffer, 0);
205
- color.push(dataview.getUint8(0));
206
- color.push(dataview.getUint8(1));
207
- color.push(dataview.getUint8(2));
208
- // TODO - handle alpha channel / RGBA?
209
- }
210
- if (offset.normal_x !== undefined) {
211
- normal.push(parseFloat(line[offset.normal_x]));
212
- normal.push(parseFloat(line[offset.normal_y]));
213
- normal.push(parseFloat(line[offset.normal_z]));
214
- }
215
- }
169
+ const position = [];
170
+ const normal = [];
171
+ const color = [];
172
+ const offset = pcdHeader.offset;
173
+ const pcdData = textData.substr(pcdHeader.headerLen);
174
+ const lines = pcdData.split('\n');
175
+
176
+ for (let i = 0; i < lines.length; i++) {
177
+ if (lines[i] !== '') {
178
+ const line = lines[i].split(' ');
179
+
180
+ if (offset.x !== undefined) {
181
+ position.push(parseFloat(line[offset.x]));
182
+ position.push(parseFloat(line[offset.y]));
183
+ position.push(parseFloat(line[offset.z]));
184
+ }
185
+
186
+ if (offset.rgb !== undefined) {
187
+ const floatValue = parseFloat(line[offset.rgb]);
188
+ const binaryColor = new Float32Array([floatValue]);
189
+ const dataview = new DataView(binaryColor.buffer, 0);
190
+ color.push(dataview.getUint8(0));
191
+ color.push(dataview.getUint8(1));
192
+ color.push(dataview.getUint8(2));
193
+ }
194
+
195
+ if (offset.normal_x !== undefined) {
196
+ normal.push(parseFloat(line[offset.normal_x]));
197
+ normal.push(parseFloat(line[offset.normal_y]));
198
+ normal.push(parseFloat(line[offset.normal_z]));
199
+ }
216
200
  }
217
- return { position, normal, color };
201
+ }
202
+
203
+ return {
204
+ position,
205
+ normal,
206
+ color
207
+ };
218
208
  }
219
- /**
220
- * @param pcdHeader
221
- * @param data
222
- * @returns [attributes]
223
- */
209
+
224
210
  function parsePCDBinary(pcdHeader, data) {
225
- const position = [];
226
- const normal = [];
227
- const color = [];
228
- const dataview = new DataView(data, pcdHeader.headerLen);
229
- const offset = pcdHeader.offset;
230
- for (let i = 0, row = 0; i < pcdHeader.points; i++, row += pcdHeader.rowSize) {
231
- if (offset.x !== undefined) {
232
- position.push(dataview.getFloat32(row + offset.x, LITTLE_ENDIAN));
233
- position.push(dataview.getFloat32(row + offset.y, LITTLE_ENDIAN));
234
- position.push(dataview.getFloat32(row + offset.z, LITTLE_ENDIAN));
235
- }
236
- if (offset.rgb !== undefined) {
237
- color.push(dataview.getUint8(row + offset.rgb + 0));
238
- color.push(dataview.getUint8(row + offset.rgb + 1));
239
- color.push(dataview.getUint8(row + offset.rgb + 2));
240
- }
241
- if (offset.normal_x !== undefined) {
242
- normal.push(dataview.getFloat32(row + offset.normal_x, LITTLE_ENDIAN));
243
- normal.push(dataview.getFloat32(row + offset.normal_y, LITTLE_ENDIAN));
244
- normal.push(dataview.getFloat32(row + offset.normal_z, LITTLE_ENDIAN));
245
- }
211
+ const position = [];
212
+ const normal = [];
213
+ const color = [];
214
+ const dataview = new DataView(data, pcdHeader.headerLen);
215
+ const offset = pcdHeader.offset;
216
+
217
+ for (let i = 0, row = 0; i < pcdHeader.points; i++, row += pcdHeader.rowSize) {
218
+ if (offset.x !== undefined) {
219
+ position.push(dataview.getFloat32(row + offset.x, LITTLE_ENDIAN));
220
+ position.push(dataview.getFloat32(row + offset.y, LITTLE_ENDIAN));
221
+ position.push(dataview.getFloat32(row + offset.z, LITTLE_ENDIAN));
222
+ }
223
+
224
+ if (offset.rgb !== undefined) {
225
+ color.push(dataview.getUint8(row + offset.rgb + 0));
226
+ color.push(dataview.getUint8(row + offset.rgb + 1));
227
+ color.push(dataview.getUint8(row + offset.rgb + 2));
228
+ }
229
+
230
+ if (offset.normal_x !== undefined) {
231
+ normal.push(dataview.getFloat32(row + offset.normal_x, LITTLE_ENDIAN));
232
+ normal.push(dataview.getFloat32(row + offset.normal_y, LITTLE_ENDIAN));
233
+ normal.push(dataview.getFloat32(row + offset.normal_z, LITTLE_ENDIAN));
246
234
  }
247
- return { position, normal, color };
235
+ }
236
+
237
+ return {
238
+ position,
239
+ normal,
240
+ color
241
+ };
248
242
  }
249
243
  /** Parse compressed PCD data in in binary_compressed form ( https://pointclouds.org/documentation/tutorials/pcd_file_format.html)
250
244
  * from https://github.com/mrdoob/three.js/blob/master/examples/jsm/loaders/PCDLoader.js
@@ -253,36 +247,43 @@ function parsePCDBinary(pcdHeader, data) {
253
247
  * @param data
254
248
  * @returns [attributes]
255
249
  */
250
+
251
+
256
252
  function parsePCDBinaryCompressed(PCDheader, data) {
257
- const position = [];
258
- const normal = [];
259
- const color = [];
260
- const sizes = new Uint32Array(data.slice(PCDheader.headerLen, PCDheader.headerLen + 8));
261
- const compressedSize = sizes[0];
262
- const decompressedSize = sizes[1];
263
- const decompressed = (0, decompress_lzf_1.decompressLZF)(new Uint8Array(data, PCDheader.headerLen + 8, compressedSize), decompressedSize);
264
- const dataview = new DataView(decompressed.buffer);
265
- const offset = PCDheader.offset;
266
- for (let i = 0; i < PCDheader.points; i++) {
267
- if (offset.x !== undefined) {
268
- position.push(dataview.getFloat32(PCDheader.points * offset.x + PCDheader.size[0] * i, LITTLE_ENDIAN));
269
- position.push(dataview.getFloat32(PCDheader.points * offset.y + PCDheader.size[1] * i, LITTLE_ENDIAN));
270
- position.push(dataview.getFloat32(PCDheader.points * offset.z + PCDheader.size[2] * i, LITTLE_ENDIAN));
271
- }
272
- if (offset.rgb !== undefined) {
273
- color.push(dataview.getUint8(PCDheader.points * offset.rgb + PCDheader.size[3] * i + 0) / 255.0);
274
- color.push(dataview.getUint8(PCDheader.points * offset.rgb + PCDheader.size[3] * i + 1) / 255.0);
275
- color.push(dataview.getUint8(PCDheader.points * offset.rgb + PCDheader.size[3] * i + 2) / 255.0);
276
- }
277
- if (offset.normal_x !== undefined) {
278
- normal.push(dataview.getFloat32(PCDheader.points * offset.normal_x + PCDheader.size[4] * i, LITTLE_ENDIAN));
279
- normal.push(dataview.getFloat32(PCDheader.points * offset.normal_y + PCDheader.size[5] * i, LITTLE_ENDIAN));
280
- normal.push(dataview.getFloat32(PCDheader.points * offset.normal_z + PCDheader.size[6] * i, LITTLE_ENDIAN));
281
- }
253
+ const position = [];
254
+ const normal = [];
255
+ const color = [];
256
+ const sizes = new Uint32Array(data.slice(PCDheader.headerLen, PCDheader.headerLen + 8));
257
+ const compressedSize = sizes[0];
258
+ const decompressedSize = sizes[1];
259
+ const decompressed = decompressLZF(new Uint8Array(data, PCDheader.headerLen + 8, compressedSize), decompressedSize);
260
+ const dataview = new DataView(decompressed.buffer);
261
+ const offset = PCDheader.offset;
262
+
263
+ for (let i = 0; i < PCDheader.points; i++) {
264
+ if (offset.x !== undefined) {
265
+ position.push(dataview.getFloat32(PCDheader.points * offset.x + PCDheader.size[0] * i, LITTLE_ENDIAN));
266
+ position.push(dataview.getFloat32(PCDheader.points * offset.y + PCDheader.size[1] * i, LITTLE_ENDIAN));
267
+ position.push(dataview.getFloat32(PCDheader.points * offset.z + PCDheader.size[2] * i, LITTLE_ENDIAN));
282
268
  }
283
- return {
284
- position,
285
- normal,
286
- color
287
- };
269
+
270
+ if (offset.rgb !== undefined) {
271
+ color.push(dataview.getUint8(PCDheader.points * offset.rgb + PCDheader.size[3] * i + 0) / 255.0);
272
+ color.push(dataview.getUint8(PCDheader.points * offset.rgb + PCDheader.size[3] * i + 1) / 255.0);
273
+ color.push(dataview.getUint8(PCDheader.points * offset.rgb + PCDheader.size[3] * i + 2) / 255.0);
274
+ }
275
+
276
+ if (offset.normal_x !== undefined) {
277
+ normal.push(dataview.getFloat32(PCDheader.points * offset.normal_x + PCDheader.size[4] * i, LITTLE_ENDIAN));
278
+ normal.push(dataview.getFloat32(PCDheader.points * offset.normal_y + PCDheader.size[5] * i, LITTLE_ENDIAN));
279
+ normal.push(dataview.getFloat32(PCDheader.points * offset.normal_z + PCDheader.size[6] * i, LITTLE_ENDIAN));
280
+ }
281
+ }
282
+
283
+ return {
284
+ position,
285
+ normal,
286
+ color
287
+ };
288
288
  }
289
+ //# sourceMappingURL=parse-pcd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/parse-pcd.ts"],"names":["getMeshBoundingBox","decompressLZF","getPCDSchema","LITTLE_ENDIAN","parsePCD","data","textData","TextDecoder","decode","pcdHeader","parsePCDHeader","attributes","parsePCDASCII","parsePCDBinary","parsePCDBinaryCompressed","Error","getMeshAttributes","header","getMeshHeader","metadata","Map","JSON","stringify","boundingBox","schema","loaderData","mode","indices","width","height","pointCount","vertexCount","normalizedAttributes","POSITION","value","Float32Array","position","size","normal","length","NORMAL","color","COLOR_0","Uint8Array","result1","search","result2","exec","substr","headerLen","str","replace","version","fields","type","count","viewpoint","points","parseFloat","split","parseInt","map","x","i","push","offset","sizeSum","rowSize","pcdData","lines","line","undefined","y","z","rgb","floatValue","binaryColor","dataview","DataView","buffer","getUint8","normal_x","normal_y","normal_z","row","getFloat32","PCDheader","sizes","Uint32Array","slice","compressedSize","decompressedSize","decompressed"],"mappings":"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","sourcesContent":["// PCD Loader, adapted from THREE.js (MIT license)\n// Description: A loader for PCD ascii and binary files.\n// Limitations: Compressed binary files are not supported.\n//\n// Attributions per original THREE.js source file:\n// @author Filipe Caixeta / http://filipecaixeta.com.br\n// @author Mugen87 / https://github.com/Mugen87\n\nimport type {MeshAttribute, MeshAttributes} from '@loaders.gl/schema';\nimport {getMeshBoundingBox} from '@loaders.gl/schema';\nimport {decompressLZF} from './decompress-lzf';\nimport {getPCDSchema} from './get-pcd-schema';\nimport type {PCDHeader} from './pcd-types';\n\ntype NormalizedAttributes = {\n POSITION: {\n value: Float32Array;\n size: number;\n };\n NORMAL?: {\n value: Float32Array;\n size: number;\n };\n COLOR_0?: {\n value: Uint8Array;\n size: number;\n };\n};\n\ntype HeaderAttributes = {\n [attributeName: string]: number[];\n};\n\nconst LITTLE_ENDIAN: boolean = true;\n\n/**\n *\n * @param data\n * @returns\n */\nexport default function parsePCD(data: ArrayBufferLike) {\n // parse header (always ascii format)\n const textData = new TextDecoder().decode(data);\n const pcdHeader = parsePCDHeader(textData);\n\n let attributes: any = {};\n\n // parse data\n switch (pcdHeader.data) {\n case 'ascii':\n attributes = parsePCDASCII(pcdHeader, textData);\n break;\n\n case 'binary':\n attributes = parsePCDBinary(pcdHeader, data);\n break;\n\n case 'binary_compressed':\n attributes = parsePCDBinaryCompressed(pcdHeader, data);\n break;\n\n default:\n throw new Error(`PCD: ${pcdHeader.data} files are not supported`);\n }\n\n attributes = getMeshAttributes(attributes);\n\n const header = getMeshHeader(pcdHeader, attributes);\n\n const metadata = new Map([\n ['mode', '0'],\n ['boundingBox', JSON.stringify(header.boundingBox)]\n ]);\n\n const schema = getPCDSchema(pcdHeader, metadata);\n\n return {\n loaderData: {\n header: pcdHeader\n },\n header,\n schema,\n mode: 0, // POINTS\n indices: null,\n attributes\n };\n}\n\n// Create a header that contains common data for PointCloud category loaders\nfunction getMeshHeader(pcdHeader: PCDHeader, attributes: NormalizedAttributes): Partial<PCDHeader> {\n if (typeof pcdHeader.width === 'number' && typeof pcdHeader.height === 'number') {\n const pointCount = pcdHeader.width * pcdHeader.height; // Supports \"organized\" point sets\n return {\n vertexCount: pointCount,\n boundingBox: getMeshBoundingBox(attributes)\n };\n }\n return pcdHeader;\n}\n\n/**\n * @param attributes\n * @returns Normalized attributes\n */\nfunction getMeshAttributes(attributes: HeaderAttributes): {[attributeName: string]: MeshAttribute} {\n const normalizedAttributes: MeshAttributes = {\n POSITION: {\n // Binary PCD is only 32 bit\n value: new Float32Array(attributes.position),\n size: 3\n }\n };\n\n if (attributes.normal && attributes.normal.length > 0) {\n normalizedAttributes.NORMAL = {\n value: new Float32Array(attributes.normal),\n size: 3\n };\n }\n\n if (attributes.color && attributes.color.length > 0) {\n // TODO - RGBA\n normalizedAttributes.COLOR_0 = {\n value: new Uint8Array(attributes.color),\n size: 3\n };\n }\n\n return normalizedAttributes;\n}\n\n/**\n * Incoming data parsing\n * @param data\n * @returns Header\n */\n/* eslint-disable complexity, max-statements */\nfunction parsePCDHeader(data: string): PCDHeader {\n const result1 = data.search(/[\\r\\n]DATA\\s(\\S*)\\s/i);\n const result2 = /[\\r\\n]DATA\\s(\\S*)\\s/i.exec(data.substr(result1 - 1));\n\n const pcdHeader: any = {};\n pcdHeader.data = result2 && result2[1];\n if (result2 !== null) {\n pcdHeader.headerLen = (result2 && result2[0].length) + result1;\n }\n pcdHeader.str = data.substr(0, pcdHeader.headerLen);\n\n // remove comments\n\n pcdHeader.str = pcdHeader.str.replace(/\\#.*/gi, '');\n\n // parse\n\n pcdHeader.version = /VERSION (.*)/i.exec(pcdHeader.str);\n pcdHeader.fields = /FIELDS (.*)/i.exec(pcdHeader.str);\n pcdHeader.size = /SIZE (.*)/i.exec(pcdHeader.str);\n pcdHeader.type = /TYPE (.*)/i.exec(pcdHeader.str);\n pcdHeader.count = /COUNT (.*)/i.exec(pcdHeader.str);\n pcdHeader.width = /WIDTH (.*)/i.exec(pcdHeader.str);\n pcdHeader.height = /HEIGHT (.*)/i.exec(pcdHeader.str);\n pcdHeader.viewpoint = /VIEWPOINT (.*)/i.exec(pcdHeader.str);\n pcdHeader.points = /POINTS (.*)/i.exec(pcdHeader.str);\n\n // evaluate\n\n if (pcdHeader.version !== null) {\n pcdHeader.version = parseFloat(pcdHeader.version[1]);\n }\n\n if (pcdHeader.fields !== null) {\n pcdHeader.fields = pcdHeader.fields[1].split(' ');\n }\n\n if (pcdHeader.type !== null) {\n pcdHeader.type = pcdHeader.type[1].split(' ');\n }\n\n if (pcdHeader.width !== null) {\n pcdHeader.width = parseInt(pcdHeader.width[1], 10);\n }\n\n if (pcdHeader.height !== null) {\n pcdHeader.height = parseInt(pcdHeader.height[1], 10);\n }\n\n if (pcdHeader.viewpoint !== null) {\n pcdHeader.viewpoint = pcdHeader.viewpoint[1];\n }\n\n if (pcdHeader.points !== null) {\n pcdHeader.points = parseInt(pcdHeader.points[1], 10);\n }\n\n if (\n pcdHeader.points === null &&\n typeof pcdHeader.width === 'number' &&\n typeof pcdHeader.height === 'number'\n ) {\n pcdHeader.points = pcdHeader.width * pcdHeader.height;\n }\n\n if (pcdHeader.size !== null) {\n pcdHeader.size = pcdHeader.size[1].split(' ').map((x) => parseInt(x, 10));\n }\n\n if (pcdHeader.count !== null) {\n pcdHeader.count = pcdHeader.count[1].split(' ').map((x) => parseInt(x, 10));\n } else {\n pcdHeader.count = [];\n if (pcdHeader.fields !== null) {\n for (let i = 0; i < pcdHeader.fields.length; i++) {\n pcdHeader.count.push(1);\n }\n }\n }\n\n pcdHeader.offset = {};\n\n let sizeSum = 0;\n if (pcdHeader.fields !== null && pcdHeader.size !== null) {\n for (let i = 0; i < pcdHeader.fields.length; i++) {\n if (pcdHeader.data === 'ascii') {\n pcdHeader.offset[pcdHeader.fields[i]] = i;\n } else {\n pcdHeader.offset[pcdHeader.fields[i]] = sizeSum;\n sizeSum += pcdHeader.size[i];\n }\n }\n }\n\n // for binary only\n pcdHeader.rowSize = sizeSum;\n\n return pcdHeader;\n}\n\n/**\n * @param pcdHeader\n * @param textData\n * @returns [attributes]\n */\n/* eslint-enable complexity, max-statements */\nfunction parsePCDASCII(pcdHeader: PCDHeader, textData: string): HeaderAttributes {\n const position: number[] = [];\n const normal: number[] = [];\n const color: number[] = [];\n\n const offset = pcdHeader.offset;\n const pcdData = textData.substr(pcdHeader.headerLen);\n const lines = pcdData.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n if (lines[i] !== '') {\n const line = lines[i].split(' ');\n\n if (offset.x !== undefined) {\n position.push(parseFloat(line[offset.x]));\n position.push(parseFloat(line[offset.y]));\n position.push(parseFloat(line[offset.z]));\n }\n\n if (offset.rgb !== undefined) {\n const floatValue = parseFloat(line[offset.rgb]);\n const binaryColor = new Float32Array([floatValue]);\n const dataview = new DataView(binaryColor.buffer, 0);\n color.push(dataview.getUint8(0));\n color.push(dataview.getUint8(1));\n color.push(dataview.getUint8(2));\n // TODO - handle alpha channel / RGBA?\n }\n\n if (offset.normal_x !== undefined) {\n normal.push(parseFloat(line[offset.normal_x]));\n normal.push(parseFloat(line[offset.normal_y]));\n normal.push(parseFloat(line[offset.normal_z]));\n }\n }\n }\n\n return {position, normal, color};\n}\n\n/**\n * @param pcdHeader\n * @param data\n * @returns [attributes]\n */\nfunction parsePCDBinary(pcdHeader: PCDHeader, data: ArrayBufferLike): HeaderAttributes {\n const position: number[] = [];\n const normal: number[] = [];\n const color: number[] = [];\n\n const dataview = new DataView(data, pcdHeader.headerLen);\n const offset = pcdHeader.offset;\n\n for (let i = 0, row = 0; i < pcdHeader.points; i++, row += pcdHeader.rowSize) {\n if (offset.x !== undefined) {\n position.push(dataview.getFloat32(row + offset.x, LITTLE_ENDIAN));\n position.push(dataview.getFloat32(row + offset.y, LITTLE_ENDIAN));\n position.push(dataview.getFloat32(row + offset.z, LITTLE_ENDIAN));\n }\n\n if (offset.rgb !== undefined) {\n color.push(dataview.getUint8(row + offset.rgb + 0));\n color.push(dataview.getUint8(row + offset.rgb + 1));\n color.push(dataview.getUint8(row + offset.rgb + 2));\n }\n\n if (offset.normal_x !== undefined) {\n normal.push(dataview.getFloat32(row + offset.normal_x, LITTLE_ENDIAN));\n normal.push(dataview.getFloat32(row + offset.normal_y, LITTLE_ENDIAN));\n normal.push(dataview.getFloat32(row + offset.normal_z, LITTLE_ENDIAN));\n }\n }\n\n return {position, normal, color};\n}\n\n/** Parse compressed PCD data in in binary_compressed form ( https://pointclouds.org/documentation/tutorials/pcd_file_format.html)\n * from https://github.com/mrdoob/three.js/blob/master/examples/jsm/loaders/PCDLoader.js\n * @license MIT (http://opensource.org/licenses/MIT)\n * @param pcdHeader\n * @param data\n * @returns [attributes]\n */\nfunction parsePCDBinaryCompressed(PCDheader: PCDHeader, data: ArrayBufferLike): HeaderAttributes {\n const position: number[] = [];\n const normal: number[] = [];\n const color: number[] = [];\n\n const sizes = new Uint32Array(data.slice(PCDheader.headerLen, PCDheader.headerLen + 8));\n const compressedSize = sizes[0];\n const decompressedSize = sizes[1];\n const decompressed = decompressLZF(\n new Uint8Array(data, PCDheader.headerLen + 8, compressedSize),\n decompressedSize\n );\n const dataview = new DataView(decompressed.buffer);\n\n const offset = PCDheader.offset;\n\n for (let i = 0; i < PCDheader.points; i++) {\n if (offset.x !== undefined) {\n position.push(\n dataview.getFloat32(\n (PCDheader.points as number) * offset.x + (PCDheader.size as number[])[0] * i,\n LITTLE_ENDIAN\n )\n );\n position.push(\n dataview.getFloat32(\n (PCDheader.points as number) * offset.y + (PCDheader.size as number[])[1] * i,\n LITTLE_ENDIAN\n )\n );\n position.push(\n dataview.getFloat32(\n (PCDheader.points as number) * offset.z + (PCDheader.size as number[])[2] * i,\n LITTLE_ENDIAN\n )\n );\n }\n\n if (offset.rgb !== undefined) {\n color.push(\n dataview.getUint8(\n (PCDheader.points as number) * offset.rgb + (PCDheader.size as number[])[3] * i + 0\n ) / 255.0\n );\n color.push(\n dataview.getUint8(\n (PCDheader.points as number) * offset.rgb + (PCDheader.size as number[])[3] * i + 1\n ) / 255.0\n );\n color.push(\n dataview.getUint8(\n (PCDheader.points as number) * offset.rgb + (PCDheader.size as number[])[3] * i + 2\n ) / 255.0\n );\n }\n\n if (offset.normal_x !== undefined) {\n normal.push(\n dataview.getFloat32(\n (PCDheader.points as number) * offset.normal_x + (PCDheader.size as number[])[4] * i,\n LITTLE_ENDIAN\n )\n );\n normal.push(\n dataview.getFloat32(\n (PCDheader.points as number) * offset.normal_y + (PCDheader.size as number[])[5] * i,\n LITTLE_ENDIAN\n )\n );\n normal.push(\n dataview.getFloat32(\n (PCDheader.points as number) * offset.normal_z + (PCDheader.size as number[])[6] * i,\n LITTLE_ENDIAN\n )\n );\n }\n }\n\n return {\n position,\n normal,\n color\n };\n}\n"],"file":"parse-pcd.js"}
@@ -1,2 +1,2 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
1
+ export {};
2
+ //# sourceMappingURL=pcd-types.js.map
File without changes