diff --git a/examples/js/loaders/OBJLoader.js b/examples/js/loaders/OBJLoader.js index 3629ddcac490d7a60cbcbea2ad6723b193d9b7a5..68ba0ef9eed210d2df514868a9161756ff75cbd7 100644 --- a/examples/js/loaders/OBJLoader.js +++ b/examples/js/loaders/OBJLoader.js @@ -46,6 +46,12 @@ THREE.OBJLoader.prototype = { parse: function ( data ) { + // fixes + + data = data.replace( /\ \\\r\n/g, '' ); // rhino adds ' \\r\n' some times. + + // + function vector( x, y, z ) { return new THREE.Vector3( x, y, z ); @@ -70,118 +76,172 @@ THREE.OBJLoader.prototype = { } + function meshN( meshName, materialName ) { + + if ( geometry.vertices.length > 0 ) { + + geometry.mergeVertices(); + geometry.computeCentroids(); + geometry.computeFaceNormals(); + geometry.computeBoundingSphere(); + + 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; + + } + + } + 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 = []; var uvs = []; - // fixes - data = data.replace( /\ \\\r\n/g, '' ); // rhino adds ' \\r\n' some times. + // v float float float - var pattern, result; + var vertex_pattern = /v( +[\d|\.|\+|\-|e]+)( [\d|\.|\+|\-|e]+)( [\d|\.|\+|\-|e]+)/; - // v float float float + // vn float float float - pattern = /v( +[\d|\.|\+|\-|e]+)( [\d|\.|\+|\-|e]+)( [\d|\.|\+|\-|e]+)/g; + var normal_pattern = /vn( +[\d|\.|\+|\-|e]+)( [\d|\.|\+|\-|e]+)( [\d|\.|\+|\-|e]+)/; - while ( ( result = pattern.exec( data ) ) != null ) { + // vt float float - // ["v 1.0 2.0 3.0", "1.0", "2.0", "3.0"] + var uv_pattern = /vt( +[\d|\.|\+|\-|e]+)( [\d|\.|\+|\-|e]+)/; - vertices.push( vector( - parseFloat( result[ 1 ] ), - parseFloat( result[ 2 ] ), - parseFloat( result[ 3 ] ) - ) ); + // f vertex vertex vertex ... - } + var face_pattern1 = /f( +[\d]+)( [\d]+)( [\d]+)( [\d]+)?/; + // f vertex/uv vertex/uv vertex/uv ... - // vn float float float + var face_pattern2 = /f( +([\d]+)\/([\d]+))( ([\d]+)\/([\d]+))( ([\d]+)\/([\d]+))( ([\d]+)\/([\d]+))?/; - pattern = /vn( +[\d|\.|\+|\-|e]+)( [\d|\.|\+|\-|e]+)( [\d|\.|\+|\-|e]+)/g; + // f vertex/uv/normal vertex/uv/normal vertex/uv/normal ... - while ( ( result = pattern.exec( data ) ) != null ) { + var face_pattern3 = /f( +([\d]+)\/([\d]+)\/([\d]+))( ([\d]+)\/([\d]+)\/([\d]+))( ([\d]+)\/([\d]+)\/([\d]+))( ([\d]+)\/([\d]+)\/([\d]+))?/; - // ["vn 1.0 2.0 3.0", "1.0", "2.0", "3.0"] + // f vertex//normal vertex//normal vertex//normal ... - normals.push( vector( - parseFloat( result[ 1 ] ), - parseFloat( result[ 2 ] ), - parseFloat( result[ 3 ] ) - ) ); + var face_pattern4 = /f( +([\d]+)\/\/([\d]+))( ([\d]+)\/\/([\d]+))( ([\d]+)\/\/([\d]+))( ([\d]+)\/\/([\d]+))?/; - } + // - // vt float float + var lines = data.split( "\n" ); - pattern = /vt( +[\d|\.|\+|\-|e]+)( [\d|\.|\+|\-|e]+)/g; + for ( var i = 0; i < lines.length; i ++ ) { - while ( ( result = pattern.exec( data ) ) != null ) { + var line = lines[ i ]; + line = line.trim(); - // ["vt 0.1 0.2", "0.1", "0.2"] + var result; - uvs.push( uv( - parseFloat( result[ 1 ] ), - parseFloat( result[ 2 ] ) - ) ); + if ( line.length === 0 || line.charAt( 0 ) === '#' ) { - } + continue; + + } else if ( ( result = vertex_pattern.exec( line ) ) !== null ) { - var splitData = data.split( '\no ' ); + // ["v 1.0 2.0 3.0", "1.0", "2.0", "3.0"] - for ( var i = 0, l = splitData.length; i < l; i ++ ) { + vertices.push( vector( + parseFloat( result[ 1 ] ), + parseFloat( result[ 2 ] ), + parseFloat( result[ 3 ] ) + ) ); - var object = splitData[ i ]; + } else if ( ( result = normal_pattern.exec( line ) ) !== null ) { - var geometry = new THREE.Geometry(); + // ["vn 1.0 2.0 3.0", "1.0", "2.0", "3.0"] - geometry.vertices = vertices; + normals.push( vector( + parseFloat( result[ 1 ] ), + parseFloat( result[ 2 ] ), + parseFloat( result[ 3 ] ) + ) ); - // f vertex vertex vertex ... + } else if ( ( result = uv_pattern.exec( line ) ) !== null ) { - pattern = /f( +[\d]+)( [\d]+)( [\d]+)( [\d]+)?/g; + // ["vt 0.1 0.2", "0.1", "0.2"] - while ( ( result = pattern.exec( object ) ) != null ) { + uvs.push( uv( + parseFloat( result[ 1 ] ), + parseFloat( result[ 2 ] ) + ) ); + + } else if ( ( result = face_pattern1.exec( line ) ) !== null ) { // ["f 1 2 3", "1", "2", "3", undefined] if ( result[ 4 ] === undefined ) { + geometry.vertices.push( + vertices[ parseInt( result[ 1 ] ) - 1 ], + vertices[ parseInt( result[ 2 ] ) - 1 ], + vertices[ parseInt( result[ 3 ] ) - 1 ] + ); + geometry.faces.push( face3( - parseInt( result[ 1 ] ) - 1, - parseInt( result[ 2 ] ) - 1, - parseInt( result[ 3 ] ) - 1 + verticesCount ++, + verticesCount ++, + verticesCount ++ ) ); } else { + geometry.vertices.push( + vertices[ parseInt( result[ 1 ] ) - 1 ], + vertices[ parseInt( result[ 2 ] ) - 1 ], + vertices[ parseInt( result[ 3 ] ) - 1 ], + vertices[ parseInt( result[ 4 ] ) - 1 ] + ); + geometry.faces.push( face4( - parseInt( result[ 1 ] ) - 1, - parseInt( result[ 2 ] ) - 1, - parseInt( result[ 3 ] ) - 1, - parseInt( result[ 4 ] ) - 1 + verticesCount ++, + verticesCount ++, + verticesCount ++, + verticesCount ++ ) ); } - } - - // f vertex/uv vertex/uv vertex/uv ... - - pattern = /f( +([\d]+)\/([\d]+))( ([\d]+)\/([\d]+))( ([\d]+)\/([\d]+))( ([\d]+)\/([\d]+))?/g; - - while ( ( result = pattern.exec( object ) ) != null ) { + } else if ( ( result = face_pattern2.exec( line ) ) !== null ) { // ["f 1/1 2/2 3/3", " 1/1", "1", "1", " 2/2", "2", "2", " 3/3", "3", "3", undefined, undefined, undefined] if ( result[ 10 ] === undefined ) { + geometry.vertices.push( + vertices[ parseInt( result[ 2 ] ) - 1 ], + vertices[ parseInt( result[ 5 ] ) - 1 ], + vertices[ parseInt( result[ 8 ] ) - 1 ] + ); + geometry.faces.push( face3( - parseInt( result[ 2 ] ) - 1, - parseInt( result[ 5 ] ) - 1, - parseInt( result[ 8 ] ) - 1 + verticesCount ++, + verticesCount ++, + verticesCount ++ ) ); geometry.faceVertexUvs[ 0 ].push( [ @@ -192,11 +252,18 @@ THREE.OBJLoader.prototype = { } else { + geometry.vertices.push( + vertices[ parseInt( result[ 2 ] ) - 1 ], + vertices[ parseInt( result[ 5 ] ) - 1 ], + vertices[ parseInt( result[ 8 ] ) - 1 ], + vertices[ parseInt( result[ 11 ] ) - 1 ] + ); + geometry.faces.push( face4( - parseInt( result[ 2 ] ) - 1, - parseInt( result[ 5 ] ) - 1, - parseInt( result[ 8 ] ) - 1, - parseInt( result[ 11 ] ) - 1 + verticesCount ++, + verticesCount ++, + verticesCount ++, + verticesCount ++ ) ); geometry.faceVertexUvs[ 0 ].push( [ @@ -208,22 +275,22 @@ THREE.OBJLoader.prototype = { } - } - - // f vertex/uv/normal vertex/uv/normal vertex/uv/normal ... - - pattern = /f( +([\d]+)\/([\d]+)\/([\d]+))( ([\d]+)\/([\d]+)\/([\d]+))( ([\d]+)\/([\d]+)\/([\d]+))( ([\d]+)\/([\d]+)\/([\d]+))?/g; - - while ( ( result = pattern.exec( object ) ) != null ) { + } else if ( ( result = face_pattern3.exec( line ) ) !== null ) { // ["f 1/1/1 2/2/2 3/3/3", " 1/1/1", "1", "1", "1", " 2/2/2", "2", "2", "2", " 3/3/3", "3", "3", "3", undefined, undefined, undefined, undefined] if ( result[ 13 ] === undefined ) { + geometry.vertices.push( + vertices[ parseInt( result[ 2 ] ) - 1 ], + vertices[ parseInt( result[ 6 ] ) - 1 ], + vertices[ parseInt( result[ 10 ] ) - 1 ] + ); + geometry.faces.push( face3( - parseInt( result[ 2 ] ) - 1, - parseInt( result[ 6 ] ) - 1, - parseInt( result[ 10 ] ) - 1, + verticesCount ++, + verticesCount ++, + verticesCount ++, [ normals[ parseInt( result[ 4 ] ) - 1 ], normals[ parseInt( result[ 8 ] ) - 1 ], @@ -239,11 +306,18 @@ THREE.OBJLoader.prototype = { } else { + geometry.vertices.push( + vertices[ parseInt( result[ 2 ] ) - 1 ], + vertices[ parseInt( result[ 6 ] ) - 1 ], + vertices[ parseInt( result[ 10 ] ) - 1 ], + vertices[ parseInt( result[ 14 ] ) - 1 ] + ); + geometry.faces.push( face4( - parseInt( result[ 2 ] ) - 1, - parseInt( result[ 6 ] ) - 1, - parseInt( result[ 10 ] ) - 1, - parseInt( result[ 14 ] ) - 1, + verticesCount ++, + verticesCount ++, + verticesCount ++, + verticesCount ++, [ normals[ parseInt( result[ 4 ] ) - 1 ], normals[ parseInt( result[ 8 ] ) - 1 ], @@ -261,23 +335,22 @@ THREE.OBJLoader.prototype = { } - - } - - // f vertex//normal vertex//normal vertex//normal ... - - pattern = /f( +([\d]+)\/\/([\d]+))( ([\d]+)\/\/([\d]+))( ([\d]+)\/\/([\d]+))( ([\d]+)\/\/([\d]+))?/g; - - while ( ( result = pattern.exec( object ) ) != null ) { + } else if ( ( result = face_pattern4.exec( line ) ) !== null ) { // ["f 1//1 2//2 3//3", " 1//1", "1", "1", " 2//2", "2", "2", " 3//3", "3", "3", undefined, undefined, undefined] if ( result[ 10 ] === undefined ) { + geometry.vertices.push( + vertices[ parseInt( result[ 2 ] ) - 1 ], + vertices[ parseInt( result[ 5 ] ) - 1 ], + vertices[ parseInt( result[ 8 ] ) - 1 ] + ); + geometry.faces.push( face3( - parseInt( result[ 2 ] ) - 1, - parseInt( result[ 5 ] ) - 1, - parseInt( result[ 8 ] ) - 1, + verticesCount ++, + verticesCount ++, + verticesCount ++, [ normals[ parseInt( result[ 3 ] ) - 1 ], normals[ parseInt( result[ 6 ] ) - 1 ], @@ -287,11 +360,18 @@ THREE.OBJLoader.prototype = { } else { + geometry.vertices.push( + vertices[ parseInt( result[ 2 ] ) - 1 ], + vertices[ parseInt( result[ 5 ] ) - 1 ], + vertices[ parseInt( result[ 8 ] ) - 1 ], + vertices[ parseInt( result[ 11 ] ) - 1 ] + ); + geometry.faces.push( face4( - parseInt( result[ 2 ] ) - 1, - parseInt( result[ 5 ] ) - 1, - parseInt( result[ 8 ] ) - 1, - parseInt( result[ 11 ] ) - 1, + verticesCount ++, + verticesCount ++, + verticesCount ++, + verticesCount ++, [ normals[ parseInt( result[ 3 ] ) - 1 ], normals[ parseInt( result[ 6 ] ) - 1 ], @@ -302,13 +382,39 @@ THREE.OBJLoader.prototype = { } - } + } else if ( line.startsWith( "o " ) ) { + + // object + + object = new THREE.Object3D(); + object.name = line.substring( 2 ).trim(); + group.add( object ); + + } else if ( line.startsWith( "g " ) ) { + + // group + + meshN( line.substring( 2 ).trim(), undefined ); + + } else if ( line.startsWith( "usemtl " ) ) { - geometry.computeCentroids(); - geometry.computeFaceNormals(); - geometry.computeBoundingSphere(); + // material - group.add( new THREE.Mesh( geometry, new THREE.MeshLambertMaterial() ) ); + meshN( undefined, line.substring( 7 ).trim() ); + + } else if ( line.startsWith( "mtllib ") ) { + + // mtl file + + } else if ( line.startsWith( "s ") ) { + + // smooth shading + + } else { + + // console.log( "THREE.OBJLoader: Unhandled line " + line ); + + } } diff --git a/examples/js/loaders/OBJMTLLoader.js b/examples/js/loaders/OBJMTLLoader.js index 01f5319b49a7da217937f6f879220c3b760708ea..1d6bffdb109647d147aa4618ef1281aed1f65aac 100644 --- a/examples/js/loaders/OBJMTLLoader.js +++ b/examples/js/loaders/OBJMTLLoader.js @@ -5,7 +5,7 @@ * @author angelxuanchang */ -THREE.OBJMTLLoader = function ( ) { +THREE.OBJMTLLoader = function () { THREE.EventDispatcher.call( this ); @@ -180,6 +180,12 @@ THREE.OBJMTLLoader.prototype = { parse: function ( data, mtllibCallback ) { + // fixes + + data = data.replace( /\ \\\r\n/g, '' ); // rhino adds ' \\r\n' some times. + + // + function vector( x, y, z ) { return new THREE.Vector3( x, y, z ); @@ -204,16 +210,45 @@ THREE.OBJMTLLoader.prototype = { } - function finalize_mesh( group, mesh_info ) { + function meshN( meshName, materialName ) { + + if ( geometry.vertices.length > 0 ) { + + geometry.mergeVertices(); + geometry.computeCentroids(); + geometry.computeFaceNormals(); + geometry.computeBoundingSphere(); + + 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_info.geometry.computeCentroids(); - mesh_info.geometry.computeFaceNormals(); - mesh_info.geometry.computeBoundingSphere(); - group.add( new THREE.Mesh( mesh_info.geometry, mesh_info.material ) ); + mesh.material = material; + + } } + 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 = []; var uvs = []; @@ -245,20 +280,7 @@ THREE.OBJMTLLoader.prototype = { var face_pattern4 = /f( +([\d]+)\/\/([\d]+))( ([\d]+)\/\/([\d]+))( ([\d]+)\/\/([\d]+))( ([\d]+)\/\/([\d]+))?/; - var final_model = new THREE.Object3D(); - - var geometry = new THREE.Geometry(); - geometry.vertices = vertices; - - var cur_mesh = { - - material: new THREE.MeshLambertMaterial(), - geometry: geometry - - }; - - // fixes - data = data.replace( /\ \\\r\n/g, '' ); // rhino adds ' \\r\n' some times. + // var lines = data.split( "\n" ); @@ -310,19 +332,32 @@ THREE.OBJMTLLoader.prototype = { if ( result[ 4 ] === undefined ) { + geometry.vertices.push( + vertices[ parseInt( result[ 1 ] ) - 1 ], + vertices[ parseInt( result[ 2 ] ) - 1 ], + vertices[ parseInt( result[ 3 ] ) - 1 ] + ); + geometry.faces.push( face3( - parseInt( result[ 1 ] ) - 1, - parseInt( result[ 2 ] ) - 1, - parseInt( result[ 3 ] ) - 1 + verticesCount ++, + verticesCount ++, + verticesCount ++ ) ); } else { + geometry.vertices.push( + vertices[ parseInt( result[ 1 ] ) - 1 ], + vertices[ parseInt( result[ 2 ] ) - 1 ], + vertices[ parseInt( result[ 3 ] ) - 1 ], + vertices[ parseInt( result[ 4 ] ) - 1 ] + ); + geometry.faces.push( face4( - parseInt( result[ 1 ] ) - 1, - parseInt( result[ 2 ] ) - 1, - parseInt( result[ 3 ] ) - 1, - parseInt( result[ 4 ] ) - 1 + verticesCount ++, + verticesCount ++, + verticesCount ++, + verticesCount ++ ) ); } @@ -333,10 +368,16 @@ THREE.OBJMTLLoader.prototype = { if ( result[ 10 ] === undefined ) { + geometry.vertices.push( + vertices[ parseInt( result[ 2 ] ) - 1 ], + vertices[ parseInt( result[ 5 ] ) - 1 ], + vertices[ parseInt( result[ 8 ] ) - 1 ] + ); + geometry.faces.push( face3( - parseInt( result[ 2 ] ) - 1, - parseInt( result[ 5 ] ) - 1, - parseInt( result[ 8 ] ) - 1 + verticesCount ++, + verticesCount ++, + verticesCount ++ ) ); geometry.faceVertexUvs[ 0 ].push( [ @@ -347,11 +388,18 @@ THREE.OBJMTLLoader.prototype = { } else { + geometry.vertices.push( + vertices[ parseInt( result[ 2 ] ) - 1 ], + vertices[ parseInt( result[ 5 ] ) - 1 ], + vertices[ parseInt( result[ 8 ] ) - 1 ], + vertices[ parseInt( result[ 11 ] ) - 1 ] + ); + geometry.faces.push( face4( - parseInt( result[ 2 ] ) - 1, - parseInt( result[ 5 ] ) - 1, - parseInt( result[ 8 ] ) - 1, - parseInt( result[ 11 ] ) - 1 + verticesCount ++, + verticesCount ++, + verticesCount ++, + verticesCount ++ ) ); geometry.faceVertexUvs[ 0 ].push( [ @@ -369,10 +417,16 @@ THREE.OBJMTLLoader.prototype = { if ( result[ 13 ] === undefined ) { + geometry.vertices.push( + vertices[ parseInt( result[ 2 ] ) - 1 ], + vertices[ parseInt( result[ 6 ] ) - 1 ], + vertices[ parseInt( result[ 10 ] ) - 1 ] + ); + geometry.faces.push( face3( - parseInt( result[ 2 ] ) - 1, - parseInt( result[ 6 ] ) - 1, - parseInt( result[ 10 ] ) - 1, + verticesCount ++, + verticesCount ++, + verticesCount ++, [ normals[ parseInt( result[ 4 ] ) - 1 ], normals[ parseInt( result[ 8 ] ) - 1 ], @@ -388,11 +442,18 @@ THREE.OBJMTLLoader.prototype = { } else { + geometry.vertices.push( + vertices[ parseInt( result[ 2 ] ) - 1 ], + vertices[ parseInt( result[ 6 ] ) - 1 ], + vertices[ parseInt( result[ 10 ] ) - 1 ], + vertices[ parseInt( result[ 14 ] ) - 1 ] + ); + geometry.faces.push( face4( - parseInt( result[ 2 ] ) - 1, - parseInt( result[ 6 ] ) - 1, - parseInt( result[ 10 ] ) - 1, - parseInt( result[ 14 ] ) - 1, + verticesCount ++, + verticesCount ++, + verticesCount ++, + verticesCount ++, [ normals[ parseInt( result[ 4 ] ) - 1 ], normals[ parseInt( result[ 8 ] ) - 1 ], @@ -416,10 +477,16 @@ THREE.OBJMTLLoader.prototype = { if ( result[ 10 ] === undefined ) { + geometry.vertices.push( + vertices[ parseInt( result[ 2 ] ) - 1 ], + vertices[ parseInt( result[ 5 ] ) - 1 ], + vertices[ parseInt( result[ 8 ] ) - 1 ] + ); + geometry.faces.push( face3( - parseInt( result[ 2 ] ) - 1, - parseInt( result[ 5 ] ) - 1, - parseInt( result[ 8 ] ) - 1, + verticesCount ++, + verticesCount ++, + verticesCount ++, [ normals[ parseInt( result[ 3 ] ) - 1 ], normals[ parseInt( result[ 6 ] ) - 1 ], @@ -429,11 +496,18 @@ THREE.OBJMTLLoader.prototype = { } else { + geometry.vertices.push( + vertices[ parseInt( result[ 2 ] ) - 1 ], + vertices[ parseInt( result[ 5 ] ) - 1 ], + vertices[ parseInt( result[ 8 ] ) - 1 ], + vertices[ parseInt( result[ 11 ] ) - 1 ] + ); + geometry.faces.push( face4( - parseInt( result[ 2 ] ) - 1, - parseInt( result[ 5 ] ) - 1, - parseInt( result[ 8 ] ) - 1, - parseInt( result[ 11 ] ) - 1, + verticesCount ++, + verticesCount ++, + verticesCount ++, + verticesCount ++, [ normals[ parseInt( result[ 3 ] ) - 1 ], normals[ parseInt( result[ 6 ] ) - 1 ], @@ -444,46 +518,25 @@ THREE.OBJMTLLoader.prototype = { } - } else if ( line.startsWith( "usemtl " ) ) { - - var material_name = line.substring( 7 ); - material_name = material_name.trim(); - - var material = new THREE.MeshLambertMaterial(); - material.name = material_name; - - if ( geometry.faces.length > 0 ) { - - // Finalize previous geometry and add to model - - finalize_mesh( final_model, cur_mesh ); - geometry = new THREE.Geometry(); - geometry.vertices = vertices; - - cur_mesh = { geometry: geometry }; + } else if ( line.startsWith( "o " ) ) { - } + // object - cur_mesh.material = material; - //material_index = materialsCreator.getIndex( material_name ); + object = new THREE.Object3D(); + object.name = line.substring( 2 ).trim(); + group.add( object ); } else if ( line.startsWith( "g " ) ) { - // Polygon group for object + // group - var group_name = line.substring( 2 ); - group_name = group_name.trim(); - - } else if ( line.startsWith( "o " ) ) { + meshN( line.substring( 2 ).trim(), undefined ); - // Object + } else if ( line.startsWith( "usemtl " ) ) { - var object_name = line.substring(2); - object_name = object_name.trim(); + // material - } else if ( line.startsWith( "s ") ) { - - // Smooth shading + meshN( undefined, line.substring( 7 ).trim() ); } else if ( line.startsWith( "mtllib ") ) { @@ -497,17 +550,19 @@ THREE.OBJMTLLoader.prototype = { } + } else if ( line.startsWith( "s ") ) { + + // Smooth shading + } else { - console.error( "Unhandled line " + line ); + console.log( "THREE.OBJMTLLoader: Unhandled line " + line ); } } - finalize_mesh( final_model, cur_mesh ); - - return final_model; + return group; } diff --git a/examples/webgl_loader_obj.html b/examples/webgl_loader_obj.html index 7e1a49f558452a80a86085b3ec10578635b4127f..ac64c25f670a63e272a8a82b83f7d2aeb78fd514 100644 --- a/examples/webgl_loader_obj.html +++ b/examples/webgl_loader_obj.html @@ -91,11 +91,15 @@ var object = event.content; - for ( var i = 0, l = object.children.length; i < l; i ++ ) { + object.traverse( function ( child ) { - object.children[ i ].material.map = texture; + if ( child instanceof THREE.Mesh ) { - } + child.material.map = texture; + + } + + } ); object.position.y = - 80; scene.add( object );