@loaders.gl/obj 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.
- package/dist/es5/bundle.js +0 -1
- package/dist/es5/bundle.js.map +1 -1
- package/dist/es5/index.js +4 -21
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/get-obj-schema.js +0 -10
- package/dist/es5/lib/get-obj-schema.js.map +1 -1
- package/dist/es5/lib/obj-types.js.map +1 -1
- package/dist/es5/lib/parse-mtl.js +3 -22
- package/dist/es5/lib/parse-mtl.js.map +1 -1
- package/dist/es5/lib/parse-obj-meshes.js +20 -74
- package/dist/es5/lib/parse-obj-meshes.js.map +1 -1
- package/dist/es5/lib/parse-obj.js +7 -24
- package/dist/es5/lib/parse-obj.js.map +1 -1
- package/dist/es5/mtl-loader.js +2 -1
- package/dist/es5/mtl-loader.js.map +1 -1
- package/dist/es5/obj-loader.js +1 -3
- package/dist/es5/obj-loader.js.map +1 -1
- package/dist/es5/workers/obj-worker.js +0 -2
- package/dist/es5/workers/obj-worker.js.map +1 -1
- package/dist/esm/bundle.js +1 -1
- package/dist/esm/bundle.js.map +1 -1
- package/dist/esm/index.js +7 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/get-obj-schema.js +2 -9
- package/dist/esm/lib/get-obj-schema.js.map +1 -1
- package/dist/esm/lib/obj-types.js.map +1 -1
- package/dist/esm/lib/parse-mtl.js +5 -16
- package/dist/esm/lib/parse-mtl.js.map +1 -1
- package/dist/esm/lib/parse-obj-meshes.js +23 -76
- package/dist/esm/lib/parse-obj-meshes.js.map +1 -1
- package/dist/esm/lib/parse-obj.js +2 -10
- package/dist/esm/lib/parse-obj.js.map +1 -1
- package/dist/esm/mtl-loader.js +3 -1
- package/dist/esm/mtl-loader.js.map +1 -1
- package/dist/esm/obj-loader.js +2 -3
- package/dist/esm/obj-loader.js.map +1 -1
- package/dist/esm/workers/obj-worker.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/obj-worker.js +2 -2
- 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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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":"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"}
|
|
@@ -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
|