@loaders.gl/ply 3.3.0-alpha.5 → 3.3.0-alpha.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/es5/bundle.js +0 -1
  2. package/dist/es5/bundle.js.map +1 -1
  3. package/dist/es5/index.js +4 -17
  4. package/dist/es5/index.js.map +1 -1
  5. package/dist/es5/lib/get-ply-schema.js +0 -6
  6. package/dist/es5/lib/get-ply-schema.js.map +1 -1
  7. package/dist/es5/lib/normalize-ply.js +1 -8
  8. package/dist/es5/lib/normalize-ply.js.map +1 -1
  9. package/dist/es5/lib/parse-ply-in-batches.js +98 -169
  10. package/dist/es5/lib/parse-ply-in-batches.js.map +1 -1
  11. package/dist/es5/lib/parse-ply.js +1 -53
  12. package/dist/es5/lib/parse-ply.js.map +1 -1
  13. package/dist/es5/lib/ply-types.js.map +1 -1
  14. package/dist/es5/ply-loader.js +3 -1
  15. package/dist/es5/ply-loader.js.map +1 -1
  16. package/dist/es5/workers/ply-worker.js +0 -2
  17. package/dist/es5/workers/ply-worker.js.map +1 -1
  18. package/dist/esm/bundle.js +1 -1
  19. package/dist/esm/bundle.js.map +1 -1
  20. package/dist/esm/index.js +4 -1
  21. package/dist/esm/index.js.map +1 -1
  22. package/dist/esm/lib/get-ply-schema.js +0 -4
  23. package/dist/esm/lib/get-ply-schema.js.map +1 -1
  24. package/dist/esm/lib/normalize-ply.js +2 -5
  25. package/dist/esm/lib/normalize-ply.js.map +1 -1
  26. package/dist/esm/lib/parse-ply-in-batches.js +6 -38
  27. package/dist/esm/lib/parse-ply-in-batches.js.map +1 -1
  28. package/dist/esm/lib/parse-ply.js +8 -52
  29. package/dist/esm/lib/parse-ply.js.map +1 -1
  30. package/dist/esm/lib/ply-types.js.map +1 -1
  31. package/dist/esm/ply-loader.js +4 -1
  32. package/dist/esm/ply-loader.js.map +1 -1
  33. package/dist/esm/workers/ply-worker.js.map +1 -1
  34. package/dist/ply-worker.js +1 -1
  35. package/package.json +4 -4
@@ -1,19 +1,16 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
4
  Object.defineProperty(exports, "__esModule", {
6
5
  value: true
7
6
  });
8
7
  exports.default = parsePLY;
9
-
10
8
  var _normalizePly = _interopRequireDefault(require("./normalize-ply"));
11
9
 
12
10
  function parsePLY(data) {
13
11
  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
14
12
  var header;
15
13
  var attributes;
16
-
17
14
  if (data instanceof ArrayBuffer) {
18
15
  var text = new TextDecoder().decode(data);
19
16
  header = parseHeader(text, options);
@@ -22,7 +19,6 @@ function parsePLY(data) {
22
19
  header = parseHeader(data, options);
23
20
  attributes = parseASCII(data, header);
24
21
  }
25
-
26
22
  return (0, _normalizePly.default)(header, attributes);
27
23
  }
28
24
 
@@ -31,12 +27,10 @@ function parseHeader(data, options) {
31
27
  var headerText = '';
32
28
  var headerLength = 0;
33
29
  var result = PLY_HEADER_PATTERN.exec(data);
34
-
35
30
  if (result !== null) {
36
31
  headerText = result[1];
37
32
  headerLength = result[0].length;
38
33
  }
39
-
40
34
  var lines = headerText.split('\n');
41
35
  var header = parseHeaderLines(lines, headerLength, options);
42
36
  return header;
@@ -51,58 +45,46 @@ function parseHeaderLines(lines, headerLength, options) {
51
45
  var lineType;
52
46
  var lineValues;
53
47
  var currentElement = null;
54
-
55
48
  for (var i = 0; i < lines.length; i++) {
56
49
  var line = lines[i];
57
50
  line = line.trim();
58
-
59
51
  if (line === '') {
60
52
  continue;
61
53
  }
62
-
63
54
  lineValues = line.split(/\s+/);
64
55
  lineType = lineValues.shift();
65
56
  line = lineValues.join(' ');
66
-
67
57
  switch (lineType) {
68
58
  case 'format':
69
59
  header.format = lineValues[0];
70
60
  header.version = lineValues[1];
71
61
  break;
72
-
73
62
  case 'comment':
74
63
  header.comments.push(line);
75
64
  break;
76
-
77
65
  case 'element':
78
66
  if (currentElement) {
79
67
  header.elements.push(currentElement);
80
68
  }
81
-
82
69
  currentElement = {
83
70
  name: lineValues[0],
84
71
  count: parseInt(lineValues[1], 10),
85
72
  properties: []
86
73
  };
87
74
  break;
88
-
89
75
  case 'property':
90
76
  if (!currentElement) {
91
77
  break;
92
78
  }
93
-
94
79
  currentElement.properties.push(makePLYElementProperty(lineValues, options.propertyNameMapping));
95
80
  break;
96
-
97
81
  default:
98
82
  console.log('unhandled', lineType, lineValues);
99
83
  }
100
84
  }
101
-
102
85
  if (currentElement !== undefined) {
103
86
  header.elements.push(currentElement);
104
87
  }
105
-
106
88
  return header;
107
89
  }
108
90
 
@@ -110,7 +92,6 @@ function makePLYElementProperty(propertValues, propertyNameMapping) {
110
92
  var property = {
111
93
  type: propertValues[0]
112
94
  };
113
-
114
95
  if (property.type === 'list') {
115
96
  property.name = propertValues[3];
116
97
  property.countType = propertValues[1];
@@ -118,11 +99,9 @@ function makePLYElementProperty(propertValues, propertyNameMapping) {
118
99
  } else {
119
100
  property.name = propertValues[1];
120
101
  }
121
-
122
102
  if (propertyNameMapping && property.name in propertyNameMapping) {
123
103
  property.name = propertyNameMapping[property.name];
124
104
  }
125
-
126
105
  return property;
127
106
  }
128
107
 
@@ -141,13 +120,11 @@ function parseASCIINumber(n, type) {
141
120
  case 'int32':
142
121
  case 'uint32':
143
122
  return parseInt(n, 10);
144
-
145
123
  case 'float':
146
124
  case 'double':
147
125
  case 'float32':
148
126
  case 'float64':
149
127
  return parseFloat(n);
150
-
151
128
  default:
152
129
  throw new Error(type);
153
130
  }
@@ -156,26 +133,23 @@ function parseASCIINumber(n, type) {
156
133
  function parseASCIIElement(properties, line) {
157
134
  var values = line.split(/\s+/);
158
135
  var element = {};
159
-
160
136
  for (var i = 0; i < properties.length; i++) {
161
137
  if (properties[i].type === 'list') {
162
138
  var list = [];
163
139
  var n = parseASCIINumber(values.shift(), properties[i].countType);
164
-
165
140
  for (var j = 0; j < n; j++) {
166
141
  list.push(parseASCIINumber(values.shift(), properties[i].itemType));
167
142
  }
168
-
169
143
  element[properties[i].name] = list;
170
144
  } else {
171
145
  element[properties[i].name] = parseASCIINumber(values.shift(), properties[i].type);
172
146
  }
173
147
  }
174
-
175
148
  return element;
176
149
  }
177
150
 
178
151
  function parseASCII(data, header) {
152
+
179
153
  var attributes = {
180
154
  indices: [],
181
155
  vertices: [],
@@ -186,48 +160,38 @@ function parseASCII(data, header) {
186
160
  var result;
187
161
  var patternBody = /end_header\s([\s\S]*)$/;
188
162
  var body = '';
189
-
190
163
  if ((result = patternBody.exec(data)) !== null) {
191
164
  body = result[1];
192
165
  }
193
-
194
166
  var lines = body.split('\n');
195
167
  var currentElement = 0;
196
168
  var currentElementCount = 0;
197
-
198
169
  for (var i = 0; i < lines.length; i++) {
199
170
  var line = lines[i];
200
171
  line = line.trim();
201
-
202
172
  if (line !== '') {
203
173
  if (currentElementCount >= header.elements[currentElement].count) {
204
174
  currentElement++;
205
175
  currentElementCount = 0;
206
176
  }
207
-
208
177
  var element = parseASCIIElement(header.elements[currentElement].properties, line);
209
178
  handleElement(attributes, header.elements[currentElement].name, element);
210
179
  currentElementCount++;
211
180
  }
212
181
  }
213
-
214
182
  return attributes;
215
183
  }
216
184
 
217
185
  function handleElement(buffer, elementName) {
218
186
  var element = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
219
-
220
187
  if (elementName === 'vertex') {
221
188
  buffer.vertices.push(element.x, element.y, element.z);
222
-
223
189
  if ('nx' in element && 'ny' in element && 'nz' in element) {
224
190
  buffer.normals.push(element.nx, element.ny, element.nz);
225
191
  }
226
-
227
192
  if ('s' in element && 't' in element) {
228
193
  buffer.uvs.push(element.s, element.t);
229
194
  }
230
-
231
195
  if ('red' in element && 'green' in element && 'blue' in element) {
232
196
  buffer.colors.push(element.red, element.green, element.blue);
233
197
  }
@@ -248,35 +212,27 @@ function binaryRead(dataview, at, type, littleEndian) {
248
212
  case 'int8':
249
213
  case 'char':
250
214
  return [dataview.getInt8(at), 1];
251
-
252
215
  case 'uint8':
253
216
  case 'uchar':
254
217
  return [dataview.getUint8(at), 1];
255
-
256
218
  case 'int16':
257
219
  case 'short':
258
220
  return [dataview.getInt16(at, littleEndian), 2];
259
-
260
221
  case 'uint16':
261
222
  case 'ushort':
262
223
  return [dataview.getUint16(at, littleEndian), 2];
263
-
264
224
  case 'int32':
265
225
  case 'int':
266
226
  return [dataview.getInt32(at, littleEndian), 4];
267
-
268
227
  case 'uint32':
269
228
  case 'uint':
270
229
  return [dataview.getUint32(at, littleEndian), 4];
271
-
272
230
  case 'float32':
273
231
  case 'float':
274
232
  return [dataview.getFloat32(at, littleEndian), 4];
275
-
276
233
  case 'float64':
277
234
  case 'double':
278
235
  return [dataview.getFloat64(at, littleEndian), 8];
279
-
280
236
  default:
281
237
  throw new Error(type);
282
238
  }
@@ -286,20 +242,17 @@ function binaryReadElement(dataview, at, properties, littleEndian) {
286
242
  var element = {};
287
243
  var result;
288
244
  var read = 0;
289
-
290
245
  for (var i = 0; i < properties.length; i++) {
291
246
  if (properties[i].type === 'list') {
292
247
  var list = [];
293
248
  result = binaryRead(dataview, at + read, properties[i].countType, littleEndian);
294
249
  var n = result[0];
295
250
  read += result[1];
296
-
297
251
  for (var j = 0; j < n; j++) {
298
252
  result = binaryRead(dataview, at + read, properties[i].itemType, littleEndian);
299
253
  list.push(result[0]);
300
254
  read += result[1];
301
255
  }
302
-
303
256
  element[properties[i].name] = list;
304
257
  } else {
305
258
  result = binaryRead(dataview, at + read, properties[i].type, littleEndian);
@@ -307,10 +260,8 @@ function binaryReadElement(dataview, at, properties, littleEndian) {
307
260
  read += result[1];
308
261
  }
309
262
  }
310
-
311
263
  return [element, read];
312
264
  }
313
-
314
265
  function parseBinary(data, header) {
315
266
  var attributes = {
316
267
  indices: [],
@@ -323,10 +274,8 @@ function parseBinary(data, header) {
323
274
  var body = new DataView(data, header.headerLength);
324
275
  var result;
325
276
  var loc = 0;
326
-
327
277
  for (var currentElement = 0; currentElement < header.elements.length; currentElement++) {
328
278
  var count = header.elements[currentElement].count;
329
-
330
279
  for (var currentElementCount = 0; currentElementCount < count; currentElementCount++) {
331
280
  result = binaryReadElement(body, loc, header.elements[currentElement].properties, littleEndian);
332
281
  loc += result[1];
@@ -334,7 +283,6 @@ function parseBinary(data, header) {
334
283
  handleElement(attributes, header.elements[currentElement].name, element);
335
284
  }
336
285
  }
337
-
338
286
  return attributes;
339
287
  }
340
288
  //# sourceMappingURL=parse-ply.js.map
@@ -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,"file":"parse-ply.js","names":["parsePLY","data","options","header","attributes","ArrayBuffer","text","TextDecoder","decode","parseHeader","format","parseASCII","parseBinary","normalizePLY","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"],"sources":["../../../src/lib/parse-ply.ts"],"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"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[],"file":"ply-types.js"}
1
+ {"version":3,"file":"ply-types.js","names":[],"sources":["../../../src/lib/ply-types.ts"],"sourcesContent":["import type {Mesh} from '@loaders.gl/schema';\n\nexport type PLYHeader = {\n format?: string;\n comments: string[];\n elements: any[];\n version?: string;\n headerLength?: number;\n};\n\n/** A parsed PLY mesh */\nexport type PLYMesh = Mesh & {\n loader: 'ply';\n loaderData: PLYHeader;\n};\n\n// INTERNAL TYPES\n\nexport type MeshHeader = {\n vertexCount?: number;\n boundingBox?: [[number, number, number], [number, number, number]];\n};\n\nexport type PLYAttributes = {\n [index: string]: number[];\n};\n\nexport type PLYProperty = {\n [index: string]: string;\n};\n\nexport type ASCIIElement = {\n name: string;\n count: number;\n properties: any[];\n};\n"],"mappings":""}
@@ -4,7 +4,9 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports._typecheckPLYLoader = exports.PLYLoader = void 0;
7
- var VERSION = typeof "3.3.0-alpha.5" !== 'undefined' ? "3.3.0-alpha.5" : 'latest';
7
+
8
+ var VERSION = typeof "3.3.0-alpha.6" !== 'undefined' ? "3.3.0-alpha.6" : 'latest';
9
+
8
10
  var PLYLoader = {
9
11
  name: 'PLY',
10
12
  id: 'ply',
@@ -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,IAAMA,OAAO,GAAG,2BAAuB,WAAvB,qBAAmD,QAAnE;AAOO,IAAMC,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,IAAMC,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"}
1
+ {"version":3,"file":"ply-loader.js","names":["VERSION","PLYLoader","name","id","module","shapes","version","worker","extensions","mimeTypes","text","binary","tests","options","ply","_typecheckPLYLoader"],"sources":["../../src/ply-loader.ts"],"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"],"mappings":";;;;;;;AAKA,IAAMA,OAAO,GAAG,sBAAkB,KAAK,WAAW,qBAAiB,QAAQ;;AAOpE,IAAMC,SAAS,GAAG;EACvBC,IAAI,EAAE,KAAK;EACXC,EAAE,EAAE,KAAK;EACTC,MAAM,EAAE,KAAK;EACbC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,CAAC;EAC1CC,OAAO,EAAEN,OAAO;EAChBO,MAAM,EAAE,IAAI;EACZC,UAAU,EAAE,CAAC,KAAK,CAAC;EACnBC,SAAS,EAAE,CAAC,YAAY,EAAE,0BAA0B,CAAC;EACrDC,IAAI,EAAE,IAAI;EACVC,MAAM,EAAE,IAAI;EACZC,KAAK,EAAE,CAAC,KAAK,CAAC;EACdC,OAAO,EAAE;IACPC,GAAG,EAAE,CAAC;EACR;AACF,CAAC;AAAC;AAEK,IAAMC,mBAA2B,GAAGd,SAAS;AAAC"}
@@ -1,8 +1,6 @@
1
1
  "use strict";
2
2
 
3
3
  var _loaderUtils = require("@loaders.gl/loader-utils");
4
-
5
4
  var _index = require("../index");
6
-
7
5
  (0, _loaderUtils.createLoaderWorker)(_index.PLYLoader);
8
6
  //# sourceMappingURL=ply-worker.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/workers/ply-worker.ts"],"names":["PLYLoader"],"mappings":";;AAAA;;AACA;;AAEA,qCAAmBA,gBAAnB","sourcesContent":["import {createLoaderWorker} from '@loaders.gl/loader-utils';\nimport {PLYLoader} from '../index';\n\ncreateLoaderWorker(PLYLoader);\n"],"file":"ply-worker.js"}
1
+ {"version":3,"file":"ply-worker.js","names":["createLoaderWorker","PLYLoader"],"sources":["../../../src/workers/ply-worker.ts"],"sourcesContent":["import {createLoaderWorker} from '@loaders.gl/loader-utils';\nimport {PLYLoader} from '../index';\n\ncreateLoaderWorker(PLYLoader);\n"],"mappings":";;AAAA;AACA;AAEA,IAAAA,+BAAkB,EAACC,gBAAS,CAAC"}
@@ -1,5 +1,5 @@
1
- const moduleExports = require('./index');
2
1
 
2
+ const moduleExports = require('./index');
3
3
  globalThis.loaders = globalThis.loaders || {};
4
4
  module.exports = Object.assign(globalThis.loaders, moduleExports);
5
5
  //# sourceMappingURL=bundle.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/bundle.ts"],"names":["moduleExports","require","globalThis","loaders","module","exports","Object","assign"],"mappings":"AACA,MAAMA,aAAa,GAAGC,OAAO,CAAC,SAAD,CAA7B;;AACAC,UAAU,CAACC,OAAX,GAAqBD,UAAU,CAACC,OAAX,IAAsB,EAA3C;AACAC,MAAM,CAACC,OAAP,GAAiBC,MAAM,CAACC,MAAP,CAAcL,UAAU,CAACC,OAAzB,EAAkCH,aAAlC,CAAjB","sourcesContent":["// @ts-nocheck\nconst moduleExports = require('./index');\nglobalThis.loaders = globalThis.loaders || {};\nmodule.exports = Object.assign(globalThis.loaders, moduleExports);\n"],"file":"bundle.js"}
1
+ {"version":3,"file":"bundle.js","names":["moduleExports","require","globalThis","loaders","module","exports","Object","assign"],"sources":["../../src/bundle.ts"],"sourcesContent":["// @ts-nocheck\nconst moduleExports = require('./index');\nglobalThis.loaders = globalThis.loaders || {};\nmodule.exports = Object.assign(globalThis.loaders, moduleExports);\n"],"mappings":";AACA,MAAMA,aAAa,GAAGC,OAAO,CAAC,SAAS,CAAC;AACxCC,UAAU,CAACC,OAAO,GAAGD,UAAU,CAACC,OAAO,IAAI,CAAC,CAAC;AAC7CC,MAAM,CAACC,OAAO,GAAGC,MAAM,CAACC,MAAM,CAACL,UAAU,CAACC,OAAO,EAAEH,aAAa,CAAC"}
package/dist/esm/index.js CHANGED
@@ -1,8 +1,11 @@
1
1
  import { PLYLoader as PLYWorkerLoader } from './ply-loader';
2
2
  import parsePLY from './lib/parse-ply';
3
3
  import parsePLYInBatches from './lib/parse-ply-in-batches';
4
+
4
5
  export { PLYWorkerLoader };
5
- export const PLYLoader = { ...PLYWorkerLoader,
6
+
7
+ export const PLYLoader = {
8
+ ...PLYWorkerLoader,
6
9
  parse: async (arrayBuffer, options) => parsePLY(arrayBuffer, options),
7
10
  parseTextSync: parsePLY,
8
11
  parseSync: parsePLY,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts"],"names":["PLYLoader","PLYWorkerLoader","parsePLY","parsePLYInBatches","parse","arrayBuffer","options","parseTextSync","parseSync","parseInBatches","_typecheckPLYLoader"],"mappings":"AACA,SAAQA,SAAS,IAAIC,eAArB,QAA2C,cAA3C;AACA,OAAOC,QAAP,MAAqB,iBAArB;AACA,OAAOC,iBAAP,MAA8B,4BAA9B;AAIA,SAAQF,eAAR;AAKA,OAAO,MAAMD,SAAS,GAAG,EACvB,GAAGC,eADoB;AAGvBG,EAAAA,KAAK,EAAE,OAAOC,WAAP,EAAoBC,OAApB,KAAgCJ,QAAQ,CAACG,WAAD,EAAcC,OAAd,CAHxB;AAIvBC,EAAAA,aAAa,EAAEL,QAJQ;AAKvBM,EAAAA,SAAS,EAAEN,QALY;AAMvBO,EAAAA,cAAc,EAAEN;AANO,CAAlB;AASP,OAAO,MAAMO,mBAAqC,GAAGV,SAA9C","sourcesContent":["import type {LoaderWithParser} from '@loaders.gl/loader-utils';\nimport {PLYLoader as PLYWorkerLoader} from './ply-loader';\nimport parsePLY from './lib/parse-ply';\nimport parsePLYInBatches from './lib/parse-ply-in-batches';\n\n// PLYLoader\n\nexport {PLYWorkerLoader};\n\n/**\n * Loader for PLY - Polygon File Format\n */\nexport const PLYLoader = {\n ...PLYWorkerLoader,\n // Note: parsePLY supports both text and binary\n parse: async (arrayBuffer, options) => parsePLY(arrayBuffer, options), // TODO - this may not detect text correctly?\n parseTextSync: parsePLY,\n parseSync: parsePLY,\n parseInBatches: parsePLYInBatches\n};\n\nexport const _typecheckPLYLoader: LoaderWithParser = PLYLoader;\n"],"file":"index.js"}
1
+ {"version":3,"file":"index.js","names":["PLYLoader","PLYWorkerLoader","parsePLY","parsePLYInBatches","parse","arrayBuffer","options","parseTextSync","parseSync","parseInBatches","_typecheckPLYLoader"],"sources":["../../src/index.ts"],"sourcesContent":["import type {LoaderWithParser} from '@loaders.gl/loader-utils';\nimport {PLYLoader as PLYWorkerLoader} from './ply-loader';\nimport parsePLY from './lib/parse-ply';\nimport parsePLYInBatches from './lib/parse-ply-in-batches';\n\n// PLYLoader\n\nexport {PLYWorkerLoader};\n\n/**\n * Loader for PLY - Polygon File Format\n */\nexport const PLYLoader = {\n ...PLYWorkerLoader,\n // Note: parsePLY supports both text and binary\n parse: async (arrayBuffer, options) => parsePLY(arrayBuffer, options), // TODO - this may not detect text correctly?\n parseTextSync: parsePLY,\n parseSync: parsePLY,\n parseInBatches: parsePLYInBatches\n};\n\nexport const _typecheckPLYLoader: LoaderWithParser = PLYLoader;\n"],"mappings":"AACA,SAAQA,SAAS,IAAIC,eAAe,QAAO,cAAc;AACzD,OAAOC,QAAQ,MAAM,iBAAiB;AACtC,OAAOC,iBAAiB,MAAM,4BAA4B;;AAI1D,SAAQF,eAAe;;AAKvB,OAAO,MAAMD,SAAS,GAAG;EACvB,GAAGC,eAAe;EAElBG,KAAK,EAAE,OAAOC,WAAW,EAAEC,OAAO,KAAKJ,QAAQ,CAACG,WAAW,EAAEC,OAAO,CAAC;EACrEC,aAAa,EAAEL,QAAQ;EACvBM,SAAS,EAAEN,QAAQ;EACnBO,cAAc,EAAEN;AAClB,CAAC;AAED,OAAO,MAAMO,mBAAqC,GAAGV,SAAS"}
@@ -9,19 +9,15 @@ function makeMetadataFromPlyHeader(plyHeader) {
9
9
  const metadataMap = new Map();
10
10
  metadataMap.set('ply_comments', JSON.stringify(plyHeader.comments));
11
11
  metadataMap.set('ply_elements', JSON.stringify(plyHeader.elements));
12
-
13
12
  if (plyHeader.format !== undefined) {
14
13
  metadataMap.set('ply_format', plyHeader.format);
15
14
  }
16
-
17
15
  if (plyHeader.version !== undefined) {
18
16
  metadataMap.set('ply_version', plyHeader.version);
19
17
  }
20
-
21
18
  if (plyHeader.headerLength !== undefined) {
22
19
  metadataMap.set('ply_headerLength', plyHeader.headerLength.toString(10));
23
20
  }
24
-
25
21
  return metadataMap;
26
22
  }
27
23
  //# sourceMappingURL=get-ply-schema.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/get-ply-schema.ts"],"names":["deduceMeshSchema","getPLYSchema","plyHeader","attributes","metadataMap","makeMetadataFromPlyHeader","schema","Map","set","JSON","stringify","comments","elements","format","undefined","version","headerLength","toString"],"mappings":"AAAA,SAAgCA,gBAAhC,QAAuD,oBAAvD;AASA,OAAO,SAASC,YAAT,CAAsBC,SAAtB,EAA4CC,UAA5C,EAAgF;AACrF,QAAMC,WAAW,GAAGC,yBAAyB,CAACH,SAAD,CAA7C;AACA,QAAMI,MAAM,GAAGN,gBAAgB,CAACG,UAAD,EAAaC,WAAb,CAA/B;AACA,SAAOE,MAAP;AACD;;AAOD,SAASD,yBAAT,CAAmCH,SAAnC,EAA8E;AAC5E,QAAME,WAAW,GAAG,IAAIG,GAAJ,EAApB;AACAH,EAAAA,WAAW,CAACI,GAAZ,CAAgB,cAAhB,EAAgCC,IAAI,CAACC,SAAL,CAAeR,SAAS,CAACS,QAAzB,CAAhC;AACAP,EAAAA,WAAW,CAACI,GAAZ,CAAgB,cAAhB,EAAgCC,IAAI,CAACC,SAAL,CAAeR,SAAS,CAACU,QAAzB,CAAhC;;AACA,MAAIV,SAAS,CAACW,MAAV,KAAqBC,SAAzB,EAAoC;AAClCV,IAAAA,WAAW,CAACI,GAAZ,CAAgB,YAAhB,EAA8BN,SAAS,CAACW,MAAxC;AACD;;AACD,MAAIX,SAAS,CAACa,OAAV,KAAsBD,SAA1B,EAAqC;AACnCV,IAAAA,WAAW,CAACI,GAAZ,CAAgB,aAAhB,EAA+BN,SAAS,CAACa,OAAzC;AACD;;AACD,MAAIb,SAAS,CAACc,YAAV,KAA2BF,SAA/B,EAA0C;AACxCV,IAAAA,WAAW,CAACI,GAAZ,CAAgB,kBAAhB,EAAoCN,SAAS,CAACc,YAAV,CAAuBC,QAAvB,CAAgC,EAAhC,CAApC;AACD;;AACD,SAAOb,WAAP;AACD","sourcesContent":["import {Schema, MeshAttributes, deduceMeshSchema} from '@loaders.gl/schema';\nimport type {PLYHeader} from './ply-types';\n\n/**\n * Gets schema from PLY header\n * @param plyHeader\n * @param metadata\n * @returns Schema\n */\nexport function getPLYSchema(plyHeader: PLYHeader, attributes: MeshAttributes): Schema {\n const metadataMap = makeMetadataFromPlyHeader(plyHeader);\n const schema = deduceMeshSchema(attributes, metadataMap);\n return schema;\n}\n\n/**\n * Make arrow like schema metadata by PlyHeader properties\n * @param plyHeader\n * @returns\n */\nfunction makeMetadataFromPlyHeader(plyHeader: PLYHeader): Map<string, string> {\n const metadataMap = new Map();\n metadataMap.set('ply_comments', JSON.stringify(plyHeader.comments));\n metadataMap.set('ply_elements', JSON.stringify(plyHeader.elements));\n if (plyHeader.format !== undefined) {\n metadataMap.set('ply_format', plyHeader.format);\n }\n if (plyHeader.version !== undefined) {\n metadataMap.set('ply_version', plyHeader.version);\n }\n if (plyHeader.headerLength !== undefined) {\n metadataMap.set('ply_headerLength', plyHeader.headerLength.toString(10));\n }\n return metadataMap;\n}\n"],"file":"get-ply-schema.js"}
1
+ {"version":3,"file":"get-ply-schema.js","names":["deduceMeshSchema","getPLYSchema","plyHeader","attributes","metadataMap","makeMetadataFromPlyHeader","schema","Map","set","JSON","stringify","comments","elements","format","undefined","version","headerLength","toString"],"sources":["../../../src/lib/get-ply-schema.ts"],"sourcesContent":["import {Schema, MeshAttributes, deduceMeshSchema} from '@loaders.gl/schema';\nimport type {PLYHeader} from './ply-types';\n\n/**\n * Gets schema from PLY header\n * @param plyHeader\n * @param metadata\n * @returns Schema\n */\nexport function getPLYSchema(plyHeader: PLYHeader, attributes: MeshAttributes): Schema {\n const metadataMap = makeMetadataFromPlyHeader(plyHeader);\n const schema = deduceMeshSchema(attributes, metadataMap);\n return schema;\n}\n\n/**\n * Make arrow like schema metadata by PlyHeader properties\n * @param plyHeader\n * @returns\n */\nfunction makeMetadataFromPlyHeader(plyHeader: PLYHeader): Map<string, string> {\n const metadataMap = new Map();\n metadataMap.set('ply_comments', JSON.stringify(plyHeader.comments));\n metadataMap.set('ply_elements', JSON.stringify(plyHeader.elements));\n if (plyHeader.format !== undefined) {\n metadataMap.set('ply_format', plyHeader.format);\n }\n if (plyHeader.version !== undefined) {\n metadataMap.set('ply_version', plyHeader.version);\n }\n if (plyHeader.headerLength !== undefined) {\n metadataMap.set('ply_headerLength', plyHeader.headerLength.toString(10));\n }\n return metadataMap;\n}\n"],"mappings":"AAAA,SAAgCA,gBAAgB,QAAO,oBAAoB;AAS3E,OAAO,SAASC,YAAY,CAACC,SAAoB,EAAEC,UAA0B,EAAU;EACrF,MAAMC,WAAW,GAAGC,yBAAyB,CAACH,SAAS,CAAC;EACxD,MAAMI,MAAM,GAAGN,gBAAgB,CAACG,UAAU,EAAEC,WAAW,CAAC;EACxD,OAAOE,MAAM;AACf;;AAOA,SAASD,yBAAyB,CAACH,SAAoB,EAAuB;EAC5E,MAAME,WAAW,GAAG,IAAIG,GAAG,EAAE;EAC7BH,WAAW,CAACI,GAAG,CAAC,cAAc,EAAEC,IAAI,CAACC,SAAS,CAACR,SAAS,CAACS,QAAQ,CAAC,CAAC;EACnEP,WAAW,CAACI,GAAG,CAAC,cAAc,EAAEC,IAAI,CAACC,SAAS,CAACR,SAAS,CAACU,QAAQ,CAAC,CAAC;EACnE,IAAIV,SAAS,CAACW,MAAM,KAAKC,SAAS,EAAE;IAClCV,WAAW,CAACI,GAAG,CAAC,YAAY,EAAEN,SAAS,CAACW,MAAM,CAAC;EACjD;EACA,IAAIX,SAAS,CAACa,OAAO,KAAKD,SAAS,EAAE;IACnCV,WAAW,CAACI,GAAG,CAAC,aAAa,EAAEN,SAAS,CAACa,OAAO,CAAC;EACnD;EACA,IAAIb,SAAS,CAACc,YAAY,KAAKF,SAAS,EAAE;IACxCV,WAAW,CAACI,GAAG,CAAC,kBAAkB,EAAEN,SAAS,CAACc,YAAY,CAACC,QAAQ,CAAC,EAAE,CAAC,CAAC;EAC1E;EACA,OAAOb,WAAW;AACpB"}
@@ -1,9 +1,11 @@
1
1
  import { getMeshBoundingBox } from '@loaders.gl/schema';
2
2
  import { getPLYSchema } from './get-ply-schema';
3
+
3
4
  export default function normalizePLY(plyHeader, plyAttributes, options) {
4
5
  const attributes = getMeshAttributes(plyAttributes);
5
6
  const boundingBox = getMeshBoundingBox(attributes);
6
7
  const vertexCount = plyAttributes.indices.length || plyAttributes.vertices.length / 3;
8
+
7
9
  const isTriangles = plyAttributes.indices && plyAttributes.indices.length > 0;
8
10
  const mode = isTriangles ? 4 : 0;
9
11
  const topology = isTriangles ? 'triangle-list' : 'point-list';
@@ -24,14 +26,12 @@ export default function normalizePLY(plyHeader, plyAttributes, options) {
24
26
  mode,
25
27
  topology
26
28
  };
27
-
28
29
  if (plyAttributes.indices.length > 0) {
29
30
  plyMesh.indices = {
30
31
  value: new Uint32Array(plyAttributes.indices),
31
32
  size: 1
32
33
  };
33
34
  }
34
-
35
35
  return plyMesh;
36
36
  }
37
37
 
@@ -48,14 +48,12 @@ function getMeshAttributes(attributes) {
48
48
  size: 3
49
49
  };
50
50
  }
51
-
52
51
  if (attributes.uvs.length > 0) {
53
52
  accessors.TEXCOORD_0 = {
54
53
  value: new Float32Array(attributes.uvs),
55
54
  size: 2
56
55
  };
57
56
  }
58
-
59
57
  if (attributes.colors.length > 0) {
60
58
  accessors.COLOR_0 = {
61
59
  value: new Uint8Array(attributes.colors),
@@ -63,7 +61,6 @@ function getMeshAttributes(attributes) {
63
61
  normalized: true
64
62
  };
65
63
  }
66
-
67
64
  return accessors;
68
65
  }
69
66
  //# sourceMappingURL=normalize-ply.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/normalize-ply.ts"],"names":["getMeshBoundingBox","getPLYSchema","normalizePLY","plyHeader","plyAttributes","options","attributes","getMeshAttributes","boundingBox","vertexCount","indices","length","vertices","isTriangles","mode","topology","schema","plyMesh","loader","loaderData","header","value","Uint32Array","size","accessors","POSITION","Float32Array","normals","NORMAL","uvs","TEXCOORD_0","colors","COLOR_0","Uint8Array","normalized"],"mappings":"AACA,SAAQA,kBAAR,QAAiC,oBAAjC;AAEA,SAAQC,YAAR,QAA2B,kBAA3B;AAOA,eAAe,SAASC,YAAT,CACbC,SADa,EAEbC,aAFa,EAGbC,OAHa,EAIJ;AACT,QAAMC,UAAU,GAAGC,iBAAiB,CAACH,aAAD,CAApC;AACA,QAAMI,WAAW,GAAGR,kBAAkB,CAACM,UAAD,CAAtC;AACA,QAAMG,WAAW,GAAGL,aAAa,CAACM,OAAd,CAAsBC,MAAtB,IAAgCP,aAAa,CAACQ,QAAd,CAAuBD,MAAvB,GAAgC,CAApF;AAIA,QAAME,WAAW,GAAGT,aAAa,CAACM,OAAd,IAAyBN,aAAa,CAACM,OAAd,CAAsBC,MAAtB,GAA+B,CAA5E;AACA,QAAMG,IAAI,GAAGD,WAAW,GAAG,CAAH,GAAO,CAA/B;AACA,QAAME,QAAQ,GAAGF,WAAW,GAAG,eAAH,GAAqB,YAAjD;AAEA,QAAMG,MAAM,GAAGf,YAAY,CAACE,SAAD,EAAYG,UAAZ,CAA3B;AAEA,QAAMW,OAAgB,GAAG;AACvBC,IAAAA,MAAM,EAAE,KADe;AAEvBC,IAAAA,UAAU,EAAEhB,SAFW;AAGvBiB,IAAAA,MAAM,EAAE;AACNX,MAAAA,WADM;AAEND,MAAAA;AAFM,KAHe;AAOvBQ,IAAAA,MAPuB;AAQvBV,IAAAA,UARuB;AASvBI,IAAAA,OAAO,EAAE;AAACW,MAAAA,KAAK,EAAE,IAAIC,WAAJ,CAAgB,CAAhB,CAAR;AAA4BC,MAAAA,IAAI,EAAE;AAAlC,KATc;AAUvBT,IAAAA,IAVuB;AAWvBC,IAAAA;AAXuB,GAAzB;;AAcA,MAAIX,aAAa,CAACM,OAAd,CAAsBC,MAAtB,GAA+B,CAAnC,EAAsC;AACpCM,IAAAA,OAAO,CAACP,OAAR,GAAkB;AAACW,MAAAA,KAAK,EAAE,IAAIC,WAAJ,CAAgBlB,aAAa,CAACM,OAA9B,CAAR;AAAgDa,MAAAA,IAAI,EAAE;AAAtD,KAAlB;AACD;;AAED,SAAON,OAAP;AACD;;AAMD,SAASV,iBAAT,CAA2BD,UAA3B,EAAsE;AACpE,QAAMkB,SAAyB,GAAG,EAAlC;AAEAA,EAAAA,SAAS,CAACC,QAAV,GAAqB;AAACJ,IAAAA,KAAK,EAAE,IAAIK,YAAJ,CAAiBpB,UAAU,CAACM,QAA5B,CAAR;AAA+CW,IAAAA,IAAI,EAAE;AAArD,GAArB;;AAIA,MAAIjB,UAAU,CAACqB,OAAX,CAAmBhB,MAAnB,GAA4B,CAAhC,EAAmC;AACjCa,IAAAA,SAAS,CAACI,MAAV,GAAmB;AAACP,MAAAA,KAAK,EAAE,IAAIK,YAAJ,CAAiBpB,UAAU,CAACqB,OAA5B,CAAR;AAA8CJ,MAAAA,IAAI,EAAE;AAApD,KAAnB;AACD;;AAED,MAAIjB,UAAU,CAACuB,GAAX,CAAelB,MAAf,GAAwB,CAA5B,EAA+B;AAC7Ba,IAAAA,SAAS,CAACM,UAAV,GAAuB;AAACT,MAAAA,KAAK,EAAE,IAAIK,YAAJ,CAAiBpB,UAAU,CAACuB,GAA5B,CAAR;AAA0CN,MAAAA,IAAI,EAAE;AAAhD,KAAvB;AACD;;AAED,MAAIjB,UAAU,CAACyB,MAAX,CAAkBpB,MAAlB,GAA2B,CAA/B,EAAkC;AAEhCa,IAAAA,SAAS,CAACQ,OAAV,GAAoB;AAACX,MAAAA,KAAK,EAAE,IAAIY,UAAJ,CAAe3B,UAAU,CAACyB,MAA1B,CAAR;AAA2CR,MAAAA,IAAI,EAAE,CAAjD;AAAoDW,MAAAA,UAAU,EAAE;AAAhE,KAApB;AACD;;AAED,SAAOV,SAAP;AACD","sourcesContent":["import type {MeshAttributes} from '@loaders.gl/schema';\nimport {getMeshBoundingBox} from '@loaders.gl/schema';\nimport type {PLYMesh, PLYHeader, PLYAttributes, MeshHeader} from './ply-types';\nimport {getPLYSchema} from './get-ply-schema';\n\n/**\n * @param header\n * @param attributes\n * @returns data and header\n */\nexport default function normalizePLY(\n plyHeader: MeshHeader & PLYHeader,\n plyAttributes: PLYAttributes,\n options?: {}\n): PLYMesh {\n const attributes = getMeshAttributes(plyAttributes);\n const boundingBox = getMeshBoundingBox(attributes);\n const vertexCount = plyAttributes.indices.length || plyAttributes.vertices.length / 3;\n\n // TODO - how to detect POINT CLOUDS vs MESHES?\n // TODO - For Meshes, PLY quadrangles must be split?\n const isTriangles = plyAttributes.indices && plyAttributes.indices.length > 0;\n const mode = isTriangles ? 4 : 0; // TRIANGLES vs POINTS\n const topology = isTriangles ? 'triangle-list' : 'point-list';\n\n const schema = getPLYSchema(plyHeader, attributes);\n\n const plyMesh: PLYMesh = {\n loader: 'ply',\n loaderData: plyHeader,\n header: {\n vertexCount,\n boundingBox\n },\n schema,\n attributes,\n indices: {value: new Uint32Array(0), size: 0},\n mode,\n topology\n };\n\n if (plyAttributes.indices.length > 0) {\n plyMesh.indices = {value: new Uint32Array(plyAttributes.indices), size: 1};\n }\n\n return plyMesh;\n}\n\n/**\n * @param attributes\n * @returns accessors []\n */\nfunction getMeshAttributes(attributes: PLYAttributes): MeshAttributes {\n const accessors: MeshAttributes = {};\n\n accessors.POSITION = {value: new Float32Array(attributes.vertices), size: 3};\n\n // optional attributes data\n\n if (attributes.normals.length > 0) {\n accessors.NORMAL = {value: new Float32Array(attributes.normals), size: 3};\n }\n\n if (attributes.uvs.length > 0) {\n accessors.TEXCOORD_0 = {value: new Float32Array(attributes.uvs), size: 2};\n }\n\n if (attributes.colors.length > 0) {\n // TODO - normalized shoud be based on `uchar` flag in source data?\n accessors.COLOR_0 = {value: new Uint8Array(attributes.colors), size: 3, normalized: true};\n }\n\n return accessors;\n}\n"],"file":"normalize-ply.js"}
1
+ {"version":3,"file":"normalize-ply.js","names":["getMeshBoundingBox","getPLYSchema","normalizePLY","plyHeader","plyAttributes","options","attributes","getMeshAttributes","boundingBox","vertexCount","indices","length","vertices","isTriangles","mode","topology","schema","plyMesh","loader","loaderData","header","value","Uint32Array","size","accessors","POSITION","Float32Array","normals","NORMAL","uvs","TEXCOORD_0","colors","COLOR_0","Uint8Array","normalized"],"sources":["../../../src/lib/normalize-ply.ts"],"sourcesContent":["import type {MeshAttributes} from '@loaders.gl/schema';\nimport {getMeshBoundingBox} from '@loaders.gl/schema';\nimport type {PLYMesh, PLYHeader, PLYAttributes, MeshHeader} from './ply-types';\nimport {getPLYSchema} from './get-ply-schema';\n\n/**\n * @param header\n * @param attributes\n * @returns data and header\n */\nexport default function normalizePLY(\n plyHeader: MeshHeader & PLYHeader,\n plyAttributes: PLYAttributes,\n options?: {}\n): PLYMesh {\n const attributes = getMeshAttributes(plyAttributes);\n const boundingBox = getMeshBoundingBox(attributes);\n const vertexCount = plyAttributes.indices.length || plyAttributes.vertices.length / 3;\n\n // TODO - how to detect POINT CLOUDS vs MESHES?\n // TODO - For Meshes, PLY quadrangles must be split?\n const isTriangles = plyAttributes.indices && plyAttributes.indices.length > 0;\n const mode = isTriangles ? 4 : 0; // TRIANGLES vs POINTS\n const topology = isTriangles ? 'triangle-list' : 'point-list';\n\n const schema = getPLYSchema(plyHeader, attributes);\n\n const plyMesh: PLYMesh = {\n loader: 'ply',\n loaderData: plyHeader,\n header: {\n vertexCount,\n boundingBox\n },\n schema,\n attributes,\n indices: {value: new Uint32Array(0), size: 0},\n mode,\n topology\n };\n\n if (plyAttributes.indices.length > 0) {\n plyMesh.indices = {value: new Uint32Array(plyAttributes.indices), size: 1};\n }\n\n return plyMesh;\n}\n\n/**\n * @param attributes\n * @returns accessors []\n */\nfunction getMeshAttributes(attributes: PLYAttributes): MeshAttributes {\n const accessors: MeshAttributes = {};\n\n accessors.POSITION = {value: new Float32Array(attributes.vertices), size: 3};\n\n // optional attributes data\n\n if (attributes.normals.length > 0) {\n accessors.NORMAL = {value: new Float32Array(attributes.normals), size: 3};\n }\n\n if (attributes.uvs.length > 0) {\n accessors.TEXCOORD_0 = {value: new Float32Array(attributes.uvs), size: 2};\n }\n\n if (attributes.colors.length > 0) {\n // TODO - normalized shoud be based on `uchar` flag in source data?\n accessors.COLOR_0 = {value: new Uint8Array(attributes.colors), size: 3, normalized: true};\n }\n\n return accessors;\n}\n"],"mappings":"AACA,SAAQA,kBAAkB,QAAO,oBAAoB;AAErD,SAAQC,YAAY,QAAO,kBAAkB;;AAO7C,eAAe,SAASC,YAAY,CAClCC,SAAiC,EACjCC,aAA4B,EAC5BC,OAAY,EACH;EACT,MAAMC,UAAU,GAAGC,iBAAiB,CAACH,aAAa,CAAC;EACnD,MAAMI,WAAW,GAAGR,kBAAkB,CAACM,UAAU,CAAC;EAClD,MAAMG,WAAW,GAAGL,aAAa,CAACM,OAAO,CAACC,MAAM,IAAIP,aAAa,CAACQ,QAAQ,CAACD,MAAM,GAAG,CAAC;;EAIrF,MAAME,WAAW,GAAGT,aAAa,CAACM,OAAO,IAAIN,aAAa,CAACM,OAAO,CAACC,MAAM,GAAG,CAAC;EAC7E,MAAMG,IAAI,GAAGD,WAAW,GAAG,CAAC,GAAG,CAAC;EAChC,MAAME,QAAQ,GAAGF,WAAW,GAAG,eAAe,GAAG,YAAY;EAE7D,MAAMG,MAAM,GAAGf,YAAY,CAACE,SAAS,EAAEG,UAAU,CAAC;EAElD,MAAMW,OAAgB,GAAG;IACvBC,MAAM,EAAE,KAAK;IACbC,UAAU,EAAEhB,SAAS;IACrBiB,MAAM,EAAE;MACNX,WAAW;MACXD;IACF,CAAC;IACDQ,MAAM;IACNV,UAAU;IACVI,OAAO,EAAE;MAACW,KAAK,EAAE,IAAIC,WAAW,CAAC,CAAC,CAAC;MAAEC,IAAI,EAAE;IAAC,CAAC;IAC7CT,IAAI;IACJC;EACF,CAAC;EAED,IAAIX,aAAa,CAACM,OAAO,CAACC,MAAM,GAAG,CAAC,EAAE;IACpCM,OAAO,CAACP,OAAO,GAAG;MAACW,KAAK,EAAE,IAAIC,WAAW,CAAClB,aAAa,CAACM,OAAO,CAAC;MAAEa,IAAI,EAAE;IAAC,CAAC;EAC5E;EAEA,OAAON,OAAO;AAChB;;AAMA,SAASV,iBAAiB,CAACD,UAAyB,EAAkB;EACpE,MAAMkB,SAAyB,GAAG,CAAC,CAAC;EAEpCA,SAAS,CAACC,QAAQ,GAAG;IAACJ,KAAK,EAAE,IAAIK,YAAY,CAACpB,UAAU,CAACM,QAAQ,CAAC;IAAEW,IAAI,EAAE;EAAC,CAAC;;EAI5E,IAAIjB,UAAU,CAACqB,OAAO,CAAChB,MAAM,GAAG,CAAC,EAAE;IACjCa,SAAS,CAACI,MAAM,GAAG;MAACP,KAAK,EAAE,IAAIK,YAAY,CAACpB,UAAU,CAACqB,OAAO,CAAC;MAAEJ,IAAI,EAAE;IAAC,CAAC;EAC3E;EAEA,IAAIjB,UAAU,CAACuB,GAAG,CAAClB,MAAM,GAAG,CAAC,EAAE;IAC7Ba,SAAS,CAACM,UAAU,GAAG;MAACT,KAAK,EAAE,IAAIK,YAAY,CAACpB,UAAU,CAACuB,GAAG,CAAC;MAAEN,IAAI,EAAE;IAAC,CAAC;EAC3E;EAEA,IAAIjB,UAAU,CAACyB,MAAM,CAACpB,MAAM,GAAG,CAAC,EAAE;IAEhCa,SAAS,CAACQ,OAAO,GAAG;MAACX,KAAK,EAAE,IAAIY,UAAU,CAAC3B,UAAU,CAACyB,MAAM,CAAC;MAAER,IAAI,EAAE,CAAC;MAAEW,UAAU,EAAE;IAAI,CAAC;EAC3F;EAEA,OAAOV,SAAS;AAClB"}