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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/bundle.js +2 -2
  2. package/dist/bundle.js.map +1 -0
  3. package/dist/dist.min.js +3 -11
  4. package/dist/index.js +11 -21
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/get-ply-schema.js +24 -33
  7. package/dist/lib/get-ply-schema.js.map +1 -0
  8. package/dist/lib/normalize-ply.js +65 -54
  9. package/dist/lib/normalize-ply.js.map +1 -0
  10. package/dist/lib/parse-ply-in-batches.d.ts.map +1 -1
  11. package/dist/lib/parse-ply-in-batches.js +200 -235
  12. package/dist/lib/parse-ply-in-batches.js.map +1 -0
  13. package/dist/lib/parse-ply.js +297 -320
  14. package/dist/lib/parse-ply.js.map +1 -0
  15. package/dist/lib/ply-types.js +2 -2
  16. package/dist/{es5/lib → lib}/ply-types.js.map +0 -0
  17. package/dist/ply-loader.js +18 -27
  18. package/dist/ply-loader.js.map +1 -0
  19. package/dist/ply-worker.js +1 -1
  20. package/dist/workers/ply-worker.js +4 -5
  21. package/dist/workers/ply-worker.js.map +1 -0
  22. package/package.json +7 -10
  23. package/src/lib/parse-ply-in-batches.ts +3 -4
  24. package/dist/es5/bundle.js +0 -7
  25. package/dist/es5/bundle.js.map +0 -1
  26. package/dist/es5/index.js +0 -63
  27. package/dist/es5/index.js.map +0 -1
  28. package/dist/es5/lib/get-ply-schema.js +0 -35
  29. package/dist/es5/lib/get-ply-schema.js.map +0 -1
  30. package/dist/es5/lib/normalize-ply.js +0 -78
  31. package/dist/es5/lib/normalize-ply.js.map +0 -1
  32. package/dist/es5/lib/parse-ply-in-batches.js +0 -370
  33. package/dist/es5/lib/parse-ply-in-batches.js.map +0 -1
  34. package/dist/es5/lib/parse-ply.js +0 -340
  35. package/dist/es5/lib/parse-ply.js.map +0 -1
  36. package/dist/es5/lib/ply-types.js +0 -2
  37. package/dist/es5/ply-loader.js +0 -27
  38. package/dist/es5/ply-loader.js.map +0 -1
  39. package/dist/es5/workers/ply-worker.js +0 -8
  40. package/dist/es5/workers/ply-worker.js.map +0 -1
  41. package/dist/esm/bundle.js +0 -5
  42. package/dist/esm/bundle.js.map +0 -1
  43. package/dist/esm/index.js +0 -12
  44. package/dist/esm/index.js.map +0 -1
  45. package/dist/esm/lib/get-ply-schema.js +0 -27
  46. package/dist/esm/lib/get-ply-schema.js.map +0 -1
  47. package/dist/esm/lib/normalize-ply.js +0 -69
  48. package/dist/esm/lib/normalize-ply.js.map +0 -1
  49. package/dist/esm/lib/parse-ply-in-batches.js +0 -218
  50. package/dist/esm/lib/parse-ply-in-batches.js.map +0 -1
  51. package/dist/esm/lib/parse-ply.js +0 -327
  52. package/dist/esm/lib/parse-ply.js.map +0 -1
  53. package/dist/esm/lib/ply-types.js +0 -2
  54. package/dist/esm/lib/ply-types.js.map +0 -1
  55. package/dist/esm/ply-loader.js +0 -19
  56. package/dist/esm/ply-loader.js.map +0 -1
  57. package/dist/esm/workers/ply-worker.js +0 -4
  58. package/dist/esm/workers/ply-worker.js.map +0 -1
@@ -1,350 +1,327 @@
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
- const normalize_ply_1 = __importDefault(require("./normalize-ply"));
7
- /**
8
- * @param data
9
- * @param options
10
- * @returns
11
- */
12
- function parsePLY(data, options = {}) {
13
- let header;
14
- let attributes;
15
- if (data instanceof ArrayBuffer) {
16
- const text = new TextDecoder().decode(data);
17
- header = parseHeader(text, options);
18
- attributes = header.format === 'ascii' ? parseASCII(text, header) : parseBinary(data, header);
19
- }
20
- else {
21
- header = parseHeader(data, options);
22
- attributes = parseASCII(data, header);
23
- }
24
- return (0, normalize_ply_1.default)(header, attributes);
1
+ import normalizePLY from './normalize-ply';
2
+ export default function parsePLY(data, options = {}) {
3
+ let header;
4
+ let attributes;
5
+
6
+ if (data instanceof ArrayBuffer) {
7
+ const text = new TextDecoder().decode(data);
8
+ header = parseHeader(text, options);
9
+ attributes = header.format === 'ascii' ? parseASCII(text, header) : parseBinary(data, header);
10
+ } else {
11
+ header = parseHeader(data, options);
12
+ attributes = parseASCII(data, header);
13
+ }
14
+
15
+ return normalizePLY(header, attributes);
25
16
  }
26
- exports.default = parsePLY;
27
- /**
28
- * @param data
29
- * @param options
30
- * @returns header
31
- */
17
+
32
18
  function parseHeader(data, options) {
33
- const PLY_HEADER_PATTERN = /ply([\s\S]*)end_header\s/;
34
- let headerText = '';
35
- let headerLength = 0;
36
- const result = PLY_HEADER_PATTERN.exec(data);
37
- if (result !== null) {
38
- headerText = result[1];
39
- headerLength = result[0].length;
40
- }
41
- const lines = headerText.split('\n');
42
- const header = parseHeaderLines(lines, headerLength, options);
43
- return header;
19
+ const PLY_HEADER_PATTERN = /ply([\s\S]*)end_header\s/;
20
+ let headerText = '';
21
+ let headerLength = 0;
22
+ const result = PLY_HEADER_PATTERN.exec(data);
23
+
24
+ if (result !== null) {
25
+ headerText = result[1];
26
+ headerLength = result[0].length;
27
+ }
28
+
29
+ const lines = headerText.split('\n');
30
+ const header = parseHeaderLines(lines, headerLength, options);
31
+ return header;
44
32
  }
45
- /**
46
- * @param lines
47
- * @param headerLength
48
- * @param options
49
- * @returns header
50
- */
33
+
51
34
  function parseHeaderLines(lines, headerLength, options) {
52
- const header = {
53
- comments: [],
54
- elements: [],
55
- headerLength
56
- };
57
- let lineType;
58
- let lineValues;
59
- let currentElement = null;
60
- for (let i = 0; i < lines.length; i++) {
61
- let line = lines[i];
62
- line = line.trim();
63
- if (line === '') {
64
- // eslint-disable-next-line
65
- continue;
35
+ const header = {
36
+ comments: [],
37
+ elements: [],
38
+ headerLength
39
+ };
40
+ let lineType;
41
+ let lineValues;
42
+ let currentElement = null;
43
+
44
+ for (let i = 0; i < lines.length; i++) {
45
+ let line = lines[i];
46
+ line = line.trim();
47
+
48
+ if (line === '') {
49
+ continue;
50
+ }
51
+
52
+ lineValues = line.split(/\s+/);
53
+ lineType = lineValues.shift();
54
+ line = lineValues.join(' ');
55
+
56
+ switch (lineType) {
57
+ case 'format':
58
+ header.format = lineValues[0];
59
+ header.version = lineValues[1];
60
+ break;
61
+
62
+ case 'comment':
63
+ header.comments.push(line);
64
+ break;
65
+
66
+ case 'element':
67
+ if (currentElement) {
68
+ header.elements.push(currentElement);
66
69
  }
67
- lineValues = line.split(/\s+/);
68
- lineType = lineValues.shift();
69
- line = lineValues.join(' ');
70
- switch (lineType) {
71
- case 'format':
72
- header.format = lineValues[0];
73
- header.version = lineValues[1];
74
- break;
75
- case 'comment':
76
- header.comments.push(line);
77
- break;
78
- case 'element':
79
- if (currentElement) {
80
- header.elements.push(currentElement);
81
- }
82
- currentElement = {
83
- name: lineValues[0],
84
- count: parseInt(lineValues[1], 10),
85
- properties: []
86
- };
87
- break;
88
- case 'property':
89
- if (!currentElement) {
90
- break;
91
- }
92
- currentElement.properties.push(makePLYElementProperty(lineValues, options.propertyNameMapping));
93
- break;
94
- default:
95
- // eslint-disable-next-line
96
- console.log('unhandled', lineType, lineValues);
70
+
71
+ currentElement = {
72
+ name: lineValues[0],
73
+ count: parseInt(lineValues[1], 10),
74
+ properties: []
75
+ };
76
+ break;
77
+
78
+ case 'property':
79
+ if (!currentElement) {
80
+ break;
97
81
  }
82
+
83
+ currentElement.properties.push(makePLYElementProperty(lineValues, options.propertyNameMapping));
84
+ break;
85
+
86
+ default:
87
+ console.log('unhandled', lineType, lineValues);
98
88
  }
99
- if (currentElement !== undefined) {
100
- header.elements.push(currentElement);
101
- }
102
- return header;
89
+ }
90
+
91
+ if (currentElement !== undefined) {
92
+ header.elements.push(currentElement);
93
+ }
94
+
95
+ return header;
103
96
  }
104
- /**
105
- * @param propertValues
106
- * @param propertyNameMapping
107
- * @returns property of ply element
108
- */
97
+
109
98
  function makePLYElementProperty(propertValues, propertyNameMapping) {
110
- const property = {
111
- type: propertValues[0]
112
- };
113
- if (property.type === 'list') {
114
- property.name = propertValues[3];
115
- property.countType = propertValues[1];
116
- property.itemType = propertValues[2];
117
- }
118
- else {
119
- property.name = propertValues[1];
120
- }
121
- if (propertyNameMapping && property.name in propertyNameMapping) {
122
- property.name = propertyNameMapping[property.name];
123
- }
124
- return property;
99
+ const property = {
100
+ type: propertValues[0]
101
+ };
102
+
103
+ if (property.type === 'list') {
104
+ property.name = propertValues[3];
105
+ property.countType = propertValues[1];
106
+ property.itemType = propertValues[2];
107
+ } else {
108
+ property.name = propertValues[1];
109
+ }
110
+
111
+ if (propertyNameMapping && property.name in propertyNameMapping) {
112
+ property.name = propertyNameMapping[property.name];
113
+ }
114
+
115
+ return property;
125
116
  }
126
- /**
127
- * Parses ASCII number
128
- * @param n
129
- * @param type
130
- * @returns
131
- */
132
- // eslint-disable-next-line complexity
117
+
133
118
  function parseASCIINumber(n, type) {
134
- switch (type) {
135
- case 'char':
136
- case 'uchar':
137
- case 'short':
138
- case 'ushort':
139
- case 'int':
140
- case 'uint':
141
- case 'int8':
142
- case 'uint8':
143
- case 'int16':
144
- case 'uint16':
145
- case 'int32':
146
- case 'uint32':
147
- return parseInt(n, 10);
148
- case 'float':
149
- case 'double':
150
- case 'float32':
151
- case 'float64':
152
- return parseFloat(n);
153
- default:
154
- throw new Error(type);
155
- }
119
+ switch (type) {
120
+ case 'char':
121
+ case 'uchar':
122
+ case 'short':
123
+ case 'ushort':
124
+ case 'int':
125
+ case 'uint':
126
+ case 'int8':
127
+ case 'uint8':
128
+ case 'int16':
129
+ case 'uint16':
130
+ case 'int32':
131
+ case 'uint32':
132
+ return parseInt(n, 10);
133
+
134
+ case 'float':
135
+ case 'double':
136
+ case 'float32':
137
+ case 'float64':
138
+ return parseFloat(n);
139
+
140
+ default:
141
+ throw new Error(type);
142
+ }
156
143
  }
157
- /**
158
- * @param properties
159
- * @param line
160
- * @returns ASCII element
161
- */
144
+
162
145
  function parseASCIIElement(properties, line) {
163
- const values = line.split(/\s+/);
164
- const element = {};
165
- for (let i = 0; i < properties.length; i++) {
166
- if (properties[i].type === 'list') {
167
- const list = [];
168
- const n = parseASCIINumber(values.shift(), properties[i].countType);
169
- for (let j = 0; j < n; j++) {
170
- list.push(parseASCIINumber(values.shift(), properties[i].itemType));
171
- }
172
- element[properties[i].name] = list;
173
- }
174
- else {
175
- element[properties[i].name] = parseASCIINumber(values.shift(), properties[i].type);
176
- }
146
+ const values = line.split(/\s+/);
147
+ const element = {};
148
+
149
+ for (let i = 0; i < properties.length; i++) {
150
+ if (properties[i].type === 'list') {
151
+ const list = [];
152
+ const n = parseASCIINumber(values.shift(), properties[i].countType);
153
+
154
+ for (let j = 0; j < n; j++) {
155
+ list.push(parseASCIINumber(values.shift(), properties[i].itemType));
156
+ }
157
+
158
+ element[properties[i].name] = list;
159
+ } else {
160
+ element[properties[i].name] = parseASCIINumber(values.shift(), properties[i].type);
177
161
  }
178
- return element;
162
+ }
163
+
164
+ return element;
179
165
  }
180
- /**
181
- * @param data
182
- * @param header
183
- * @returns [attributes]
184
- */
166
+
185
167
  function parseASCII(data, header) {
186
- // PLY ascii format specification, as per http://en.wikipedia.org/wiki/PLY_(file_format)
187
- const attributes = {
188
- indices: [],
189
- vertices: [],
190
- normals: [],
191
- uvs: [],
192
- colors: []
193
- };
194
- let result;
195
- const patternBody = /end_header\s([\s\S]*)$/;
196
- let body = '';
197
- if ((result = patternBody.exec(data)) !== null) {
198
- body = result[1];
199
- }
200
- const lines = body.split('\n');
201
- let currentElement = 0;
202
- let currentElementCount = 0;
203
- for (let i = 0; i < lines.length; i++) {
204
- let line = lines[i];
205
- line = line.trim();
206
- if (line !== '') {
207
- if (currentElementCount >= header.elements[currentElement].count) {
208
- currentElement++;
209
- currentElementCount = 0;
210
- }
211
- const element = parseASCIIElement(header.elements[currentElement].properties, line);
212
- handleElement(attributes, header.elements[currentElement].name, element);
213
- currentElementCount++;
214
- }
168
+ const attributes = {
169
+ indices: [],
170
+ vertices: [],
171
+ normals: [],
172
+ uvs: [],
173
+ colors: []
174
+ };
175
+ let result;
176
+ const patternBody = /end_header\s([\s\S]*)$/;
177
+ let body = '';
178
+
179
+ if ((result = patternBody.exec(data)) !== null) {
180
+ body = result[1];
181
+ }
182
+
183
+ const lines = body.split('\n');
184
+ let currentElement = 0;
185
+ let currentElementCount = 0;
186
+
187
+ for (let i = 0; i < lines.length; i++) {
188
+ let line = lines[i];
189
+ line = line.trim();
190
+
191
+ if (line !== '') {
192
+ if (currentElementCount >= header.elements[currentElement].count) {
193
+ currentElement++;
194
+ currentElementCount = 0;
195
+ }
196
+
197
+ const element = parseASCIIElement(header.elements[currentElement].properties, line);
198
+ handleElement(attributes, header.elements[currentElement].name, element);
199
+ currentElementCount++;
215
200
  }
216
- return attributes;
201
+ }
202
+
203
+ return attributes;
217
204
  }
218
- /**
219
- * @param buffer
220
- * @param elementName
221
- * @param element
222
- */
223
- // eslint-disable-next-line complexity
205
+
224
206
  function handleElement(buffer, elementName, element = {}) {
225
- if (elementName === 'vertex') {
226
- buffer.vertices.push(element.x, element.y, element.z);
227
- if ('nx' in element && 'ny' in element && 'nz' in element) {
228
- buffer.normals.push(element.nx, element.ny, element.nz);
229
- }
230
- if ('s' in element && 't' in element) {
231
- buffer.uvs.push(element.s, element.t);
232
- }
233
- if ('red' in element && 'green' in element && 'blue' in element) {
234
- buffer.colors.push(element.red, element.green, element.blue);
235
- }
207
+ if (elementName === 'vertex') {
208
+ buffer.vertices.push(element.x, element.y, element.z);
209
+
210
+ if ('nx' in element && 'ny' in element && 'nz' in element) {
211
+ buffer.normals.push(element.nx, element.ny, element.nz);
236
212
  }
237
- else if (elementName === 'face') {
238
- const vertexIndices = element.vertex_indices || element.vertex_index; // issue #9338
239
- if (vertexIndices.length === 3) {
240
- buffer.indices.push(vertexIndices[0], vertexIndices[1], vertexIndices[2]);
241
- }
242
- else if (vertexIndices.length === 4) {
243
- buffer.indices.push(vertexIndices[0], vertexIndices[1], vertexIndices[3]);
244
- buffer.indices.push(vertexIndices[1], vertexIndices[2], vertexIndices[3]);
245
- }
213
+
214
+ if ('s' in element && 't' in element) {
215
+ buffer.uvs.push(element.s, element.t);
246
216
  }
217
+
218
+ if ('red' in element && 'green' in element && 'blue' in element) {
219
+ buffer.colors.push(element.red, element.green, element.blue);
220
+ }
221
+ } else if (elementName === 'face') {
222
+ const vertexIndices = element.vertex_indices || element.vertex_index;
223
+
224
+ if (vertexIndices.length === 3) {
225
+ buffer.indices.push(vertexIndices[0], vertexIndices[1], vertexIndices[2]);
226
+ } else if (vertexIndices.length === 4) {
227
+ buffer.indices.push(vertexIndices[0], vertexIndices[1], vertexIndices[3]);
228
+ buffer.indices.push(vertexIndices[1], vertexIndices[2], vertexIndices[3]);
229
+ }
230
+ }
247
231
  }
248
- /**
249
- * Reads binary data
250
- * @param dataview
251
- * @param at
252
- * @param type
253
- * @param littleEndian
254
- * @returns [number, number]
255
- */
256
- // eslint-disable-next-line complexity
232
+
257
233
  function binaryRead(dataview, at, type, littleEndian) {
258
- switch (type) {
259
- // corespondences for non-specific length types here match rply:
260
- case 'int8':
261
- case 'char':
262
- return [dataview.getInt8(at), 1];
263
- case 'uint8':
264
- case 'uchar':
265
- return [dataview.getUint8(at), 1];
266
- case 'int16':
267
- case 'short':
268
- return [dataview.getInt16(at, littleEndian), 2];
269
- case 'uint16':
270
- case 'ushort':
271
- return [dataview.getUint16(at, littleEndian), 2];
272
- case 'int32':
273
- case 'int':
274
- return [dataview.getInt32(at, littleEndian), 4];
275
- case 'uint32':
276
- case 'uint':
277
- return [dataview.getUint32(at, littleEndian), 4];
278
- case 'float32':
279
- case 'float':
280
- return [dataview.getFloat32(at, littleEndian), 4];
281
- case 'float64':
282
- case 'double':
283
- return [dataview.getFloat64(at, littleEndian), 8];
284
- default:
285
- throw new Error(type);
286
- }
234
+ switch (type) {
235
+ case 'int8':
236
+ case 'char':
237
+ return [dataview.getInt8(at), 1];
238
+
239
+ case 'uint8':
240
+ case 'uchar':
241
+ return [dataview.getUint8(at), 1];
242
+
243
+ case 'int16':
244
+ case 'short':
245
+ return [dataview.getInt16(at, littleEndian), 2];
246
+
247
+ case 'uint16':
248
+ case 'ushort':
249
+ return [dataview.getUint16(at, littleEndian), 2];
250
+
251
+ case 'int32':
252
+ case 'int':
253
+ return [dataview.getInt32(at, littleEndian), 4];
254
+
255
+ case 'uint32':
256
+ case 'uint':
257
+ return [dataview.getUint32(at, littleEndian), 4];
258
+
259
+ case 'float32':
260
+ case 'float':
261
+ return [dataview.getFloat32(at, littleEndian), 4];
262
+
263
+ case 'float64':
264
+ case 'double':
265
+ return [dataview.getFloat64(at, littleEndian), 8];
266
+
267
+ default:
268
+ throw new Error(type);
269
+ }
287
270
  }
288
- /**
289
- * Reads binary data
290
- * @param dataview
291
- * @param at
292
- * @param properties
293
- * @param littleEndian
294
- * @returns [object, number]
295
- */
271
+
296
272
  function binaryReadElement(dataview, at, properties, littleEndian) {
297
- const element = {};
298
- let result;
299
- let read = 0;
300
- for (let i = 0; i < properties.length; i++) {
301
- if (properties[i].type === 'list') {
302
- const list = [];
303
- result = binaryRead(dataview, at + read, properties[i].countType, littleEndian);
304
- const n = result[0];
305
- read += result[1];
306
- for (let j = 0; j < n; j++) {
307
- result = binaryRead(dataview, at + read, properties[i].itemType, littleEndian);
308
- // @ts-ignore
309
- list.push(result[0]);
310
- read += result[1];
311
- }
312
- element[properties[i].name] = list;
313
- }
314
- else {
315
- result = binaryRead(dataview, at + read, properties[i].type, littleEndian);
316
- element[properties[i].name] = result[0];
317
- read += result[1];
318
- }
273
+ const element = {};
274
+ let result;
275
+ let read = 0;
276
+
277
+ for (let i = 0; i < properties.length; i++) {
278
+ if (properties[i].type === 'list') {
279
+ const list = [];
280
+ result = binaryRead(dataview, at + read, properties[i].countType, littleEndian);
281
+ const n = result[0];
282
+ read += result[1];
283
+
284
+ for (let j = 0; j < n; j++) {
285
+ result = binaryRead(dataview, at + read, properties[i].itemType, littleEndian);
286
+ list.push(result[0]);
287
+ read += result[1];
288
+ }
289
+
290
+ element[properties[i].name] = list;
291
+ } else {
292
+ result = binaryRead(dataview, at + read, properties[i].type, littleEndian);
293
+ element[properties[i].name] = result[0];
294
+ read += result[1];
319
295
  }
320
- return [element, read];
296
+ }
297
+
298
+ return [element, read];
321
299
  }
322
- /**
323
- * Parses binary data
324
- * @param data
325
- * @param header
326
- * @returns [attributes] of data
327
- */
300
+
328
301
  function parseBinary(data, header) {
329
- const attributes = {
330
- indices: [],
331
- vertices: [],
332
- normals: [],
333
- uvs: [],
334
- colors: []
335
- };
336
- const littleEndian = header.format === 'binary_little_endian';
337
- const body = new DataView(data, header.headerLength);
338
- let result;
339
- let loc = 0;
340
- for (let currentElement = 0; currentElement < header.elements.length; currentElement++) {
341
- const count = header.elements[currentElement].count;
342
- for (let currentElementCount = 0; currentElementCount < count; currentElementCount++) {
343
- result = binaryReadElement(body, loc, header.elements[currentElement].properties, littleEndian);
344
- loc += result[1];
345
- const element = result[0];
346
- handleElement(attributes, header.elements[currentElement].name, element);
347
- }
302
+ const attributes = {
303
+ indices: [],
304
+ vertices: [],
305
+ normals: [],
306
+ uvs: [],
307
+ colors: []
308
+ };
309
+ const littleEndian = header.format === 'binary_little_endian';
310
+ const body = new DataView(data, header.headerLength);
311
+ let result;
312
+ let loc = 0;
313
+
314
+ for (let currentElement = 0; currentElement < header.elements.length; currentElement++) {
315
+ const count = header.elements[currentElement].count;
316
+
317
+ for (let currentElementCount = 0; currentElementCount < count; currentElementCount++) {
318
+ result = binaryReadElement(body, loc, header.elements[currentElement].properties, littleEndian);
319
+ loc += result[1];
320
+ const element = result[0];
321
+ handleElement(attributes, header.elements[currentElement].name, element);
348
322
  }
349
- return attributes;
323
+ }
324
+
325
+ return attributes;
350
326
  }
327
+ //# sourceMappingURL=parse-ply.js.map