@loaders.gl/ply 3.1.0-alpha.4 → 3.1.0-beta.3
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/bundle.d.ts +2 -0
- package/dist/bundle.d.ts.map +1 -0
- package/dist/bundle.js +1249 -0
- package/dist/es5/bundle.js +1 -1
- package/dist/es5/bundle.js.map +1 -1
- package/dist/es5/index.js +5 -37
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/get-ply-schema.js +3 -3
- package/dist/es5/lib/get-ply-schema.js.map +1 -1
- package/dist/es5/lib/normalize-ply.js +15 -15
- package/dist/es5/lib/normalize-ply.js.map +1 -1
- package/dist/es5/lib/parse-ply-in-batches.js +107 -247
- package/dist/es5/lib/parse-ply-in-batches.js.map +1 -1
- package/dist/es5/lib/parse-ply.js +52 -55
- package/dist/es5/lib/parse-ply.js.map +1 -1
- package/dist/es5/ply-loader.js +3 -3
- package/dist/es5/ply-loader.js.map +1 -1
- package/dist/esm/ply-loader.js +1 -1
- package/dist/esm/ply-loader.js.map +1 -1
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/lib/get-ply-schema.d.ts +10 -0
- package/dist/lib/get-ply-schema.d.ts.map +1 -0
- package/dist/lib/get-ply-schema.js +36 -0
- package/dist/lib/normalize-ply.d.ts +8 -0
- package/dist/lib/normalize-ply.d.ts.map +1 -0
- package/dist/lib/normalize-ply.js +58 -0
- package/dist/lib/parse-ply-in-batches.d.ts +8 -0
- package/dist/lib/parse-ply-in-batches.d.ts.map +1 -0
- package/dist/lib/parse-ply-in-batches.js +253 -0
- package/dist/lib/parse-ply.d.ts +8 -0
- package/dist/lib/parse-ply.d.ts.map +1 -0
- package/dist/lib/parse-ply.js +350 -0
- package/dist/lib/ply-types.d.ts +29 -0
- package/dist/lib/ply-types.d.ts.map +1 -0
- package/dist/lib/ply-types.js +2 -0
- package/dist/ply-loader.d.ts +24 -0
- package/dist/ply-loader.d.ts.map +1 -0
- package/dist/ply-loader.js +28 -0
- package/dist/ply-worker.js +1257 -2
- package/dist/workers/ply-worker.d.ts +2 -0
- package/dist/workers/ply-worker.d.ts.map +1 -0
- package/dist/workers/ply-worker.js +5 -0
- package/package.json +10 -8
- package/dist/dist.min.js +0 -2
- package/dist/dist.min.js.map +0 -1
- package/dist/ply-worker.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/parse-ply-in-batches.ts"],"names":["currentElement","parsePLYInBatches","iterator","options","lineIterator","parsePLYHeader","header","format","parseASCII","attributes","Error","comments","elements","line","trim","lineValues","split","lineType","shift","join","version","push","name","count","parseInt","properties","property","makePLYElementProperty","propertyNameMapping","console","log","propertValues","type","countType","itemType","indices","vertices","normals","uvs","colors","currentElementCount","element","parseASCIIElement","handleElement","parseASCIINumber","n","parseFloat","values","i","length","list","j","buffer","elementName","x","y","z","nx","ny","nz","s","t","red","green","blue","vertexIndices","vertex_indices","vertex_index"],"mappings":"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","sourcesContent":["// PLY Loader, adapted from THREE.js (MIT license)\n//\n// Attributions per original THREE.js source file:\n//\n// @author Wei Meng / http://about.me/menway\n//\n// Description: A loader for PLY ASCII files (known as the Polygon File Format\n// or the Stanford Triangle Format).\n//\n// Limitations: ASCII decoding assumes file is UTF-8.\n//\n// If the PLY file uses non standard property names, they can be mapped while\n// loading. For example, the following maps the properties\n// “diffuse_(red|green|blue)” in the file to standard color names.\n//\n// parsePLY(data, {\n// propertyNameMapping: {\n// diffuse_red: 'red',\n// diffuse_green: 'green',\n// diffuse_blue: 'blue'\n// }\n// });\n// @ts-nocheck\n\nimport {makeLineIterator, makeTextDecoderIterator, forEach} from '@loaders.gl/core';\nimport normalizePLY from './normalize-ply';\nimport {PLYMesh, PLYHeader, ASCIIElement, PLYAttributes} from './ply-types';\n\nlet currentElement: ASCIIElement;\n\n/**\n * PARSER\n * @param iterator\n * @param options\n */\nexport default async function* parsePLYInBatches(\n iterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>,\n options: any\n): AsyncIterable<PLYMesh> {\n const lineIterator = makeLineIterator(makeTextDecoderIterator(iterator));\n const header = await parsePLYHeader(lineIterator, options);\n\n let attributes: PLYAttributes;\n switch (header.format) {\n case 'ascii':\n attributes = await parseASCII(lineIterator, header);\n break;\n default:\n throw new Error('Binary PLY can not yet be parsed in streaming mode');\n // attributes = await parseBinary(lineIterator, header);\n }\n\n yield normalizePLY(header, attributes, options);\n}\n\n/**\n * Parses header\n * @param lineIterator\n * @param options\n * @returns\n */\nasync function parsePLYHeader(\n lineIterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>,\n options: {[key: string]: any}\n): Promise<PLYHeader> {\n const header: PLYHeader = {\n comments: [],\n elements: []\n // headerLength\n };\n\n // Note: forEach does not reset iterator if exiting loop prematurely\n // so that iteration can continue in a second loop\n await forEach(lineIterator, (line: string) => {\n line = line.trim();\n\n // End of header\n if (line === 'end_header') {\n return true; // Returning true cancels `forEach`\n }\n\n // Ignore empty lines\n if (line === '') {\n // eslint-disable-next-line\n return false; // Returning false does not cancel `forEach`\n }\n\n const lineValues = line.split(/\\s+/);\n const lineType = lineValues.shift();\n line = lineValues.join(' ');\n\n switch (lineType) {\n case 'ply':\n // First line magic characters, ignore\n break;\n\n case 'format':\n header.format = lineValues[0];\n header.version = lineValues[1];\n break;\n\n case 'comment':\n header.comments.push(line);\n break;\n\n case 'element':\n if (currentElement) {\n header.elements.push(currentElement);\n }\n\n currentElement = {\n name: lineValues[0],\n count: parseInt(lineValues[1], 10),\n properties: []\n };\n break;\n\n case 'property':\n const property = makePLYElementProperty(lineValues, options.propertyNameMapping);\n currentElement.properties.push(property);\n break;\n\n default:\n // eslint-disable-next-line\n console.log('unhandled', lineType, lineValues);\n }\n\n return false;\n });\n\n if (currentElement) {\n header.elements.push(currentElement);\n }\n\n return header;\n}\n\nfunction makePLYElementProperty(propertValues: string[], propertyNameMapping: []) {\n const property: {[index: string]: string} = {\n type: propertValues[0]\n };\n\n if (property.type === 'list') {\n property.name = propertValues[3];\n property.countType = propertValues[1];\n property.itemType = propertValues[2];\n } else {\n property.name = propertValues[1];\n }\n\n if (propertyNameMapping && property.name in propertyNameMapping) {\n property.name = propertyNameMapping[property.name];\n }\n\n return property;\n}\n\n// ASCII PARSING\n/**\n * @param lineIterator\n * @param header\n * @returns\n */\nasync function parseASCII(lineIterator: string, header: PLYHeader) {\n // PLY ascii format specification, as per http://en.wikipedia.org/wiki/PLY_(file_format)\n const attributes: PLYAttributes = {\n indices: [],\n vertices: [],\n normals: [],\n uvs: [],\n colors: []\n };\n\n let currentElement = 0;\n let currentElementCount = 0;\n\n for await (let line of lineIterator) {\n line = line.trim();\n\n if (line !== '') {\n if (currentElementCount >= header.elements[currentElement].count) {\n currentElement++;\n currentElementCount = 0;\n }\n\n const element = parseASCIIElement(header.elements[currentElement].properties, line);\n handleElement(attributes, header.elements[currentElement].name, element);\n currentElementCount++;\n }\n }\n\n return attributes;\n}\n/**\n * Parses ASCII number\n * @param n\n * @param type\n * @returns ASCII number\n */\n// eslint-disable-next-line complexity\nfunction parseASCIINumber(n: string, type: string): number {\n switch (type) {\n case 'char':\n case 'uchar':\n case 'short':\n case 'ushort':\n case 'int':\n case 'uint':\n case 'int8':\n case 'uint8':\n case 'int16':\n case 'uint16':\n case 'int32':\n case 'uint32':\n return parseInt(n, 10);\n\n case 'float':\n case 'double':\n case 'float32':\n case 'float64':\n return parseFloat(n);\n\n default:\n throw new Error(type);\n }\n}\n/**\n * Parses ASCII element\n * @param properties\n * @param line\n * @returns element\n */\nfunction parseASCIIElement(properties: any[], line: string) {\n const values: any = line.split(/\\s+/);\n\n const element = {};\n\n for (let i = 0; i < properties.length; i++) {\n if (properties[i].type === 'list') {\n const list: any = [];\n const n = parseASCIINumber(values.shift(), properties[i].countType);\n\n for (let j = 0; j < n; j++) {\n list.push(parseASCIINumber(values.shift(), properties[i].itemType));\n }\n\n element[properties[i].name] = list;\n } else {\n element[properties[i].name] = parseASCIINumber(values.shift(), properties[i].type);\n }\n }\n\n return element;\n}\n/**\n * @param buffer\n * @param elementName\n * @param element\n */\n// HELPER FUNCTIONS\n// eslint-disable-next-line complexity\nfunction handleElement(\n buffer: {[index: string]: number[]},\n elementName: string,\n element: any = {}\n) {\n switch (elementName) {\n case 'vertex':\n buffer.vertices.push(element.x, element.y, element.z);\n if ('nx' in element && 'ny' in element && 'nz' in element) {\n buffer.normals.push(element.nx, element.ny, element.nz);\n }\n if ('s' in element && 't' in element) {\n buffer.uvs.push(element.s, element.t);\n }\n if ('red' in element && 'green' in element && 'blue' in element) {\n buffer.colors.push(element.red / 255.0, element.green / 255.0, element.blue / 255.0);\n }\n break;\n\n case 'face':\n const vertexIndices = element.vertex_indices || element.vertex_index; // issue #9338\n if (vertexIndices.length === 3) {\n buffer.indices.push(vertexIndices[0], vertexIndices[1], vertexIndices[2]);\n } else if (vertexIndices.length === 4) {\n buffer.indices.push(vertexIndices[0], vertexIndices[1], vertexIndices[3]);\n buffer.indices.push(vertexIndices[1], vertexIndices[2], vertexIndices[3]);\n }\n break;\n\n default:\n break;\n }\n}\n"],"file":"parse-ply-in-batches.js"}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/parse-ply-in-batches.ts"],"names":["currentElement","parsePLYInBatches","iterator","options","lineIterator","header","parsePLYHeader","attributes","format","parseASCII","Error","comments","elements","line","trim","lineValues","split","lineType","shift","join","version","push","name","count","parseInt","properties","property","makePLYElementProperty","propertyNameMapping","console","log","propertValues","type","countType","itemType","indices","vertices","normals","uvs","colors","currentElementCount","element","parseASCIIElement","handleElement","parseASCIINumber","n","parseFloat","values","i","length","list","j","buffer","elementName","x","y","z","nx","ny","nz","s","t","red","green","blue","vertexIndices","vertex_indices","vertex_index"],"mappings":"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","sourcesContent":["// PLY Loader, adapted from THREE.js (MIT license)\n//\n// Attributions per original THREE.js source file:\n//\n// @author Wei Meng / http://about.me/menway\n//\n// Description: A loader for PLY ASCII files (known as the Polygon File Format\n// or the Stanford Triangle Format).\n//\n// Limitations: ASCII decoding assumes file is UTF-8.\n//\n// If the PLY file uses non standard property names, they can be mapped while\n// loading. For example, the following maps the properties\n// “diffuse_(red|green|blue)” in the file to standard color names.\n//\n// parsePLY(data, {\n// propertyNameMapping: {\n// diffuse_red: 'red',\n// diffuse_green: 'green',\n// diffuse_blue: 'blue'\n// }\n// });\n// @ts-nocheck\n\nimport {makeLineIterator, makeTextDecoderIterator, forEach} from '@loaders.gl/core';\nimport normalizePLY from './normalize-ply';\nimport {PLYMesh, PLYHeader, ASCIIElement, PLYAttributes} from './ply-types';\n\nlet currentElement: ASCIIElement;\n\n/**\n * PARSER\n * @param iterator\n * @param options\n */\nexport default async function* parsePLYInBatches(\n iterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>,\n options: any\n): AsyncIterable<PLYMesh> {\n const lineIterator = makeLineIterator(makeTextDecoderIterator(iterator));\n const header = await parsePLYHeader(lineIterator, options);\n\n let attributes: PLYAttributes;\n switch (header.format) {\n case 'ascii':\n attributes = await parseASCII(lineIterator, header);\n break;\n default:\n throw new Error('Binary PLY can not yet be parsed in streaming mode');\n // attributes = await parseBinary(lineIterator, header);\n }\n\n yield normalizePLY(header, attributes, options);\n}\n\n/**\n * Parses header\n * @param lineIterator\n * @param options\n * @returns\n */\nasync function parsePLYHeader(\n lineIterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>,\n options: {[key: string]: any}\n): Promise<PLYHeader> {\n const header: PLYHeader = {\n comments: [],\n elements: []\n // headerLength\n };\n\n // Note: forEach does not reset iterator if exiting loop prematurely\n // so that iteration can continue in a second loop\n await forEach(lineIterator, (line: string) => {\n line = line.trim();\n\n // End of header\n if (line === 'end_header') {\n return true; // Returning true cancels `forEach`\n }\n\n // Ignore empty lines\n if (line === '') {\n // eslint-disable-next-line\n return false; // Returning false does not cancel `forEach`\n }\n\n const lineValues = line.split(/\\s+/);\n const lineType = lineValues.shift();\n line = lineValues.join(' ');\n\n switch (lineType) {\n case 'ply':\n // First line magic characters, ignore\n break;\n\n case 'format':\n header.format = lineValues[0];\n header.version = lineValues[1];\n break;\n\n case 'comment':\n header.comments.push(line);\n break;\n\n case 'element':\n if (currentElement) {\n header.elements.push(currentElement);\n }\n\n currentElement = {\n name: lineValues[0],\n count: parseInt(lineValues[1], 10),\n properties: []\n };\n break;\n\n case 'property':\n const property = makePLYElementProperty(lineValues, options.propertyNameMapping);\n currentElement.properties.push(property);\n break;\n\n default:\n // eslint-disable-next-line\n console.log('unhandled', lineType, lineValues);\n }\n\n return false;\n });\n\n if (currentElement) {\n header.elements.push(currentElement);\n }\n\n return header;\n}\n\nfunction makePLYElementProperty(propertValues: string[], propertyNameMapping: []) {\n const property: {[index: string]: string} = {\n type: propertValues[0]\n };\n\n if (property.type === 'list') {\n property.name = propertValues[3];\n property.countType = propertValues[1];\n property.itemType = propertValues[2];\n } else {\n property.name = propertValues[1];\n }\n\n if (propertyNameMapping && property.name in propertyNameMapping) {\n property.name = propertyNameMapping[property.name];\n }\n\n return property;\n}\n\n// ASCII PARSING\n/**\n * @param lineIterator\n * @param header\n * @returns\n */\nasync function parseASCII(lineIterator: string, header: PLYHeader) {\n // PLY ascii format specification, as per http://en.wikipedia.org/wiki/PLY_(file_format)\n const attributes: PLYAttributes = {\n indices: [],\n vertices: [],\n normals: [],\n uvs: [],\n colors: []\n };\n\n let currentElement = 0;\n let currentElementCount = 0;\n\n for await (let line of lineIterator) {\n line = line.trim();\n\n if (line !== '') {\n if (currentElementCount >= header.elements[currentElement].count) {\n currentElement++;\n currentElementCount = 0;\n }\n\n const element = parseASCIIElement(header.elements[currentElement].properties, line);\n handleElement(attributes, header.elements[currentElement].name, element);\n currentElementCount++;\n }\n }\n\n return attributes;\n}\n/**\n * Parses ASCII number\n * @param n\n * @param type\n * @returns ASCII number\n */\n// eslint-disable-next-line complexity\nfunction parseASCIINumber(n: string, type: string): number {\n switch (type) {\n case 'char':\n case 'uchar':\n case 'short':\n case 'ushort':\n case 'int':\n case 'uint':\n case 'int8':\n case 'uint8':\n case 'int16':\n case 'uint16':\n case 'int32':\n case 'uint32':\n return parseInt(n, 10);\n\n case 'float':\n case 'double':\n case 'float32':\n case 'float64':\n return parseFloat(n);\n\n default:\n throw new Error(type);\n }\n}\n/**\n * Parses ASCII element\n * @param properties\n * @param line\n * @returns element\n */\nfunction parseASCIIElement(properties: any[], line: string) {\n const values: any = line.split(/\\s+/);\n\n const element = {};\n\n for (let i = 0; i < properties.length; i++) {\n if (properties[i].type === 'list') {\n const list: any = [];\n const n = parseASCIINumber(values.shift(), properties[i].countType);\n\n for (let j = 0; j < n; j++) {\n list.push(parseASCIINumber(values.shift(), properties[i].itemType));\n }\n\n element[properties[i].name] = list;\n } else {\n element[properties[i].name] = parseASCIINumber(values.shift(), properties[i].type);\n }\n }\n\n return element;\n}\n/**\n * @param buffer\n * @param elementName\n * @param element\n */\n// HELPER FUNCTIONS\n// eslint-disable-next-line complexity\nfunction handleElement(\n buffer: {[index: string]: number[]},\n elementName: string,\n element: any = {}\n) {\n switch (elementName) {\n case 'vertex':\n buffer.vertices.push(element.x, element.y, element.z);\n if ('nx' in element && 'ny' in element && 'nz' in element) {\n buffer.normals.push(element.nx, element.ny, element.nz);\n }\n if ('s' in element && 't' in element) {\n buffer.uvs.push(element.s, element.t);\n }\n if ('red' in element && 'green' in element && 'blue' in element) {\n buffer.colors.push(element.red / 255.0, element.green / 255.0, element.blue / 255.0);\n }\n break;\n\n case 'face':\n const vertexIndices = element.vertex_indices || element.vertex_index; // issue #9338\n if (vertexIndices.length === 3) {\n buffer.indices.push(vertexIndices[0], vertexIndices[1], vertexIndices[2]);\n } else if (vertexIndices.length === 4) {\n buffer.indices.push(vertexIndices[0], vertexIndices[1], vertexIndices[3]);\n buffer.indices.push(vertexIndices[1], vertexIndices[2], vertexIndices[3]);\n }\n break;\n\n default:\n break;\n }\n}\n"],"file":"parse-ply-in-batches.js"}
|
|
@@ -9,13 +9,12 @@ exports.default = parsePLY;
|
|
|
9
9
|
|
|
10
10
|
var _normalizePly = _interopRequireDefault(require("./normalize-ply"));
|
|
11
11
|
|
|
12
|
-
function parsePLY(data) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
var attributes;
|
|
12
|
+
function parsePLY(data, options = {}) {
|
|
13
|
+
let header;
|
|
14
|
+
let attributes;
|
|
16
15
|
|
|
17
16
|
if (data instanceof ArrayBuffer) {
|
|
18
|
-
|
|
17
|
+
const text = new TextDecoder().decode(data);
|
|
19
18
|
header = parseHeader(text, options);
|
|
20
19
|
attributes = header.format === 'ascii' ? parseASCII(text, header) : parseBinary(data, header);
|
|
21
20
|
} else {
|
|
@@ -27,33 +26,33 @@ function parsePLY(data) {
|
|
|
27
26
|
}
|
|
28
27
|
|
|
29
28
|
function parseHeader(data, options) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
29
|
+
const PLY_HEADER_PATTERN = /ply([\s\S]*)end_header\s/;
|
|
30
|
+
let headerText = '';
|
|
31
|
+
let headerLength = 0;
|
|
32
|
+
const result = PLY_HEADER_PATTERN.exec(data);
|
|
34
33
|
|
|
35
34
|
if (result !== null) {
|
|
36
35
|
headerText = result[1];
|
|
37
36
|
headerLength = result[0].length;
|
|
38
37
|
}
|
|
39
38
|
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
const lines = headerText.split('\n');
|
|
40
|
+
const header = parseHeaderLines(lines, headerLength, options);
|
|
42
41
|
return header;
|
|
43
42
|
}
|
|
44
43
|
|
|
45
44
|
function parseHeaderLines(lines, headerLength, options) {
|
|
46
|
-
|
|
45
|
+
const header = {
|
|
47
46
|
comments: [],
|
|
48
47
|
elements: [],
|
|
49
|
-
headerLength
|
|
48
|
+
headerLength
|
|
50
49
|
};
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
let lineType;
|
|
51
|
+
let lineValues;
|
|
52
|
+
let currentElement = null;
|
|
54
53
|
|
|
55
|
-
for (
|
|
56
|
-
|
|
54
|
+
for (let i = 0; i < lines.length; i++) {
|
|
55
|
+
let line = lines[i];
|
|
57
56
|
line = line.trim();
|
|
58
57
|
|
|
59
58
|
if (line === '') {
|
|
@@ -107,7 +106,7 @@ function parseHeaderLines(lines, headerLength, options) {
|
|
|
107
106
|
}
|
|
108
107
|
|
|
109
108
|
function makePLYElementProperty(propertValues, propertyNameMapping) {
|
|
110
|
-
|
|
109
|
+
const property = {
|
|
111
110
|
type: propertValues[0]
|
|
112
111
|
};
|
|
113
112
|
|
|
@@ -154,15 +153,15 @@ function parseASCIINumber(n, type) {
|
|
|
154
153
|
}
|
|
155
154
|
|
|
156
155
|
function parseASCIIElement(properties, line) {
|
|
157
|
-
|
|
158
|
-
|
|
156
|
+
const values = line.split(/\s+/);
|
|
157
|
+
const element = {};
|
|
159
158
|
|
|
160
|
-
for (
|
|
159
|
+
for (let i = 0; i < properties.length; i++) {
|
|
161
160
|
if (properties[i].type === 'list') {
|
|
162
|
-
|
|
163
|
-
|
|
161
|
+
const list = [];
|
|
162
|
+
const n = parseASCIINumber(values.shift(), properties[i].countType);
|
|
164
163
|
|
|
165
|
-
for (
|
|
164
|
+
for (let j = 0; j < n; j++) {
|
|
166
165
|
list.push(parseASCIINumber(values.shift(), properties[i].itemType));
|
|
167
166
|
}
|
|
168
167
|
|
|
@@ -176,27 +175,27 @@ function parseASCIIElement(properties, line) {
|
|
|
176
175
|
}
|
|
177
176
|
|
|
178
177
|
function parseASCII(data, header) {
|
|
179
|
-
|
|
178
|
+
const attributes = {
|
|
180
179
|
indices: [],
|
|
181
180
|
vertices: [],
|
|
182
181
|
normals: [],
|
|
183
182
|
uvs: [],
|
|
184
183
|
colors: []
|
|
185
184
|
};
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
185
|
+
let result;
|
|
186
|
+
const patternBody = /end_header\s([\s\S]*)$/;
|
|
187
|
+
let body = '';
|
|
189
188
|
|
|
190
189
|
if ((result = patternBody.exec(data)) !== null) {
|
|
191
190
|
body = result[1];
|
|
192
191
|
}
|
|
193
192
|
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
193
|
+
const lines = body.split('\n');
|
|
194
|
+
let currentElement = 0;
|
|
195
|
+
let currentElementCount = 0;
|
|
197
196
|
|
|
198
|
-
for (
|
|
199
|
-
|
|
197
|
+
for (let i = 0; i < lines.length; i++) {
|
|
198
|
+
let line = lines[i];
|
|
200
199
|
line = line.trim();
|
|
201
200
|
|
|
202
201
|
if (line !== '') {
|
|
@@ -205,7 +204,7 @@ function parseASCII(data, header) {
|
|
|
205
204
|
currentElementCount = 0;
|
|
206
205
|
}
|
|
207
206
|
|
|
208
|
-
|
|
207
|
+
const element = parseASCIIElement(header.elements[currentElement].properties, line);
|
|
209
208
|
handleElement(attributes, header.elements[currentElement].name, element);
|
|
210
209
|
currentElementCount++;
|
|
211
210
|
}
|
|
@@ -214,9 +213,7 @@ function parseASCII(data, header) {
|
|
|
214
213
|
return attributes;
|
|
215
214
|
}
|
|
216
215
|
|
|
217
|
-
function handleElement(buffer, elementName) {
|
|
218
|
-
var element = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
219
|
-
|
|
216
|
+
function handleElement(buffer, elementName, element = {}) {
|
|
220
217
|
if (elementName === 'vertex') {
|
|
221
218
|
buffer.vertices.push(element.x, element.y, element.z);
|
|
222
219
|
|
|
@@ -232,7 +229,7 @@ function handleElement(buffer, elementName) {
|
|
|
232
229
|
buffer.colors.push(element.red, element.green, element.blue);
|
|
233
230
|
}
|
|
234
231
|
} else if (elementName === 'face') {
|
|
235
|
-
|
|
232
|
+
const vertexIndices = element.vertex_indices || element.vertex_index;
|
|
236
233
|
|
|
237
234
|
if (vertexIndices.length === 3) {
|
|
238
235
|
buffer.indices.push(vertexIndices[0], vertexIndices[1], vertexIndices[2]);
|
|
@@ -283,18 +280,18 @@ function binaryRead(dataview, at, type, littleEndian) {
|
|
|
283
280
|
}
|
|
284
281
|
|
|
285
282
|
function binaryReadElement(dataview, at, properties, littleEndian) {
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
283
|
+
const element = {};
|
|
284
|
+
let result;
|
|
285
|
+
let read = 0;
|
|
289
286
|
|
|
290
|
-
for (
|
|
287
|
+
for (let i = 0; i < properties.length; i++) {
|
|
291
288
|
if (properties[i].type === 'list') {
|
|
292
|
-
|
|
289
|
+
const list = [];
|
|
293
290
|
result = binaryRead(dataview, at + read, properties[i].countType, littleEndian);
|
|
294
|
-
|
|
291
|
+
const n = result[0];
|
|
295
292
|
read += result[1];
|
|
296
293
|
|
|
297
|
-
for (
|
|
294
|
+
for (let j = 0; j < n; j++) {
|
|
298
295
|
result = binaryRead(dataview, at + read, properties[i].itemType, littleEndian);
|
|
299
296
|
list.push(result[0]);
|
|
300
297
|
read += result[1];
|
|
@@ -312,25 +309,25 @@ function binaryReadElement(dataview, at, properties, littleEndian) {
|
|
|
312
309
|
}
|
|
313
310
|
|
|
314
311
|
function parseBinary(data, header) {
|
|
315
|
-
|
|
312
|
+
const attributes = {
|
|
316
313
|
indices: [],
|
|
317
314
|
vertices: [],
|
|
318
315
|
normals: [],
|
|
319
316
|
uvs: [],
|
|
320
317
|
colors: []
|
|
321
318
|
};
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
319
|
+
const littleEndian = header.format === 'binary_little_endian';
|
|
320
|
+
const body = new DataView(data, header.headerLength);
|
|
321
|
+
let result;
|
|
322
|
+
let loc = 0;
|
|
326
323
|
|
|
327
|
-
for (
|
|
328
|
-
|
|
324
|
+
for (let currentElement = 0; currentElement < header.elements.length; currentElement++) {
|
|
325
|
+
const count = header.elements[currentElement].count;
|
|
329
326
|
|
|
330
|
-
for (
|
|
327
|
+
for (let currentElementCount = 0; currentElementCount < count; currentElementCount++) {
|
|
331
328
|
result = binaryReadElement(body, loc, header.elements[currentElement].properties, littleEndian);
|
|
332
329
|
loc += result[1];
|
|
333
|
-
|
|
330
|
+
const element = result[0];
|
|
334
331
|
handleElement(attributes, header.elements[currentElement].name, element);
|
|
335
332
|
}
|
|
336
333
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/parse-ply.ts"],"names":["parsePLY","data","options","header","attributes","ArrayBuffer","text","TextDecoder","decode","parseHeader","format","parseASCII","parseBinary","PLY_HEADER_PATTERN","headerText","headerLength","result","exec","length","lines","split","parseHeaderLines","comments","elements","lineType","lineValues","currentElement","i","line","trim","shift","join","version","push","name","count","parseInt","properties","makePLYElementProperty","propertyNameMapping","console","log","undefined","propertValues","property","type","countType","itemType","parseASCIINumber","n","parseFloat","Error","parseASCIIElement","values","element","list","j","indices","vertices","normals","uvs","colors","patternBody","body","currentElementCount","handleElement","buffer","elementName","x","y","z","nx","ny","nz","s","t","red","green","blue","vertexIndices","vertex_indices","vertex_index","binaryRead","dataview","at","littleEndian","getInt8","getUint8","getInt16","getUint16","getInt32","getUint32","getFloat32","getFloat64","binaryReadElement","read","DataView","loc"],"mappings":"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","sourcesContent":["// PLY Loader, adapted from THREE.js (MIT license)\n//\n// Attributions per original THREE.js source file:\n//\n// @author Wei Meng / http://about.me/menway\n//\n// Description: A loader for PLY ASCII files (known as the Polygon File Format\n// or the Stanford Triangle Format).\n//\n// Limitations: ASCII decoding assumes file is UTF-8.\n//\n// If the PLY file uses non standard property names, they can be mapped while\n// loading. For example, the following maps the properties\n// “diffuse_(red|green|blue)” in the file to standard color names.\n//\n// parsePLY(data, {\n// propertyNameMapping: {\n// diffuse_red: 'red',\n// diffuse_green: 'green',\n// diffuse_blue: 'blue'\n// }\n// });\nimport type {\n PLYMesh,\n PLYHeader,\n PLYAttributes,\n MeshHeader,\n ASCIIElement,\n PLYProperty\n} from './ply-types';\nimport normalizePLY from './normalize-ply';\n\n/**\n * @param data\n * @param options\n * @returns\n */\nexport default function parsePLY(data: ArrayBuffer | string, options = {}): PLYMesh {\n let header: PLYHeader & MeshHeader;\n let attributes: PLYAttributes;\n\n if (data instanceof ArrayBuffer) {\n const text = new TextDecoder().decode(data);\n header = parseHeader(text, options);\n attributes = header.format === 'ascii' ? parseASCII(text, header) : parseBinary(data, header);\n } else {\n header = parseHeader(data, options);\n attributes = parseASCII(data, header);\n }\n\n return normalizePLY(header, attributes);\n}\n\n/**\n * @param data\n * @param options\n * @returns header\n */\nfunction parseHeader(data: any, options: {[index: string]: any}): PLYHeader {\n const PLY_HEADER_PATTERN = /ply([\\s\\S]*)end_header\\s/;\n\n let headerText = '';\n let headerLength = 0;\n\n const result = PLY_HEADER_PATTERN.exec(data);\n\n if (result !== null) {\n headerText = result[1];\n headerLength = result[0].length;\n }\n const lines = headerText.split('\\n');\n const header = parseHeaderLines(lines, headerLength, options);\n\n return header;\n}\n\n/**\n * @param lines\n * @param headerLength\n * @param options\n * @returns header\n */\nfunction parseHeaderLines(\n lines: string[],\n headerLength: number,\n options: {[index: string]: any}\n): PLYHeader {\n const header: PLYHeader = {\n comments: [],\n elements: [],\n headerLength\n };\n\n let lineType: string | undefined;\n let lineValues: string[];\n let currentElement: ASCIIElement | null = null;\n\n for (let i = 0; i < lines.length; i++) {\n let line: string = lines[i];\n line = line.trim();\n\n if (line === '') {\n // eslint-disable-next-line\n continue;\n }\n\n lineValues = line.split(/\\s+/);\n lineType = lineValues.shift();\n line = lineValues.join(' ');\n\n switch (lineType) {\n case 'format':\n header.format = lineValues[0];\n header.version = lineValues[1];\n break;\n\n case 'comment':\n header.comments.push(line);\n break;\n\n case 'element':\n if (currentElement) {\n header.elements.push(currentElement);\n }\n\n currentElement = {\n name: lineValues[0],\n count: parseInt(lineValues[1], 10),\n properties: []\n };\n break;\n\n case 'property':\n if (!currentElement) {\n break;\n }\n currentElement.properties.push(\n makePLYElementProperty(lineValues, options.propertyNameMapping)\n );\n break;\n\n default:\n // eslint-disable-next-line\n console.log('unhandled', lineType, lineValues);\n }\n }\n\n if (currentElement !== undefined) {\n header.elements.push(currentElement);\n }\n\n return header;\n}\n\n/**\n * @param propertValues\n * @param propertyNameMapping\n * @returns property of ply element\n */\nfunction makePLYElementProperty(propertValues: string[], propertyNameMapping: []): PLYProperty {\n const property: PLYProperty = {\n type: propertValues[0]\n };\n\n if (property.type === 'list') {\n property.name = propertValues[3];\n property.countType = propertValues[1];\n property.itemType = propertValues[2];\n } else {\n property.name = propertValues[1];\n }\n\n if (propertyNameMapping && property.name in propertyNameMapping) {\n property.name = propertyNameMapping[property.name];\n }\n\n return property;\n}\n\n/**\n * Parses ASCII number\n * @param n\n * @param type\n * @returns\n */\n// eslint-disable-next-line complexity\nfunction parseASCIINumber(n: string, type: string): number {\n switch (type) {\n case 'char':\n case 'uchar':\n case 'short':\n case 'ushort':\n case 'int':\n case 'uint':\n case 'int8':\n case 'uint8':\n case 'int16':\n case 'uint16':\n case 'int32':\n case 'uint32':\n return parseInt(n, 10);\n\n case 'float':\n case 'double':\n case 'float32':\n case 'float64':\n return parseFloat(n);\n\n default:\n throw new Error(type);\n }\n}\n\n/**\n * @param properties\n * @param line\n * @returns ASCII element\n */\nfunction parseASCIIElement(properties: any[], line: string) {\n const values: any = line.split(/\\s+/);\n\n const element = {};\n\n for (let i = 0; i < properties.length; i++) {\n if (properties[i].type === 'list') {\n const list: any = [];\n const n = parseASCIINumber(values.shift(), properties[i].countType);\n\n for (let j = 0; j < n; j++) {\n list.push(parseASCIINumber(values.shift(), properties[i].itemType));\n }\n\n element[properties[i].name] = list;\n } else {\n element[properties[i].name] = parseASCIINumber(values.shift(), properties[i].type);\n }\n }\n\n return element;\n}\n\n/**\n * @param data\n * @param header\n * @returns [attributes]\n */\nfunction parseASCII(data: any, header: PLYHeader): PLYAttributes {\n // PLY ascii format specification, as per http://en.wikipedia.org/wiki/PLY_(file_format)\n\n const attributes: PLYAttributes = {\n indices: [],\n vertices: [],\n normals: [],\n uvs: [],\n colors: []\n };\n\n let result: RegExpExecArray | null;\n\n const patternBody = /end_header\\s([\\s\\S]*)$/;\n let body = '';\n if ((result = patternBody.exec(data)) !== null) {\n body = result[1];\n }\n\n const lines = body.split('\\n');\n let currentElement = 0;\n let currentElementCount = 0;\n\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i];\n line = line.trim();\n\n if (line !== '') {\n if (currentElementCount >= header.elements[currentElement].count) {\n currentElement++;\n currentElementCount = 0;\n }\n\n const element = parseASCIIElement(header.elements[currentElement].properties, line);\n handleElement(attributes, header.elements[currentElement].name, element);\n currentElementCount++;\n }\n }\n\n return attributes;\n}\n\n/**\n * @param buffer\n * @param elementName\n * @param element\n */\n// eslint-disable-next-line complexity\nfunction handleElement(\n buffer: {[index: string]: number[]},\n elementName: string,\n element: any = {}\n) {\n if (elementName === 'vertex') {\n buffer.vertices.push(element.x, element.y, element.z);\n\n if ('nx' in element && 'ny' in element && 'nz' in element) {\n buffer.normals.push(element.nx, element.ny, element.nz);\n }\n\n if ('s' in element && 't' in element) {\n buffer.uvs.push(element.s, element.t);\n }\n\n if ('red' in element && 'green' in element && 'blue' in element) {\n buffer.colors.push(element.red, element.green, element.blue);\n }\n } else if (elementName === 'face') {\n const vertexIndices = element.vertex_indices || element.vertex_index; // issue #9338\n\n if (vertexIndices.length === 3) {\n buffer.indices.push(vertexIndices[0], vertexIndices[1], vertexIndices[2]);\n } else if (vertexIndices.length === 4) {\n buffer.indices.push(vertexIndices[0], vertexIndices[1], vertexIndices[3]);\n buffer.indices.push(vertexIndices[1], vertexIndices[2], vertexIndices[3]);\n }\n }\n}\n\n/**\n * Reads binary data\n * @param dataview\n * @param at\n * @param type\n * @param littleEndian\n * @returns [number, number]\n */\n// eslint-disable-next-line complexity\nfunction binaryRead(dataview: DataView, at: number, type: any, littleEndian: boolean): number[] {\n switch (type) {\n // corespondences for non-specific length types here match rply:\n case 'int8':\n case 'char':\n return [dataview.getInt8(at), 1];\n case 'uint8':\n case 'uchar':\n return [dataview.getUint8(at), 1];\n case 'int16':\n case 'short':\n return [dataview.getInt16(at, littleEndian), 2];\n case 'uint16':\n case 'ushort':\n return [dataview.getUint16(at, littleEndian), 2];\n case 'int32':\n case 'int':\n return [dataview.getInt32(at, littleEndian), 4];\n case 'uint32':\n case 'uint':\n return [dataview.getUint32(at, littleEndian), 4];\n case 'float32':\n case 'float':\n return [dataview.getFloat32(at, littleEndian), 4];\n case 'float64':\n case 'double':\n return [dataview.getFloat64(at, littleEndian), 8];\n\n default:\n throw new Error(type);\n }\n}\n\n/**\n * Reads binary data\n * @param dataview\n * @param at\n * @param properties\n * @param littleEndian\n * @returns [object, number]\n */\nfunction binaryReadElement(\n dataview: DataView,\n at: number,\n properties: {[index: string]: any},\n littleEndian: boolean\n): {}[] {\n const element = {};\n let result: number[];\n let read = 0;\n\n for (let i = 0; i < properties.length; i++) {\n if (properties[i].type === 'list') {\n const list = [];\n\n result = binaryRead(dataview, at + read, properties[i].countType, littleEndian);\n const n = result[0];\n read += result[1];\n\n for (let j = 0; j < n; j++) {\n result = binaryRead(dataview, at + read, properties[i].itemType, littleEndian);\n // @ts-ignore\n list.push(result[0]);\n read += result[1];\n }\n\n element[properties[i].name] = list;\n } else {\n result = binaryRead(dataview, at + read, properties[i].type, littleEndian);\n element[properties[i].name] = result[0];\n read += result[1];\n }\n }\n\n return [element, read];\n}\n\ntype BinaryAttributes = {\n [index: string]: number[];\n};\n\n/**\n * Parses binary data\n * @param data\n * @param header\n * @returns [attributes] of data\n */\nfunction parseBinary(data: ArrayBuffer, header: {[index: string]: any}): BinaryAttributes {\n const attributes: BinaryAttributes = {\n indices: [],\n vertices: [],\n normals: [],\n uvs: [],\n colors: []\n };\n\n const littleEndian = header.format === 'binary_little_endian';\n const body = new DataView(data, header.headerLength);\n let result: any[];\n let loc = 0;\n\n for (let currentElement = 0; currentElement < header.elements.length; currentElement++) {\n const count = header.elements[currentElement].count;\n for (let currentElementCount = 0; currentElementCount < count; currentElementCount++) {\n result = binaryReadElement(\n body,\n loc,\n header.elements[currentElement].properties,\n littleEndian\n );\n loc += result[1];\n const element = result[0];\n\n handleElement(attributes, header.elements[currentElement].name, element);\n }\n }\n\n return attributes;\n}\n"],"file":"parse-ply.js"}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/parse-ply.ts"],"names":["parsePLY","data","options","header","attributes","ArrayBuffer","text","TextDecoder","decode","parseHeader","format","parseASCII","parseBinary","PLY_HEADER_PATTERN","headerText","headerLength","result","exec","length","lines","split","parseHeaderLines","comments","elements","lineType","lineValues","currentElement","i","line","trim","shift","join","version","push","name","count","parseInt","properties","makePLYElementProperty","propertyNameMapping","console","log","undefined","propertValues","property","type","countType","itemType","parseASCIINumber","n","parseFloat","Error","parseASCIIElement","values","element","list","j","indices","vertices","normals","uvs","colors","patternBody","body","currentElementCount","handleElement","buffer","elementName","x","y","z","nx","ny","nz","s","t","red","green","blue","vertexIndices","vertex_indices","vertex_index","binaryRead","dataview","at","littleEndian","getInt8","getUint8","getInt16","getUint16","getInt32","getUint32","getFloat32","getFloat64","binaryReadElement","read","DataView","loc"],"mappings":"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","sourcesContent":["// PLY Loader, adapted from THREE.js (MIT license)\n//\n// Attributions per original THREE.js source file:\n//\n// @author Wei Meng / http://about.me/menway\n//\n// Description: A loader for PLY ASCII files (known as the Polygon File Format\n// or the Stanford Triangle Format).\n//\n// Limitations: ASCII decoding assumes file is UTF-8.\n//\n// If the PLY file uses non standard property names, they can be mapped while\n// loading. For example, the following maps the properties\n// “diffuse_(red|green|blue)” in the file to standard color names.\n//\n// parsePLY(data, {\n// propertyNameMapping: {\n// diffuse_red: 'red',\n// diffuse_green: 'green',\n// diffuse_blue: 'blue'\n// }\n// });\nimport type {\n PLYMesh,\n PLYHeader,\n PLYAttributes,\n MeshHeader,\n ASCIIElement,\n PLYProperty\n} from './ply-types';\nimport normalizePLY from './normalize-ply';\n\n/**\n * @param data\n * @param options\n * @returns\n */\nexport default function parsePLY(data: ArrayBuffer | string, options = {}): PLYMesh {\n let header: PLYHeader & MeshHeader;\n let attributes: PLYAttributes;\n\n if (data instanceof ArrayBuffer) {\n const text = new TextDecoder().decode(data);\n header = parseHeader(text, options);\n attributes = header.format === 'ascii' ? parseASCII(text, header) : parseBinary(data, header);\n } else {\n header = parseHeader(data, options);\n attributes = parseASCII(data, header);\n }\n\n return normalizePLY(header, attributes);\n}\n\n/**\n * @param data\n * @param options\n * @returns header\n */\nfunction parseHeader(data: any, options: {[index: string]: any}): PLYHeader {\n const PLY_HEADER_PATTERN = /ply([\\s\\S]*)end_header\\s/;\n\n let headerText = '';\n let headerLength = 0;\n\n const result = PLY_HEADER_PATTERN.exec(data);\n\n if (result !== null) {\n headerText = result[1];\n headerLength = result[0].length;\n }\n const lines = headerText.split('\\n');\n const header = parseHeaderLines(lines, headerLength, options);\n\n return header;\n}\n\n/**\n * @param lines\n * @param headerLength\n * @param options\n * @returns header\n */\nfunction parseHeaderLines(\n lines: string[],\n headerLength: number,\n options: {[index: string]: any}\n): PLYHeader {\n const header: PLYHeader = {\n comments: [],\n elements: [],\n headerLength\n };\n\n let lineType: string | undefined;\n let lineValues: string[];\n let currentElement: ASCIIElement | null = null;\n\n for (let i = 0; i < lines.length; i++) {\n let line: string = lines[i];\n line = line.trim();\n\n if (line === '') {\n // eslint-disable-next-line\n continue;\n }\n\n lineValues = line.split(/\\s+/);\n lineType = lineValues.shift();\n line = lineValues.join(' ');\n\n switch (lineType) {\n case 'format':\n header.format = lineValues[0];\n header.version = lineValues[1];\n break;\n\n case 'comment':\n header.comments.push(line);\n break;\n\n case 'element':\n if (currentElement) {\n header.elements.push(currentElement);\n }\n\n currentElement = {\n name: lineValues[0],\n count: parseInt(lineValues[1], 10),\n properties: []\n };\n break;\n\n case 'property':\n if (!currentElement) {\n break;\n }\n currentElement.properties.push(\n makePLYElementProperty(lineValues, options.propertyNameMapping)\n );\n break;\n\n default:\n // eslint-disable-next-line\n console.log('unhandled', lineType, lineValues);\n }\n }\n\n if (currentElement !== undefined) {\n header.elements.push(currentElement);\n }\n\n return header;\n}\n\n/**\n * @param propertValues\n * @param propertyNameMapping\n * @returns property of ply element\n */\nfunction makePLYElementProperty(propertValues: string[], propertyNameMapping: []): PLYProperty {\n const property: PLYProperty = {\n type: propertValues[0]\n };\n\n if (property.type === 'list') {\n property.name = propertValues[3];\n property.countType = propertValues[1];\n property.itemType = propertValues[2];\n } else {\n property.name = propertValues[1];\n }\n\n if (propertyNameMapping && property.name in propertyNameMapping) {\n property.name = propertyNameMapping[property.name];\n }\n\n return property;\n}\n\n/**\n * Parses ASCII number\n * @param n\n * @param type\n * @returns\n */\n// eslint-disable-next-line complexity\nfunction parseASCIINumber(n: string, type: string): number {\n switch (type) {\n case 'char':\n case 'uchar':\n case 'short':\n case 'ushort':\n case 'int':\n case 'uint':\n case 'int8':\n case 'uint8':\n case 'int16':\n case 'uint16':\n case 'int32':\n case 'uint32':\n return parseInt(n, 10);\n\n case 'float':\n case 'double':\n case 'float32':\n case 'float64':\n return parseFloat(n);\n\n default:\n throw new Error(type);\n }\n}\n\n/**\n * @param properties\n * @param line\n * @returns ASCII element\n */\nfunction parseASCIIElement(properties: any[], line: string) {\n const values: any = line.split(/\\s+/);\n\n const element = {};\n\n for (let i = 0; i < properties.length; i++) {\n if (properties[i].type === 'list') {\n const list: any = [];\n const n = parseASCIINumber(values.shift(), properties[i].countType);\n\n for (let j = 0; j < n; j++) {\n list.push(parseASCIINumber(values.shift(), properties[i].itemType));\n }\n\n element[properties[i].name] = list;\n } else {\n element[properties[i].name] = parseASCIINumber(values.shift(), properties[i].type);\n }\n }\n\n return element;\n}\n\n/**\n * @param data\n * @param header\n * @returns [attributes]\n */\nfunction parseASCII(data: any, header: PLYHeader): PLYAttributes {\n // PLY ascii format specification, as per http://en.wikipedia.org/wiki/PLY_(file_format)\n\n const attributes: PLYAttributes = {\n indices: [],\n vertices: [],\n normals: [],\n uvs: [],\n colors: []\n };\n\n let result: RegExpExecArray | null;\n\n const patternBody = /end_header\\s([\\s\\S]*)$/;\n let body = '';\n if ((result = patternBody.exec(data)) !== null) {\n body = result[1];\n }\n\n const lines = body.split('\\n');\n let currentElement = 0;\n let currentElementCount = 0;\n\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i];\n line = line.trim();\n\n if (line !== '') {\n if (currentElementCount >= header.elements[currentElement].count) {\n currentElement++;\n currentElementCount = 0;\n }\n\n const element = parseASCIIElement(header.elements[currentElement].properties, line);\n handleElement(attributes, header.elements[currentElement].name, element);\n currentElementCount++;\n }\n }\n\n return attributes;\n}\n\n/**\n * @param buffer\n * @param elementName\n * @param element\n */\n// eslint-disable-next-line complexity\nfunction handleElement(\n buffer: {[index: string]: number[]},\n elementName: string,\n element: any = {}\n) {\n if (elementName === 'vertex') {\n buffer.vertices.push(element.x, element.y, element.z);\n\n if ('nx' in element && 'ny' in element && 'nz' in element) {\n buffer.normals.push(element.nx, element.ny, element.nz);\n }\n\n if ('s' in element && 't' in element) {\n buffer.uvs.push(element.s, element.t);\n }\n\n if ('red' in element && 'green' in element && 'blue' in element) {\n buffer.colors.push(element.red, element.green, element.blue);\n }\n } else if (elementName === 'face') {\n const vertexIndices = element.vertex_indices || element.vertex_index; // issue #9338\n\n if (vertexIndices.length === 3) {\n buffer.indices.push(vertexIndices[0], vertexIndices[1], vertexIndices[2]);\n } else if (vertexIndices.length === 4) {\n buffer.indices.push(vertexIndices[0], vertexIndices[1], vertexIndices[3]);\n buffer.indices.push(vertexIndices[1], vertexIndices[2], vertexIndices[3]);\n }\n }\n}\n\n/**\n * Reads binary data\n * @param dataview\n * @param at\n * @param type\n * @param littleEndian\n * @returns [number, number]\n */\n// eslint-disable-next-line complexity\nfunction binaryRead(dataview: DataView, at: number, type: any, littleEndian: boolean): number[] {\n switch (type) {\n // corespondences for non-specific length types here match rply:\n case 'int8':\n case 'char':\n return [dataview.getInt8(at), 1];\n case 'uint8':\n case 'uchar':\n return [dataview.getUint8(at), 1];\n case 'int16':\n case 'short':\n return [dataview.getInt16(at, littleEndian), 2];\n case 'uint16':\n case 'ushort':\n return [dataview.getUint16(at, littleEndian), 2];\n case 'int32':\n case 'int':\n return [dataview.getInt32(at, littleEndian), 4];\n case 'uint32':\n case 'uint':\n return [dataview.getUint32(at, littleEndian), 4];\n case 'float32':\n case 'float':\n return [dataview.getFloat32(at, littleEndian), 4];\n case 'float64':\n case 'double':\n return [dataview.getFloat64(at, littleEndian), 8];\n\n default:\n throw new Error(type);\n }\n}\n\n/**\n * Reads binary data\n * @param dataview\n * @param at\n * @param properties\n * @param littleEndian\n * @returns [object, number]\n */\nfunction binaryReadElement(\n dataview: DataView,\n at: number,\n properties: {[index: string]: any},\n littleEndian: boolean\n): {}[] {\n const element = {};\n let result: number[];\n let read = 0;\n\n for (let i = 0; i < properties.length; i++) {\n if (properties[i].type === 'list') {\n const list = [];\n\n result = binaryRead(dataview, at + read, properties[i].countType, littleEndian);\n const n = result[0];\n read += result[1];\n\n for (let j = 0; j < n; j++) {\n result = binaryRead(dataview, at + read, properties[i].itemType, littleEndian);\n // @ts-ignore\n list.push(result[0]);\n read += result[1];\n }\n\n element[properties[i].name] = list;\n } else {\n result = binaryRead(dataview, at + read, properties[i].type, littleEndian);\n element[properties[i].name] = result[0];\n read += result[1];\n }\n }\n\n return [element, read];\n}\n\ntype BinaryAttributes = {\n [index: string]: number[];\n};\n\n/**\n * Parses binary data\n * @param data\n * @param header\n * @returns [attributes] of data\n */\nfunction parseBinary(data: ArrayBuffer, header: {[index: string]: any}): BinaryAttributes {\n const attributes: BinaryAttributes = {\n indices: [],\n vertices: [],\n normals: [],\n uvs: [],\n colors: []\n };\n\n const littleEndian = header.format === 'binary_little_endian';\n const body = new DataView(data, header.headerLength);\n let result: any[];\n let loc = 0;\n\n for (let currentElement = 0; currentElement < header.elements.length; currentElement++) {\n const count = header.elements[currentElement].count;\n for (let currentElementCount = 0; currentElementCount < count; currentElementCount++) {\n result = binaryReadElement(\n body,\n loc,\n header.elements[currentElement].properties,\n littleEndian\n );\n loc += result[1];\n const element = result[0];\n\n handleElement(attributes, header.elements[currentElement].name, element);\n }\n }\n\n return attributes;\n}\n"],"file":"parse-ply.js"}
|
package/dist/es5/ply-loader.js
CHANGED
|
@@ -4,8 +4,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports._typecheckPLYLoader = exports.PLYLoader = void 0;
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
const VERSION = typeof "3.1.0-beta.3" !== 'undefined' ? "3.1.0-beta.3" : 'latest';
|
|
8
|
+
const PLYLoader = {
|
|
9
9
|
name: 'PLY',
|
|
10
10
|
id: 'ply',
|
|
11
11
|
module: 'ply',
|
|
@@ -22,6 +22,6 @@ var PLYLoader = {
|
|
|
22
22
|
}
|
|
23
23
|
};
|
|
24
24
|
exports.PLYLoader = PLYLoader;
|
|
25
|
-
|
|
25
|
+
const _typecheckPLYLoader = PLYLoader;
|
|
26
26
|
exports._typecheckPLYLoader = _typecheckPLYLoader;
|
|
27
27
|
//# sourceMappingURL=ply-loader.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ply-loader.ts"],"names":["VERSION","PLYLoader","name","id","module","shapes","version","worker","extensions","mimeTypes","text","binary","tests","options","ply","_typecheckPLYLoader"],"mappings":";;;;;;AAKA,
|
|
1
|
+
{"version":3,"sources":["../../src/ply-loader.ts"],"names":["VERSION","PLYLoader","name","id","module","shapes","version","worker","extensions","mimeTypes","text","binary","tests","options","ply","_typecheckPLYLoader"],"mappings":";;;;;;AAKA,MAAMA,OAAO,GAAG,0BAAuB,WAAvB,oBAAmD,QAAnE;AAOO,MAAMC,SAAS,GAAG;AACvBC,EAAAA,IAAI,EAAE,KADiB;AAEvBC,EAAAA,EAAE,EAAE,KAFmB;AAGvBC,EAAAA,MAAM,EAAE,KAHe;AAIvBC,EAAAA,MAAM,EAAE,CAAC,MAAD,EAAS,MAAT,EAAiB,gBAAjB,CAJe;AAKvBC,EAAAA,OAAO,EAAEN,OALc;AAMvBO,EAAAA,MAAM,EAAE,IANe;AAOvBC,EAAAA,UAAU,EAAE,CAAC,KAAD,CAPW;AAQvBC,EAAAA,SAAS,EAAE,CAAC,YAAD,EAAe,0BAAf,CARY;AASvBC,EAAAA,IAAI,EAAE,IATiB;AAUvBC,EAAAA,MAAM,EAAE,IAVe;AAWvBC,EAAAA,KAAK,EAAE,CAAC,KAAD,CAXgB;AAYvBC,EAAAA,OAAO,EAAE;AACPC,IAAAA,GAAG,EAAE;AADE;AAZc,CAAlB;;AAiBA,MAAMC,mBAA2B,GAAGd,SAApC","sourcesContent":["// PLY Loader\nimport 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 PLY - Polygon File Format (aka Stanford Triangle Format)'\n * links: ['http://paulbourke.net/dataformats/ply/',\n * 'https://en.wikipedia.org/wiki/PLY_(file_format)']\n */\nexport const PLYLoader = {\n name: 'PLY',\n id: 'ply',\n module: 'ply',\n shapes: ['mesh', 'gltf', 'columnar-table'],\n version: VERSION,\n worker: true,\n extensions: ['ply'],\n mimeTypes: ['text/plain', 'application/octet-stream'],\n text: true,\n binary: true,\n tests: ['ply'],\n options: {\n ply: {}\n }\n};\n\nexport const _typecheckPLYLoader: Loader = PLYLoader;\n"],"file":"ply-loader.js"}
|
package/dist/esm/ply-loader.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/ply-loader.ts"],"names":["VERSION","PLYLoader","name","id","module","shapes","version","worker","extensions","mimeTypes","text","binary","tests","options","ply","_typecheckPLYLoader"],"mappings":"AAKA,MAAMA,OAAO,GAAG,
|
|
1
|
+
{"version":3,"sources":["../../src/ply-loader.ts"],"names":["VERSION","PLYLoader","name","id","module","shapes","version","worker","extensions","mimeTypes","text","binary","tests","options","ply","_typecheckPLYLoader"],"mappings":"AAKA,MAAMA,OAAO,GAAG,0BAAuB,WAAvB,oBAAmD,QAAnE;AAOA,OAAO,MAAMC,SAAS,GAAG;AACvBC,EAAAA,IAAI,EAAE,KADiB;AAEvBC,EAAAA,EAAE,EAAE,KAFmB;AAGvBC,EAAAA,MAAM,EAAE,KAHe;AAIvBC,EAAAA,MAAM,EAAE,CAAC,MAAD,EAAS,MAAT,EAAiB,gBAAjB,CAJe;AAKvBC,EAAAA,OAAO,EAAEN,OALc;AAMvBO,EAAAA,MAAM,EAAE,IANe;AAOvBC,EAAAA,UAAU,EAAE,CAAC,KAAD,CAPW;AAQvBC,EAAAA,SAAS,EAAE,CAAC,YAAD,EAAe,0BAAf,CARY;AASvBC,EAAAA,IAAI,EAAE,IATiB;AAUvBC,EAAAA,MAAM,EAAE,IAVe;AAWvBC,EAAAA,KAAK,EAAE,CAAC,KAAD,CAXgB;AAYvBC,EAAAA,OAAO,EAAE;AACPC,IAAAA,GAAG,EAAE;AADE;AAZc,CAAlB;AAiBP,OAAO,MAAMC,mBAA2B,GAAGd,SAApC","sourcesContent":["// PLY Loader\nimport 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 PLY - Polygon File Format (aka Stanford Triangle Format)'\n * links: ['http://paulbourke.net/dataformats/ply/',\n * 'https://en.wikipedia.org/wiki/PLY_(file_format)']\n */\nexport const PLYLoader = {\n name: 'PLY',\n id: 'ply',\n module: 'ply',\n shapes: ['mesh', 'gltf', 'columnar-table'],\n version: VERSION,\n worker: true,\n extensions: ['ply'],\n mimeTypes: ['text/plain', 'application/octet-stream'],\n text: true,\n binary: true,\n tests: ['ply'],\n options: {\n ply: {}\n }\n};\n\nexport const _typecheckPLYLoader: Loader = PLYLoader;\n"],"file":"ply-loader.js"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { LoaderWithParser } from '@loaders.gl/loader-utils';
|
|
2
|
+
import { PLYLoader as PLYWorkerLoader } from './ply-loader';
|
|
3
|
+
import parsePLY from './lib/parse-ply';
|
|
4
|
+
import parsePLYInBatches from './lib/parse-ply-in-batches';
|
|
5
|
+
export { PLYWorkerLoader };
|
|
6
|
+
/**
|
|
7
|
+
* Loader for PLY - Polygon File Format
|
|
8
|
+
*/
|
|
9
|
+
export declare const PLYLoader: {
|
|
10
|
+
parse: (arrayBuffer: any, options: any) => Promise<import("./lib/ply-types").PLYMesh>;
|
|
11
|
+
parseTextSync: typeof parsePLY;
|
|
12
|
+
parseSync: typeof parsePLY;
|
|
13
|
+
parseInBatches: typeof parsePLYInBatches;
|
|
14
|
+
name: string;
|
|
15
|
+
id: string;
|
|
16
|
+
module: string;
|
|
17
|
+
shapes: string[];
|
|
18
|
+
version: any;
|
|
19
|
+
worker: boolean;
|
|
20
|
+
extensions: string[];
|
|
21
|
+
mimeTypes: string[];
|
|
22
|
+
text: boolean;
|
|
23
|
+
binary: boolean;
|
|
24
|
+
tests: string[];
|
|
25
|
+
options: {
|
|
26
|
+
ply: {};
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
export declare const _typecheckPLYLoader: LoaderWithParser;
|
|
30
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAC,SAAS,IAAI,eAAe,EAAC,MAAM,cAAc,CAAC;AAC1D,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AACvC,OAAO,iBAAiB,MAAM,4BAA4B,CAAC;AAI3D,OAAO,EAAC,eAAe,EAAC,CAAC;AAEzB;;GAEG;AACH,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;CAOrB,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,gBAA4B,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports._typecheckPLYLoader = exports.PLYLoader = exports.PLYWorkerLoader = void 0;
|
|
7
|
+
const ply_loader_1 = require("./ply-loader");
|
|
8
|
+
Object.defineProperty(exports, "PLYWorkerLoader", { enumerable: true, get: function () { return ply_loader_1.PLYLoader; } });
|
|
9
|
+
const parse_ply_1 = __importDefault(require("./lib/parse-ply"));
|
|
10
|
+
const parse_ply_in_batches_1 = __importDefault(require("./lib/parse-ply-in-batches"));
|
|
11
|
+
/**
|
|
12
|
+
* Loader for PLY - Polygon File Format
|
|
13
|
+
*/
|
|
14
|
+
exports.PLYLoader = {
|
|
15
|
+
...ply_loader_1.PLYLoader,
|
|
16
|
+
// Note: parsePLY supports both text and binary
|
|
17
|
+
parse: async (arrayBuffer, options) => (0, parse_ply_1.default)(arrayBuffer, options),
|
|
18
|
+
parseTextSync: parse_ply_1.default,
|
|
19
|
+
parseSync: parse_ply_1.default,
|
|
20
|
+
parseInBatches: parse_ply_in_batches_1.default
|
|
21
|
+
};
|
|
22
|
+
exports._typecheckPLYLoader = exports.PLYLoader;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Schema, MeshAttributes } from '@loaders.gl/schema';
|
|
2
|
+
import type { PLYHeader } from './ply-types';
|
|
3
|
+
/**
|
|
4
|
+
* Gets schema from PLY header
|
|
5
|
+
* @param plyHeader
|
|
6
|
+
* @param metadata
|
|
7
|
+
* @returns Schema
|
|
8
|
+
*/
|
|
9
|
+
export declare function getPLYSchema(plyHeader: PLYHeader, attributes: MeshAttributes): Schema;
|
|
10
|
+
//# sourceMappingURL=get-ply-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-ply-schema.d.ts","sourceRoot":"","sources":["../../src/lib/get-ply-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,MAAM,EAAE,cAAc,EAAmB,MAAM,oBAAoB,CAAC;AAC5E,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,aAAa,CAAC;AAE3C;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,GAAG,MAAM,CAIrF"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getPLYSchema = void 0;
|
|
4
|
+
const schema_1 = require("@loaders.gl/schema");
|
|
5
|
+
/**
|
|
6
|
+
* Gets schema from PLY header
|
|
7
|
+
* @param plyHeader
|
|
8
|
+
* @param metadata
|
|
9
|
+
* @returns Schema
|
|
10
|
+
*/
|
|
11
|
+
function getPLYSchema(plyHeader, attributes) {
|
|
12
|
+
const metadataMap = makeMetadataFromPlyHeader(plyHeader);
|
|
13
|
+
const schema = (0, schema_1.deduceMeshSchema)(attributes, metadataMap);
|
|
14
|
+
return schema;
|
|
15
|
+
}
|
|
16
|
+
exports.getPLYSchema = getPLYSchema;
|
|
17
|
+
/**
|
|
18
|
+
* Make arrow like schema metadata by PlyHeader properties
|
|
19
|
+
* @param plyHeader
|
|
20
|
+
* @returns
|
|
21
|
+
*/
|
|
22
|
+
function makeMetadataFromPlyHeader(plyHeader) {
|
|
23
|
+
const metadataMap = new Map();
|
|
24
|
+
metadataMap.set('ply_comments', JSON.stringify(plyHeader.comments));
|
|
25
|
+
metadataMap.set('ply_elements', JSON.stringify(plyHeader.elements));
|
|
26
|
+
if (plyHeader.format !== undefined) {
|
|
27
|
+
metadataMap.set('ply_format', plyHeader.format);
|
|
28
|
+
}
|
|
29
|
+
if (plyHeader.version !== undefined) {
|
|
30
|
+
metadataMap.set('ply_version', plyHeader.version);
|
|
31
|
+
}
|
|
32
|
+
if (plyHeader.headerLength !== undefined) {
|
|
33
|
+
metadataMap.set('ply_headerLength', plyHeader.headerLength.toString(10));
|
|
34
|
+
}
|
|
35
|
+
return metadataMap;
|
|
36
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { PLYMesh, PLYHeader, PLYAttributes, MeshHeader } from './ply-types';
|
|
2
|
+
/**
|
|
3
|
+
* @param header
|
|
4
|
+
* @param attributes
|
|
5
|
+
* @returns data and header
|
|
6
|
+
*/
|
|
7
|
+
export default function normalizePLY(plyHeader: MeshHeader & PLYHeader, plyAttributes: PLYAttributes, options?: {}): PLYMesh;
|
|
8
|
+
//# sourceMappingURL=normalize-ply.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-ply.d.ts","sourceRoot":"","sources":["../../src/lib/normalize-ply.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAC,MAAM,aAAa,CAAC;AAG/E;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAClC,SAAS,EAAE,UAAU,GAAG,SAAS,EACjC,aAAa,EAAE,aAAa,EAC5B,OAAO,CAAC,EAAE,EAAE,GACX,OAAO,CAgCT"}
|