瀏覽代碼

Simplified OBJLoader. Should fix #3826.
The loader now ignores groups. Need to take a second look and try to implement MeshFaceMaterial when multiple usemtl. Then apply to OBJMTLLoader.

Mr.doob 12 年之前
父節點
當前提交
a00f4cf55b
共有 1 個文件被更改,包括 30 次插入43 次删除
  1. 30 43
      examples/js/loaders/OBJLoader.js

+ 30 - 43
examples/js/loaders/OBJLoader.js

@@ -58,43 +58,20 @@ THREE.OBJLoader.prototype = {
 
 		}
 
-		function meshN( meshName, materialName ) {
+		var object = new THREE.Object3D();
+		var geometry, material, mesh;
 
-			if ( geometry.vertices.length > 0 ) {
+		// create mesh if no objects in data
 
-				geometry.mergeVertices();
-				geometry.computeCentroids();
-				geometry.computeFaceNormals();
-				geometry.computeBoundingSphere();
+		if ( /^o /gm.test( data ) === false ) {
 
-				object.add( mesh );
-
-				geometry = new THREE.Geometry();
-				mesh = new THREE.Mesh( geometry, material );
-
-				verticesCount = 0;
-
-			}
-
-			if ( meshName !== undefined ) mesh.name = meshName;
-			if ( materialName !== undefined ) {
-
-				material = new THREE.MeshLambertMaterial();
-				material.name = materialName;
-
-				mesh.material = material;
-
-			}
+			geometry = new THREE.Geometry();
+			material = new THREE.MeshLambertMaterial();
+			mesh = new THREE.Mesh( geometry, material );
+			object.add( mesh );
 
 		}
 
-		var group = new THREE.Object3D();
-		var object = group;
-
-		var geometry = new THREE.Geometry();
-		var material = new THREE.MeshLambertMaterial();
-		var mesh = new THREE.Mesh( geometry, material );
-
 		var vertices = [];
 		var verticesCount = 0;
 		var normals = [];
@@ -110,11 +87,11 @@ THREE.OBJLoader.prototype = {
 
 		// vt float float
 
-		var uv_pattern = /vt( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/
+		var uv_pattern = /vt( +[\d|\.|\+|\-|e]+)( +[\d|\.|\+|\-|e]+)/;
 
 		// f vertex vertex vertex
 
-		var face_pattern1 = /f( +\d+)( +\d+)( +\d+)/
+		var face_pattern1 = /f( +\d+)( +\d+)( +\d+)/;
 
 		// f vertex/uv vertex/uv vertex/uv
 
@@ -130,7 +107,7 @@ THREE.OBJLoader.prototype = {
 
 		//
 
-		var lines = data.split( "\n" );
+		var lines = data.split( '\n' );
 
 		for ( var i = 0; i < lines.length; i ++ ) {
 
@@ -262,21 +239,24 @@ THREE.OBJLoader.prototype = {
 
 				// object
 
-				object = new THREE.Object3D();
-				object.name = line.substring( 2 ).trim();
-				group.add( object );
+				geometry = new THREE.Geometry();
+				material = new THREE.MeshLambertMaterial();
+
+				mesh = new THREE.Mesh( geometry, material );
+				mesh.name = line.substring( 2 ).trim();
+				object.add( mesh );
+
+				verticesCount = 0;
 
 			} else if ( /^g /.test( line ) ) {
 
 				// group
 
-				meshN( line.substring( 2 ).trim(), undefined );
-
 			} else if ( /^usemtl /.test( line ) ) {
 
 				// material
 
-				meshN( undefined, line.substring( 7 ).trim() );
+				material.name = line.substring( 7 ).trim();
 
 			} else if ( /^mtllib /.test( line ) ) {
 
@@ -294,10 +274,17 @@ THREE.OBJLoader.prototype = {
 
 		}
 
-		// add the last group
-		meshN( undefined, undefined );
+		for ( var i = 0, l = object.children.length; i < l; i ++ ) {
+
+			var geometry = object.children[ i ].geometry;
+
+			geometry.computeCentroids();
+			geometry.computeFaceNormals();
+			geometry.computeBoundingSphere();
+
+		}
 
-		return group;
+		return object;
 
 	}