@loaders.gl/obj 3.3.0-alpha.5 → 3.3.0-alpha.7

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 (41) 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 -21
  4. package/dist/es5/index.js.map +1 -1
  5. package/dist/es5/lib/get-obj-schema.js +0 -10
  6. package/dist/es5/lib/get-obj-schema.js.map +1 -1
  7. package/dist/es5/lib/obj-types.js.map +1 -1
  8. package/dist/es5/lib/parse-mtl.js +3 -22
  9. package/dist/es5/lib/parse-mtl.js.map +1 -1
  10. package/dist/es5/lib/parse-obj-meshes.js +20 -74
  11. package/dist/es5/lib/parse-obj-meshes.js.map +1 -1
  12. package/dist/es5/lib/parse-obj.js +7 -24
  13. package/dist/es5/lib/parse-obj.js.map +1 -1
  14. package/dist/es5/mtl-loader.js +2 -1
  15. package/dist/es5/mtl-loader.js.map +1 -1
  16. package/dist/es5/obj-loader.js +1 -3
  17. package/dist/es5/obj-loader.js.map +1 -1
  18. package/dist/es5/workers/obj-worker.js +0 -2
  19. package/dist/es5/workers/obj-worker.js.map +1 -1
  20. package/dist/esm/bundle.js +1 -1
  21. package/dist/esm/bundle.js.map +1 -1
  22. package/dist/esm/index.js +7 -2
  23. package/dist/esm/index.js.map +1 -1
  24. package/dist/esm/lib/get-obj-schema.js +2 -9
  25. package/dist/esm/lib/get-obj-schema.js.map +1 -1
  26. package/dist/esm/lib/obj-types.js.map +1 -1
  27. package/dist/esm/lib/parse-mtl.js +5 -16
  28. package/dist/esm/lib/parse-mtl.js.map +1 -1
  29. package/dist/esm/lib/parse-obj-meshes.js +23 -76
  30. package/dist/esm/lib/parse-obj-meshes.js.map +1 -1
  31. package/dist/esm/lib/parse-obj.js +2 -10
  32. package/dist/esm/lib/parse-obj.js.map +1 -1
  33. package/dist/esm/mtl-loader.js +3 -1
  34. package/dist/esm/mtl-loader.js.map +1 -1
  35. package/dist/esm/obj-loader.js +2 -3
  36. package/dist/esm/obj-loader.js.map +1 -1
  37. package/dist/esm/workers/obj-worker.js.map +1 -1
  38. package/dist/index.d.ts +4 -4
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/obj-worker.js +2 -2
  41. package/package.json +4 -4
@@ -1,15 +1,17 @@
1
+
2
+
1
3
  const OBJECT_RE = /^[og]\s*(.+)?/;
2
4
  const MATERIAL_RE = /^mtllib /;
3
5
  const MATERIAL_USE_RE = /^usemtl /;
4
-
5
6
  class MeshMaterial {
6
- constructor({
7
- index,
8
- name = '',
9
- mtllib,
10
- smooth,
11
- groupStart
12
- }) {
7
+ constructor(_ref) {
8
+ let {
9
+ index,
10
+ name = '',
11
+ mtllib,
12
+ smooth,
13
+ groupStart
14
+ } = _ref;
13
15
  this.index = index;
14
16
  this.name = name;
15
17
  this.mtllib = mtllib;
@@ -19,8 +21,8 @@ class MeshMaterial {
19
21
  this.groupCount = -1;
20
22
  this.inherited = false;
21
23
  }
22
-
23
- clone(index = this.index) {
24
+ clone() {
25
+ let index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.index;
24
26
  return new MeshMaterial({
25
27
  index,
26
28
  name: this.name,
@@ -29,11 +31,10 @@ class MeshMaterial {
29
31
  groupStart: 0
30
32
  });
31
33
  }
32
-
33
34
  }
34
-
35
35
  class MeshObject {
36
- constructor(name = '') {
36
+ constructor() {
37
+ let name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
37
38
  this.name = name;
38
39
  this.geometry = {
39
40
  vertices: [],
@@ -45,14 +46,12 @@ class MeshObject {
45
46
  this.smooth = true;
46
47
  this.fromDeclaration = null;
47
48
  }
48
-
49
49
  startMaterial(name, libraries) {
50
50
  const previous = this._finalize(false);
51
51
 
52
52
  if (previous && (previous.inherited || previous.groupCount <= 0)) {
53
53
  this.materials.splice(previous.index, 1);
54
54
  }
55
-
56
55
  const material = new MeshMaterial({
57
56
  index: this.materials.length,
58
57
  name,
@@ -63,18 +62,14 @@ class MeshObject {
63
62
  this.materials.push(material);
64
63
  return material;
65
64
  }
66
-
67
65
  currentMaterial() {
68
66
  if (this.materials.length > 0) {
69
67
  return this.materials[this.materials.length - 1];
70
68
  }
71
-
72
69
  return undefined;
73
70
  }
74
-
75
71
  _finalize(end) {
76
72
  const lastMultiMaterial = this.currentMaterial();
77
-
78
73
  if (lastMultiMaterial && lastMultiMaterial.groupEnd === -1) {
79
74
  lastMultiMaterial.groupEnd = this.geometry.vertices.length / 3;
80
75
  lastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart;
@@ -95,12 +90,9 @@ class MeshObject {
95
90
  smooth: this.smooth
96
91
  });
97
92
  }
98
-
99
93
  return lastMultiMaterial;
100
94
  }
101
-
102
95
  }
103
-
104
96
  class ParserState {
105
97
  constructor() {
106
98
  this.objects = [];
@@ -112,20 +104,17 @@ class ParserState {
112
104
  this.materialLibraries = [];
113
105
  this.startObject('', false);
114
106
  }
115
-
116
- startObject(name, fromDeclaration = true) {
107
+ startObject(name) {
108
+ let fromDeclaration = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
117
109
  if (this.object && !this.object.fromDeclaration) {
118
110
  this.object.name = name;
119
111
  this.object.fromDeclaration = fromDeclaration;
120
112
  return;
121
113
  }
122
-
123
114
  const previousMaterial = this.object && typeof this.object.currentMaterial === 'function' ? this.object.currentMaterial() : undefined;
124
-
125
115
  if (this.object && typeof this.object._finalize === 'function') {
126
116
  this.object._finalize(true);
127
117
  }
128
-
129
118
  this.object = new MeshObject(name);
130
119
  this.object.fromDeclaration = fromDeclaration;
131
120
 
@@ -134,31 +123,25 @@ class ParserState {
134
123
  declared.inherited = true;
135
124
  this.object.materials.push(declared);
136
125
  }
137
-
138
126
  this.objects.push(this.object);
139
127
  }
140
-
141
128
  finalize() {
142
129
  if (this.object && typeof this.object._finalize === 'function') {
143
130
  this.object._finalize(true);
144
131
  }
145
132
  }
146
-
147
133
  parseVertexIndex(value, len) {
148
134
  const index = parseInt(value);
149
135
  return (index >= 0 ? index - 1 : index + len / 3) * 3;
150
136
  }
151
-
152
137
  parseNormalIndex(value, len) {
153
138
  const index = parseInt(value);
154
139
  return (index >= 0 ? index - 1 : index + len / 3) * 3;
155
140
  }
156
-
157
141
  parseUVIndex(value, len) {
158
142
  const index = parseInt(value);
159
143
  return (index >= 0 ? index - 1 : index + len / 2) * 2;
160
144
  }
161
-
162
145
  addVertex(a, b, c) {
163
146
  const src = this.vertices;
164
147
  const dst = this.object.geometry.vertices;
@@ -166,19 +149,16 @@ class ParserState {
166
149
  dst.push(src[b + 0], src[b + 1], src[b + 2]);
167
150
  dst.push(src[c + 0], src[c + 1], src[c + 2]);
168
151
  }
169
-
170
152
  addVertexPoint(a) {
171
153
  const src = this.vertices;
172
154
  const dst = this.object.geometry.vertices;
173
155
  dst.push(src[a + 0], src[a + 1], src[a + 2]);
174
156
  }
175
-
176
157
  addVertexLine(a) {
177
158
  const src = this.vertices;
178
159
  const dst = this.object.geometry.vertices;
179
160
  dst.push(src[a + 0], src[a + 1], src[a + 2]);
180
161
  }
181
-
182
162
  addNormal(a, b, c) {
183
163
  const src = this.normals;
184
164
  const dst = this.object.geometry.normals;
@@ -186,7 +166,6 @@ class ParserState {
186
166
  dst.push(src[b + 0], src[b + 1], src[b + 2]);
187
167
  dst.push(src[c + 0], src[c + 1], src[c + 2]);
188
168
  }
189
-
190
169
  addColor(a, b, c) {
191
170
  const src = this.colors;
192
171
  const dst = this.object.geometry.colors;
@@ -194,7 +173,6 @@ class ParserState {
194
173
  dst.push(src[b + 0], src[b + 1], src[b + 2]);
195
174
  dst.push(src[c + 0], src[c + 1], src[c + 2]);
196
175
  }
197
-
198
176
  addUV(a, b, c) {
199
177
  const src = this.uvs;
200
178
  const dst = this.object.geometry.uvs;
@@ -202,7 +180,6 @@ class ParserState {
202
180
  dst.push(src[b + 0], src[b + 1]);
203
181
  dst.push(src[c + 0], src[c + 1]);
204
182
  }
205
-
206
183
  addUVLine(a) {
207
184
  const src = this.uvs;
208
185
  const dst = this.object.geometry.uvs;
@@ -215,7 +192,6 @@ class ParserState {
215
192
  let ib = this.parseVertexIndex(b, vLen);
216
193
  let ic = this.parseVertexIndex(c, vLen);
217
194
  this.addVertex(ia, ib, ic);
218
-
219
195
  if (ua !== undefined && ua !== '') {
220
196
  const uvLen = this.uvs.length;
221
197
  ia = this.parseUVIndex(ua, uvLen);
@@ -223,7 +199,6 @@ class ParserState {
223
199
  ic = this.parseUVIndex(uc, uvLen);
224
200
  this.addUV(ia, ib, ic);
225
201
  }
226
-
227
202
  if (na !== undefined && na !== '') {
228
203
  const nLen = this.normals.length;
229
204
  ia = this.parseNormalIndex(na, nLen);
@@ -231,53 +206,44 @@ class ParserState {
231
206
  ic = na === nc ? ia : this.parseNormalIndex(nc, nLen);
232
207
  this.addNormal(ia, ib, ic);
233
208
  }
234
-
235
209
  if (this.colors.length > 0) {
236
210
  this.addColor(ia, ib, ic);
237
211
  }
238
212
  }
239
-
240
213
  addPointGeometry(vertices) {
241
214
  this.object.geometry.type = 'Points';
242
215
  const vLen = this.vertices.length;
243
-
244
216
  for (const vertex of vertices) {
245
217
  this.addVertexPoint(this.parseVertexIndex(vertex, vLen));
246
218
  }
247
219
  }
248
-
249
220
  addLineGeometry(vertices, uvs) {
250
221
  this.object.geometry.type = 'Line';
251
222
  const vLen = this.vertices.length;
252
223
  const uvLen = this.uvs.length;
253
-
254
224
  for (const vertex of vertices) {
255
225
  this.addVertexLine(this.parseVertexIndex(vertex, vLen));
256
226
  }
257
-
258
227
  for (const uv of uvs) {
259
228
  this.addUVLine(this.parseUVIndex(uv, uvLen));
260
229
  }
261
230
  }
262
-
263
231
  }
264
232
 
265
233
  export function parseOBJMeshes(text) {
266
234
  const state = new ParserState();
267
-
268
235
  if (text.indexOf('\r\n') !== -1) {
269
236
  text = text.replace(/\r\n/g, '\n');
270
237
  }
271
-
272
238
  if (text.indexOf('\\\n') !== -1) {
273
239
  text = text.replace(/\\\n/g, '');
274
240
  }
275
-
276
241
  const lines = text.split('\n');
277
242
  let line = '';
278
243
  let lineFirstChar = '';
279
244
  let lineLength = 0;
280
245
  let result = [];
246
+
281
247
  const trimLeft = typeof ''.trimLeft === 'function';
282
248
 
283
249
  for (let i = 0, l = lines.length; i < l; i++) {
@@ -286,29 +252,23 @@ export function parseOBJMeshes(text) {
286
252
  lineLength = line.length;
287
253
  if (lineLength === 0) continue;
288
254
  lineFirstChar = line.charAt(0);
289
- if (lineFirstChar === '#') continue;
290
255
 
256
+ if (lineFirstChar === '#') continue;
291
257
  if (lineFirstChar === 'v') {
292
258
  const data = line.split(/\s+/);
293
-
294
259
  switch (data[0]) {
295
260
  case 'v':
296
261
  state.vertices.push(parseFloat(data[1]), parseFloat(data[2]), parseFloat(data[3]));
297
-
298
262
  if (data.length === 8) {
299
263
  state.colors.push(parseFloat(data[4]), parseFloat(data[5]), parseFloat(data[6]));
300
264
  }
301
-
302
265
  break;
303
-
304
266
  case 'vn':
305
267
  state.normals.push(parseFloat(data[1]), parseFloat(data[2]), parseFloat(data[3]));
306
268
  break;
307
-
308
269
  case 'vt':
309
270
  state.uvs.push(parseFloat(data[1]), parseFloat(data[2]));
310
271
  break;
311
-
312
272
  default:
313
273
  }
314
274
  } else if (lineFirstChar === 'f') {
@@ -318,7 +278,6 @@ export function parseOBJMeshes(text) {
318
278
 
319
279
  for (let j = 0, jl = vertexData.length; j < jl; j++) {
320
280
  const vertex = vertexData[j];
321
-
322
281
  if (vertex.length > 0) {
323
282
  const vertexParts = vertex.split('/');
324
283
  faceVertices.push(vertexParts);
@@ -326,7 +285,6 @@ export function parseOBJMeshes(text) {
326
285
  }
327
286
 
328
287
  const v1 = faceVertices[0];
329
-
330
288
  for (let j = 1, jl = faceVertices.length - 1; j < jl; j++) {
331
289
  const v2 = faceVertices[j];
332
290
  const v3 = faceVertices[j + 1];
@@ -336,30 +294,31 @@ export function parseOBJMeshes(text) {
336
294
  const lineParts = line.substring(1).trim().split(' ');
337
295
  let lineVertices;
338
296
  const lineUVs = [];
339
-
340
297
  if (line.indexOf('/') === -1) {
341
298
  lineVertices = lineParts;
342
299
  } else {
343
300
  lineVertices = [];
344
-
345
301
  for (let li = 0, llen = lineParts.length; li < llen; li++) {
346
302
  const parts = lineParts[li].split('/');
347
303
  if (parts[0] !== '') lineVertices.push(parts[0]);
348
304
  if (parts[1] !== '') lineUVs.push(parts[1]);
349
305
  }
350
306
  }
351
-
352
307
  state.addLineGeometry(lineVertices, lineUVs);
353
308
  } else if (lineFirstChar === 'p') {
354
309
  const lineData = line.substr(1).trim();
355
310
  const pointData = lineData.split(' ');
356
311
  state.addPointGeometry(pointData);
357
312
  } else if ((result = OBJECT_RE.exec(line)) !== null) {
313
+
358
314
  const name = (' ' + result[0].substr(1).trim()).substr(1);
315
+
359
316
  state.startObject(name);
360
317
  } else if (MATERIAL_USE_RE.test(line)) {
318
+
361
319
  state.object.startMaterial(line.substring(7).trim(), state.materialLibraries);
362
320
  } else if (MATERIAL_RE.test(line)) {
321
+
363
322
  state.materialLibraries.push(line.substring(7).trim());
364
323
  } else if (lineFirstChar === 's') {
365
324
  result = line.split(' ');
@@ -370,7 +329,6 @@ export function parseOBJMeshes(text) {
370
329
  } else {
371
330
  state.object.smooth = true;
372
331
  }
373
-
374
332
  const material = state.object.currentMaterial();
375
333
  if (material) material.smooth = state.object.smooth;
376
334
  } else {
@@ -378,15 +336,14 @@ export function parseOBJMeshes(text) {
378
336
  throw new Error("Unexpected line: \"".concat(line, "\""));
379
337
  }
380
338
  }
381
-
382
339
  state.finalize();
383
340
  const meshes = [];
384
341
  const materials = [];
385
-
386
342
  for (const object of state.objects) {
387
343
  const {
388
344
  geometry
389
345
  } = object;
346
+
390
347
  if (geometry.vertices.length === 0) continue;
391
348
  const mesh = {
392
349
  header: {
@@ -394,40 +351,33 @@ export function parseOBJMeshes(text) {
394
351
  },
395
352
  attributes: {}
396
353
  };
397
-
398
354
  switch (geometry.type) {
399
355
  case 'Points':
400
356
  mesh.mode = 0;
401
357
  break;
402
-
403
358
  case 'Line':
404
359
  mesh.mode = 1;
405
360
  break;
406
-
407
361
  default:
408
362
  mesh.mode = 4;
409
363
  break;
410
364
  }
411
-
412
365
  mesh.attributes.POSITION = {
413
366
  value: new Float32Array(geometry.vertices),
414
367
  size: 3
415
368
  };
416
-
417
369
  if (geometry.normals.length > 0) {
418
370
  mesh.attributes.NORMAL = {
419
371
  value: new Float32Array(geometry.normals),
420
372
  size: 3
421
373
  };
422
374
  }
423
-
424
375
  if (geometry.colors.length > 0) {
425
376
  mesh.attributes.COLOR_0 = {
426
377
  value: new Float32Array(geometry.colors),
427
378
  size: 3
428
379
  };
429
380
  }
430
-
431
381
  if (geometry.uvs.length > 0) {
432
382
  mesh.attributes.TEXCOORD_0 = {
433
383
  value: new Float32Array(geometry.uvs),
@@ -436,7 +386,6 @@ export function parseOBJMeshes(text) {
436
386
  }
437
387
 
438
388
  mesh.materials = [];
439
-
440
389
  for (const sourceMaterial of object.materials) {
441
390
  const _material = {
442
391
  name: sourceMaterial.name,
@@ -445,11 +394,9 @@ export function parseOBJMeshes(text) {
445
394
  mesh.materials.push(_material);
446
395
  materials.push(_material);
447
396
  }
448
-
449
397
  mesh.name = object.name;
450
398
  meshes.push(mesh);
451
399
  }
452
-
453
400
  return {
454
401
  meshes,
455
402
  materials
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/parse-obj-meshes.ts"],"names":["OBJECT_RE","MATERIAL_RE","MATERIAL_USE_RE","MeshMaterial","constructor","index","name","mtllib","smooth","groupStart","groupEnd","groupCount","inherited","clone","MeshObject","geometry","vertices","normals","colors","uvs","materials","fromDeclaration","startMaterial","libraries","previous","_finalize","splice","material","length","Array","isArray","undefined","push","currentMaterial","end","lastMultiMaterial","mi","ParserState","objects","object","materialLibraries","startObject","previousMaterial","declared","finalize","parseVertexIndex","value","len","parseInt","parseNormalIndex","parseUVIndex","addVertex","a","b","c","src","dst","addVertexPoint","addVertexLine","addNormal","addColor","addUV","addUVLine","addFace","ua","ub","uc","na","nb","nc","vLen","ia","ib","ic","uvLen","nLen","addPointGeometry","type","vertex","addLineGeometry","uv","parseOBJMeshes","text","state","indexOf","replace","lines","split","line","lineFirstChar","lineLength","result","trimLeft","i","l","trim","charAt","data","parseFloat","lineData","substr","vertexData","faceVertices","j","jl","vertexParts","v1","v2","v3","lineParts","substring","lineVertices","lineUVs","li","llen","parts","pointData","exec","test","toLowerCase","Error","meshes","mesh","header","vertexCount","attributes","mode","POSITION","Float32Array","size","NORMAL","COLOR_0","TEXCOORD_0","sourceMaterial","_material","flatShading"],"mappings":"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","sourcesContent":["// OBJ Loader, adapted from THREE.js (MIT license)\n//\n// Attributions per original THREE.js source file:\n//\n// @author mrdoob / http://mrdoob.com/\n\n// @ts-nocheck\n\n// o object_name | g group_name\nconst OBJECT_RE = /^[og]\\s*(.+)?/;\n// mtllib file_reference\nconst MATERIAL_RE = /^mtllib /;\n// usemtl material_name\nconst MATERIAL_USE_RE = /^usemtl /;\n\nclass MeshMaterial {\n constructor({index, name = '', mtllib, smooth, groupStart}) {\n this.index = index;\n this.name = name;\n this.mtllib = mtllib;\n this.smooth = smooth;\n this.groupStart = groupStart;\n this.groupEnd = -1;\n this.groupCount = -1;\n this.inherited = false;\n }\n\n clone(index = this.index) {\n return new MeshMaterial({\n index,\n name: this.name,\n mtllib: this.mtllib,\n smooth: this.smooth,\n groupStart: 0\n });\n }\n}\n\nclass MeshObject {\n constructor(name = '') {\n this.name = name;\n\n this.geometry = {\n vertices: [],\n normals: [],\n colors: [],\n uvs: []\n };\n\n this.materials = [];\n this.smooth = true;\n\n this.fromDeclaration = null;\n }\n\n startMaterial(name, libraries) {\n const previous = this._finalize(false);\n\n // New usemtl declaration overwrites an inherited material, except if faces were declared\n // after the material, then it must be preserved for proper MultiMaterial continuation.\n if (previous && (previous.inherited || previous.groupCount <= 0)) {\n this.materials.splice(previous.index, 1);\n }\n\n const material = new MeshMaterial({\n index: this.materials.length,\n name,\n mtllib:\n Array.isArray(libraries) && libraries.length > 0 ? libraries[libraries.length - 1] : '',\n smooth: previous !== undefined ? previous.smooth : this.smooth,\n groupStart: previous !== undefined ? previous.groupEnd : 0\n });\n\n this.materials.push(material);\n\n return material;\n }\n\n currentMaterial() {\n if (this.materials.length > 0) {\n return this.materials[this.materials.length - 1];\n }\n\n return undefined;\n }\n\n _finalize(end) {\n const lastMultiMaterial = this.currentMaterial();\n if (lastMultiMaterial && lastMultiMaterial.groupEnd === -1) {\n lastMultiMaterial.groupEnd = this.geometry.vertices.length / 3;\n lastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart;\n lastMultiMaterial.inherited = false;\n }\n\n // Ignore objects tail materials if no face declarations followed them before a new o/g started.\n if (end && this.materials.length > 1) {\n for (let mi = this.materials.length - 1; mi >= 0; mi--) {\n if (this.materials[mi].groupCount <= 0) {\n this.materials.splice(mi, 1);\n }\n }\n }\n\n // Guarantee at least one empty material, this makes the creation later more straight forward.\n if (end && this.materials.length === 0) {\n this.materials.push({\n name: '',\n smooth: this.smooth\n });\n }\n\n return lastMultiMaterial;\n }\n}\n\nclass ParserState {\n constructor() {\n this.objects = [];\n this.object = null;\n\n this.vertices = [];\n this.normals = [];\n this.colors = [];\n this.uvs = [];\n\n this.materialLibraries = [];\n\n this.startObject('', false);\n }\n\n startObject(name, fromDeclaration = true) {\n // If the current object (initial from reset) is not from a g/o declaration in the parsed\n // file. We need to use it for the first parsed g/o to keep things in sync.\n if (this.object && !this.object.fromDeclaration) {\n this.object.name = name;\n this.object.fromDeclaration = fromDeclaration;\n return;\n }\n\n const previousMaterial =\n this.object && typeof this.object.currentMaterial === 'function'\n ? this.object.currentMaterial()\n : undefined;\n\n if (this.object && typeof this.object._finalize === 'function') {\n this.object._finalize(true);\n }\n\n this.object = new MeshObject(name);\n this.object.fromDeclaration = fromDeclaration;\n\n // Inherit previous objects material.\n // Spec tells us that a declared material must be set to all objects until a new material is declared.\n // If a usemtl declaration is encountered while this new object is being parsed, it will\n // overwrite the inherited material. Exception being that there was already face declarations\n // to the inherited material, then it will be preserved for proper MultiMaterial continuation.\n if (previousMaterial && previousMaterial.name && typeof previousMaterial.clone === 'function') {\n const declared = previousMaterial.clone(0);\n declared.inherited = true;\n this.object.materials.push(declared);\n }\n\n this.objects.push(this.object);\n }\n\n finalize() {\n if (this.object && typeof this.object._finalize === 'function') {\n this.object._finalize(true);\n }\n }\n\n parseVertexIndex(value, len) {\n const index = parseInt(value);\n return (index >= 0 ? index - 1 : index + len / 3) * 3;\n }\n\n parseNormalIndex(value, len) {\n const index = parseInt(value);\n return (index >= 0 ? index - 1 : index + len / 3) * 3;\n }\n\n parseUVIndex(value, len) {\n const index = parseInt(value);\n return (index >= 0 ? index - 1 : index + len / 2) * 2;\n }\n\n addVertex(a, b, c) {\n const src = this.vertices;\n const dst = this.object.geometry.vertices;\n\n dst.push(src[a + 0], src[a + 1], src[a + 2]);\n dst.push(src[b + 0], src[b + 1], src[b + 2]);\n dst.push(src[c + 0], src[c + 1], src[c + 2]);\n }\n\n addVertexPoint(a) {\n const src = this.vertices;\n const dst = this.object.geometry.vertices;\n\n dst.push(src[a + 0], src[a + 1], src[a + 2]);\n }\n\n addVertexLine(a) {\n const src = this.vertices;\n const dst = this.object.geometry.vertices;\n\n dst.push(src[a + 0], src[a + 1], src[a + 2]);\n }\n\n addNormal(a, b, c) {\n const src = this.normals;\n const dst = this.object.geometry.normals;\n\n dst.push(src[a + 0], src[a + 1], src[a + 2]);\n dst.push(src[b + 0], src[b + 1], src[b + 2]);\n dst.push(src[c + 0], src[c + 1], src[c + 2]);\n }\n\n addColor(a, b, c) {\n const src = this.colors;\n const dst = this.object.geometry.colors;\n\n dst.push(src[a + 0], src[a + 1], src[a + 2]);\n dst.push(src[b + 0], src[b + 1], src[b + 2]);\n dst.push(src[c + 0], src[c + 1], src[c + 2]);\n }\n\n addUV(a, b, c) {\n const src = this.uvs;\n const dst = this.object.geometry.uvs;\n\n dst.push(src[a + 0], src[a + 1]);\n dst.push(src[b + 0], src[b + 1]);\n dst.push(src[c + 0], src[c + 1]);\n }\n\n addUVLine(a) {\n const src = this.uvs;\n const dst = this.object.geometry.uvs;\n\n dst.push(src[a + 0], src[a + 1]);\n }\n\n // eslint-disable-next-line max-params\n addFace(a, b, c, ua, ub, uc, na, nb, nc) {\n const vLen = this.vertices.length;\n\n let ia = this.parseVertexIndex(a, vLen);\n let ib = this.parseVertexIndex(b, vLen);\n let ic = this.parseVertexIndex(c, vLen);\n\n this.addVertex(ia, ib, ic);\n\n if (ua !== undefined && ua !== '') {\n const uvLen = this.uvs.length;\n ia = this.parseUVIndex(ua, uvLen);\n ib = this.parseUVIndex(ub, uvLen);\n ic = this.parseUVIndex(uc, uvLen);\n this.addUV(ia, ib, ic);\n }\n\n if (na !== undefined && na !== '') {\n // Normals are many times the same. If so, skip function call and parseInt.\n const nLen = this.normals.length;\n ia = this.parseNormalIndex(na, nLen);\n\n ib = na === nb ? ia : this.parseNormalIndex(nb, nLen);\n ic = na === nc ? ia : this.parseNormalIndex(nc, nLen);\n\n this.addNormal(ia, ib, ic);\n }\n\n if (this.colors.length > 0) {\n this.addColor(ia, ib, ic);\n }\n }\n\n addPointGeometry(vertices) {\n this.object.geometry.type = 'Points';\n\n const vLen = this.vertices.length;\n\n for (const vertex of vertices) {\n this.addVertexPoint(this.parseVertexIndex(vertex, vLen));\n }\n }\n\n addLineGeometry(vertices, uvs) {\n this.object.geometry.type = 'Line';\n\n const vLen = this.vertices.length;\n const uvLen = this.uvs.length;\n\n for (const vertex of vertices) {\n this.addVertexLine(this.parseVertexIndex(vertex, vLen));\n }\n\n for (const uv of uvs) {\n this.addUVLine(this.parseUVIndex(uv, uvLen));\n }\n }\n}\n\n// eslint-disable-next-line max-statements, complexity\nexport function parseOBJMeshes(text) {\n const state = new ParserState();\n\n if (text.indexOf('\\r\\n') !== -1) {\n // This is faster than String.split with regex that splits on both\n text = text.replace(/\\r\\n/g, '\\n');\n }\n\n if (text.indexOf('\\\\\\n') !== -1) {\n // join lines separated by a line continuation character (\\)\n text = text.replace(/\\\\\\n/g, '');\n }\n\n const lines = text.split('\\n');\n let line = '';\n let lineFirstChar = '';\n let lineLength = 0;\n let result = [];\n\n // Faster to just trim left side of the line. Use if available.\n const trimLeft = typeof ''.trimLeft === 'function';\n\n /* eslint-disable no-continue, max-depth */\n for (let i = 0, l = lines.length; i < l; i++) {\n line = lines[i];\n line = trimLeft ? line.trimLeft() : line.trim();\n lineLength = line.length;\n\n if (lineLength === 0) continue;\n\n lineFirstChar = line.charAt(0);\n\n // @todo invoke passed in handler if any\n if (lineFirstChar === '#') continue;\n\n if (lineFirstChar === 'v') {\n const data = line.split(/\\s+/);\n\n switch (data[0]) {\n case 'v':\n state.vertices.push(parseFloat(data[1]), parseFloat(data[2]), parseFloat(data[3]));\n if (data.length === 8) {\n state.colors.push(parseFloat(data[4]), parseFloat(data[5]), parseFloat(data[6]));\n }\n break;\n case 'vn':\n state.normals.push(parseFloat(data[1]), parseFloat(data[2]), parseFloat(data[3]));\n break;\n case 'vt':\n state.uvs.push(parseFloat(data[1]), parseFloat(data[2]));\n break;\n default:\n }\n } else if (lineFirstChar === 'f') {\n const lineData = line.substr(1).trim();\n const vertexData = lineData.split(/\\s+/);\n const faceVertices = [];\n\n // Parse the face vertex data into an easy to work with format\n\n for (let j = 0, jl = vertexData.length; j < jl; j++) {\n const vertex = vertexData[j];\n\n if (vertex.length > 0) {\n const vertexParts = vertex.split('/');\n faceVertices.push(vertexParts);\n }\n }\n\n // Draw an edge between the first vertex and all subsequent vertices to form an n-gon\n\n const v1 = faceVertices[0];\n\n for (let j = 1, jl = faceVertices.length - 1; j < jl; j++) {\n const v2 = faceVertices[j];\n const v3 = faceVertices[j + 1];\n\n state.addFace(v1[0], v2[0], v3[0], v1[1], v2[1], v3[1], v1[2], v2[2], v3[2]);\n }\n } else if (lineFirstChar === 'l') {\n const lineParts = line.substring(1).trim().split(' ');\n let lineVertices;\n const lineUVs = [];\n\n if (line.indexOf('/') === -1) {\n lineVertices = lineParts;\n } else {\n lineVertices = [];\n for (let li = 0, llen = lineParts.length; li < llen; li++) {\n const parts = lineParts[li].split('/');\n\n if (parts[0] !== '') lineVertices.push(parts[0]);\n if (parts[1] !== '') lineUVs.push(parts[1]);\n }\n }\n state.addLineGeometry(lineVertices, lineUVs);\n } else if (lineFirstChar === 'p') {\n const lineData = line.substr(1).trim();\n const pointData = lineData.split(' ');\n\n state.addPointGeometry(pointData);\n } else if ((result = OBJECT_RE.exec(line)) !== null) {\n // o object_name\n // or\n // g group_name\n\n // WORKAROUND: https://bugs.chromium.org/p/v8/issues/detail?id=2869\n // var name = result[ 0 ].substr( 1 ).trim();\n const name = (' ' + result[0].substr(1).trim()).substr(1); // eslint-disable-line\n\n state.startObject(name);\n } else if (MATERIAL_USE_RE.test(line)) {\n // material\n\n state.object.startMaterial(line.substring(7).trim(), state.materialLibraries);\n } else if (MATERIAL_RE.test(line)) {\n // mtl file\n\n state.materialLibraries.push(line.substring(7).trim());\n } else if (lineFirstChar === 's') {\n result = line.split(' ');\n\n // smooth shading\n\n // @todo Handle files that have varying smooth values for a set of faces inside one geometry,\n // but does not define a usemtl for each face set.\n // This should be detected and a dummy material created (later MultiMaterial and geometry groups).\n // This requires some care to not create extra material on each smooth value for \"normal\" obj files.\n // where explicit usemtl defines geometry groups.\n // Example asset: examples/models/obj/cerberus/Cerberus.obj\n\n /*\n * http://paulbourke.net/dataformats/obj/\n * or\n * http://www.cs.utah.edu/~boulos/cs3505/obj_spec.pdf\n *\n * From chapter \"Grouping\" Syntax explanation \"s group_number\":\n * \"group_number is the smoothing group number. To turn off smoothing groups, use a value of 0 or off.\n * Polygonal elements use group numbers to put elements in different smoothing groups. For free-form\n * surfaces, smoothing groups are either turned on or off; there is no difference between values greater\n * than 0.\"\n */\n if (result.length > 1) {\n const value = result[1].trim().toLowerCase();\n state.object.smooth = value !== '0' && value !== 'off';\n } else {\n // ZBrush can produce \"s\" lines #11707\n state.object.smooth = true;\n }\n const material = state.object.currentMaterial();\n if (material) material.smooth = state.object.smooth;\n } else {\n // Handle null terminated files without exception\n if (line === '\\0') continue;\n\n throw new Error(`Unexpected line: \"${line}\"`);\n }\n }\n\n state.finalize();\n\n const meshes = [];\n const materials = [];\n\n for (const object of state.objects) {\n const {geometry} = object;\n\n // Skip o/g line declarations that did not follow with any faces\n if (geometry.vertices.length === 0) continue;\n\n const mesh = {\n header: {\n vertexCount: geometry.vertices.length / 3\n },\n attributes: {}\n };\n\n switch (geometry.type) {\n case 'Points':\n mesh.mode = 0; // GL.POINTS\n break;\n case 'Line':\n mesh.mode = 1; // GL.LINES\n break;\n default:\n mesh.mode = 4; // GL.TRIANGLES\n break;\n }\n\n mesh.attributes.POSITION = {value: new Float32Array(geometry.vertices), size: 3};\n\n if (geometry.normals.length > 0) {\n mesh.attributes.NORMAL = {value: new Float32Array(geometry.normals), size: 3};\n }\n\n if (geometry.colors.length > 0) {\n mesh.attributes.COLOR_0 = {value: new Float32Array(geometry.colors), size: 3};\n }\n\n if (geometry.uvs.length > 0) {\n mesh.attributes.TEXCOORD_0 = {value: new Float32Array(geometry.uvs), size: 2};\n }\n\n // Create materials\n mesh.materials = [];\n for (const sourceMaterial of object.materials) {\n // TODO - support full spec\n const _material = {\n name: sourceMaterial.name,\n flatShading: !sourceMaterial.smooth\n };\n mesh.materials.push(_material);\n materials.push(_material);\n }\n\n mesh.name = object.name;\n meshes.push(mesh);\n }\n\n return {meshes, materials};\n}\n"],"file":"parse-obj-meshes.js"}
1
+ {"version":3,"file":"parse-obj-meshes.js","names":["OBJECT_RE","MATERIAL_RE","MATERIAL_USE_RE","MeshMaterial","constructor","index","name","mtllib","smooth","groupStart","groupEnd","groupCount","inherited","clone","MeshObject","geometry","vertices","normals","colors","uvs","materials","fromDeclaration","startMaterial","libraries","previous","_finalize","splice","material","length","Array","isArray","undefined","push","currentMaterial","end","lastMultiMaterial","mi","ParserState","objects","object","materialLibraries","startObject","previousMaterial","declared","finalize","parseVertexIndex","value","len","parseInt","parseNormalIndex","parseUVIndex","addVertex","a","b","c","src","dst","addVertexPoint","addVertexLine","addNormal","addColor","addUV","addUVLine","addFace","ua","ub","uc","na","nb","nc","vLen","ia","ib","ic","uvLen","nLen","addPointGeometry","type","vertex","addLineGeometry","uv","parseOBJMeshes","text","state","indexOf","replace","lines","split","line","lineFirstChar","lineLength","result","trimLeft","i","l","trim","charAt","data","parseFloat","lineData","substr","vertexData","faceVertices","j","jl","vertexParts","v1","v2","v3","lineParts","substring","lineVertices","lineUVs","li","llen","parts","pointData","exec","test","toLowerCase","Error","meshes","mesh","header","vertexCount","attributes","mode","POSITION","Float32Array","size","NORMAL","COLOR_0","TEXCOORD_0","sourceMaterial","_material","flatShading"],"sources":["../../../src/lib/parse-obj-meshes.ts"],"sourcesContent":["// OBJ Loader, adapted from THREE.js (MIT license)\n//\n// Attributions per original THREE.js source file:\n//\n// @author mrdoob / http://mrdoob.com/\n\n// @ts-nocheck\n\n// o object_name | g group_name\nconst OBJECT_RE = /^[og]\\s*(.+)?/;\n// mtllib file_reference\nconst MATERIAL_RE = /^mtllib /;\n// usemtl material_name\nconst MATERIAL_USE_RE = /^usemtl /;\n\nclass MeshMaterial {\n constructor({index, name = '', mtllib, smooth, groupStart}) {\n this.index = index;\n this.name = name;\n this.mtllib = mtllib;\n this.smooth = smooth;\n this.groupStart = groupStart;\n this.groupEnd = -1;\n this.groupCount = -1;\n this.inherited = false;\n }\n\n clone(index = this.index) {\n return new MeshMaterial({\n index,\n name: this.name,\n mtllib: this.mtllib,\n smooth: this.smooth,\n groupStart: 0\n });\n }\n}\n\nclass MeshObject {\n constructor(name = '') {\n this.name = name;\n\n this.geometry = {\n vertices: [],\n normals: [],\n colors: [],\n uvs: []\n };\n\n this.materials = [];\n this.smooth = true;\n\n this.fromDeclaration = null;\n }\n\n startMaterial(name, libraries) {\n const previous = this._finalize(false);\n\n // New usemtl declaration overwrites an inherited material, except if faces were declared\n // after the material, then it must be preserved for proper MultiMaterial continuation.\n if (previous && (previous.inherited || previous.groupCount <= 0)) {\n this.materials.splice(previous.index, 1);\n }\n\n const material = new MeshMaterial({\n index: this.materials.length,\n name,\n mtllib:\n Array.isArray(libraries) && libraries.length > 0 ? libraries[libraries.length - 1] : '',\n smooth: previous !== undefined ? previous.smooth : this.smooth,\n groupStart: previous !== undefined ? previous.groupEnd : 0\n });\n\n this.materials.push(material);\n\n return material;\n }\n\n currentMaterial() {\n if (this.materials.length > 0) {\n return this.materials[this.materials.length - 1];\n }\n\n return undefined;\n }\n\n _finalize(end) {\n const lastMultiMaterial = this.currentMaterial();\n if (lastMultiMaterial && lastMultiMaterial.groupEnd === -1) {\n lastMultiMaterial.groupEnd = this.geometry.vertices.length / 3;\n lastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart;\n lastMultiMaterial.inherited = false;\n }\n\n // Ignore objects tail materials if no face declarations followed them before a new o/g started.\n if (end && this.materials.length > 1) {\n for (let mi = this.materials.length - 1; mi >= 0; mi--) {\n if (this.materials[mi].groupCount <= 0) {\n this.materials.splice(mi, 1);\n }\n }\n }\n\n // Guarantee at least one empty material, this makes the creation later more straight forward.\n if (end && this.materials.length === 0) {\n this.materials.push({\n name: '',\n smooth: this.smooth\n });\n }\n\n return lastMultiMaterial;\n }\n}\n\nclass ParserState {\n constructor() {\n this.objects = [];\n this.object = null;\n\n this.vertices = [];\n this.normals = [];\n this.colors = [];\n this.uvs = [];\n\n this.materialLibraries = [];\n\n this.startObject('', false);\n }\n\n startObject(name, fromDeclaration = true) {\n // If the current object (initial from reset) is not from a g/o declaration in the parsed\n // file. We need to use it for the first parsed g/o to keep things in sync.\n if (this.object && !this.object.fromDeclaration) {\n this.object.name = name;\n this.object.fromDeclaration = fromDeclaration;\n return;\n }\n\n const previousMaterial =\n this.object && typeof this.object.currentMaterial === 'function'\n ? this.object.currentMaterial()\n : undefined;\n\n if (this.object && typeof this.object._finalize === 'function') {\n this.object._finalize(true);\n }\n\n this.object = new MeshObject(name);\n this.object.fromDeclaration = fromDeclaration;\n\n // Inherit previous objects material.\n // Spec tells us that a declared material must be set to all objects until a new material is declared.\n // If a usemtl declaration is encountered while this new object is being parsed, it will\n // overwrite the inherited material. Exception being that there was already face declarations\n // to the inherited material, then it will be preserved for proper MultiMaterial continuation.\n if (previousMaterial && previousMaterial.name && typeof previousMaterial.clone === 'function') {\n const declared = previousMaterial.clone(0);\n declared.inherited = true;\n this.object.materials.push(declared);\n }\n\n this.objects.push(this.object);\n }\n\n finalize() {\n if (this.object && typeof this.object._finalize === 'function') {\n this.object._finalize(true);\n }\n }\n\n parseVertexIndex(value, len) {\n const index = parseInt(value);\n return (index >= 0 ? index - 1 : index + len / 3) * 3;\n }\n\n parseNormalIndex(value, len) {\n const index = parseInt(value);\n return (index >= 0 ? index - 1 : index + len / 3) * 3;\n }\n\n parseUVIndex(value, len) {\n const index = parseInt(value);\n return (index >= 0 ? index - 1 : index + len / 2) * 2;\n }\n\n addVertex(a, b, c) {\n const src = this.vertices;\n const dst = this.object.geometry.vertices;\n\n dst.push(src[a + 0], src[a + 1], src[a + 2]);\n dst.push(src[b + 0], src[b + 1], src[b + 2]);\n dst.push(src[c + 0], src[c + 1], src[c + 2]);\n }\n\n addVertexPoint(a) {\n const src = this.vertices;\n const dst = this.object.geometry.vertices;\n\n dst.push(src[a + 0], src[a + 1], src[a + 2]);\n }\n\n addVertexLine(a) {\n const src = this.vertices;\n const dst = this.object.geometry.vertices;\n\n dst.push(src[a + 0], src[a + 1], src[a + 2]);\n }\n\n addNormal(a, b, c) {\n const src = this.normals;\n const dst = this.object.geometry.normals;\n\n dst.push(src[a + 0], src[a + 1], src[a + 2]);\n dst.push(src[b + 0], src[b + 1], src[b + 2]);\n dst.push(src[c + 0], src[c + 1], src[c + 2]);\n }\n\n addColor(a, b, c) {\n const src = this.colors;\n const dst = this.object.geometry.colors;\n\n dst.push(src[a + 0], src[a + 1], src[a + 2]);\n dst.push(src[b + 0], src[b + 1], src[b + 2]);\n dst.push(src[c + 0], src[c + 1], src[c + 2]);\n }\n\n addUV(a, b, c) {\n const src = this.uvs;\n const dst = this.object.geometry.uvs;\n\n dst.push(src[a + 0], src[a + 1]);\n dst.push(src[b + 0], src[b + 1]);\n dst.push(src[c + 0], src[c + 1]);\n }\n\n addUVLine(a) {\n const src = this.uvs;\n const dst = this.object.geometry.uvs;\n\n dst.push(src[a + 0], src[a + 1]);\n }\n\n // eslint-disable-next-line max-params\n addFace(a, b, c, ua, ub, uc, na, nb, nc) {\n const vLen = this.vertices.length;\n\n let ia = this.parseVertexIndex(a, vLen);\n let ib = this.parseVertexIndex(b, vLen);\n let ic = this.parseVertexIndex(c, vLen);\n\n this.addVertex(ia, ib, ic);\n\n if (ua !== undefined && ua !== '') {\n const uvLen = this.uvs.length;\n ia = this.parseUVIndex(ua, uvLen);\n ib = this.parseUVIndex(ub, uvLen);\n ic = this.parseUVIndex(uc, uvLen);\n this.addUV(ia, ib, ic);\n }\n\n if (na !== undefined && na !== '') {\n // Normals are many times the same. If so, skip function call and parseInt.\n const nLen = this.normals.length;\n ia = this.parseNormalIndex(na, nLen);\n\n ib = na === nb ? ia : this.parseNormalIndex(nb, nLen);\n ic = na === nc ? ia : this.parseNormalIndex(nc, nLen);\n\n this.addNormal(ia, ib, ic);\n }\n\n if (this.colors.length > 0) {\n this.addColor(ia, ib, ic);\n }\n }\n\n addPointGeometry(vertices) {\n this.object.geometry.type = 'Points';\n\n const vLen = this.vertices.length;\n\n for (const vertex of vertices) {\n this.addVertexPoint(this.parseVertexIndex(vertex, vLen));\n }\n }\n\n addLineGeometry(vertices, uvs) {\n this.object.geometry.type = 'Line';\n\n const vLen = this.vertices.length;\n const uvLen = this.uvs.length;\n\n for (const vertex of vertices) {\n this.addVertexLine(this.parseVertexIndex(vertex, vLen));\n }\n\n for (const uv of uvs) {\n this.addUVLine(this.parseUVIndex(uv, uvLen));\n }\n }\n}\n\n// eslint-disable-next-line max-statements, complexity\nexport function parseOBJMeshes(text) {\n const state = new ParserState();\n\n if (text.indexOf('\\r\\n') !== -1) {\n // This is faster than String.split with regex that splits on both\n text = text.replace(/\\r\\n/g, '\\n');\n }\n\n if (text.indexOf('\\\\\\n') !== -1) {\n // join lines separated by a line continuation character (\\)\n text = text.replace(/\\\\\\n/g, '');\n }\n\n const lines = text.split('\\n');\n let line = '';\n let lineFirstChar = '';\n let lineLength = 0;\n let result = [];\n\n // Faster to just trim left side of the line. Use if available.\n const trimLeft = typeof ''.trimLeft === 'function';\n\n /* eslint-disable no-continue, max-depth */\n for (let i = 0, l = lines.length; i < l; i++) {\n line = lines[i];\n line = trimLeft ? line.trimLeft() : line.trim();\n lineLength = line.length;\n\n if (lineLength === 0) continue;\n\n lineFirstChar = line.charAt(0);\n\n // @todo invoke passed in handler if any\n if (lineFirstChar === '#') continue;\n\n if (lineFirstChar === 'v') {\n const data = line.split(/\\s+/);\n\n switch (data[0]) {\n case 'v':\n state.vertices.push(parseFloat(data[1]), parseFloat(data[2]), parseFloat(data[3]));\n if (data.length === 8) {\n state.colors.push(parseFloat(data[4]), parseFloat(data[5]), parseFloat(data[6]));\n }\n break;\n case 'vn':\n state.normals.push(parseFloat(data[1]), parseFloat(data[2]), parseFloat(data[3]));\n break;\n case 'vt':\n state.uvs.push(parseFloat(data[1]), parseFloat(data[2]));\n break;\n default:\n }\n } else if (lineFirstChar === 'f') {\n const lineData = line.substr(1).trim();\n const vertexData = lineData.split(/\\s+/);\n const faceVertices = [];\n\n // Parse the face vertex data into an easy to work with format\n\n for (let j = 0, jl = vertexData.length; j < jl; j++) {\n const vertex = vertexData[j];\n\n if (vertex.length > 0) {\n const vertexParts = vertex.split('/');\n faceVertices.push(vertexParts);\n }\n }\n\n // Draw an edge between the first vertex and all subsequent vertices to form an n-gon\n\n const v1 = faceVertices[0];\n\n for (let j = 1, jl = faceVertices.length - 1; j < jl; j++) {\n const v2 = faceVertices[j];\n const v3 = faceVertices[j + 1];\n\n state.addFace(v1[0], v2[0], v3[0], v1[1], v2[1], v3[1], v1[2], v2[2], v3[2]);\n }\n } else if (lineFirstChar === 'l') {\n const lineParts = line.substring(1).trim().split(' ');\n let lineVertices;\n const lineUVs = [];\n\n if (line.indexOf('/') === -1) {\n lineVertices = lineParts;\n } else {\n lineVertices = [];\n for (let li = 0, llen = lineParts.length; li < llen; li++) {\n const parts = lineParts[li].split('/');\n\n if (parts[0] !== '') lineVertices.push(parts[0]);\n if (parts[1] !== '') lineUVs.push(parts[1]);\n }\n }\n state.addLineGeometry(lineVertices, lineUVs);\n } else if (lineFirstChar === 'p') {\n const lineData = line.substr(1).trim();\n const pointData = lineData.split(' ');\n\n state.addPointGeometry(pointData);\n } else if ((result = OBJECT_RE.exec(line)) !== null) {\n // o object_name\n // or\n // g group_name\n\n // WORKAROUND: https://bugs.chromium.org/p/v8/issues/detail?id=2869\n // var name = result[ 0 ].substr( 1 ).trim();\n const name = (' ' + result[0].substr(1).trim()).substr(1); // eslint-disable-line\n\n state.startObject(name);\n } else if (MATERIAL_USE_RE.test(line)) {\n // material\n\n state.object.startMaterial(line.substring(7).trim(), state.materialLibraries);\n } else if (MATERIAL_RE.test(line)) {\n // mtl file\n\n state.materialLibraries.push(line.substring(7).trim());\n } else if (lineFirstChar === 's') {\n result = line.split(' ');\n\n // smooth shading\n\n // @todo Handle files that have varying smooth values for a set of faces inside one geometry,\n // but does not define a usemtl for each face set.\n // This should be detected and a dummy material created (later MultiMaterial and geometry groups).\n // This requires some care to not create extra material on each smooth value for \"normal\" obj files.\n // where explicit usemtl defines geometry groups.\n // Example asset: examples/models/obj/cerberus/Cerberus.obj\n\n /*\n * http://paulbourke.net/dataformats/obj/\n * or\n * http://www.cs.utah.edu/~boulos/cs3505/obj_spec.pdf\n *\n * From chapter \"Grouping\" Syntax explanation \"s group_number\":\n * \"group_number is the smoothing group number. To turn off smoothing groups, use a value of 0 or off.\n * Polygonal elements use group numbers to put elements in different smoothing groups. For free-form\n * surfaces, smoothing groups are either turned on or off; there is no difference between values greater\n * than 0.\"\n */\n if (result.length > 1) {\n const value = result[1].trim().toLowerCase();\n state.object.smooth = value !== '0' && value !== 'off';\n } else {\n // ZBrush can produce \"s\" lines #11707\n state.object.smooth = true;\n }\n const material = state.object.currentMaterial();\n if (material) material.smooth = state.object.smooth;\n } else {\n // Handle null terminated files without exception\n if (line === '\\0') continue;\n\n throw new Error(`Unexpected line: \"${line}\"`);\n }\n }\n\n state.finalize();\n\n const meshes = [];\n const materials = [];\n\n for (const object of state.objects) {\n const {geometry} = object;\n\n // Skip o/g line declarations that did not follow with any faces\n if (geometry.vertices.length === 0) continue;\n\n const mesh = {\n header: {\n vertexCount: geometry.vertices.length / 3\n },\n attributes: {}\n };\n\n switch (geometry.type) {\n case 'Points':\n mesh.mode = 0; // GL.POINTS\n break;\n case 'Line':\n mesh.mode = 1; // GL.LINES\n break;\n default:\n mesh.mode = 4; // GL.TRIANGLES\n break;\n }\n\n mesh.attributes.POSITION = {value: new Float32Array(geometry.vertices), size: 3};\n\n if (geometry.normals.length > 0) {\n mesh.attributes.NORMAL = {value: new Float32Array(geometry.normals), size: 3};\n }\n\n if (geometry.colors.length > 0) {\n mesh.attributes.COLOR_0 = {value: new Float32Array(geometry.colors), size: 3};\n }\n\n if (geometry.uvs.length > 0) {\n mesh.attributes.TEXCOORD_0 = {value: new Float32Array(geometry.uvs), size: 2};\n }\n\n // Create materials\n mesh.materials = [];\n for (const sourceMaterial of object.materials) {\n // TODO - support full spec\n const _material = {\n name: sourceMaterial.name,\n flatShading: !sourceMaterial.smooth\n };\n mesh.materials.push(_material);\n materials.push(_material);\n }\n\n mesh.name = object.name;\n meshes.push(mesh);\n }\n\n return {meshes, materials};\n}\n"],"mappings":";;AASA,MAAMA,SAAS,GAAG,eAAe;AAEjC,MAAMC,WAAW,GAAG,UAAU;AAE9B,MAAMC,eAAe,GAAG,UAAU;AAElC,MAAMC,YAAY,CAAC;EACjBC,WAAW,OAAiD;IAAA,IAAhD;MAACC,KAAK;MAAEC,IAAI,GAAG,EAAE;MAAEC,MAAM;MAAEC,MAAM;MAAEC;IAAU,CAAC;IACxD,IAAI,CAACJ,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACC,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACC,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACC,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACC,UAAU,GAAGA,UAAU;IAC5B,IAAI,CAACC,QAAQ,GAAG,CAAC,CAAC;IAClB,IAAI,CAACC,UAAU,GAAG,CAAC,CAAC;IACpB,IAAI,CAACC,SAAS,GAAG,KAAK;EACxB;EAEAC,KAAK,GAAqB;IAAA,IAApBR,KAAK,uEAAG,IAAI,CAACA,KAAK;IACtB,OAAO,IAAIF,YAAY,CAAC;MACtBE,KAAK;MACLC,IAAI,EAAE,IAAI,CAACA,IAAI;MACfC,MAAM,EAAE,IAAI,CAACA,MAAM;MACnBC,MAAM,EAAE,IAAI,CAACA,MAAM;MACnBC,UAAU,EAAE;IACd,CAAC,CAAC;EACJ;AACF;AAEA,MAAMK,UAAU,CAAC;EACfV,WAAW,GAAY;IAAA,IAAXE,IAAI,uEAAG,EAAE;IACnB,IAAI,CAACA,IAAI,GAAGA,IAAI;IAEhB,IAAI,CAACS,QAAQ,GAAG;MACdC,QAAQ,EAAE,EAAE;MACZC,OAAO,EAAE,EAAE;MACXC,MAAM,EAAE,EAAE;MACVC,GAAG,EAAE;IACP,CAAC;IAED,IAAI,CAACC,SAAS,GAAG,EAAE;IACnB,IAAI,CAACZ,MAAM,GAAG,IAAI;IAElB,IAAI,CAACa,eAAe,GAAG,IAAI;EAC7B;EAEAC,aAAa,CAAChB,IAAI,EAAEiB,SAAS,EAAE;IAC7B,MAAMC,QAAQ,GAAG,IAAI,CAACC,SAAS,CAAC,KAAK,CAAC;;IAItC,IAAID,QAAQ,KAAKA,QAAQ,CAACZ,SAAS,IAAIY,QAAQ,CAACb,UAAU,IAAI,CAAC,CAAC,EAAE;MAChE,IAAI,CAACS,SAAS,CAACM,MAAM,CAACF,QAAQ,CAACnB,KAAK,EAAE,CAAC,CAAC;IAC1C;IAEA,MAAMsB,QAAQ,GAAG,IAAIxB,YAAY,CAAC;MAChCE,KAAK,EAAE,IAAI,CAACe,SAAS,CAACQ,MAAM;MAC5BtB,IAAI;MACJC,MAAM,EACJsB,KAAK,CAACC,OAAO,CAACP,SAAS,CAAC,IAAIA,SAAS,CAACK,MAAM,GAAG,CAAC,GAAGL,SAAS,CAACA,SAAS,CAACK,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE;MACzFpB,MAAM,EAAEgB,QAAQ,KAAKO,SAAS,GAAGP,QAAQ,CAAChB,MAAM,GAAG,IAAI,CAACA,MAAM;MAC9DC,UAAU,EAAEe,QAAQ,KAAKO,SAAS,GAAGP,QAAQ,CAACd,QAAQ,GAAG;IAC3D,CAAC,CAAC;IAEF,IAAI,CAACU,SAAS,CAACY,IAAI,CAACL,QAAQ,CAAC;IAE7B,OAAOA,QAAQ;EACjB;EAEAM,eAAe,GAAG;IAChB,IAAI,IAAI,CAACb,SAAS,CAACQ,MAAM,GAAG,CAAC,EAAE;MAC7B,OAAO,IAAI,CAACR,SAAS,CAAC,IAAI,CAACA,SAAS,CAACQ,MAAM,GAAG,CAAC,CAAC;IAClD;IAEA,OAAOG,SAAS;EAClB;EAEAN,SAAS,CAACS,GAAG,EAAE;IACb,MAAMC,iBAAiB,GAAG,IAAI,CAACF,eAAe,EAAE;IAChD,IAAIE,iBAAiB,IAAIA,iBAAiB,CAACzB,QAAQ,KAAK,CAAC,CAAC,EAAE;MAC1DyB,iBAAiB,CAACzB,QAAQ,GAAG,IAAI,CAACK,QAAQ,CAACC,QAAQ,CAACY,MAAM,GAAG,CAAC;MAC9DO,iBAAiB,CAACxB,UAAU,GAAGwB,iBAAiB,CAACzB,QAAQ,GAAGyB,iBAAiB,CAAC1B,UAAU;MACxF0B,iBAAiB,CAACvB,SAAS,GAAG,KAAK;IACrC;;IAGA,IAAIsB,GAAG,IAAI,IAAI,CAACd,SAAS,CAACQ,MAAM,GAAG,CAAC,EAAE;MACpC,KAAK,IAAIQ,EAAE,GAAG,IAAI,CAAChB,SAAS,CAACQ,MAAM,GAAG,CAAC,EAAEQ,EAAE,IAAI,CAAC,EAAEA,EAAE,EAAE,EAAE;QACtD,IAAI,IAAI,CAAChB,SAAS,CAACgB,EAAE,CAAC,CAACzB,UAAU,IAAI,CAAC,EAAE;UACtC,IAAI,CAACS,SAAS,CAACM,MAAM,CAACU,EAAE,EAAE,CAAC,CAAC;QAC9B;MACF;IACF;;IAGA,IAAIF,GAAG,IAAI,IAAI,CAACd,SAAS,CAACQ,MAAM,KAAK,CAAC,EAAE;MACtC,IAAI,CAACR,SAAS,CAACY,IAAI,CAAC;QAClB1B,IAAI,EAAE,EAAE;QACRE,MAAM,EAAE,IAAI,CAACA;MACf,CAAC,CAAC;IACJ;IAEA,OAAO2B,iBAAiB;EAC1B;AACF;AAEA,MAAME,WAAW,CAAC;EAChBjC,WAAW,GAAG;IACZ,IAAI,CAACkC,OAAO,GAAG,EAAE;IACjB,IAAI,CAACC,MAAM,GAAG,IAAI;IAElB,IAAI,CAACvB,QAAQ,GAAG,EAAE;IAClB,IAAI,CAACC,OAAO,GAAG,EAAE;IACjB,IAAI,CAACC,MAAM,GAAG,EAAE;IAChB,IAAI,CAACC,GAAG,GAAG,EAAE;IAEb,IAAI,CAACqB,iBAAiB,GAAG,EAAE;IAE3B,IAAI,CAACC,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC;EAC7B;EAEAA,WAAW,CAACnC,IAAI,EAA0B;IAAA,IAAxBe,eAAe,uEAAG,IAAI;IAGtC,IAAI,IAAI,CAACkB,MAAM,IAAI,CAAC,IAAI,CAACA,MAAM,CAAClB,eAAe,EAAE;MAC/C,IAAI,CAACkB,MAAM,CAACjC,IAAI,GAAGA,IAAI;MACvB,IAAI,CAACiC,MAAM,CAAClB,eAAe,GAAGA,eAAe;MAC7C;IACF;IAEA,MAAMqB,gBAAgB,GACpB,IAAI,CAACH,MAAM,IAAI,OAAO,IAAI,CAACA,MAAM,CAACN,eAAe,KAAK,UAAU,GAC5D,IAAI,CAACM,MAAM,CAACN,eAAe,EAAE,GAC7BF,SAAS;IAEf,IAAI,IAAI,CAACQ,MAAM,IAAI,OAAO,IAAI,CAACA,MAAM,CAACd,SAAS,KAAK,UAAU,EAAE;MAC9D,IAAI,CAACc,MAAM,CAACd,SAAS,CAAC,IAAI,CAAC;IAC7B;IAEA,IAAI,CAACc,MAAM,GAAG,IAAIzB,UAAU,CAACR,IAAI,CAAC;IAClC,IAAI,CAACiC,MAAM,CAAClB,eAAe,GAAGA,eAAe;;IAO7C,IAAIqB,gBAAgB,IAAIA,gBAAgB,CAACpC,IAAI,IAAI,OAAOoC,gBAAgB,CAAC7B,KAAK,KAAK,UAAU,EAAE;MAC7F,MAAM8B,QAAQ,GAAGD,gBAAgB,CAAC7B,KAAK,CAAC,CAAC,CAAC;MAC1C8B,QAAQ,CAAC/B,SAAS,GAAG,IAAI;MACzB,IAAI,CAAC2B,MAAM,CAACnB,SAAS,CAACY,IAAI,CAACW,QAAQ,CAAC;IACtC;IAEA,IAAI,CAACL,OAAO,CAACN,IAAI,CAAC,IAAI,CAACO,MAAM,CAAC;EAChC;EAEAK,QAAQ,GAAG;IACT,IAAI,IAAI,CAACL,MAAM,IAAI,OAAO,IAAI,CAACA,MAAM,CAACd,SAAS,KAAK,UAAU,EAAE;MAC9D,IAAI,CAACc,MAAM,CAACd,SAAS,CAAC,IAAI,CAAC;IAC7B;EACF;EAEAoB,gBAAgB,CAACC,KAAK,EAAEC,GAAG,EAAE;IAC3B,MAAM1C,KAAK,GAAG2C,QAAQ,CAACF,KAAK,CAAC;IAC7B,OAAO,CAACzC,KAAK,IAAI,CAAC,GAAGA,KAAK,GAAG,CAAC,GAAGA,KAAK,GAAG0C,GAAG,GAAG,CAAC,IAAI,CAAC;EACvD;EAEAE,gBAAgB,CAACH,KAAK,EAAEC,GAAG,EAAE;IAC3B,MAAM1C,KAAK,GAAG2C,QAAQ,CAACF,KAAK,CAAC;IAC7B,OAAO,CAACzC,KAAK,IAAI,CAAC,GAAGA,KAAK,GAAG,CAAC,GAAGA,KAAK,GAAG0C,GAAG,GAAG,CAAC,IAAI,CAAC;EACvD;EAEAG,YAAY,CAACJ,KAAK,EAAEC,GAAG,EAAE;IACvB,MAAM1C,KAAK,GAAG2C,QAAQ,CAACF,KAAK,CAAC;IAC7B,OAAO,CAACzC,KAAK,IAAI,CAAC,GAAGA,KAAK,GAAG,CAAC,GAAGA,KAAK,GAAG0C,GAAG,GAAG,CAAC,IAAI,CAAC;EACvD;EAEAI,SAAS,CAACC,CAAC,EAAEC,CAAC,EAAEC,CAAC,EAAE;IACjB,MAAMC,GAAG,GAAG,IAAI,CAACvC,QAAQ;IACzB,MAAMwC,GAAG,GAAG,IAAI,CAACjB,MAAM,CAACxB,QAAQ,CAACC,QAAQ;IAEzCwC,GAAG,CAACxB,IAAI,CAACuB,GAAG,CAACH,CAAC,GAAG,CAAC,CAAC,EAAEG,GAAG,CAACH,CAAC,GAAG,CAAC,CAAC,EAAEG,GAAG,CAACH,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5CI,GAAG,CAACxB,IAAI,CAACuB,GAAG,CAACF,CAAC,GAAG,CAAC,CAAC,EAAEE,GAAG,CAACF,CAAC,GAAG,CAAC,CAAC,EAAEE,GAAG,CAACF,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5CG,GAAG,CAACxB,IAAI,CAACuB,GAAG,CAACD,CAAC,GAAG,CAAC,CAAC,EAAEC,GAAG,CAACD,CAAC,GAAG,CAAC,CAAC,EAAEC,GAAG,CAACD,CAAC,GAAG,CAAC,CAAC,CAAC;EAC9C;EAEAG,cAAc,CAACL,CAAC,EAAE;IAChB,MAAMG,GAAG,GAAG,IAAI,CAACvC,QAAQ;IACzB,MAAMwC,GAAG,GAAG,IAAI,CAACjB,MAAM,CAACxB,QAAQ,CAACC,QAAQ;IAEzCwC,GAAG,CAACxB,IAAI,CAACuB,GAAG,CAACH,CAAC,GAAG,CAAC,CAAC,EAAEG,GAAG,CAACH,CAAC,GAAG,CAAC,CAAC,EAAEG,GAAG,CAACH,CAAC,GAAG,CAAC,CAAC,CAAC;EAC9C;EAEAM,aAAa,CAACN,CAAC,EAAE;IACf,MAAMG,GAAG,GAAG,IAAI,CAACvC,QAAQ;IACzB,MAAMwC,GAAG,GAAG,IAAI,CAACjB,MAAM,CAACxB,QAAQ,CAACC,QAAQ;IAEzCwC,GAAG,CAACxB,IAAI,CAACuB,GAAG,CAACH,CAAC,GAAG,CAAC,CAAC,EAAEG,GAAG,CAACH,CAAC,GAAG,CAAC,CAAC,EAAEG,GAAG,CAACH,CAAC,GAAG,CAAC,CAAC,CAAC;EAC9C;EAEAO,SAAS,CAACP,CAAC,EAAEC,CAAC,EAAEC,CAAC,EAAE;IACjB,MAAMC,GAAG,GAAG,IAAI,CAACtC,OAAO;IACxB,MAAMuC,GAAG,GAAG,IAAI,CAACjB,MAAM,CAACxB,QAAQ,CAACE,OAAO;IAExCuC,GAAG,CAACxB,IAAI,CAACuB,GAAG,CAACH,CAAC,GAAG,CAAC,CAAC,EAAEG,GAAG,CAACH,CAAC,GAAG,CAAC,CAAC,EAAEG,GAAG,CAACH,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5CI,GAAG,CAACxB,IAAI,CAACuB,GAAG,CAACF,CAAC,GAAG,CAAC,CAAC,EAAEE,GAAG,CAACF,CAAC,GAAG,CAAC,CAAC,EAAEE,GAAG,CAACF,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5CG,GAAG,CAACxB,IAAI,CAACuB,GAAG,CAACD,CAAC,GAAG,CAAC,CAAC,EAAEC,GAAG,CAACD,CAAC,GAAG,CAAC,CAAC,EAAEC,GAAG,CAACD,CAAC,GAAG,CAAC,CAAC,CAAC;EAC9C;EAEAM,QAAQ,CAACR,CAAC,EAAEC,CAAC,EAAEC,CAAC,EAAE;IAChB,MAAMC,GAAG,GAAG,IAAI,CAACrC,MAAM;IACvB,MAAMsC,GAAG,GAAG,IAAI,CAACjB,MAAM,CAACxB,QAAQ,CAACG,MAAM;IAEvCsC,GAAG,CAACxB,IAAI,CAACuB,GAAG,CAACH,CAAC,GAAG,CAAC,CAAC,EAAEG,GAAG,CAACH,CAAC,GAAG,CAAC,CAAC,EAAEG,GAAG,CAACH,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5CI,GAAG,CAACxB,IAAI,CAACuB,GAAG,CAACF,CAAC,GAAG,CAAC,CAAC,EAAEE,GAAG,CAACF,CAAC,GAAG,CAAC,CAAC,EAAEE,GAAG,CAACF,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5CG,GAAG,CAACxB,IAAI,CAACuB,GAAG,CAACD,CAAC,GAAG,CAAC,CAAC,EAAEC,GAAG,CAACD,CAAC,GAAG,CAAC,CAAC,EAAEC,GAAG,CAACD,CAAC,GAAG,CAAC,CAAC,CAAC;EAC9C;EAEAO,KAAK,CAACT,CAAC,EAAEC,CAAC,EAAEC,CAAC,EAAE;IACb,MAAMC,GAAG,GAAG,IAAI,CAACpC,GAAG;IACpB,MAAMqC,GAAG,GAAG,IAAI,CAACjB,MAAM,CAACxB,QAAQ,CAACI,GAAG;IAEpCqC,GAAG,CAACxB,IAAI,CAACuB,GAAG,CAACH,CAAC,GAAG,CAAC,CAAC,EAAEG,GAAG,CAACH,CAAC,GAAG,CAAC,CAAC,CAAC;IAChCI,GAAG,CAACxB,IAAI,CAACuB,GAAG,CAACF,CAAC,GAAG,CAAC,CAAC,EAAEE,GAAG,CAACF,CAAC,GAAG,CAAC,CAAC,CAAC;IAChCG,GAAG,CAACxB,IAAI,CAACuB,GAAG,CAACD,CAAC,GAAG,CAAC,CAAC,EAAEC,GAAG,CAACD,CAAC,GAAG,CAAC,CAAC,CAAC;EAClC;EAEAQ,SAAS,CAACV,CAAC,EAAE;IACX,MAAMG,GAAG,GAAG,IAAI,CAACpC,GAAG;IACpB,MAAMqC,GAAG,GAAG,IAAI,CAACjB,MAAM,CAACxB,QAAQ,CAACI,GAAG;IAEpCqC,GAAG,CAACxB,IAAI,CAACuB,GAAG,CAACH,CAAC,GAAG,CAAC,CAAC,EAAEG,GAAG,CAACH,CAAC,GAAG,CAAC,CAAC,CAAC;EAClC;;EAGAW,OAAO,CAACX,CAAC,EAAEC,CAAC,EAAEC,CAAC,EAAEU,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAE;IACvC,MAAMC,IAAI,GAAG,IAAI,CAACtD,QAAQ,CAACY,MAAM;IAEjC,IAAI2C,EAAE,GAAG,IAAI,CAAC1B,gBAAgB,CAACO,CAAC,EAAEkB,IAAI,CAAC;IACvC,IAAIE,EAAE,GAAG,IAAI,CAAC3B,gBAAgB,CAACQ,CAAC,EAAEiB,IAAI,CAAC;IACvC,IAAIG,EAAE,GAAG,IAAI,CAAC5B,gBAAgB,CAACS,CAAC,EAAEgB,IAAI,CAAC;IAEvC,IAAI,CAACnB,SAAS,CAACoB,EAAE,EAAEC,EAAE,EAAEC,EAAE,CAAC;IAE1B,IAAIT,EAAE,KAAKjC,SAAS,IAAIiC,EAAE,KAAK,EAAE,EAAE;MACjC,MAAMU,KAAK,GAAG,IAAI,CAACvD,GAAG,CAACS,MAAM;MAC7B2C,EAAE,GAAG,IAAI,CAACrB,YAAY,CAACc,EAAE,EAAEU,KAAK,CAAC;MACjCF,EAAE,GAAG,IAAI,CAACtB,YAAY,CAACe,EAAE,EAAES,KAAK,CAAC;MACjCD,EAAE,GAAG,IAAI,CAACvB,YAAY,CAACgB,EAAE,EAAEQ,KAAK,CAAC;MACjC,IAAI,CAACb,KAAK,CAACU,EAAE,EAAEC,EAAE,EAAEC,EAAE,CAAC;IACxB;IAEA,IAAIN,EAAE,KAAKpC,SAAS,IAAIoC,EAAE,KAAK,EAAE,EAAE;MAEjC,MAAMQ,IAAI,GAAG,IAAI,CAAC1D,OAAO,CAACW,MAAM;MAChC2C,EAAE,GAAG,IAAI,CAACtB,gBAAgB,CAACkB,EAAE,EAAEQ,IAAI,CAAC;MAEpCH,EAAE,GAAGL,EAAE,KAAKC,EAAE,GAAGG,EAAE,GAAG,IAAI,CAACtB,gBAAgB,CAACmB,EAAE,EAAEO,IAAI,CAAC;MACrDF,EAAE,GAAGN,EAAE,KAAKE,EAAE,GAAGE,EAAE,GAAG,IAAI,CAACtB,gBAAgB,CAACoB,EAAE,EAAEM,IAAI,CAAC;MAErD,IAAI,CAAChB,SAAS,CAACY,EAAE,EAAEC,EAAE,EAAEC,EAAE,CAAC;IAC5B;IAEA,IAAI,IAAI,CAACvD,MAAM,CAACU,MAAM,GAAG,CAAC,EAAE;MAC1B,IAAI,CAACgC,QAAQ,CAACW,EAAE,EAAEC,EAAE,EAAEC,EAAE,CAAC;IAC3B;EACF;EAEAG,gBAAgB,CAAC5D,QAAQ,EAAE;IACzB,IAAI,CAACuB,MAAM,CAACxB,QAAQ,CAAC8D,IAAI,GAAG,QAAQ;IAEpC,MAAMP,IAAI,GAAG,IAAI,CAACtD,QAAQ,CAACY,MAAM;IAEjC,KAAK,MAAMkD,MAAM,IAAI9D,QAAQ,EAAE;MAC7B,IAAI,CAACyC,cAAc,CAAC,IAAI,CAACZ,gBAAgB,CAACiC,MAAM,EAAER,IAAI,CAAC,CAAC;IAC1D;EACF;EAEAS,eAAe,CAAC/D,QAAQ,EAAEG,GAAG,EAAE;IAC7B,IAAI,CAACoB,MAAM,CAACxB,QAAQ,CAAC8D,IAAI,GAAG,MAAM;IAElC,MAAMP,IAAI,GAAG,IAAI,CAACtD,QAAQ,CAACY,MAAM;IACjC,MAAM8C,KAAK,GAAG,IAAI,CAACvD,GAAG,CAACS,MAAM;IAE7B,KAAK,MAAMkD,MAAM,IAAI9D,QAAQ,EAAE;MAC7B,IAAI,CAAC0C,aAAa,CAAC,IAAI,CAACb,gBAAgB,CAACiC,MAAM,EAAER,IAAI,CAAC,CAAC;IACzD;IAEA,KAAK,MAAMU,EAAE,IAAI7D,GAAG,EAAE;MACpB,IAAI,CAAC2C,SAAS,CAAC,IAAI,CAACZ,YAAY,CAAC8B,EAAE,EAAEN,KAAK,CAAC,CAAC;IAC9C;EACF;AACF;;AAGA,OAAO,SAASO,cAAc,CAACC,IAAI,EAAE;EACnC,MAAMC,KAAK,GAAG,IAAI9C,WAAW,EAAE;EAE/B,IAAI6C,IAAI,CAACE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;IAE/BF,IAAI,GAAGA,IAAI,CAACG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;EACpC;EAEA,IAAIH,IAAI,CAACE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;IAE/BF,IAAI,GAAGA,IAAI,CAACG,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;EAClC;EAEA,MAAMC,KAAK,GAAGJ,IAAI,CAACK,KAAK,CAAC,IAAI,CAAC;EAC9B,IAAIC,IAAI,GAAG,EAAE;EACb,IAAIC,aAAa,GAAG,EAAE;EACtB,IAAIC,UAAU,GAAG,CAAC;EAClB,IAAIC,MAAM,GAAG,EAAE;;EAGf,MAAMC,QAAQ,GAAG,OAAO,EAAE,CAACA,QAAQ,KAAK,UAAU;;EAGlD,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEC,CAAC,GAAGR,KAAK,CAAC1D,MAAM,EAAEiE,CAAC,GAAGC,CAAC,EAAED,CAAC,EAAE,EAAE;IAC5CL,IAAI,GAAGF,KAAK,CAACO,CAAC,CAAC;IACfL,IAAI,GAAGI,QAAQ,GAAGJ,IAAI,CAACI,QAAQ,EAAE,GAAGJ,IAAI,CAACO,IAAI,EAAE;IAC/CL,UAAU,GAAGF,IAAI,CAAC5D,MAAM;IAExB,IAAI8D,UAAU,KAAK,CAAC,EAAE;IAEtBD,aAAa,GAAGD,IAAI,CAACQ,MAAM,CAAC,CAAC,CAAC;;IAG9B,IAAIP,aAAa,KAAK,GAAG,EAAE;IAE3B,IAAIA,aAAa,KAAK,GAAG,EAAE;MACzB,MAAMQ,IAAI,GAAGT,IAAI,CAACD,KAAK,CAAC,KAAK,CAAC;MAE9B,QAAQU,IAAI,CAAC,CAAC,CAAC;QACb,KAAK,GAAG;UACNd,KAAK,CAACnE,QAAQ,CAACgB,IAAI,CAACkE,UAAU,CAACD,IAAI,CAAC,CAAC,CAAC,CAAC,EAAEC,UAAU,CAACD,IAAI,CAAC,CAAC,CAAC,CAAC,EAAEC,UAAU,CAACD,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;UAClF,IAAIA,IAAI,CAACrE,MAAM,KAAK,CAAC,EAAE;YACrBuD,KAAK,CAACjE,MAAM,CAACc,IAAI,CAACkE,UAAU,CAACD,IAAI,CAAC,CAAC,CAAC,CAAC,EAAEC,UAAU,CAACD,IAAI,CAAC,CAAC,CAAC,CAAC,EAAEC,UAAU,CAACD,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;UAClF;UACA;QACF,KAAK,IAAI;UACPd,KAAK,CAAClE,OAAO,CAACe,IAAI,CAACkE,UAAU,CAACD,IAAI,CAAC,CAAC,CAAC,CAAC,EAAEC,UAAU,CAACD,IAAI,CAAC,CAAC,CAAC,CAAC,EAAEC,UAAU,CAACD,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;UACjF;QACF,KAAK,IAAI;UACPd,KAAK,CAAChE,GAAG,CAACa,IAAI,CAACkE,UAAU,CAACD,IAAI,CAAC,CAAC,CAAC,CAAC,EAAEC,UAAU,CAACD,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;UACxD;QACF;MAAQ;IAEZ,CAAC,MAAM,IAAIR,aAAa,KAAK,GAAG,EAAE;MAChC,MAAMU,QAAQ,GAAGX,IAAI,CAACY,MAAM,CAAC,CAAC,CAAC,CAACL,IAAI,EAAE;MACtC,MAAMM,UAAU,GAAGF,QAAQ,CAACZ,KAAK,CAAC,KAAK,CAAC;MACxC,MAAMe,YAAY,GAAG,EAAE;;MAIvB,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEC,EAAE,GAAGH,UAAU,CAACzE,MAAM,EAAE2E,CAAC,GAAGC,EAAE,EAAED,CAAC,EAAE,EAAE;QACnD,MAAMzB,MAAM,GAAGuB,UAAU,CAACE,CAAC,CAAC;QAE5B,IAAIzB,MAAM,CAAClD,MAAM,GAAG,CAAC,EAAE;UACrB,MAAM6E,WAAW,GAAG3B,MAAM,CAACS,KAAK,CAAC,GAAG,CAAC;UACrCe,YAAY,CAACtE,IAAI,CAACyE,WAAW,CAAC;QAChC;MACF;;MAIA,MAAMC,EAAE,GAAGJ,YAAY,CAAC,CAAC,CAAC;MAE1B,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEC,EAAE,GAAGF,YAAY,CAAC1E,MAAM,GAAG,CAAC,EAAE2E,CAAC,GAAGC,EAAE,EAAED,CAAC,EAAE,EAAE;QACzD,MAAMI,EAAE,GAAGL,YAAY,CAACC,CAAC,CAAC;QAC1B,MAAMK,EAAE,GAAGN,YAAY,CAACC,CAAC,GAAG,CAAC,CAAC;QAE9BpB,KAAK,CAACpB,OAAO,CAAC2C,EAAE,CAAC,CAAC,CAAC,EAAEC,EAAE,CAAC,CAAC,CAAC,EAAEC,EAAE,CAAC,CAAC,CAAC,EAAEF,EAAE,CAAC,CAAC,CAAC,EAAEC,EAAE,CAAC,CAAC,CAAC,EAAEC,EAAE,CAAC,CAAC,CAAC,EAAEF,EAAE,CAAC,CAAC,CAAC,EAAEC,EAAE,CAAC,CAAC,CAAC,EAAEC,EAAE,CAAC,CAAC,CAAC,CAAC;MAC9E;IACF,CAAC,MAAM,IAAInB,aAAa,KAAK,GAAG,EAAE;MAChC,MAAMoB,SAAS,GAAGrB,IAAI,CAACsB,SAAS,CAAC,CAAC,CAAC,CAACf,IAAI,EAAE,CAACR,KAAK,CAAC,GAAG,CAAC;MACrD,IAAIwB,YAAY;MAChB,MAAMC,OAAO,GAAG,EAAE;MAElB,IAAIxB,IAAI,CAACJ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE;QAC5B2B,YAAY,GAAGF,SAAS;MAC1B,CAAC,MAAM;QACLE,YAAY,GAAG,EAAE;QACjB,KAAK,IAAIE,EAAE,GAAG,CAAC,EAAEC,IAAI,GAAGL,SAAS,CAACjF,MAAM,EAAEqF,EAAE,GAAGC,IAAI,EAAED,EAAE,EAAE,EAAE;UACzD,MAAME,KAAK,GAAGN,SAAS,CAACI,EAAE,CAAC,CAAC1B,KAAK,CAAC,GAAG,CAAC;UAEtC,IAAI4B,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAEJ,YAAY,CAAC/E,IAAI,CAACmF,KAAK,CAAC,CAAC,CAAC,CAAC;UAChD,IAAIA,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,EAAEH,OAAO,CAAChF,IAAI,CAACmF,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7C;MACF;MACAhC,KAAK,CAACJ,eAAe,CAACgC,YAAY,EAAEC,OAAO,CAAC;IAC9C,CAAC,MAAM,IAAIvB,aAAa,KAAK,GAAG,EAAE;MAChC,MAAMU,QAAQ,GAAGX,IAAI,CAACY,MAAM,CAAC,CAAC,CAAC,CAACL,IAAI,EAAE;MACtC,MAAMqB,SAAS,GAAGjB,QAAQ,CAACZ,KAAK,CAAC,GAAG,CAAC;MAErCJ,KAAK,CAACP,gBAAgB,CAACwC,SAAS,CAAC;IACnC,CAAC,MAAM,IAAI,CAACzB,MAAM,GAAG3F,SAAS,CAACqH,IAAI,CAAC7B,IAAI,CAAC,MAAM,IAAI,EAAE;;MAOnD,MAAMlF,IAAI,GAAG,CAAC,GAAG,GAAGqF,MAAM,CAAC,CAAC,CAAC,CAACS,MAAM,CAAC,CAAC,CAAC,CAACL,IAAI,EAAE,EAAEK,MAAM,CAAC,CAAC,CAAC;;MAEzDjB,KAAK,CAAC1C,WAAW,CAACnC,IAAI,CAAC;IACzB,CAAC,MAAM,IAAIJ,eAAe,CAACoH,IAAI,CAAC9B,IAAI,CAAC,EAAE;;MAGrCL,KAAK,CAAC5C,MAAM,CAACjB,aAAa,CAACkE,IAAI,CAACsB,SAAS,CAAC,CAAC,CAAC,CAACf,IAAI,EAAE,EAAEZ,KAAK,CAAC3C,iBAAiB,CAAC;IAC/E,CAAC,MAAM,IAAIvC,WAAW,CAACqH,IAAI,CAAC9B,IAAI,CAAC,EAAE;;MAGjCL,KAAK,CAAC3C,iBAAiB,CAACR,IAAI,CAACwD,IAAI,CAACsB,SAAS,CAAC,CAAC,CAAC,CAACf,IAAI,EAAE,CAAC;IACxD,CAAC,MAAM,IAAIN,aAAa,KAAK,GAAG,EAAE;MAChCE,MAAM,GAAGH,IAAI,CAACD,KAAK,CAAC,GAAG,CAAC;;MAsBxB,IAAII,MAAM,CAAC/D,MAAM,GAAG,CAAC,EAAE;QACrB,MAAMkB,KAAK,GAAG6C,MAAM,CAAC,CAAC,CAAC,CAACI,IAAI,EAAE,CAACwB,WAAW,EAAE;QAC5CpC,KAAK,CAAC5C,MAAM,CAAC/B,MAAM,GAAGsC,KAAK,KAAK,GAAG,IAAIA,KAAK,KAAK,KAAK;MACxD,CAAC,MAAM;QAELqC,KAAK,CAAC5C,MAAM,CAAC/B,MAAM,GAAG,IAAI;MAC5B;MACA,MAAMmB,QAAQ,GAAGwD,KAAK,CAAC5C,MAAM,CAACN,eAAe,EAAE;MAC/C,IAAIN,QAAQ,EAAEA,QAAQ,CAACnB,MAAM,GAAG2E,KAAK,CAAC5C,MAAM,CAAC/B,MAAM;IACrD,CAAC,MAAM;MAEL,IAAIgF,IAAI,KAAK,IAAI,EAAE;MAEnB,MAAM,IAAIgC,KAAK,8BAAsBhC,IAAI,QAAI;IAC/C;EACF;EAEAL,KAAK,CAACvC,QAAQ,EAAE;EAEhB,MAAM6E,MAAM,GAAG,EAAE;EACjB,MAAMrG,SAAS,GAAG,EAAE;EAEpB,KAAK,MAAMmB,MAAM,IAAI4C,KAAK,CAAC7C,OAAO,EAAE;IAClC,MAAM;MAACvB;IAAQ,CAAC,GAAGwB,MAAM;;IAGzB,IAAIxB,QAAQ,CAACC,QAAQ,CAACY,MAAM,KAAK,CAAC,EAAE;IAEpC,MAAM8F,IAAI,GAAG;MACXC,MAAM,EAAE;QACNC,WAAW,EAAE7G,QAAQ,CAACC,QAAQ,CAACY,MAAM,GAAG;MAC1C,CAAC;MACDiG,UAAU,EAAE,CAAC;IACf,CAAC;IAED,QAAQ9G,QAAQ,CAAC8D,IAAI;MACnB,KAAK,QAAQ;QACX6C,IAAI,CAACI,IAAI,GAAG,CAAC;QACb;MACF,KAAK,MAAM;QACTJ,IAAI,CAACI,IAAI,GAAG,CAAC;QACb;MACF;QACEJ,IAAI,CAACI,IAAI,GAAG,CAAC;QACb;IAAM;IAGVJ,IAAI,CAACG,UAAU,CAACE,QAAQ,GAAG;MAACjF,KAAK,EAAE,IAAIkF,YAAY,CAACjH,QAAQ,CAACC,QAAQ,CAAC;MAAEiH,IAAI,EAAE;IAAC,CAAC;IAEhF,IAAIlH,QAAQ,CAACE,OAAO,CAACW,MAAM,GAAG,CAAC,EAAE;MAC/B8F,IAAI,CAACG,UAAU,CAACK,MAAM,GAAG;QAACpF,KAAK,EAAE,IAAIkF,YAAY,CAACjH,QAAQ,CAACE,OAAO,CAAC;QAAEgH,IAAI,EAAE;MAAC,CAAC;IAC/E;IAEA,IAAIlH,QAAQ,CAACG,MAAM,CAACU,MAAM,GAAG,CAAC,EAAE;MAC9B8F,IAAI,CAACG,UAAU,CAACM,OAAO,GAAG;QAACrF,KAAK,EAAE,IAAIkF,YAAY,CAACjH,QAAQ,CAACG,MAAM,CAAC;QAAE+G,IAAI,EAAE;MAAC,CAAC;IAC/E;IAEA,IAAIlH,QAAQ,CAACI,GAAG,CAACS,MAAM,GAAG,CAAC,EAAE;MAC3B8F,IAAI,CAACG,UAAU,CAACO,UAAU,GAAG;QAACtF,KAAK,EAAE,IAAIkF,YAAY,CAACjH,QAAQ,CAACI,GAAG,CAAC;QAAE8G,IAAI,EAAE;MAAC,CAAC;IAC/E;;IAGAP,IAAI,CAACtG,SAAS,GAAG,EAAE;IACnB,KAAK,MAAMiH,cAAc,IAAI9F,MAAM,CAACnB,SAAS,EAAE;MAE7C,MAAMkH,SAAS,GAAG;QAChBhI,IAAI,EAAE+H,cAAc,CAAC/H,IAAI;QACzBiI,WAAW,EAAE,CAACF,cAAc,CAAC7H;MAC/B,CAAC;MACDkH,IAAI,CAACtG,SAAS,CAACY,IAAI,CAACsG,SAAS,CAAC;MAC9BlH,SAAS,CAACY,IAAI,CAACsG,SAAS,CAAC;IAC3B;IAEAZ,IAAI,CAACpH,IAAI,GAAGiC,MAAM,CAACjC,IAAI;IACvBmH,MAAM,CAACzF,IAAI,CAAC0F,IAAI,CAAC;EACnB;EAEA,OAAO;IAACD,MAAM;IAAErG;EAAS,CAAC;AAC5B"}
@@ -5,6 +5,7 @@ export function parseOBJ(text, options) {
5
5
  const {
6
6
  meshes
7
7
  } = parseOBJMeshes(text);
8
+
8
9
  const vertexCount = meshes.reduce((s, mesh) => s + mesh.header.vertexCount, 0);
9
10
  const attributes = mergeAttributes(meshes, vertexCount);
10
11
  const header = {
@@ -22,6 +23,7 @@ export function parseOBJ(text, options) {
22
23
  schema,
23
24
  header,
24
25
  mode: 4,
26
+
25
27
  attributes
26
28
  };
27
29
  }
@@ -32,7 +34,6 @@ function mergeAttributes(meshes, vertexCount) {
32
34
  let colors;
33
35
  let uvs;
34
36
  let i = 0;
35
-
36
37
  for (const mesh of meshes) {
37
38
  const {
38
39
  POSITION,
@@ -41,52 +42,43 @@ function mergeAttributes(meshes, vertexCount) {
41
42
  TEXCOORD_0
42
43
  } = mesh.attributes;
43
44
  positions.set(POSITION.value, i * 3);
44
-
45
45
  if (NORMAL) {
46
46
  normals = normals || new Float32Array(vertexCount * 3);
47
47
  normals.set(NORMAL.value, i * 3);
48
48
  }
49
-
50
49
  if (COLOR_0) {
51
50
  colors = colors || new Float32Array(vertexCount * 3);
52
51
  colors.set(COLOR_0.value, i * 3);
53
52
  }
54
-
55
53
  if (TEXCOORD_0) {
56
54
  uvs = uvs || new Float32Array(vertexCount * 2);
57
55
  uvs.set(TEXCOORD_0.value, i * 2);
58
56
  }
59
-
60
57
  i += POSITION.value.length / 3;
61
58
  }
62
-
63
59
  const attributes = {};
64
60
  attributes.POSITION = {
65
61
  value: positions,
66
62
  size: 3
67
63
  };
68
-
69
64
  if (normals) {
70
65
  attributes.NORMAL = {
71
66
  value: normals,
72
67
  size: 3
73
68
  };
74
69
  }
75
-
76
70
  if (colors) {
77
71
  attributes.COLOR_0 = {
78
72
  value: colors,
79
73
  size: 3
80
74
  };
81
75
  }
82
-
83
76
  if (uvs) {
84
77
  attributes.TEXCOORD_0 = {
85
78
  value: uvs,
86
79
  size: 2
87
80
  };
88
81
  }
89
-
90
82
  return attributes;
91
83
  }
92
84
  //# sourceMappingURL=parse-obj.js.map