diff --git a/examples/js/loaders/MTLLoader.js b/examples/js/loaders/MTLLoader.js index 7c51ec2f4b5106e515e716c1291749fab47c4bf1..c804213aaee769d6e75b532ccb93f483c0c71339 100644 --- a/examples/js/loaders/MTLLoader.js +++ b/examples/js/loaders/MTLLoader.js @@ -16,56 +16,18 @@ THREE.MTLLoader.prototype = { constructor: THREE.MTLLoader, - /** - * Loads a MTL file - * - * Loading progress is indicated by the following events: - * "load" event (successful loading): type = 'load', content = THREE.MTLLoader.MaterialCreator - * "error" event (error loading): type = 'load', message - * "progress" event (progress loading): type = 'progress', loaded, total - * - * @param url - location of MTL file - */ - load: function( url ) { + load: function ( url, onLoad, onProgress, onError ) { var scope = this; - var xhr = new XMLHttpRequest(); - - function onloaded( event ) { - - if ( event.target.status === 200 || event.target.status === 0 ) { - - var materialCreator = scope.parse( event.target.responseText ); - - // Notify caller, that I'm done - - scope.dispatchEvent( { type: 'load', content: materialCreator } ); - - } else { - - scope.dispatchEvent( { type: 'error', message: 'Couldn\'t load URL [' + url + ']', - response: event.target.responseText } ); - - } - - } - - xhr.addEventListener( 'load', onloaded, false ); - - xhr.addEventListener( 'progress', function ( event ) { - - scope.dispatchEvent( { type: 'progress', loaded: event.loaded, total: event.total } ); - - }, false ); - xhr.addEventListener( 'error', function () { + var loader = new THREE.XHRLoader(); + loader.setCrossOrigin( this.crossOrigin ); + loader.load( url, function ( text ) { - scope.dispatchEvent( { type: 'error', message: 'Couldn\'t load URL [' + url + ']' } ); + onLoad( scope.parse( text ) ); - }, false ); + } ); - xhr.open( 'GET', url, true ); - xhr.send( null ); }, /** @@ -73,14 +35,14 @@ THREE.MTLLoader.prototype = { * @param text - Content of MTL file * @return {THREE.MTLLoader.MaterialCreator} */ - parse: function( text ) { + parse: function ( text ) { var lines = text.split( "\n" ); var info = {}; var delimiter_pattern = /\s+/; var materialsInfo = {}; - for ( var i = 0; i < lines.length; i ++ ) { + for ( var i = 0; i < lines.length; i ++ ) { var line = lines[ i ]; line = line.trim(); @@ -94,7 +56,7 @@ THREE.MTLLoader.prototype = { var pos = line.indexOf( ' ' ); - var key = ( pos >= 0 ) ? line.substring( 0, pos) : line; + var key = ( pos >= 0 ) ? line.substring( 0, pos ) : line; key = key.toLowerCase(); var value = ( pos >= 0 ) ? line.substring( pos + 1 ) : ""; @@ -326,7 +288,7 @@ THREE.MTLLoader.MaterialCreator.prototype = { // Diffuse color (color under white light) using RGB values - params[ 'diffuse' ] = new THREE.Color().setRGB( value[0], value[1], value[2] ); + params[ 'diffuse' ] = new THREE.Color().fromArray( value ); break; @@ -334,14 +296,14 @@ THREE.MTLLoader.MaterialCreator.prototype = { // Ambient color (color under shadow) using RGB values - params[ 'ambient' ] = new THREE.Color().setRGB( value[0], value[1], value[2] ); + params[ 'ambient' ] = new THREE.Color().fromArray( value ); break; case 'ks': // Specular color (color when light is reflected from shiny surface) using RGB values - params[ 'specular' ] = new THREE.Color().setRGB( value[0], value[1], value[2] ); + params[ 'specular' ] = new THREE.Color().fromArray( value ); break; diff --git a/examples/js/loaders/OBJLoader.js b/examples/js/loaders/OBJLoader.js index 4c4b5ddbb510abddf1142de1759dfe7a6d79ec90..5afad8004030b48e72edf21310797d7789d15fea 100644 --- a/examples/js/loaders/OBJLoader.js +++ b/examples/js/loaders/OBJLoader.js @@ -26,17 +26,17 @@ THREE.OBJLoader.prototype = { }, - parse: function ( data ) { + parse: function ( text ) { // fixes - data = data.replace( /\ \\\r\n/g, '' ); // rhino adds ' \\r\n' some times. + text = text.replace( /\ \\\r\n/g, '' ); // rhino adds ' \\r\n' some times. var replacement = '/f$1$2$4\n/f$2$3$4'; // quads to tris - data = data.replace( /f( +\d+)( +\d+)( +\d+)( +\d+)/g, replacement ); - data = data.replace( /f( +\d+\/\d+)( +\d+\/\d+)( +\d+\/\d+)( +\d+\/\d+)/g, replacement ); - data = data.replace( /f( +\d+\/\d+\/\d+)( +\d+\/\d+\/\d+)( +\d+\/\d+\/\d+)( +\d+\/\d+\/\d+)/g, replacement ); - data = data.replace( /f( +\d+\/\/\d+)( +\d+\/\/\d+)( +\d+\/\/\d+)( +\d+\/\/\d+)/g, replacement ); + text = text.replace( /f( +\d+)( +\d+)( +\d+)( +\d+)/g, replacement ); + text = text.replace( /f( +\d+\/\d+)( +\d+\/\d+)( +\d+\/\d+)( +\d+\/\d+)/g, replacement ); + text = text.replace( /f( +\d+\/\d+\/\d+)( +\d+\/\d+\/\d+)( +\d+\/\d+\/\d+)( +\d+\/\d+\/\d+)/g, replacement ); + text = text.replace( /f( +\d+\/\/\d+)( +\d+\/\/\d+)( +\d+\/\/\d+)( +\d+\/\/\d+)/g, replacement ); // @@ -61,9 +61,9 @@ THREE.OBJLoader.prototype = { var object = new THREE.Object3D(); var geometry, material, mesh; - // create mesh if no objects in data + // create mesh if no objects in text - if ( /^o /gm.test( data ) === false ) { + if ( /^o /gm.test( text ) === false ) { geometry = new THREE.Geometry(); material = new THREE.MeshLambertMaterial(); @@ -107,7 +107,7 @@ THREE.OBJLoader.prototype = { // - var lines = data.split( '\n' ); + var lines = text.split( '\n' ); for ( var i = 0; i < lines.length; i ++ ) { diff --git a/examples/js/loaders/OBJMTLLoader.js b/examples/js/loaders/OBJMTLLoader.js index a585c53e77b04a3c19dc5d5d42ab2b6d46da1682..e85a3c7b60db71f530092c9813af7f8810dddef6 100644 --- a/examples/js/loaders/OBJMTLLoader.js +++ b/examples/js/loaders/OBJMTLLoader.js @@ -11,159 +11,43 @@ THREE.OBJMTLLoader.prototype = { constructor: THREE.OBJMTLLoader, - /** - * Load a Wavefront OBJ file with materials (MTL file) - * - * Loading progress is indicated by the following events: - * "load" event (successful loading): type = 'load', content = THREE.Object3D - * "error" event (error loading): type = 'load', message - * "progress" event (progress loading): type = 'progress', loaded, total - * - * If the MTL file cannot be loaded, then a MeshLambertMaterial is used as a default - * @param url - Location of OBJ file to load - * @param mtlfileurl - MTL file to load (optional, if not specified, attempts to use MTL specified in OBJ file) - * @param options - Options on how to interpret the material (see THREE.MTLLoader.MaterialCreator ) - */ - - load: function ( url, mtlfileurl, options ) { + load: function ( url, mtlurl, onLoad, onProgress, onError ) { var scope = this; - var xhr = new XMLHttpRequest(); - - var mtlDone; // Is the MTL done (true if no MTL, error loading MTL, or MTL actually loaded) - var obj3d; // Loaded model (from obj file) - var materialsCreator; // Material creator is created when MTL file is loaded - - // Loader for MTL - - var mtlLoader = new THREE.MTLLoader( url.substr( 0, url.lastIndexOf( "/" ) + 1 ), options ); - mtlLoader.addEventListener( 'load', waitReady ); - mtlLoader.addEventListener( 'error', waitReady ); - - // Try to load mtlfile - - if ( mtlfileurl ) { - - mtlLoader.load( mtlfileurl ); - mtlDone = false; - - } else { - - mtlDone = true; - - } - - function waitReady( event ) { - if ( event.type === 'load' ) { + var mtlLoader = new THREE.MTLLoader( url.substr( 0, url.lastIndexOf( "/" ) + 1 ) ); + mtlLoader.load( mtlurl, function ( materials ) { - if ( event.content instanceof THREE.MTLLoader.MaterialCreator ) { + var materialsCreator = materials; + materialsCreator.preload(); - // MTL file is loaded + var loader = new THREE.XHRLoader( scope.manager ); + loader.setCrossOrigin( this.crossOrigin ); + loader.load( url, function ( text ) { - mtlDone = true; - materialsCreator = event.content; - materialsCreator.preload(); + var object = scope.parse( text ); - } else { + object.traverse( function ( object ) { - // OBJ file is loaded + if ( object instanceof THREE.Mesh ) { - if ( event.target.status === 200 || event.target.status === 0 ) { + if ( object.material.name ) { - var objContent = event.target.responseText; + var material = materialsCreator.create( object.material.name ); - if ( mtlfileurl ) { - - // Parse with passed in MTL file - - obj3d = scope.parse( objContent ); - - } else { - - // No passed in MTL file, look for mtlfile in obj file - - obj3d = scope.parse( objContent, function( mtlfile ) { - - mtlDone = false; - mtlLoader.load( mtlLoader.baseUrl + mtlfile ); - - } ); + if ( material ) object.material = material; } - } else { - - // Error loading OBJ file.... - - scope.dispatchEvent( { - type: 'error', - message: 'Couldn\'t load URL [' + url + ']', - response: event.target.responseText } ); - } - } - - } else if ( event.type === 'error' ) { - - // MTL failed to load -- oh well, we will just not have material ... - - mtlDone = true; - - } - - if ( mtlDone && obj3d ) { - - // MTL file is loaded and OBJ file is loaded - // Apply materials to model - - if ( materialsCreator ) { - - obj3d.traverse( function( object ) { - - if ( object instanceof THREE.Mesh ) { - - if ( object.material.name ) { - - var material = materialsCreator.create( object.material.name ); - if ( material ) { - - object.material = material; - - } - - } - - } - - } ); - - } - - // Notify listeners - - scope.dispatchEvent( { type: 'load', content: obj3d } ); - } - - } - - xhr.addEventListener( 'load', waitReady, false ); - - xhr.addEventListener( 'progress', function ( event ) { - - scope.dispatchEvent( { type: 'progress', loaded: event.loaded, total: event.total } ); - - }, false ); - - xhr.addEventListener( 'error', function () { + } ); - scope.dispatchEvent( { type: 'error', message: 'Couldn\'t load URL [' + url + ']' } ); + onLoad( object ); - }, false ); + } ); - xhr.open( 'GET', url, true ); - xhr.send( null ); + } ); }, diff --git a/examples/webgl_loader_obj_mtl.html b/examples/webgl_loader_obj_mtl.html index 3f93addea3b1f3e54f6808aa707ec69a168ac65f..c40bd971b0dd14afc0f1969a5256b407b9144887 100644 --- a/examples/webgl_loader_obj_mtl.html +++ b/examples/webgl_loader_obj_mtl.html @@ -76,15 +76,12 @@ // model var loader = new THREE.OBJMTLLoader(); - loader.addEventListener( 'load', function ( event ) { - - var object = event.content; + loader.load( 'obj/male02/male02.obj', 'obj/male02/male02_dds.mtl', function ( object ) { object.position.y = - 80; scene.add( object ); - }); - loader.load( 'obj/male02/male02.obj', 'obj/male02/male02_dds.mtl' ); + } ); //