|
@@ -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;
|
|
|
|