瀏覽代碼

OBJLoader/MTLLoader: Added setPath()

Mr.doob 9 年之前
父節點
當前提交
dd7d07e56e
共有 3 個文件被更改,包括 58 次插入45 次删除
  1. 9 0
      examples/js/loaders/MTLLoader.js
  2. 33 26
      examples/js/loaders/OBJLoader.js
  3. 16 19
      examples/webgl_loader_obj_mtl.html

+ 9 - 0
examples/js/loaders/MTLLoader.js

@@ -20,6 +20,7 @@ THREE.MTLLoader.prototype = {
 
 		var loader = new THREE.XHRLoader( this.manager );
 		loader.setCrossOrigin( this.crossOrigin );
+		loader.setPath( this.path );
 		loader.load( url, function ( text ) {
 
 			onLoad( scope.parse( text ) );
@@ -28,8 +29,16 @@ THREE.MTLLoader.prototype = {
 
 	},
 
+	setPath: function ( value ) {
+
+		this.path = value;
+
+	},
+
 	setBaseUrl: function( value ) {
 
+		// TODO: Merge with setPath()? Or rename to setTexturePath?
+
 		this.baseUrl = value;
 
 	},

+ 33 - 26
examples/js/loaders/OBJLoader.js

@@ -5,7 +5,7 @@
 THREE.OBJLoader = function ( manager ) {
 
 	this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;
-	
+
 	this.materials = null;
 
 };
@@ -20,6 +20,7 @@ THREE.OBJLoader.prototype = {
 
 		var loader = new THREE.XHRLoader( scope.manager );
 		loader.setCrossOrigin( this.crossOrigin );
+		loader.setPath( this.path );
 		loader.load( url, function ( text ) {
 
 			onLoad( scope.parse( text ) );
@@ -33,11 +34,17 @@ THREE.OBJLoader.prototype = {
 		this.crossOrigin = value;
 
 	},
-	
+
+	setPath: function ( value ) {
+
+		this.path = value;
+
+	},
+
 	setMaterials: function ( materials ) {
-		
+
 		this.materials = materials;
-			
+
 	},
 
 	parse: function ( text ) {
@@ -50,9 +57,9 @@ THREE.OBJLoader.prototype = {
 		var vertices = [];
 		var normals = [];
 		var uvs = [];
-		
+
 		function addObject(name) {
-			
+
 			var geometry = {
 				vertices: [],
 				normals: [],
@@ -71,7 +78,7 @@ THREE.OBJLoader.prototype = {
 			};
 
 			objects.push( object );
-			
+
 		}
 
 		function parseVertexIndex( value ) {
@@ -191,7 +198,7 @@ THREE.OBJLoader.prototype = {
 			}
 
 		}
-		
+
 		addObject("");
 
 		// v float float float
@@ -214,9 +221,9 @@ THREE.OBJLoader.prototype = {
 
 		// f vertex//normal vertex//normal vertex//normal ...
 		var face_pattern4 = /^f\s+((-?\d+)\/\/(-?\d+))\s+((-?\d+)\/\/(-?\d+))\s+((-?\d+)\/\/(-?\d+))(?:\s+((-?\d+)\/\/(-?\d+)))?/;
-		
+
 		var object_pattern = /^[og]\s+(.+)/;
-		
+
 		var smoothing_pattern = /^s\s+([01]|on|off)/;
 
 		//
@@ -301,22 +308,22 @@ THREE.OBJLoader.prototype = {
 				);
 
 			} else if ( ( result = object_pattern.exec( line ) ) !== null ) {
-				
+
 				// o object_name
 				// or
 				// g group_name
-				
+
 				var name = result[1].trim();
-				
+
 				if ( foundObjects === false ) {
-					
+
 					foundObjects = true;
 					object.name = name;
-					
+
 				} else {
-					
+
 					addObject(name);
-					
+
 				}
 
 			} else if ( /^usemtl /.test( line ) ) {
@@ -332,7 +339,7 @@ THREE.OBJLoader.prototype = {
 			} else if ( ( result = smoothing_pattern.exec( line ) ) !== null ) {
 
 				// smooth shading
-				
+
 				object.material.smooth = result[ 1 ] === "1" || result[ 1 ] === "on";
 
 			} else {
@@ -359,9 +366,9 @@ THREE.OBJLoader.prototype = {
 				buffergeometry.addAttribute( 'normal', new THREE.BufferAttribute( new Float32Array( geometry.normals ), 3 ) );
 
 			} else {
-				
+
 				buffergeometry.computeVertexNormals();
-				
+
 			}
 
 			if ( geometry.uvs.length > 0 ) {
@@ -369,20 +376,20 @@ THREE.OBJLoader.prototype = {
 				buffergeometry.addAttribute( 'uv', new THREE.BufferAttribute( new Float32Array( geometry.uvs ), 2 ) );
 
 			}
-			
+
 			var material;
-			
+
 			if ( this.materials !== null ) {
-				
+
 				material = this.materials.create( object.material.name );
-				
+
 			}
-							
+
 			if ( !material ) {
 
 				material = new THREE.MeshPhongMaterial();
 				material.name = object.material.name;
-				
+
 			}
 
 			material.shading = object.material.smooth ? THREE.SmoothShading : THREE.FlatShading;

+ 16 - 19
examples/webgl_loader_obj_mtl.html

@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <html lang="en">
 	<head>
-		<title>three.js webgl - loaders - OBJ MTL loader</title>
+		<title>three.js webgl - OBJLoader + MTLLoader</title>
 		<meta charset="utf-8">
 		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
 		<style>
@@ -27,7 +27,7 @@
 
 	<body>
 		<div id="info">
-		<a href="http://threejs.org" target="_blank">three.js</a> - OBJMTLLoader test
+		<a href="http://threejs.org" target="_blank">three.js</a> - OBJLoader + MTLLoader
 		</div>
 
 		<script src="../build/three.min.js"></script>
@@ -84,29 +84,26 @@
 				};
 
 				var onError = function ( xhr ) { };
-				
+
 				THREE.Loader.Handlers.add( /\.dds$/i, new THREE.DDSLoader() );
-				
-				var objLoader = new THREE.OBJLoader();
-				var mtlLoader = new THREE.MTLLoader(objLoader.manager);
-				
-				var mtlUrl = 'obj/male02/male02_dds.mtl';
-				var objUrl = 'obj/male02/male02.obj';
-				
-				mtlLoader.setBaseUrl( objUrl.substr( 0, objUrl.lastIndexOf( "/" ) + 1 ) );
-				
-				mtlLoader.load( mtlUrl, function( materials ) {
-					
+
+				var mtlLoader = new THREE.MTLLoader();
+				mtlLoader.setBaseUrl( 'obj/male02/' );
+				mtlLoader.setPath( 'obj/male02/' );
+				mtlLoader.load( 'male02_dds.mtl', function( materials ) {
+
 					materials.preload();
+
+					var objLoader = new THREE.OBJLoader();
 					objLoader.setMaterials( materials );
-					
-					objLoader.load( objUrl, function ( object ) {
-	
+					objLoader.setPath( 'obj/male02/' );
+					objLoader.load( 'male02.obj', function ( object ) {
+
 						object.position.y = - 80;
 						scene.add( object );
-	
+
 					}, onProgress, onError );
-					
+
 				});
 
 				//