Skip to content

Commit 82b60ac

Browse files
authored
Merge pull request #11871 from jbaicoianu/objloader-ngons
OBJLoader n-gon support
2 parents d4bb9b0 + 9511139 commit 82b60ac

File tree

1 file changed

+19
-43
lines changed

1 file changed

+19
-43
lines changed

examples/js/loaders/OBJLoader.js

+19-43
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,6 @@ THREE.OBJLoader = ( function () {
1010
var normal_pattern = /^vn\s+([\d\.\+\-eE]+)\s+([\d\.\+\-eE]+)\s+([\d\.\+\-eE]+)/;
1111
// vt float float
1212
var uv_pattern = /^vt\s+([\d\.\+\-eE]+)\s+([\d\.\+\-eE]+)/;
13-
// f vertex vertex vertex
14-
var face_vertex = /^f\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)(?:\s+(-?\d+))?/;
15-
// f vertex/uv vertex/uv vertex/uv
16-
var face_vertex_uv = /^f\s+(-?\d+)\/(-?\d+)\s+(-?\d+)\/(-?\d+)\s+(-?\d+)\/(-?\d+)(?:\s+(-?\d+)\/(-?\d+))?/;
17-
// f vertex/uv/normal vertex/uv/normal vertex/uv/normal
18-
var face_vertex_uv_normal = /^f\s+(-?\d+)\/(-?\d+)\/(-?\d+)\s+(-?\d+)\/(-?\d+)\/(-?\d+)\s+(-?\d+)\/(-?\d+)\/(-?\d+)(?:\s+(-?\d+)\/(-?\d+)\/(-?\d+))?/;
19-
// f vertex//normal vertex//normal vertex//normal
20-
var face_vertex_normal = /^f\s+(-?\d+)\/\/(-?\d+)\s+(-?\d+)\/\/(-?\d+)\s+(-?\d+)\/\/(-?\d+)(?:\s+(-?\d+)\/\/(-?\d+))?/;
2113
// o object_name | g group_name
2214
var object_pattern = /^[og]\s*(.+)?/;
2315
// mtllib file_reference
@@ -489,55 +481,39 @@ THREE.OBJLoader = ( function () {
489481

490482
} else if ( lineFirstChar === "f" ) {
491483

492-
if ( ( result = face_vertex_uv_normal.exec( line ) ) !== null ) {
484+
var lineData = line.substr(1).trim(),
485+
vertexData = lineData.split(' '),
486+
faceVertices = [];
493487

494-
// f vertex/uv/normal vertex/uv/normal vertex/uv/normal
495-
// 0 1 2 3 4 5 6 7 8 9 10 11 12
496-
// ["f 1/1/1 2/2/2 3/3/3", "1", "1", "1", "2", "2", "2", "3", "3", "3", undefined, undefined, undefined]
488+
// Parse the face vertex data into an easy to work with format
497489

498-
state.addFace(
499-
result[ 1 ], result[ 4 ], result[ 7 ], result[ 10 ],
500-
result[ 2 ], result[ 5 ], result[ 8 ], result[ 11 ],
501-
result[ 3 ], result[ 6 ], result[ 9 ], result[ 12 ]
502-
);
490+
for (var idx = 0; idx < vertexData.length; idx++) {
503491

504-
} else if ( ( result = face_vertex_uv.exec( line ) ) !== null ) {
492+
if (vertexData[idx].length > 0) {
505493

506-
// f vertex/uv vertex/uv vertex/uv
507-
// 0 1 2 3 4 5 6 7 8
508-
// ["f 1/1 2/2 3/3", "1", "1", "2", "2", "3", "3", undefined, undefined]
494+
var vertexParts = vertexData[idx].split('/');
495+
faceVertices.push(vertexParts);
509496

510-
state.addFace(
511-
result[ 1 ], result[ 3 ], result[ 5 ], result[ 7 ],
512-
result[ 2 ], result[ 4 ], result[ 6 ], result[ 8 ]
513-
);
497+
}
514498

515-
} else if ( ( result = face_vertex_normal.exec( line ) ) !== null ) {
499+
}
516500

517-
// f vertex//normal vertex//normal vertex//normal
518-
// 0 1 2 3 4 5 6 7 8
519-
// ["f 1//1 2//2 3//3", "1", "1", "2", "2", "3", "3", undefined, undefined]
501+
// Draw an edge between the first vertex and all subsequent vertices to form an n-gon
520502

521-
state.addFace(
522-
result[ 1 ], result[ 3 ], result[ 5 ], result[ 7 ],
523-
undefined, undefined, undefined, undefined,
524-
result[ 2 ], result[ 4 ], result[ 6 ], result[ 8 ]
525-
);
503+
var v1 = faceVertices[0],
504+
numFaces = faceVertices.length - 1;
526505

527-
} else if ( ( result = face_vertex.exec( line ) ) !== null ) {
506+
for (var idx = 1; idx < numFaces; idx++) {
528507

529-
// f vertex vertex vertex
530-
// 0 1 2 3 4
531-
// ["f 1 2 3", "1", "2", "3", undefined]
508+
var v2 = faceVertices[idx],
509+
v3 = faceVertices[idx+1];
532510

533511
state.addFace(
534-
result[ 1 ], result[ 2 ], result[ 3 ], result[ 4 ]
512+
v1[ 0 ], v2[ 0 ], v3[ 0 ], undefined,
513+
v1[ 1 ], v2[ 1 ], v3[ 1 ], undefined,
514+
v1[ 2 ], v2[ 2 ], v3[ 2 ], undefined
535515
);
536516

537-
} else {
538-
539-
throw new Error( "Unexpected face line: '" + line + "'" );
540-
541517
}
542518

543519
} else if ( lineFirstChar === "l" ) {

0 commit comments

Comments
 (0)