From 8b5ad99e6e057d1e1fd6e0dd24e9b113f08acbd2 Mon Sep 17 00:00:00 2001 From: "Mr.doob" Date: Mon, 11 May 2015 17:20:49 -0400 Subject: [PATCH] OBJExporter: Clean up. --- examples/js/exporters/OBJExporter.js | 73 ++++++++++++++++------------ 1 file changed, 43 insertions(+), 30 deletions(-) diff --git a/examples/js/exporters/OBJExporter.js b/examples/js/exporters/OBJExporter.js index fe3d264e55..f53f5165d2 100644 --- a/examples/js/exporters/OBJExporter.js +++ b/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; -- GitLab