@loaders.gl/pcd 4.0.0-alpha.4 → 4.0.0-alpha.6

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 (72) hide show
  1. package/dist/bundle.d.ts +2 -0
  2. package/dist/bundle.d.ts.map +1 -0
  3. package/dist/bundle.js +2 -2
  4. package/dist/dist.min.js +476 -0
  5. package/dist/es5/bundle.js +6 -0
  6. package/dist/es5/bundle.js.map +1 -0
  7. package/dist/es5/index.js +45 -0
  8. package/dist/es5/index.js.map +1 -0
  9. package/dist/es5/lib/decompress-lzf.js +57 -0
  10. package/dist/es5/lib/decompress-lzf.js.map +1 -0
  11. package/dist/es5/lib/get-pcd-schema.js +54 -0
  12. package/dist/es5/lib/get-pcd-schema.js.map +1 -0
  13. package/dist/es5/lib/parse-pcd.js +299 -0
  14. package/dist/es5/lib/parse-pcd.js.map +1 -0
  15. package/dist/es5/lib/pcd-types.js +2 -0
  16. package/dist/es5/lib/pcd-types.js.map +1 -0
  17. package/dist/es5/pcd-loader.js +21 -0
  18. package/dist/es5/pcd-loader.js.map +1 -0
  19. package/dist/es5/workers/pcd-worker.js +6 -0
  20. package/dist/es5/workers/pcd-worker.js.map +1 -0
  21. package/dist/esm/bundle.js +4 -0
  22. package/dist/esm/bundle.js.map +1 -0
  23. package/dist/esm/index.js +10 -0
  24. package/dist/esm/index.js.map +1 -0
  25. package/dist/esm/lib/decompress-lzf.js +51 -0
  26. package/dist/esm/lib/decompress-lzf.js.map +1 -0
  27. package/dist/esm/lib/get-pcd-schema.js +48 -0
  28. package/dist/esm/lib/get-pcd-schema.js.map +1 -0
  29. package/dist/esm/lib/parse-pcd.js +289 -0
  30. package/dist/esm/lib/parse-pcd.js.map +1 -0
  31. package/dist/esm/lib/pcd-types.js +2 -0
  32. package/dist/esm/lib/pcd-types.js.map +1 -0
  33. package/dist/esm/pcd-loader.js +14 -0
  34. package/dist/esm/pcd-loader.js.map +1 -0
  35. package/dist/esm/workers/pcd-worker.js +4 -0
  36. package/dist/esm/workers/pcd-worker.js.map +1 -0
  37. package/dist/index.d.ts +10 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +17 -8
  40. package/dist/lib/decompress-lzf.d.ts +8 -0
  41. package/dist/lib/decompress-lzf.d.ts.map +1 -0
  42. package/dist/lib/decompress-lzf.js +62 -0
  43. package/dist/lib/get-pcd-schema.d.ts +10 -0
  44. package/dist/lib/get-pcd-schema.d.ts.map +1 -0
  45. package/dist/lib/get-pcd-schema.js +32 -19
  46. package/dist/lib/parse-pcd.d.ts +8 -0
  47. package/dist/lib/parse-pcd.d.ts.map +1 -0
  48. package/dist/lib/parse-pcd.js +317 -223
  49. package/dist/lib/pcd-types.d.ts +31 -0
  50. package/dist/lib/pcd-types.d.ts.map +1 -0
  51. package/dist/lib/pcd-types.js +2 -2
  52. package/dist/pcd-loader.d.ts +7 -0
  53. package/dist/pcd-loader.d.ts.map +1 -0
  54. package/dist/pcd-loader.js +21 -14
  55. package/dist/pcd-worker.js +200 -439
  56. package/dist/workers/pcd-worker.d.ts +2 -0
  57. package/dist/workers/pcd-worker.d.ts.map +1 -0
  58. package/dist/workers/pcd-worker.js +5 -4
  59. package/package.json +9 -9
  60. package/src/index.ts +3 -2
  61. package/src/lib/decompress-lzf.ts +64 -0
  62. package/src/lib/get-pcd-schema.ts +15 -10
  63. package/src/lib/parse-pcd.ts +161 -12
  64. package/src/lib/pcd-types.ts +9 -9
  65. package/src/pcd-loader.ts +5 -4
  66. package/dist/bundle.js.map +0 -1
  67. package/dist/index.js.map +0 -1
  68. package/dist/lib/get-pcd-schema.js.map +0 -1
  69. package/dist/lib/parse-pcd.js.map +0 -1
  70. package/dist/lib/pcd-types.js.map +0 -1
  71. package/dist/pcd-loader.js.map +0 -1
  72. package/dist/workers/pcd-worker.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pcd-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pcd-worker.d.ts","sourceRoot":"","sources":["../../src/workers/pcd-worker.ts"],"names":[],"mappings":""}
@@ -1,4 +1,5 @@
1
- import { createLoaderWorker } from '@loaders.gl/loader-utils';
2
- import { PCDLoader } from '../index';
3
- createLoaderWorker(PCDLoader);
4
- //# sourceMappingURL=pcd-worker.js.map
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const loader_utils_1 = require("@loaders.gl/loader-utils");
4
+ const index_1 = require("../index");
5
+ (0, loader_utils_1.createLoaderWorker)(index_1.PCDLoader);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loaders.gl/pcd",
3
- "version": "4.0.0-alpha.4",
3
+ "version": "4.0.0-alpha.6",
4
4
  "description": "Framework-independent loader for the PCD format",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -18,9 +18,9 @@
18
18
  "point cloud",
19
19
  "PCD"
20
20
  ],
21
- "types": "src/index.ts",
22
- "main": "dist/index.js",
23
- "module": "dist/index.js",
21
+ "types": "dist/index.d.ts",
22
+ "main": "dist/es5/index.js",
23
+ "module": "dist/esm/index.js",
24
24
  "sideEffects": false,
25
25
  "files": [
26
26
  "src",
@@ -29,12 +29,12 @@
29
29
  ],
30
30
  "scripts": {
31
31
  "pre-build": "npm run build-worker && npm run build-bundle",
32
- "build-bundle": "esbuild src/bundle.ts --bundle --outfile=dist/bundle.js",
33
- "build-worker": "esbuild src/workers/pcd-worker.ts --bundle --outfile=dist/pcd-worker.js"
32
+ "build-bundle": "esbuild src/bundle.ts --bundle --outfile=dist/dist.min.js",
33
+ "build-worker": "esbuild src/workers/pcd-worker.ts --bundle --outfile=dist/pcd-worker.js --define:__VERSION__=\\\"$npm_package_version\\\""
34
34
  },
35
35
  "dependencies": {
36
- "@loaders.gl/loader-utils": "4.0.0-alpha.4",
37
- "@loaders.gl/schema": "4.0.0-alpha.4"
36
+ "@loaders.gl/loader-utils": "4.0.0-alpha.6",
37
+ "@loaders.gl/schema": "4.0.0-alpha.6"
38
38
  },
39
- "gitHead": "53026061b3c8871f7e96d3a5826125cc6613bddc"
39
+ "gitHead": "acc1985050dfaa0f1f0c066f8da5bce7454a046c"
40
40
  }
package/src/index.ts CHANGED
@@ -1,13 +1,14 @@
1
- import type {LoaderWithParser} from '@loaders.gl/loader-utils';
1
+ import type {LoaderOptions, LoaderWithParser} from '@loaders.gl/loader-utils';
2
2
  import parsePCDSync from './lib/parse-pcd';
3
3
  import {PCDLoader as PCDWorkerLoader} from './pcd-loader';
4
+ import {PCDMesh} from './lib/pcd-types';
4
5
 
5
6
  export {PCDWorkerLoader};
6
7
 
7
8
  /**
8
9
  * Loader for PCD - Point Cloud Data
9
10
  */
10
- export const PCDLoader = {
11
+ export const PCDLoader: LoaderWithParser<PCDMesh, never, LoaderOptions> = {
11
12
  ...PCDWorkerLoader,
12
13
  parse: async (arrayBuffer) => parsePCDSync(arrayBuffer),
13
14
  parseSync: parsePCDSync
@@ -0,0 +1,64 @@
1
+ /* eslint-disable */
2
+ /**
3
+ * from https://gitlab.com/taketwo/three-pcd-loader/blob/master/decompress-lzf.js
4
+ * @param inData
5
+ * @param outLength
6
+ * @returns
7
+ */
8
+ export function decompressLZF(inData: Uint8Array, outLength: number): Uint8Array {
9
+ const inLength = inData.length;
10
+ const outData = new Uint8Array(outLength);
11
+ let inPtr = 0;
12
+ let outPtr = 0;
13
+ let ctrl;
14
+ let len;
15
+ let ref;
16
+
17
+ do {
18
+ ctrl = inData[inPtr++];
19
+
20
+ if (ctrl < 1 << 5) {
21
+ ctrl++;
22
+ if (outPtr + ctrl > outLength) {
23
+ throw new Error('Output buffer is not large enough');
24
+ }
25
+ if (inPtr + ctrl > inLength) {
26
+ throw new Error('Invalid compressed data');
27
+ }
28
+
29
+ do {
30
+ outData[outPtr++] = inData[inPtr++];
31
+ } while (--ctrl);
32
+ } else {
33
+ len = ctrl >> 5;
34
+ ref = outPtr - ((ctrl & 0x1f) << 8) - 1;
35
+ if (inPtr >= inLength) {
36
+ throw new Error('Invalid compressed data');
37
+ }
38
+
39
+ if (len === 7) {
40
+ len += inData[inPtr++];
41
+ if (inPtr >= inLength) {
42
+ throw new Error('Invalid compressed data');
43
+ }
44
+ }
45
+
46
+ ref -= inData[inPtr++];
47
+ if (outPtr + len + 2 > outLength) {
48
+ throw new Error('Output buffer is not large enough');
49
+ }
50
+ if (ref < 0) {
51
+ throw new Error('Invalid compressed data');
52
+ }
53
+ if (ref >= outPtr) {
54
+ throw new Error('Invalid compressed data');
55
+ }
56
+
57
+ do {
58
+ outData[outPtr++] = outData[ref++];
59
+ } while (--len + 2);
60
+ }
61
+ } while (inPtr < inLength);
62
+
63
+ return outData;
64
+ }
@@ -1,32 +1,37 @@
1
- import {Schema, Field, Float32, Uint8, FixedSizeList} from '@loaders.gl/schema';
1
+ import {Schema, Field} from '@loaders.gl/schema';
2
2
  import type {PCDHeader} from './pcd-types';
3
3
 
4
- type SchemaMetadata = Map<string, any>;
5
-
6
4
  /**
7
5
  * Gets schema from PCD header
8
6
  * @param PCDheader
9
7
  * @param metadata
10
8
  * @returns Schema
11
9
  */
12
- export function getPCDSchema(PCDheader: PCDHeader, metadata: SchemaMetadata): Schema {
10
+ export function getPCDSchema(PCDheader: PCDHeader, metadata: Record<string, string>): Schema {
13
11
  const offset = PCDheader.offset;
14
12
 
15
13
  const fields: Field[] = [];
16
14
 
17
15
  if (offset.x !== undefined) {
18
- fields.push(
19
- new Field('POSITION', new FixedSizeList(3, new Field('xyz', new Float32())), false)
20
- );
16
+ fields.push({
17
+ name: 'POSITION',
18
+ type: {type: 'fixed-size-list', listSize: 3, children: [{name: 'xyz', type: 'float32'}]}
19
+ });
21
20
  }
22
21
 
23
22
  if (offset.normal_x !== undefined) {
24
- fields.push(new Field('NORMAL', new FixedSizeList(3, new Field('xyz', new Float32())), false));
23
+ fields.push({
24
+ name: 'NORMAL',
25
+ type: {type: 'fixed-size-list', listSize: 3, children: [{name: 'xyz', type: 'float32'}]}
26
+ });
25
27
  }
26
28
 
27
29
  if (offset.rgb !== undefined) {
28
- fields.push(new Field('COLOR_0', new FixedSizeList(3, new Field('rgb', new Uint8())), false));
30
+ fields.push({
31
+ name: 'COLOR_0',
32
+ type: {type: 'fixed-size-list', listSize: 3, children: [{name: 'rgb', type: 'uint8'}]}
33
+ });
29
34
  }
30
35
 
31
- return new Schema(fields, metadata);
36
+ return {fields, metadata};
32
37
  }
@@ -6,10 +6,16 @@
6
6
  // @author Filipe Caixeta / http://filipecaixeta.com.br
7
7
  // @author Mugen87 / https://github.com/Mugen87
8
8
 
9
+ import {MeshAttribute, MeshAttributes} from '@loaders.gl/schema';
9
10
  import {getMeshBoundingBox} from '@loaders.gl/schema';
10
- import type {MeshAttribute, MeshAttributes} from '@loaders.gl/schema';
11
- import type {PCDHeader} from './pcd-types';
11
+ import {decompressLZF} from './decompress-lzf';
12
12
  import {getPCDSchema} from './get-pcd-schema';
13
+ import type {PCDHeader, PCDMesh} from './pcd-types';
14
+
15
+ type MeshHeader = {
16
+ vertexCount: number;
17
+ boundingBox: [[number, number, number], [number, number, number]];
18
+ };
13
19
 
14
20
  type NormalizedAttributes = {
15
21
  POSITION: {
@@ -37,7 +43,7 @@ const LITTLE_ENDIAN: boolean = true;
37
43
  * @param data
38
44
  * @returns
39
45
  */
40
- export default function parsePCD(data: ArrayBufferLike) {
46
+ export default function parsePCD(data: ArrayBufferLike): PCDMesh {
41
47
  // parse header (always ascii format)
42
48
  const textData = new TextDecoder().decode(data);
43
49
  const pcdHeader = parsePCDHeader(textData);
@@ -55,6 +61,9 @@ export default function parsePCD(data: ArrayBufferLike) {
55
61
  break;
56
62
 
57
63
  case 'binary_compressed':
64
+ attributes = parsePCDBinaryCompressed(pcdHeader, data);
65
+ break;
66
+
58
67
  default:
59
68
  throw new Error(`PCD: ${pcdHeader.data} files are not supported`);
60
69
  }
@@ -63,7 +72,7 @@ export default function parsePCD(data: ArrayBufferLike) {
63
72
 
64
73
  const header = getMeshHeader(pcdHeader, attributes);
65
74
 
66
- const metadata = new Map([
75
+ const metadata = Object.fromEntries([
67
76
  ['mode', '0'],
68
77
  ['boundingBox', JSON.stringify(header.boundingBox)]
69
78
  ]);
@@ -71,19 +80,18 @@ export default function parsePCD(data: ArrayBufferLike) {
71
80
  const schema = getPCDSchema(pcdHeader, metadata);
72
81
 
73
82
  return {
74
- loaderData: {
75
- header: pcdHeader
76
- },
83
+ loader: 'pcd',
84
+ loaderData: pcdHeader,
77
85
  header,
78
86
  schema,
79
87
  mode: 0, // POINTS
80
- indices: null,
88
+ topology: 'point-list',
81
89
  attributes
82
90
  };
83
91
  }
84
92
 
85
93
  // Create a header that contains common data for PointCloud category loaders
86
- function getMeshHeader(pcdHeader: PCDHeader, attributes: NormalizedAttributes): Partial<PCDHeader> {
94
+ function getMeshHeader(pcdHeader: PCDHeader, attributes: NormalizedAttributes): MeshHeader {
87
95
  if (typeof pcdHeader.width === 'number' && typeof pcdHeader.height === 'number') {
88
96
  const pointCount = pcdHeader.width * pcdHeader.height; // Supports "organized" point sets
89
97
  return {
@@ -91,7 +99,10 @@ function getMeshHeader(pcdHeader: PCDHeader, attributes: NormalizedAttributes):
91
99
  boundingBox: getMeshBoundingBox(attributes)
92
100
  };
93
101
  }
94
- return pcdHeader;
102
+ return {
103
+ vertexCount: pcdHeader.vertexCount,
104
+ boundingBox: pcdHeader.boundingBox
105
+ };
95
106
  }
96
107
 
97
108
  /**
@@ -122,6 +133,22 @@ function getMeshAttributes(attributes: HeaderAttributes): {[attributeName: strin
122
133
  };
123
134
  }
124
135
 
136
+ if (attributes.intensity && attributes.intensity.length > 0) {
137
+ // TODO - RGBA
138
+ normalizedAttributes.COLOR_0 = {
139
+ value: new Uint8Array(attributes.color),
140
+ size: 3
141
+ };
142
+ }
143
+
144
+ if (attributes.label && attributes.label.length > 0) {
145
+ // TODO - RGBA
146
+ normalizedAttributes.COLOR_0 = {
147
+ value: new Uint8Array(attributes.label),
148
+ size: 3
149
+ };
150
+ }
151
+
125
152
  return normalizedAttributes;
126
153
  }
127
154
 
@@ -236,11 +263,13 @@ function parsePCDHeader(data: string): PCDHeader {
236
263
  * @param textData
237
264
  * @returns [attributes]
238
265
  */
239
- /* eslint-enable complexity, max-statements */
266
+ // eslint-enable-next-line complexity, max-statements
240
267
  function parsePCDASCII(pcdHeader: PCDHeader, textData: string): HeaderAttributes {
241
268
  const position: number[] = [];
242
269
  const normal: number[] = [];
243
270
  const color: number[] = [];
271
+ const intensity: number[] = [];
272
+ const label: number[] = [];
244
273
 
245
274
  const offset = pcdHeader.offset;
246
275
  const pcdData = textData.substr(pcdHeader.headerLen);
@@ -271,6 +300,14 @@ function parsePCDASCII(pcdHeader: PCDHeader, textData: string): HeaderAttributes
271
300
  normal.push(parseFloat(line[offset.normal_y]));
272
301
  normal.push(parseFloat(line[offset.normal_z]));
273
302
  }
303
+
304
+ if (offset.intensity !== undefined) {
305
+ intensity.push(parseFloat(line[offset.intensity]));
306
+ }
307
+
308
+ if (offset.label !== undefined) {
309
+ label.push(parseInt(line[offset.label]));
310
+ }
274
311
  }
275
312
  }
276
313
 
@@ -286,6 +323,8 @@ function parsePCDBinary(pcdHeader: PCDHeader, data: ArrayBufferLike): HeaderAttr
286
323
  const position: number[] = [];
287
324
  const normal: number[] = [];
288
325
  const color: number[] = [];
326
+ const intensity: number[] = [];
327
+ const label: number[] = [];
289
328
 
290
329
  const dataview = new DataView(data, pcdHeader.headerLen);
291
330
  const offset = pcdHeader.offset;
@@ -308,7 +347,117 @@ function parsePCDBinary(pcdHeader: PCDHeader, data: ArrayBufferLike): HeaderAttr
308
347
  normal.push(dataview.getFloat32(row + offset.normal_y, LITTLE_ENDIAN));
309
348
  normal.push(dataview.getFloat32(row + offset.normal_z, LITTLE_ENDIAN));
310
349
  }
350
+
351
+ if (offset.intensity !== undefined) {
352
+ intensity.push(dataview.getFloat32(row + offset.intensity, LITTLE_ENDIAN));
353
+ }
354
+
355
+ if (offset.label !== undefined) {
356
+ label.push(dataview.getInt32(row + offset.label, LITTLE_ENDIAN));
357
+ }
311
358
  }
312
359
 
313
- return {position, normal, color};
360
+ return {position, normal, color, intensity, label};
361
+ }
362
+
363
+ /** Parse compressed PCD data in in binary_compressed form ( https://pointclouds.org/documentation/tutorials/pcd_file_format.html)
364
+ * from https://github.com/mrdoob/three.js/blob/master/examples/jsm/loaders/PCDLoader.js
365
+ * @license MIT (http://opensource.org/licenses/MIT)
366
+ * @param pcdHeader
367
+ * @param data
368
+ * @returns [attributes]
369
+ */
370
+ // eslint-enable-next-line complexity, max-statements
371
+ function parsePCDBinaryCompressed(pcdHeader: PCDHeader, data: ArrayBufferLike): HeaderAttributes {
372
+ const position: number[] = [];
373
+ const normal: number[] = [];
374
+ const color: number[] = [];
375
+ const intensity: number[] = [];
376
+ const label: number[] = [];
377
+
378
+ const sizes = new Uint32Array(data.slice(pcdHeader.headerLen, pcdHeader.headerLen + 8));
379
+ const compressedSize = sizes[0];
380
+ const decompressedSize = sizes[1];
381
+ const decompressed = decompressLZF(
382
+ new Uint8Array(data, pcdHeader.headerLen + 8, compressedSize),
383
+ decompressedSize
384
+ );
385
+ const dataview = new DataView(decompressed.buffer);
386
+
387
+ const offset = pcdHeader.offset;
388
+
389
+ for (let i = 0; i < pcdHeader.points; i++) {
390
+ if (offset.x !== undefined) {
391
+ position.push(
392
+ dataview.getFloat32(pcdHeader.points * offset.x + pcdHeader.size[0] * i, LITTLE_ENDIAN)
393
+ );
394
+ position.push(
395
+ dataview.getFloat32(pcdHeader.points * offset.y + pcdHeader.size[1] * i, LITTLE_ENDIAN)
396
+ );
397
+ position.push(
398
+ dataview.getFloat32(pcdHeader.points * offset.z + pcdHeader.size[2] * i, LITTLE_ENDIAN)
399
+ );
400
+ }
401
+
402
+ if (offset.rgb !== undefined) {
403
+ color.push(
404
+ dataview.getUint8(pcdHeader.points * offset.rgb + pcdHeader.size[3] * i + 0) / 255.0
405
+ );
406
+ color.push(
407
+ dataview.getUint8(pcdHeader.points * offset.rgb + pcdHeader.size[3] * i + 1) / 255.0
408
+ );
409
+ color.push(
410
+ dataview.getUint8(pcdHeader.points * offset.rgb + pcdHeader.size[3] * i + 2) / 255.0
411
+ );
412
+ }
413
+
414
+ if (offset.normal_x !== undefined) {
415
+ normal.push(
416
+ dataview.getFloat32(
417
+ pcdHeader.points * offset.normal_x + pcdHeader.size[4] * i,
418
+ LITTLE_ENDIAN
419
+ )
420
+ );
421
+ normal.push(
422
+ dataview.getFloat32(
423
+ pcdHeader.points * offset.normal_y + pcdHeader.size[5] * i,
424
+ LITTLE_ENDIAN
425
+ )
426
+ );
427
+ normal.push(
428
+ dataview.getFloat32(
429
+ pcdHeader.points * offset.normal_z + pcdHeader.size[6] * i,
430
+ LITTLE_ENDIAN
431
+ )
432
+ );
433
+ }
434
+
435
+ if (offset.intensity !== undefined) {
436
+ const intensityIndex = pcdHeader.fields.indexOf('intensity');
437
+ intensity.push(
438
+ dataview.getFloat32(
439
+ pcdHeader.points * offset.intensity + pcdHeader.size[intensityIndex] * i,
440
+ LITTLE_ENDIAN
441
+ )
442
+ );
443
+ }
444
+
445
+ if (offset.label !== undefined) {
446
+ const labelIndex = pcdHeader.fields.indexOf('label');
447
+ label.push(
448
+ dataview.getInt32(
449
+ pcdHeader.points * offset.label + pcdHeader.size[labelIndex] * i,
450
+ LITTLE_ENDIAN
451
+ )
452
+ );
453
+ }
454
+ }
455
+
456
+ return {
457
+ position,
458
+ normal,
459
+ color,
460
+ intensity,
461
+ label
462
+ };
314
463
  }
@@ -6,15 +6,15 @@ export type PCDHeader = {
6
6
  data: any;
7
7
  headerLen: number;
8
8
  str: string;
9
- version: RegExpExecArray | null | number;
10
- fields: RegExpExecArray | null | string[];
11
- size: RegExpExecArray | null | number[];
12
- type: RegExpExecArray | null | string[];
13
- count: RegExpExecArray | null | number[];
14
- width: RegExpExecArray | number;
15
- height: RegExpExecArray | number;
16
- viewpoint: RegExpExecArray | null | string;
17
- points: RegExpExecArray | number;
9
+ version: number;
10
+ fields: string[];
11
+ size: number[];
12
+ type: null | string[];
13
+ count: null | number[];
14
+ width: number;
15
+ height: number;
16
+ viewpoint: null | string;
17
+ points: number;
18
18
  offset: {[index: string]: number};
19
19
  rowSize: number;
20
20
  vertexCount: number;
package/src/pcd-loader.ts CHANGED
@@ -1,4 +1,7 @@
1
- import type {Loader} from '@loaders.gl/loader-utils';
1
+ // loaders.gl, MIT license
2
+
3
+ import type {Loader, LoaderOptions} from '@loaders.gl/loader-utils';
4
+ import {PCDMesh} from './lib/pcd-types';
2
5
 
3
6
  // __VERSION__ is injected by babel-plugin-version-inline
4
7
  // @ts-ignore TS2304: Cannot find name '__VERSION__'.
@@ -7,7 +10,7 @@ const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';
7
10
  /**
8
11
  * Worker loader for PCD - Point Cloud Data
9
12
  */
10
- export const PCDLoader = {
13
+ export const PCDLoader: Loader<PCDMesh, never, LoaderOptions> = {
11
14
  name: 'PCD (Point Cloud Data)',
12
15
  id: 'pcd',
13
16
  module: 'pcd',
@@ -19,5 +22,3 @@ export const PCDLoader = {
19
22
  pcd: {}
20
23
  }
21
24
  };
22
-
23
- export const _typecheckPCDLoader: Loader = PCDLoader;
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/bundle.ts"],"names":["moduleExports","require","globalThis","loaders","module","exports","Object","assign"],"mappings":"AACA,MAAMA,aAAa,GAAGC,OAAO,CAAC,SAAD,CAA7B;;AACAC,UAAU,CAACC,OAAX,GAAqBD,UAAU,CAACC,OAAX,IAAsB,EAA3C;AACAC,MAAM,CAACC,OAAP,GAAiBC,MAAM,CAACC,MAAP,CAAcL,UAAU,CAACC,OAAzB,EAAkCH,aAAlC,CAAjB","sourcesContent":["// @ts-nocheck\nconst moduleExports = require('./index');\nglobalThis.loaders = globalThis.loaders || {};\nmodule.exports = Object.assign(globalThis.loaders, moduleExports);\n"],"file":"bundle.js"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["parsePCDSync","PCDLoader","PCDWorkerLoader","parse","arrayBuffer","parseSync","_typecheckPCDLoader"],"mappings":"AACA,OAAOA,YAAP,MAAyB,iBAAzB;AACA,SAAQC,SAAS,IAAIC,eAArB,QAA2C,cAA3C;AAEA,SAAQA,eAAR;AAKA,OAAO,MAAMD,SAAS,GAAG,EACvB,GAAGC,eADoB;AAEvBC,EAAAA,KAAK,EAAE,MAAOC,WAAP,IAAuBJ,YAAY,CAACI,WAAD,CAFnB;AAGvBC,EAAAA,SAAS,EAAEL;AAHY,CAAlB;AAMP,OAAO,MAAMM,mBAAqC,GAAGL,SAA9C","sourcesContent":["import type {LoaderWithParser} from '@loaders.gl/loader-utils';\nimport parsePCDSync from './lib/parse-pcd';\nimport {PCDLoader as PCDWorkerLoader} from './pcd-loader';\n\nexport {PCDWorkerLoader};\n\n/**\n * Loader for PCD - Point Cloud Data\n */\nexport const PCDLoader = {\n ...PCDWorkerLoader,\n parse: async (arrayBuffer) => parsePCDSync(arrayBuffer),\n parseSync: parsePCDSync\n};\n\nexport const _typecheckPCDLoader: LoaderWithParser = PCDLoader;\n"],"file":"index.js"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/lib/get-pcd-schema.ts"],"names":["Schema","Field","Float32","Uint8","FixedSizeList","getPCDSchema","PCDheader","metadata","offset","fields","x","undefined","push","normal_x","rgb"],"mappings":"AAAA,SAAQA,MAAR,EAAgBC,KAAhB,EAAuBC,OAAvB,EAAgCC,KAAhC,EAAuCC,aAAvC,QAA2D,oBAA3D;AAWA,OAAO,SAASC,YAAT,CAAsBC,SAAtB,EAA4CC,QAA5C,EAA8E;AACnF,QAAMC,MAAM,GAAGF,SAAS,CAACE,MAAzB;AAEA,QAAMC,MAAe,GAAG,EAAxB;;AAEA,MAAID,MAAM,CAACE,CAAP,KAAaC,SAAjB,EAA4B;AAC1BF,IAAAA,MAAM,CAACG,IAAP,CACE,IAAIX,KAAJ,CAAU,UAAV,EAAsB,IAAIG,aAAJ,CAAkB,CAAlB,EAAqB,IAAIH,KAAJ,CAAU,KAAV,EAAiB,IAAIC,OAAJ,EAAjB,CAArB,CAAtB,EAA6E,KAA7E,CADF;AAGD;;AAED,MAAIM,MAAM,CAACK,QAAP,KAAoBF,SAAxB,EAAmC;AACjCF,IAAAA,MAAM,CAACG,IAAP,CAAY,IAAIX,KAAJ,CAAU,QAAV,EAAoB,IAAIG,aAAJ,CAAkB,CAAlB,EAAqB,IAAIH,KAAJ,CAAU,KAAV,EAAiB,IAAIC,OAAJ,EAAjB,CAArB,CAApB,EAA2E,KAA3E,CAAZ;AACD;;AAED,MAAIM,MAAM,CAACM,GAAP,KAAeH,SAAnB,EAA8B;AAC5BF,IAAAA,MAAM,CAACG,IAAP,CAAY,IAAIX,KAAJ,CAAU,SAAV,EAAqB,IAAIG,aAAJ,CAAkB,CAAlB,EAAqB,IAAIH,KAAJ,CAAU,KAAV,EAAiB,IAAIE,KAAJ,EAAjB,CAArB,CAArB,EAA0E,KAA1E,CAAZ;AACD;;AAED,SAAO,IAAIH,MAAJ,CAAWS,MAAX,EAAmBF,QAAnB,CAAP;AACD","sourcesContent":["import {Schema, Field, Float32, Uint8, FixedSizeList} from '@loaders.gl/schema';\nimport type {PCDHeader} from './pcd-types';\n\ntype SchemaMetadata = Map<string, any>;\n\n/**\n * Gets schema from PCD header\n * @param PCDheader\n * @param metadata\n * @returns Schema\n */\nexport function getPCDSchema(PCDheader: PCDHeader, metadata: SchemaMetadata): Schema {\n const offset = PCDheader.offset;\n\n const fields: Field[] = [];\n\n if (offset.x !== undefined) {\n fields.push(\n new Field('POSITION', new FixedSizeList(3, new Field('xyz', new Float32())), false)\n );\n }\n\n if (offset.normal_x !== undefined) {\n fields.push(new Field('NORMAL', new FixedSizeList(3, new Field('xyz', new Float32())), false));\n }\n\n if (offset.rgb !== undefined) {\n fields.push(new Field('COLOR_0', new FixedSizeList(3, new Field('rgb', new Uint8())), false));\n }\n\n return new Schema(fields, metadata);\n}\n"],"file":"get-pcd-schema.js"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/lib/parse-pcd.ts"],"names":["getMeshBoundingBox","getPCDSchema","LITTLE_ENDIAN","parsePCD","data","textData","TextDecoder","decode","pcdHeader","parsePCDHeader","attributes","parsePCDASCII","parsePCDBinary","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"],"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 {getMeshBoundingBox} from '@loaders.gl/schema';\nimport type {MeshAttribute, MeshAttributes} from '@loaders.gl/schema';\nimport type {PCDHeader} from './pcd-types';\nimport {getPCDSchema} from './get-pcd-schema';\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 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"],"file":"parse-pcd.js"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[],"file":"pcd-types.js"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/pcd-loader.ts"],"names":["VERSION","PCDLoader","name","id","module","version","worker","extensions","mimeTypes","options","pcd","_typecheckPCDLoader"],"mappings":"AAIA,MAAMA,OAAO,GAAG,2BAAuB,WAAvB,qBAAmD,QAAnE;AAKA,OAAO,MAAMC,SAAS,GAAG;AACvBC,EAAAA,IAAI,EAAE,wBADiB;AAEvBC,EAAAA,EAAE,EAAE,KAFmB;AAGvBC,EAAAA,MAAM,EAAE,KAHe;AAIvBC,EAAAA,OAAO,EAAEL,OAJc;AAKvBM,EAAAA,MAAM,EAAE,IALe;AAMvBC,EAAAA,UAAU,EAAE,CAAC,KAAD,CANW;AAOvBC,EAAAA,SAAS,EAAE,CAAC,YAAD,CAPY;AAQvBC,EAAAA,OAAO,EAAE;AACPC,IAAAA,GAAG,EAAE;AADE;AARc,CAAlB;AAaP,OAAO,MAAMC,mBAA2B,GAAGV,SAApC","sourcesContent":["import type {Loader} from '@loaders.gl/loader-utils';\n\n// __VERSION__ is injected by babel-plugin-version-inline\n// @ts-ignore TS2304: Cannot find name '__VERSION__'.\nconst VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';\n\n/**\n * Worker loader for PCD - Point Cloud Data\n */\nexport const PCDLoader = {\n name: 'PCD (Point Cloud Data)',\n id: 'pcd',\n module: 'pcd',\n version: VERSION,\n worker: true,\n extensions: ['pcd'],\n mimeTypes: ['text/plain'],\n options: {\n pcd: {}\n }\n};\n\nexport const _typecheckPCDLoader: Loader = PCDLoader;\n"],"file":"pcd-loader.js"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/workers/pcd-worker.ts"],"names":["createLoaderWorker","PCDLoader"],"mappings":"AAAA,SAAQA,kBAAR,QAAiC,0BAAjC;AACA,SAAQC,SAAR,QAAwB,UAAxB;AAEAD,kBAAkB,CAACC,SAAD,CAAlB","sourcesContent":["import {createLoaderWorker} from '@loaders.gl/loader-utils';\nimport {PCDLoader} from '../index';\n\ncreateLoaderWorker(PCDLoader);\n"],"file":"pcd-worker.js"}