Mr.doob пре 10 година
родитељ
комит
8b5ad99e6e
1 измењених фајлова са 43 додато и 30 уклоњено
  1. 43 30
      examples/js/exporters/OBJExporter.js

+ 43 - 30
examples/js/exporters/OBJExporter.js

@@ -16,22 +16,24 @@ THREE.OBJExporter.prototype = {
 		var indexVertexUvs = 0;
 		var indexNormals = 0;
 
-		var parseObject = function ( child ) {
+		var parseMesh = function ( mesh ) {
 
 			var nbVertex = 0;
 			var nbVertexUvs = 0;
 			var nbNormals = 0;
 
-			var geometry = child.geometry;
+			var geometry = mesh.geometry;
 
 			if ( geometry instanceof THREE.Geometry ) {
 
-				output += 'o ' + child.name + '\n';
+				output += 'o ' + mesh.name + '\n';
 
-				for ( var i = 0, l = geometry.vertices.length; i < l; i ++ ) {
+				var vertices = geometry.vertices;
 
-					var vertex = geometry.vertices[ i ].clone();
-					vertex.applyMatrix4( child.matrixWorld );
+				for ( var i = 0, l = vertices.length; i < l; i ++ ) {
+
+					var vertex = vertices[ i ].clone();
+					vertex.applyMatrix4( mesh.matrixWorld );
 
 					output += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z + '\n';
 
@@ -41,16 +43,19 @@ THREE.OBJExporter.prototype = {
 
 				// uvs
 
-				if (geometry.faceVertexUvs[ 0 ].length == geometry.faces.length) {
-					
-					for ( var i = 0, l = geometry.faceVertexUvs[ 0 ].length; i < l; i ++ ) {
+				var faces = geometry.faces;
+				var faceVertexUvs = geometry.faceVertexUvs[ 0 ];
+
+				if ( faces.length === faceVertexUvs.length ) {
 
-						var vertexUvs = geometry.faceVertexUvs[ 0 ][ i ];
+					for ( var i = 0, l = faceVertexUvs.length; i < l; i ++ ) {
+
+						var vertexUvs = faceVertexUvs[ i ];
 
 						for ( var j = 0; j < vertexUvs.length; j ++ ) {
 
 							var uv = vertexUvs[ j ];
-							vertex.applyMatrix4( child.matrixWorld );
+							vertex.applyMatrix4( mesh.matrixWorld );
 
 							output += 'vt ' + uv.x + ' ' + uv.y + '\n';
 
@@ -59,56 +64,57 @@ THREE.OBJExporter.prototype = {
 						}
 
 					}
-					
+
 				} else {
-					
-					for ( var i = 0, l = geometry.faces.length * 3; i < l; i ++ ) {
+
+					for ( var i = 0, l = faces.length * 3; i < l; i ++ ) {
 
 						output += 'vt 0 0\n';
 						nbVertexUvs ++;
-						
+
 					}
-					
+
 				}
 
 				// normals
 
-				for ( var i = 0, l = geometry.faces.length; i < l; i ++ ) {
+				for ( var i = 0, l = faces.length; i < l; i ++ ) {
 
-					var normals = geometry.faces[ i ].vertexNormals;
+					var face = faces[ i ];
+					var vertexNormals = face.vertexNormals;
 
-					if (normals.length == 3) {
+					if ( vertexNormals.length === 3 ) {
 
-						for ( var j = 0; j < normals.length; j ++ ) {
+						for ( var j = 0; j < vertexNormals.length; j ++ ) {
 
-							var normal = normals[ j ];
+							var normal = vertexNormals[ j ];
 							output += 'vn ' + normal.x + ' ' + normal.y + ' ' + normal.z + '\n';
 
 							nbNormals ++;
 
 						}
-						
+
 					} else {
-						
-						var normal = geometry.faces[ i ].normal;
-						
+
+						var normal = face.normal;
+
 						for ( var j = 0; j < 3; j ++ ) {
 
 							output += 'vn ' + normal.x + ' ' + normal.y + ' ' + normal.z + '\n';
 
 							nbNormals ++;
 
-						}										
-						
+						}
+
 					}
 
 				}
 
 				// faces
 
-				for ( var i = 0, j = 1, l = geometry.faces.length; i < l; i ++, j += 3 ) {
+				for ( var i = 0, j = 1, l = faces.length; i < l; i ++, j += 3 ) {
 
-					var face = geometry.faces[ i ];
+					var face = faces[ i ];
 
 					output += 'f ';
 					output += ( indexVertex + face.a + 1 ) + '/' + ( indexVertexUvs + j ) + '/' + ( indexNormals + j ) + ' ';
@@ -117,6 +123,11 @@ THREE.OBJExporter.prototype = {
 
 				}
 
+			} else {
+
+				console.warn( 'THREE.OBJExporter.parseMesh(): geometry type unsupported', mesh );
+				// TODO: Support only BufferGeometry and use use setFromObject()
+
 			}
 
 			// update index
@@ -126,7 +137,9 @@ THREE.OBJExporter.prototype = {
 
 		};
 
-		object.traverse( parseObject );
+		object.traverse( function ( child ) {
+			if ( child instanceof THREE.Mesh ) parseMesh( child );
+		} );
 
 		return output;