@loaders.gl/pcd
Version:
Framework-independent loader for the PCD format
8 lines (7 loc) • 29 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../src/index.ts", "../src/lib/parse-pcd.ts", "../src/lib/decompress-lzf.ts", "../src/lib/get-pcd-schema.ts", "../src/pcd-format.ts", "../src/pcd-loader.ts", "../src/pcd-arrow-loader.ts"],
"sourcesContent": ["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright vis.gl contributors\n\nexport type {PCDLoaderOptions} from './pcd-loader';\nexport {PCDWorkerLoader, PCDLoader} from './pcd-loader';\nexport {PCDArrowLoader} from './pcd-arrow-loader';\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// 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 {MeshAttribute, MeshAttributes} from '@loaders.gl/schema';\nimport {getMeshBoundingBox} from '@loaders.gl/schema-utils';\nimport {decompressLZF} from './decompress-lzf';\nimport {getPCDSchema} from './get-pcd-schema';\nimport type {PCDHeader, PCDMesh} from './pcd-types';\n\ntype MeshHeader = {\n vertexCount: number;\n boundingBox: [[number, number, number], [number, number, number]];\n};\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 function parsePCD(data: ArrayBufferLike): PCDMesh {\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 schemaMetadata = Object.fromEntries([\n ['topology', 'point-list'],\n ['mode', '0'],\n ['boundingBox', JSON.stringify(header.boundingBox)]\n ]);\n\n const schema = getPCDSchema(pcdHeader, schemaMetadata);\n\n return {\n loader: 'pcd',\n loaderData: pcdHeader,\n header,\n schema,\n topology: 'point-list',\n mode: 0, // POINTS (deprecated)\n attributes\n };\n}\n\n// Create a header that contains common data for PointCloud category loaders\nfunction getMeshHeader(pcdHeader: PCDHeader, attributes: NormalizedAttributes): MeshHeader {\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 {\n vertexCount: pcdHeader.vertexCount,\n boundingBox: pcdHeader.boundingBox\n };\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 if (attributes.intensity && attributes.intensity.length > 0) {\n // TODO - RGBA\n normalizedAttributes.COLOR_0 = {\n value: new Uint8Array(attributes.color),\n size: 3\n };\n }\n\n if (attributes.label && attributes.label.length > 0) {\n // TODO - RGBA\n normalizedAttributes.COLOR_0 = {\n value: new Uint8Array(attributes.label),\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 for (let i = 0, l = pcdHeader.fields.length; i < l; 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] * pcdHeader.count[i];\n }\n }\n\n // for binary only\n pcdHeader.rowSize = sizeSum;\n return pcdHeader;\n}\n\n/**\n * @param pcdHeader\n * @param textData\n * @returns [attributes]\n */\n// eslint-enable-next-line complexity, max-statements\nfunction parsePCDASCII(pcdHeader: PCDHeader, textData: string): HeaderAttributes {\n const position: number[] = [];\n const normal: number[] = [];\n const color: number[] = [];\n const intensity: number[] = [];\n const label: 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 if (offset.intensity !== undefined) {\n intensity.push(parseFloat(line[offset.intensity]));\n }\n\n if (offset.label !== undefined) {\n label.push(parseInt(line[offset.label]));\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 const intensity: number[] = [];\n const label: 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 if (offset.intensity !== undefined) {\n intensity.push(dataview.getFloat32(row + offset.intensity, LITTLE_ENDIAN));\n }\n\n if (offset.label !== undefined) {\n label.push(dataview.getInt32(row + offset.label, LITTLE_ENDIAN));\n }\n }\n\n return {position, normal, color, intensity, label};\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 */\n// eslint-enable-next-line complexity, max-statements\nfunction parsePCDBinaryCompressed(pcdHeader: PCDHeader, data: ArrayBufferLike): HeaderAttributes {\n const position: number[] = [];\n const normal: number[] = [];\n const color: number[] = [];\n const intensity: number[] = [];\n const label: 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(pcdHeader.points * offset.x + pcdHeader.size[0] * i, LITTLE_ENDIAN)\n );\n position.push(\n dataview.getFloat32(pcdHeader.points * offset.y + pcdHeader.size[1] * i, LITTLE_ENDIAN)\n );\n position.push(\n dataview.getFloat32(pcdHeader.points * offset.z + pcdHeader.size[2] * i, LITTLE_ENDIAN)\n );\n }\n\n if (offset.rgb !== undefined) {\n color.push(\n dataview.getUint8(pcdHeader.points * offset.rgb + pcdHeader.size[3] * i + 0) / 255.0\n );\n color.push(\n dataview.getUint8(pcdHeader.points * offset.rgb + pcdHeader.size[3] * i + 1) / 255.0\n );\n color.push(\n dataview.getUint8(pcdHeader.points * offset.rgb + pcdHeader.size[3] * i + 2) / 255.0\n );\n }\n\n if (offset.normal_x !== undefined) {\n normal.push(\n dataview.getFloat32(\n pcdHeader.points * offset.normal_x + pcdHeader.size[4] * i,\n LITTLE_ENDIAN\n )\n );\n normal.push(\n dataview.getFloat32(\n pcdHeader.points * offset.normal_y + pcdHeader.size[5] * i,\n LITTLE_ENDIAN\n )\n );\n normal.push(\n dataview.getFloat32(\n pcdHeader.points * offset.normal_z + pcdHeader.size[6] * i,\n LITTLE_ENDIAN\n )\n );\n }\n\n if (offset.intensity !== undefined) {\n const intensityIndex = pcdHeader.fields.indexOf('intensity');\n intensity.push(\n dataview.getFloat32(\n pcdHeader.points * offset.intensity + pcdHeader.size[intensityIndex] * i,\n LITTLE_ENDIAN\n )\n );\n }\n\n if (offset.label !== undefined) {\n const labelIndex = pcdHeader.fields.indexOf('label');\n label.push(\n dataview.getInt32(\n pcdHeader.points * offset.label + pcdHeader.size[labelIndex] * i,\n LITTLE_ENDIAN\n )\n );\n }\n }\n\n return {\n position,\n normal,\n color,\n intensity,\n label\n };\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n// Forked from https://gitlab.com/taketwo/three-pcd-loader/blob/master/decompress-lzf.js\n\n/* eslint-disable */\n/**\n * @param inData\n * @param outLength\n * @returns\n */\nexport function decompressLZF(inData: Uint8Array, outLength: number): Uint8Array {\n const inLength = inData.length;\n const outData = new Uint8Array(outLength);\n let inPtr = 0;\n let outPtr = 0;\n let ctrl;\n let len;\n let ref;\n\n do {\n ctrl = inData[inPtr++];\n\n if (ctrl < 1 << 5) {\n ctrl++;\n if (outPtr + ctrl > outLength) {\n throw new Error('Output buffer is not large enough');\n }\n if (inPtr + ctrl > inLength) {\n throw new Error('Invalid compressed data');\n }\n\n do {\n outData[outPtr++] = inData[inPtr++];\n } while (--ctrl);\n } else {\n len = ctrl >> 5;\n ref = outPtr - ((ctrl & 0x1f) << 8) - 1;\n if (inPtr >= inLength) {\n throw new Error('Invalid compressed data');\n }\n\n if (len === 7) {\n len += inData[inPtr++];\n if (inPtr >= inLength) {\n throw new Error('Invalid compressed data');\n }\n }\n\n ref -= inData[inPtr++];\n if (outPtr + len + 2 > outLength) {\n throw new Error('Output buffer is not large enough');\n }\n if (ref < 0) {\n throw new Error('Invalid compressed data');\n }\n if (ref >= outPtr) {\n throw new Error('Invalid compressed data');\n }\n\n do {\n outData[outPtr++] = outData[ref++];\n } while (--len + 2);\n }\n } while (inPtr < inLength);\n\n return outData;\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport {Schema, Field} from '@loaders.gl/schema';\nimport type {PCDHeader} from './pcd-types';\n\n/**\n * Gets schema from PCD header\n * @param PCDheader\n * @param metadata\n * @returns Schema\n */\nexport function getPCDSchema(PCDheader: PCDHeader, metadata: Record<string, string>): Schema {\n const fields: Field[] = [];\n\n for (const key of Object.keys(PCDheader.offset)) {\n switch (key) {\n case 'x':\n fields.push({\n name: 'POSITION',\n type: {type: 'fixed-size-list', listSize: 3, children: [{name: 'xyz', type: 'float32'}]},\n metadata: {attribute: 'POSITION'}\n });\n break;\n case 'y':\n case 'z':\n // ignore\n break;\n\n case 'normal_x':\n fields.push({\n name: 'NORMAL',\n type: {type: 'fixed-size-list', listSize: 3, children: [{name: 'xyz', type: 'float32'}]},\n metadata: {attribute: 'NORMAL'}\n });\n break;\n case 'normal_y':\n case 'normal_z':\n // ignore\n break;\n\n case 'rgb':\n fields.push({\n name: 'COLOR_0',\n type: {type: 'fixed-size-list', listSize: 3, children: [{name: 'rgb', type: 'uint8'}]},\n metadata: {attribute: 'COLOR'}\n });\n break;\n\n default:\n // TODO - push fields\n }\n }\n\n return {fields, metadata};\n}\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Format} from '@loaders.gl/loader-utils';\n\n/**\n * PCD (Point Cloud Data) file format\n */\nexport const PCDFormat = {\n name: 'PCD (Point Cloud Data)',\n id: 'pcd',\n module: 'pcd',\n extensions: ['pcd'],\n mimeTypes: ['text/plain'],\n category: 'pointcloud',\n text: true,\n binary: true\n} as const satisfies Format;\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Loader, LoaderOptions, LoaderWithParser} from '@loaders.gl/loader-utils';\nimport type {PCDMesh} from './lib/pcd-types';\nimport {parsePCD} from './lib/parse-pcd';\nimport {PCDFormat} from './pcd-format';\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\nexport type PCDLoaderOptions = LoaderOptions & {\n pcd?: {\n /** Override the URL to the worker bundle (by default loads from unpkg.com) */\n workerUrl?: string;\n };\n};\n\n/**\n * Worker loader for PCD - Point Cloud Data\n */\nexport const PCDWorkerLoader = {\n ...PCDFormat,\n dataType: null as unknown as PCDMesh,\n batchType: null as never,\n version: VERSION,\n worker: true,\n options: {\n pcd: {}\n }\n} as const satisfies Loader<PCDMesh, never, PCDLoaderOptions>;\n\n/**\n * Loader for PCD - Point Cloud Data\n */\nexport const PCDLoader = {\n ...PCDWorkerLoader,\n parse: async (arrayBuffer) => parsePCD(arrayBuffer),\n parseSync: parsePCD\n} as const satisfies LoaderWithParser<PCDMesh, never, LoaderOptions>;\n", "// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {LoaderWithParser} from '@loaders.gl/loader-utils';\nimport type {ArrowTable} from '@loaders.gl/schema';\n\nimport {PCDLoaderOptions, PCDWorkerLoader} from './pcd-loader';\nimport {convertMeshToTable} from '@loaders.gl/schema-utils';\nimport {parsePCD} from './lib/parse-pcd';\n\n/**\n * Worker loader for PCD - Point Cloud Data\n */\nexport const PCDArrowLoader = {\n ...PCDWorkerLoader,\n dataType: null as unknown as ArrowTable,\n batchType: null as never,\n worker: false,\n parse: async (arrayBuffer: ArrayBuffer) => {\n const mesh = parsePCD(arrayBuffer);\n const arrowTable = convertMeshToTable(mesh, 'arrow-table');\n return arrowTable;\n }\n} as const satisfies LoaderWithParser<ArrowTable, never, PCDLoaderOptions>;\n"],
"mappings": "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",
"names": ["import_schema_utils"]
}