Răsfoiți Sursa

Simplified OBJLoader, MTLLoader and OBJMTLLoader.
Eventually I would like to kill OBJMTLLoader altogether though...

Mr.doob 12 ani în urmă
părinte
comite
21515188fd

+ 12 - 50
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;
 

+ 9 - 9
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 ++ ) {
 

+ 18 - 134
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 );
+		} );
 
 	},
 

+ 2 - 5
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' );
+				} );
 
 				//