Browse Source

At Loader.js, as far as I can see we don't need all that `stride` stuff. Removed/Simplified from createModel() by now. That saves *a lot* of multiplications at init of the geometry.

Mr.doob 14 years ago
parent
commit
453c6efc0d
3 changed files with 417 additions and 417 deletions
  1. 0 0
      build/Three.js
  2. 0 0
      build/ThreeDebug.js
  3. 417 417
      src/io/Loader.js

File diff suppressed because it is too large
+ 0 - 0
build/Three.js


File diff suppressed because it is too large
+ 0 - 0
build/ThreeDebug.js


+ 417 - 417
src/io/Loader.js

@@ -6,11 +6,11 @@ THREE.Loader = function() {
 };
 };
 
 
 THREE.Loader.prototype = {
 THREE.Loader.prototype = {
-	
+
 	// Load models generated by Blender exporter and original OBJ converter (converter_obj_three.py)
 	// Load models generated by Blender exporter and original OBJ converter (converter_obj_three.py)
-	
+
 	loadAsciiOld: function( url, callback ) {
 	loadAsciiOld: function( url, callback ) {
-		
+
 		var element = document.createElement( 'script' );
 		var element = document.createElement( 'script' );
 		element.type = 'text/javascript';
 		element.type = 'text/javascript';
 		element.onload = callback;
 		element.onload = callback;
@@ -21,66 +21,66 @@ THREE.Loader.prototype = {
 
 
 	// Load models generated by slim OBJ converter with ASCII option (converter_obj_three_slim.py -t ascii)
 	// Load models generated by slim OBJ converter with ASCII option (converter_obj_three_slim.py -t ascii)
 	//  - urlbase parameter is optional (it only applies to models with textures)
 	//  - urlbase parameter is optional (it only applies to models with textures)
-	
+
 	loadAscii: function ( url, callback, urlbase ) {
 	loadAscii: function ( url, callback, urlbase ) {
-		
+
 		var s = (new Date).getTime(),
 		var s = (new Date).getTime(),
 			worker = new Worker( url );
 			worker = new Worker( url );
 
 
 		worker.onmessage = function( event ) {
 		worker.onmessage = function( event ) {
-		
+
 			THREE.Loader.prototype.createModel( event.data, callback, urlbase );
 			THREE.Loader.prototype.createModel( event.data, callback, urlbase );
-			
+
 		};
 		};
-		
+
 		worker.postMessage( s );
 		worker.postMessage( s );
-		
+
 	},
 	},
-	
+
 	// Load models generated by slim OBJ converter with BINARY option (converter_obj_three_slim.py -t binary)
 	// Load models generated by slim OBJ converter with BINARY option (converter_obj_three_slim.py -t binary)
 	//  - urlbase parameter is mandatory (it applies to all models, it tells where to find the file with binary buffers)
 	//  - urlbase parameter is mandatory (it applies to all models, it tells where to find the file with binary buffers)
 	//  - binary models consist of two files: JS and BIN
 	//  - binary models consist of two files: JS and BIN
-	
+
 	loadBinary: function( url, callback, urlbase ) {
 	loadBinary: function( url, callback, urlbase ) {
-		
+
 		// #1 load JS part via web worker
 		// #1 load JS part via web worker
-		
+
 		//  This isn't really necessary, JS part is tiny,
 		//  This isn't really necessary, JS part is tiny,
 		//  could be done by more ordinary means.
 		//  could be done by more ordinary means.
-		
+
 		var s = (new Date).getTime(),
 		var s = (new Date).getTime(),
 			worker = new Worker( url );
 			worker = new Worker( url );
 
 
 		worker.onmessage = function( event ) {
 		worker.onmessage = function( event ) {
-			
+
 			var materials = event.data.materials,
 			var materials = event.data.materials,
 				buffers = event.data.buffers;
 				buffers = event.data.buffers;
-			
+
 			// #2 load BIN part via Ajax
 			// #2 load BIN part via Ajax
-			
+
 			//  For some reason it is faster doing loading from here than from within the worker.
 			//  For some reason it is faster doing loading from here than from within the worker.
 			//  Maybe passing of ginormous string as message between threads is costly? 
 			//  Maybe passing of ginormous string as message between threads is costly? 
 			//  Also, worker loading huge data by Ajax still freezes browser. Go figure, 
 			//  Also, worker loading huge data by Ajax still freezes browser. Go figure, 
 			//  worker with baked ascii JSON data keeps browser more responsive.
 			//  worker with baked ascii JSON data keeps browser more responsive.
-			
+
 			THREE.Loader.prototype.loadAjaxBuffers( buffers, materials, callback, urlbase );
 			THREE.Loader.prototype.loadAjaxBuffers( buffers, materials, callback, urlbase );
-			
+
 		};
 		};
-		
+
 		worker.onerror = function (event) {
 		worker.onerror = function (event) {
-			
+
 			alert( "worker.onerror: " + event.message + "\n" + event.data );
 			alert( "worker.onerror: " + event.message + "\n" + event.data );
 			event.preventDefault();
 			event.preventDefault();
-			
+
 		};
 		};
-		
+
 		worker.postMessage( s );
 		worker.postMessage( s );
-		
+
 	},
 	},
 
 
 	// Binary AJAX parser based on Magi binary loader
 	// Binary AJAX parser based on Magi binary loader
 	// https://github.com/kig/magi
 	// https://github.com/kig/magi
-	
+
 	// Should look more into HTML5 File API
 	// Should look more into HTML5 File API
 	// See also other suggestions by Gregg Tavares
 	// See also other suggestions by Gregg Tavares
 	// https://groups.google.com/group/o3d-discuss/browse_thread/thread/a8967bc9ce1e0978
 	// https://groups.google.com/group/o3d-discuss/browse_thread/thread/a8967bc9ce1e0978
@@ -89,59 +89,59 @@ THREE.Loader.prototype = {
 
 
 		var xhr = new XMLHttpRequest(),
 		var xhr = new XMLHttpRequest(),
 			url = urlbase + "/" + buffers;
 			url = urlbase + "/" + buffers;
-	
+
 		xhr.onreadystatechange = function() {
 		xhr.onreadystatechange = function() {
-	  
+
 			if ( xhr.readyState == 4 ) {
 			if ( xhr.readyState == 4 ) {
-				
+
 				if ( xhr.status == 200 || xhr.status == 0 ) {
 				if ( xhr.status == 200 || xhr.status == 0 ) {
-		  
+
 					THREE.Loader.prototype.createBinModel( xhr.responseText, callback, urlbase, materials );
 					THREE.Loader.prototype.createBinModel( xhr.responseText, callback, urlbase, materials );
-					
+
 				} else {
 				} else {
-		  
+
 					alert( "Couldn't load [" + url + "] [" + xhr.status + "]" );
 					alert( "Couldn't load [" + url + "] [" + xhr.status + "]" );
-					
+
 				}
 				}
 			}
 			}
 		}
 		}
-		
+
 		xhr.open("GET", url, true);
 		xhr.open("GET", url, true);
 		xhr.overrideMimeType("text/plain; charset=x-user-defined");
 		xhr.overrideMimeType("text/plain; charset=x-user-defined");
 		xhr.setRequestHeader("Content-Type", "text/plain");
 		xhr.setRequestHeader("Content-Type", "text/plain");
 		xhr.send(null);
 		xhr.send(null);
-		
+
 	},
 	},
 
 
 	createBinModel: function ( data, callback, urlbase, materials ) {
 	createBinModel: function ( data, callback, urlbase, materials ) {
-		
+
 		var Model = function ( urlbase ) {
 		var Model = function ( urlbase ) {
-			
+
 			//var s = (new Date).getTime();
 			//var s = (new Date).getTime();
-			
+
 			var scope = this,
 			var scope = this,
 				currentOffset = 0, 
 				currentOffset = 0, 
 				md,
 				md,
 				normals = [],
 				normals = [],
 				uvs = [];
 				uvs = [];
 
 
-			
+
 			THREE.Geometry.call(this);
 			THREE.Geometry.call(this);
-			
+
 			THREE.Loader.prototype.init_materials( scope, materials, urlbase );
 			THREE.Loader.prototype.init_materials( scope, materials, urlbase );
-			
+
 			md = parseMetaData( data, currentOffset );
 			md = parseMetaData( data, currentOffset );
 			currentOffset += md.header_bytes;
 			currentOffset += md.header_bytes;
-			
+
 			currentOffset += init_vertices( currentOffset );
 			currentOffset += init_vertices( currentOffset );
 			currentOffset += init_normals( currentOffset );
 			currentOffset += init_normals( currentOffset );
 			currentOffset += init_uvs( currentOffset );
 			currentOffset += init_uvs( currentOffset );
-			
+
 			currentOffset += init_triangles_flat( currentOffset );
 			currentOffset += init_triangles_flat( currentOffset );
 			currentOffset += init_triangles_smooth( currentOffset );
 			currentOffset += init_triangles_smooth( currentOffset );
 			currentOffset += init_triangles_flat_uv( currentOffset );
 			currentOffset += init_triangles_flat_uv( currentOffset );
 			currentOffset += init_triangles_smooth_uv( currentOffset );
 			currentOffset += init_triangles_smooth_uv( currentOffset );
-			
+
 			currentOffset += init_quads_flat( currentOffset );
 			currentOffset += init_quads_flat( currentOffset );
 			currentOffset += init_quads_smooth( currentOffset );
 			currentOffset += init_quads_smooth( currentOffset );
 			currentOffset += init_quads_flat_uv( currentOffset );
 			currentOffset += init_quads_flat_uv( currentOffset );
@@ -149,70 +149,70 @@ THREE.Loader.prototype = {
 
 
 			this.computeCentroids();
 			this.computeCentroids();
 			this.computeNormals();
 			this.computeNormals();
-			
+
 			//var e = (new Date).getTime();
 			//var e = (new Date).getTime();
-			
+
 			//log( "binary data parse time: " + (e-s) + " ms" );
 			//log( "binary data parse time: " + (e-s) + " ms" );
-			
+
 			function parseMetaData( data, offset ) {
 			function parseMetaData( data, offset ) {
-				
+
 				var metaData = {
 				var metaData = {
-					
+
 					'signature'               :parseString( data, offset, 8 ),
 					'signature'               :parseString( data, offset, 8 ),
 					'header_bytes'            :parseUChar8( data, offset + 8 ),
 					'header_bytes'            :parseUChar8( data, offset + 8 ),
-					
+
 					'vertex_coordinate_bytes' :parseUChar8( data, offset + 9 ),
 					'vertex_coordinate_bytes' :parseUChar8( data, offset + 9 ),
 					'normal_coordinate_bytes' :parseUChar8( data, offset + 10 ),
 					'normal_coordinate_bytes' :parseUChar8( data, offset + 10 ),
 					'uv_coordinate_bytes'     :parseUChar8( data, offset + 11 ),
 					'uv_coordinate_bytes'     :parseUChar8( data, offset + 11 ),
-					
+
 					'vertex_index_bytes'      :parseUChar8( data, offset + 12 ),
 					'vertex_index_bytes'      :parseUChar8( data, offset + 12 ),
 					'normal_index_bytes'      :parseUChar8( data, offset + 13 ),
 					'normal_index_bytes'      :parseUChar8( data, offset + 13 ),
 					'uv_index_bytes'          :parseUChar8( data, offset + 14 ),
 					'uv_index_bytes'          :parseUChar8( data, offset + 14 ),
 					'material_index_bytes'    :parseUChar8( data, offset + 15 ),
 					'material_index_bytes'    :parseUChar8( data, offset + 15 ),
-				
+
 					'nvertices'    :parseUInt32( data, offset + 16 ),
 					'nvertices'    :parseUInt32( data, offset + 16 ),
 					'nnormals'     :parseUInt32( data, offset + 16 + 4*1 ),
 					'nnormals'     :parseUInt32( data, offset + 16 + 4*1 ),
 					'nuvs'         :parseUInt32( data, offset + 16 + 4*2 ),
 					'nuvs'         :parseUInt32( data, offset + 16 + 4*2 ),
-					
+
 					'ntri_flat'      :parseUInt32( data, offset + 16 + 4*3 ),
 					'ntri_flat'      :parseUInt32( data, offset + 16 + 4*3 ),
 					'ntri_smooth'    :parseUInt32( data, offset + 16 + 4*4 ),
 					'ntri_smooth'    :parseUInt32( data, offset + 16 + 4*4 ),
 					'ntri_flat_uv'   :parseUInt32( data, offset + 16 + 4*5 ),
 					'ntri_flat_uv'   :parseUInt32( data, offset + 16 + 4*5 ),
 					'ntri_smooth_uv' :parseUInt32( data, offset + 16 + 4*6 ),
 					'ntri_smooth_uv' :parseUInt32( data, offset + 16 + 4*6 ),
-					
+
 					'nquad_flat'      :parseUInt32( data, offset + 16 + 4*7 ),
 					'nquad_flat'      :parseUInt32( data, offset + 16 + 4*7 ),
 					'nquad_smooth'    :parseUInt32( data, offset + 16 + 4*8 ),
 					'nquad_smooth'    :parseUInt32( data, offset + 16 + 4*8 ),
 					'nquad_flat_uv'   :parseUInt32( data, offset + 16 + 4*9 ),
 					'nquad_flat_uv'   :parseUInt32( data, offset + 16 + 4*9 ),
 					'nquad_smooth_uv' :parseUInt32( data, offset + 16 + 4*10 )
 					'nquad_smooth_uv' :parseUInt32( data, offset + 16 + 4*10 )
-					
+
 				};
 				};
 
 
 				/*
 				/*
 				log( "signature: " + metaData.signature );
 				log( "signature: " + metaData.signature );
-				
+
 				log( "header_bytes: " + metaData.header_bytes );
 				log( "header_bytes: " + metaData.header_bytes );
 				log( "vertex_coordinate_bytes: " + metaData.vertex_coordinate_bytes );
 				log( "vertex_coordinate_bytes: " + metaData.vertex_coordinate_bytes );
 				log( "normal_coordinate_bytes: " + metaData.normal_coordinate_bytes );
 				log( "normal_coordinate_bytes: " + metaData.normal_coordinate_bytes );
 				log( "uv_coordinate_bytes: " + metaData.uv_coordinate_bytes );
 				log( "uv_coordinate_bytes: " + metaData.uv_coordinate_bytes );
-				
+
 				log( "vertex_index_bytes: " + metaData.vertex_index_bytes );
 				log( "vertex_index_bytes: " + metaData.vertex_index_bytes );
 				log( "normal_index_bytes: " + metaData.normal_index_bytes );
 				log( "normal_index_bytes: " + metaData.normal_index_bytes );
 				log( "uv_index_bytes: " + metaData.uv_index_bytes );
 				log( "uv_index_bytes: " + metaData.uv_index_bytes );
 				log( "material_index_bytes: " + metaData.material_index_bytes );
 				log( "material_index_bytes: " + metaData.material_index_bytes );
-				
+
 				log( "nvertices: " + metaData.nvertices );
 				log( "nvertices: " + metaData.nvertices );
 				log( "nnormals: " + metaData.nnormals );
 				log( "nnormals: " + metaData.nnormals );
 				log( "nuvs: " + metaData.nuvs );
 				log( "nuvs: " + metaData.nuvs );
-				
+
 				log( "ntri_flat: " + metaData.ntri_flat );
 				log( "ntri_flat: " + metaData.ntri_flat );
 				log( "ntri_smooth: " + metaData.ntri_smooth );
 				log( "ntri_smooth: " + metaData.ntri_smooth );
 				log( "ntri_flat_uv: " + metaData.ntri_flat_uv );
 				log( "ntri_flat_uv: " + metaData.ntri_flat_uv );
 				log( "ntri_smooth_uv: " + metaData.ntri_smooth_uv );
 				log( "ntri_smooth_uv: " + metaData.ntri_smooth_uv );
-				
+
 				log( "nquad_flat: " + metaData.nquad_flat );
 				log( "nquad_flat: " + metaData.nquad_flat );
 				log( "nquad_smooth: " + metaData.nquad_smooth );
 				log( "nquad_smooth: " + metaData.nquad_smooth );
 				log( "nquad_flat_uv: " + metaData.nquad_flat_uv );
 				log( "nquad_flat_uv: " + metaData.nquad_flat_uv );
 				log( "nquad_smooth_uv: " + metaData.nquad_smooth_uv );
 				log( "nquad_smooth_uv: " + metaData.nquad_smooth_uv );
-				
+
 				var total = metaData.header_bytes
 				var total = metaData.header_bytes
 						  + metaData.nvertices * metaData.vertex_coordinate_bytes * 3
 						  + metaData.nvertices * metaData.vertex_coordinate_bytes * 3
 						  + metaData.nnormals * metaData.normal_coordinate_bytes * 3
 						  + metaData.nnormals * metaData.normal_coordinate_bytes * 3
@@ -227,734 +227,734 @@ THREE.Loader.prototype = {
 						  + metaData.nquad_smooth_uv * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes + metaData.normal_index_bytes*4 + metaData.uv_index_bytes*4 );
 						  + metaData.nquad_smooth_uv * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes + metaData.normal_index_bytes*4 + metaData.uv_index_bytes*4 );
 				log( "total bytes: " + total );
 				log( "total bytes: " + total );
 				*/
 				*/
-				
+
 				return metaData;
 				return metaData;
-				
+
 			}
 			}
-			
+
 			function parseString( data, offset, length ) {
 			function parseString( data, offset, length ) {
-				
+
 				return data.substr( offset, length );
 				return data.substr( offset, length );
-				
+
 			}
 			}
-			
+
 			function parseFloat32( data, offset ) {
 			function parseFloat32( data, offset ) {
-				
+
 				var b3 = parseUChar8( data, offset ),
 				var b3 = parseUChar8( data, offset ),
 					b2 = parseUChar8( data, offset + 1 ),
 					b2 = parseUChar8( data, offset + 1 ),
 					b1 = parseUChar8( data, offset + 2 ),
 					b1 = parseUChar8( data, offset + 2 ),
 					b0 = parseUChar8( data, offset + 3 ),
 					b0 = parseUChar8( data, offset + 3 ),
-				
+
 					sign = 1 - ( 2 * ( b0 >> 7 ) ),
 					sign = 1 - ( 2 * ( b0 >> 7 ) ),
 					exponent = ((( b0 << 1 ) & 0xff) | ( b1 >> 7 )) - 127,
 					exponent = ((( b0 << 1 ) & 0xff) | ( b1 >> 7 )) - 127,
 					mantissa = (( b1 & 0x7f ) << 16) | (b2 << 8) | b3;
 					mantissa = (( b1 & 0x7f ) << 16) | (b2 << 8) | b3;
-					
+
 					if (mantissa == 0 && exponent == -127)
 					if (mantissa == 0 && exponent == -127)
 						return 0.0;
 						return 0.0;
-					
+
 					return sign * ( 1 + mantissa * Math.pow( 2, -23 ) ) * Math.pow( 2, exponent );
 					return sign * ( 1 + mantissa * Math.pow( 2, -23 ) ) * Math.pow( 2, exponent );
 
 
 			}
 			}
-			
+
 			function parseUInt32( data, offset ) {
 			function parseUInt32( data, offset ) {
-				
+
 				var b0 = parseUChar8( data, offset ),
 				var b0 = parseUChar8( data, offset ),
 					b1 = parseUChar8( data, offset + 1 ),
 					b1 = parseUChar8( data, offset + 1 ),
 					b2 = parseUChar8( data, offset + 2 ),
 					b2 = parseUChar8( data, offset + 2 ),
 					b3 = parseUChar8( data, offset + 3 );
 					b3 = parseUChar8( data, offset + 3 );
-				
+
 				return (b3 << 24) + (b2 << 16) + (b1 << 8) + b0;
 				return (b3 << 24) + (b2 << 16) + (b1 << 8) + b0;
 			}
 			}
-			
+
 			function parseUInt16( data, offset ) {
 			function parseUInt16( data, offset ) {
-				
+
 				var b0 = parseUChar8( data, offset ),
 				var b0 = parseUChar8( data, offset ),
 					b1 = parseUChar8( data, offset + 1 );
 					b1 = parseUChar8( data, offset + 1 );
-				
+
 				return (b1 << 8) + b0;
 				return (b1 << 8) + b0;
-				
+
 			}
 			}
-			
+
 			function parseSChar8( data, offset ) {
 			function parseSChar8( data, offset ) {
-				
+
 				var b = parseUChar8( data, offset );
 				var b = parseUChar8( data, offset );
 				return b > 127 ? b - 256 : b;
 				return b > 127 ? b - 256 : b;
-				
+
 			}
 			}
-			
+
 			function parseUChar8( data, offset ) {
 			function parseUChar8( data, offset ) {
-				
+
 				return data.charCodeAt( offset ) & 0xff;
 				return data.charCodeAt( offset ) & 0xff;
 			}
 			}
-			
+
 			function init_vertices( start ) {
 			function init_vertices( start ) {
-				
+
 				var i, x, y, z, 
 				var i, x, y, z, 
 					stride = md.vertex_coordinate_bytes * 3;
 					stride = md.vertex_coordinate_bytes * 3;
-				
+
 				for( i = 0; i < md.nvertices; ++i ) {
 				for( i = 0; i < md.nvertices; ++i ) {
-					
+
 					x = parseFloat32( data, start + i*stride );
 					x = parseFloat32( data, start + i*stride );
 					y = parseFloat32( data, start + i*stride + md.vertex_coordinate_bytes );
 					y = parseFloat32( data, start + i*stride + md.vertex_coordinate_bytes );
 					z = parseFloat32( data, start + i*stride + md.vertex_coordinate_bytes*2 );
 					z = parseFloat32( data, start + i*stride + md.vertex_coordinate_bytes*2 );
-					
+
 					THREE.Loader.prototype.v( scope, x, y, z );
 					THREE.Loader.prototype.v( scope, x, y, z );
-					
+
 				}
 				}
-				
+
 				return md.nvertices * stride;
 				return md.nvertices * stride;
-				
+
 			}
 			}
-			
+
 			function init_normals( start ) {
 			function init_normals( start ) {
-				
+
 				var i, x, y, z, 
 				var i, x, y, z, 
 					stride = md.normal_coordinate_bytes * 3;
 					stride = md.normal_coordinate_bytes * 3;
-				
+
 				for( i = 0; i < md.nnormals; ++i ) {
 				for( i = 0; i < md.nnormals; ++i ) {
-					
+
 					x = parseSChar8( data, start + i*stride );
 					x = parseSChar8( data, start + i*stride );
 					y = parseSChar8( data, start + i*stride + md.normal_coordinate_bytes );
 					y = parseSChar8( data, start + i*stride + md.normal_coordinate_bytes );
 					z = parseSChar8( data, start + i*stride + md.normal_coordinate_bytes*2 );
 					z = parseSChar8( data, start + i*stride + md.normal_coordinate_bytes*2 );
-					
+
 					normals.push( x/127, y/127, z/127 );
 					normals.push( x/127, y/127, z/127 );
-					
+
 				}
 				}
-				
+
 				return md.nnormals * stride;
 				return md.nnormals * stride;
-				
+
 			}
 			}
 
 
 			function init_uvs( start ) {
 			function init_uvs( start ) {
-				
+
 				var i, u, v, 
 				var i, u, v, 
 					stride = md.uv_coordinate_bytes * 2;
 					stride = md.uv_coordinate_bytes * 2;
-				
+
 				for( i = 0; i < md.nuvs; ++i ) {
 				for( i = 0; i < md.nuvs; ++i ) {
-					
+
 					u = parseFloat32( data, start + i*stride );
 					u = parseFloat32( data, start + i*stride );
 					v = parseFloat32( data, start + i*stride + md.uv_coordinate_bytes );
 					v = parseFloat32( data, start + i*stride + md.uv_coordinate_bytes );
-					
+
 					uvs.push( u, v );
 					uvs.push( u, v );
-					
+
 				}
 				}
-				
+
 				return md.nuvs * stride;
 				return md.nuvs * stride;
-				
+
 			}
 			}
-			
+
 			function add_tri( start, i, stride ) {
 			function add_tri( start, i, stride ) {
-				
+
 				var a, b, c, m;
 				var a, b, c, m;
-				
+
 				a = parseUInt32( data, start + i*stride );
 				a = parseUInt32( data, start + i*stride );
 				b = parseUInt32( data, start + i*stride + md.vertex_index_bytes );
 				b = parseUInt32( data, start + i*stride + md.vertex_index_bytes );
 				c = parseUInt32( data, start + i*stride + md.vertex_index_bytes*2 );
 				c = parseUInt32( data, start + i*stride + md.vertex_index_bytes*2 );
-				
+
 				m = parseUInt16( data, start + i*stride + md.vertex_index_bytes*3 );
 				m = parseUInt16( data, start + i*stride + md.vertex_index_bytes*3 );
-				
+
 				THREE.Loader.prototype.f3( scope, a, b, c, m );
 				THREE.Loader.prototype.f3( scope, a, b, c, m );
-				
+
 			}
 			}
-			
+
 			function add_tri_n( start, i, stride ) {
 			function add_tri_n( start, i, stride ) {
-				
+
 				var a, b, c, m, na, nb, nc;
 				var a, b, c, m, na, nb, nc;
-				
+
 				a  = parseUInt32( data, start + i*stride );
 				a  = parseUInt32( data, start + i*stride );
 				b  = parseUInt32( data, start + i*stride + md.vertex_index_bytes );
 				b  = parseUInt32( data, start + i*stride + md.vertex_index_bytes );
 				c  = parseUInt32( data, start + i*stride + md.vertex_index_bytes*2 );
 				c  = parseUInt32( data, start + i*stride + md.vertex_index_bytes*2 );
-				
+
 				m  = parseUInt16( data, start + i*stride + md.vertex_index_bytes*3 );
 				m  = parseUInt16( data, start + i*stride + md.vertex_index_bytes*3 );
-				
+
 				na = parseUInt32( data, start + i*stride + md.vertex_index_bytes*3 + md.material_index_bytes );
 				na = parseUInt32( data, start + i*stride + md.vertex_index_bytes*3 + md.material_index_bytes );
 				nb = parseUInt32( data, start + i*stride + md.vertex_index_bytes*3 + md.material_index_bytes + md.normal_index_bytes );
 				nb = parseUInt32( data, start + i*stride + md.vertex_index_bytes*3 + md.material_index_bytes + md.normal_index_bytes );
 				nc = parseUInt32( data, start + i*stride + md.vertex_index_bytes*3 + md.material_index_bytes + md.normal_index_bytes*2 );
 				nc = parseUInt32( data, start + i*stride + md.vertex_index_bytes*3 + md.material_index_bytes + md.normal_index_bytes*2 );
-				
+
 				THREE.Loader.prototype.f3n( scope, normals, a, b, c, m, na, nb, nc );
 				THREE.Loader.prototype.f3n( scope, normals, a, b, c, m, na, nb, nc );
-			
+
 			}
 			}
-			
+
 			function add_quad( start, i, stride ) {
 			function add_quad( start, i, stride ) {
-				
+
 				var a, b, c, d, m;
 				var a, b, c, d, m;
-				
+
 				a = parseUInt32( data, start + i*stride );
 				a = parseUInt32( data, start + i*stride );
 				b = parseUInt32( data, start + i*stride + md.vertex_index_bytes );
 				b = parseUInt32( data, start + i*stride + md.vertex_index_bytes );
 				c = parseUInt32( data, start + i*stride + md.vertex_index_bytes*2 );
 				c = parseUInt32( data, start + i*stride + md.vertex_index_bytes*2 );
 				d = parseUInt32( data, start + i*stride + md.vertex_index_bytes*3 );
 				d = parseUInt32( data, start + i*stride + md.vertex_index_bytes*3 );
-				
+
 				m = parseUInt16( data, start + i*stride + md.vertex_index_bytes*4 );
 				m = parseUInt16( data, start + i*stride + md.vertex_index_bytes*4 );
-				
+
 				THREE.Loader.prototype.f4( scope, a, b, c, d, m );
 				THREE.Loader.prototype.f4( scope, a, b, c, d, m );
-				
+
 			}
 			}
-			
+
 			function add_quad_n( start, i, stride ) {
 			function add_quad_n( start, i, stride ) {
-				
+
 				var a, b, c, d, m, na, nb, nc, nd;
 				var a, b, c, d, m, na, nb, nc, nd;
-				
+
 				a  = parseUInt32( data, start + i*stride );
 				a  = parseUInt32( data, start + i*stride );
 				b  = parseUInt32( data, start + i*stride + md.vertex_index_bytes );
 				b  = parseUInt32( data, start + i*stride + md.vertex_index_bytes );
 				c  = parseUInt32( data, start + i*stride + md.vertex_index_bytes*2 );
 				c  = parseUInt32( data, start + i*stride + md.vertex_index_bytes*2 );
 				d  = parseUInt32( data, start + i*stride + md.vertex_index_bytes*3 );
 				d  = parseUInt32( data, start + i*stride + md.vertex_index_bytes*3 );
-				
+
 				m  = parseUInt16( data, start + i*stride + md.vertex_index_bytes*4 );
 				m  = parseUInt16( data, start + i*stride + md.vertex_index_bytes*4 );
-				
+
 				na = parseUInt32( data, start + i*stride + md.vertex_index_bytes*4 + md.material_index_bytes );
 				na = parseUInt32( data, start + i*stride + md.vertex_index_bytes*4 + md.material_index_bytes );
 				nb = parseUInt32( data, start + i*stride + md.vertex_index_bytes*4 + md.material_index_bytes + md.normal_index_bytes );
 				nb = parseUInt32( data, start + i*stride + md.vertex_index_bytes*4 + md.material_index_bytes + md.normal_index_bytes );
 				nc = parseUInt32( data, start + i*stride + md.vertex_index_bytes*4 + md.material_index_bytes + md.normal_index_bytes*2 );
 				nc = parseUInt32( data, start + i*stride + md.vertex_index_bytes*4 + md.material_index_bytes + md.normal_index_bytes*2 );
 				nd = parseUInt32( data, start + i*stride + md.vertex_index_bytes*4 + md.material_index_bytes + md.normal_index_bytes*3 );
 				nd = parseUInt32( data, start + i*stride + md.vertex_index_bytes*4 + md.material_index_bytes + md.normal_index_bytes*3 );
-				
+
 				THREE.Loader.prototype.f4n( scope, normals, a, b, c, d, m, na, nb, nc, nd );
 				THREE.Loader.prototype.f4n( scope, normals, a, b, c, d, m, na, nb, nc, nd );
-			
+
 			}
 			}
-			
+
 			function add_uv3( start, i, stride, offset ) {
 			function add_uv3( start, i, stride, offset ) {
-				
+
 				var uva, uvb, uvc, u1, u2, u3, v1, v2, v3;
 				var uva, uvb, uvc, u1, u2, u3, v1, v2, v3;
-				
+
 				uva = parseUInt32( data, start + i*stride + offset );
 				uva = parseUInt32( data, start + i*stride + offset );
 				uvb = parseUInt32( data, start + i*stride + offset + md.uv_index_bytes );
 				uvb = parseUInt32( data, start + i*stride + offset + md.uv_index_bytes );
 				uvc = parseUInt32( data, start + i*stride + offset + md.uv_index_bytes * 2 );
 				uvc = parseUInt32( data, start + i*stride + offset + md.uv_index_bytes * 2 );
-				
+
 				u1 = uvs[ uva*2 ];
 				u1 = uvs[ uva*2 ];
 				v1 = uvs[ uva*2 + 1];
 				v1 = uvs[ uva*2 + 1];
-				
+
 				u2 = uvs[ uvb*2 ];
 				u2 = uvs[ uvb*2 ];
 				v2 = uvs[ uvb*2 + 1];
 				v2 = uvs[ uvb*2 + 1];
-				
+
 				u3 = uvs[ uvc*2 ];
 				u3 = uvs[ uvc*2 ];
 				v3 = uvs[ uvc*2 + 1];
 				v3 = uvs[ uvc*2 + 1];
-				
-				THREE.Loader.prototype.uv( scope, u1, v1, u2, v2, u3, v3 );				
-				
+
+				THREE.Loader.prototype.uv( scope, u1, v1, u2, v2, u3, v3 );
+
 			}
 			}
-			
+
 			function add_uv4( start, i, stride, offset ) {
 			function add_uv4( start, i, stride, offset ) {
-				
+
 				var uva, uvb, uvc, uvd, u1, u2, u3, u4, v1, v2, v3, v4;
 				var uva, uvb, uvc, uvd, u1, u2, u3, u4, v1, v2, v3, v4;
-				
+
 				uva = parseUInt32( data, start + i*stride + offset );
 				uva = parseUInt32( data, start + i*stride + offset );
 				uvb = parseUInt32( data, start + i*stride + offset + md.uv_index_bytes );
 				uvb = parseUInt32( data, start + i*stride + offset + md.uv_index_bytes );
 				uvc = parseUInt32( data, start + i*stride + offset + md.uv_index_bytes * 2 );
 				uvc = parseUInt32( data, start + i*stride + offset + md.uv_index_bytes * 2 );
 				uvd = parseUInt32( data, start + i*stride + offset + md.uv_index_bytes * 3 );
 				uvd = parseUInt32( data, start + i*stride + offset + md.uv_index_bytes * 3 );
-				
+
 				u1 = uvs[ uva*2 ];
 				u1 = uvs[ uva*2 ];
 				v1 = uvs[ uva*2 + 1];
 				v1 = uvs[ uva*2 + 1];
-				
+
 				u2 = uvs[ uvb*2 ];
 				u2 = uvs[ uvb*2 ];
 				v2 = uvs[ uvb*2 + 1];
 				v2 = uvs[ uvb*2 + 1];
-				
+
 				u3 = uvs[ uvc*2 ];
 				u3 = uvs[ uvc*2 ];
 				v3 = uvs[ uvc*2 + 1];
 				v3 = uvs[ uvc*2 + 1];
 
 
 				u4 = uvs[ uvd*2 ];
 				u4 = uvs[ uvd*2 ];
 				v4 = uvs[ uvd*2 + 1];
 				v4 = uvs[ uvd*2 + 1];
-				
-				THREE.Loader.prototype.uv( scope, u1, v1, u2, v2, u3, v3, u4, v4 );				
-				
+
+				THREE.Loader.prototype.uv( scope, u1, v1, u2, v2, u3, v3, u4, v4 );
+
 			}
 			}
-			
+
 			function init_triangles_flat( start ) {
 			function init_triangles_flat( start ) {
-				
+
 				var i, stride = md.vertex_index_bytes * 3 + md.material_index_bytes;
 				var i, stride = md.vertex_index_bytes * 3 + md.material_index_bytes;
-				
+
 				for( i = 0; i < md.ntri_flat; ++i ) {
 				for( i = 0; i < md.ntri_flat; ++i ) {
-					
+
 					add_tri( start, i, stride );
 					add_tri( start, i, stride );
-					
+
 				}
 				}
-				
+
 				return md.ntri_flat * stride;
 				return md.ntri_flat * stride;
-				
+
 			}
 			}
 
 
 			function init_triangles_flat_uv( start ) {
 			function init_triangles_flat_uv( start ) {
-				
+
 				var i, offset = md.vertex_index_bytes * 3 + md.material_index_bytes,
 				var i, offset = md.vertex_index_bytes * 3 + md.material_index_bytes,
 					stride = offset + md.uv_index_bytes * 3;
 					stride = offset + md.uv_index_bytes * 3;
-				
+
 				for( i = 0; i < md.ntri_flat_uv; ++i ) {
 				for( i = 0; i < md.ntri_flat_uv; ++i ) {
-					
+
 					add_tri( start, i, stride );
 					add_tri( start, i, stride );
 					add_uv3( start, i, stride, md.vertex_index_bytes*3 + md.material_index_bytes );
 					add_uv3( start, i, stride, md.vertex_index_bytes*3 + md.material_index_bytes );
-					
+
 				}
 				}
-				
+
 				return md.ntri_flat_uv * stride;
 				return md.ntri_flat_uv * stride;
-				
+
 			}
 			}
-			
+
 			function init_triangles_smooth( start ) {
 			function init_triangles_smooth( start ) {
-			
+
 				var i, stride = md.vertex_index_bytes * 3 + md.material_index_bytes + md.normal_index_bytes * 3;
 				var i, stride = md.vertex_index_bytes * 3 + md.material_index_bytes + md.normal_index_bytes * 3;
-				
+
 				for( i = 0; i < md.ntri_smooth; ++i ) {
 				for( i = 0; i < md.ntri_smooth; ++i ) {
-					
+
 					add_tri_n( start, i, stride );
 					add_tri_n( start, i, stride );
-					
+
 				}
 				}
-				
+
 				return md.ntri_smooth * stride;
 				return md.ntri_smooth * stride;
-				
+
 			}
 			}
 
 
 			function init_triangles_smooth_uv( start ) {
 			function init_triangles_smooth_uv( start ) {
-			
+
 				var i, offset = md.vertex_index_bytes * 3 + md.material_index_bytes + md.normal_index_bytes * 3,
 				var i, offset = md.vertex_index_bytes * 3 + md.material_index_bytes + md.normal_index_bytes * 3,
 					stride = offset + md.uv_index_bytes * 3;
 					stride = offset + md.uv_index_bytes * 3;
-				
+
 				for( i = 0; i < md.ntri_smooth_uv; ++i ) {
 				for( i = 0; i < md.ntri_smooth_uv; ++i ) {
-					
+
 					add_tri_n( start, i, stride );
 					add_tri_n( start, i, stride );
 					add_uv3( start, i, stride, offset );
 					add_uv3( start, i, stride, offset );
-					
+
 				}
 				}
-				
+
 				return md.ntri_smooth * stride;
 				return md.ntri_smooth * stride;
-				
+
 			}
 			}
 
 
 			function init_quads_flat( start ) {
 			function init_quads_flat( start ) {
-				
+
 				var i, stride = md.vertex_index_bytes * 4 + md.material_index_bytes;
 				var i, stride = md.vertex_index_bytes * 4 + md.material_index_bytes;
-				
+
 				for( i = 0; i < md.nquad_flat; ++i ) {
 				for( i = 0; i < md.nquad_flat; ++i ) {
-					
+
 					add_quad( start, i, stride );
 					add_quad( start, i, stride );
-					
+
 				}
 				}
-				
+
 				return md.nquad_flat * stride;
 				return md.nquad_flat * stride;
-				
+
 			}
 			}
 
 
 			function init_quads_flat_uv( start ) {
 			function init_quads_flat_uv( start ) {
-				
+
 				var i, offset = md.vertex_index_bytes * 4 + md.material_index_bytes,
 				var i, offset = md.vertex_index_bytes * 4 + md.material_index_bytes,
 					stride = offset + md.uv_index_bytes * 4;
 					stride = offset + md.uv_index_bytes * 4;
-				
+
 				for( i = 0; i < md.nquad_flat_uv; ++i ) {
 				for( i = 0; i < md.nquad_flat_uv; ++i ) {
-					
+
 					add_quad( start, i, stride );
 					add_quad( start, i, stride );
 					add_uv4( start, i, offset );
 					add_uv4( start, i, offset );
-					
+
 				}
 				}
-				
+
 				return md.nquad_flat * stride;
 				return md.nquad_flat * stride;
-				
+
 			}
 			}
 
 
 			function init_quads_smooth( start ) {
 			function init_quads_smooth( start ) {
-				
+
 				var i, stride = md.vertex_index_bytes * 4 + md.material_index_bytes + md.normal_index_bytes * 4;
 				var i, stride = md.vertex_index_bytes * 4 + md.material_index_bytes + md.normal_index_bytes * 4;
-				
+
 				for( i = 0; i < md.nquad_smooth; ++i ) {
 				for( i = 0; i < md.nquad_smooth; ++i ) {
-					
+
 					add_quad_n( start, i, stride );
 					add_quad_n( start, i, stride );
 				}
 				}
-				
+
 				return md.nquad_smooth * stride;
 				return md.nquad_smooth * stride;
-				
+
 			}
 			}
 
 
 			function init_quads_smooth_uv( start ) {
 			function init_quads_smooth_uv( start ) {
-				
+
 				var i, offset = md.vertex_index_bytes * 4 + md.material_index_bytes + md.normal_index_bytes * 4, 
 				var i, offset = md.vertex_index_bytes * 4 + md.material_index_bytes + md.normal_index_bytes * 4, 
 					stride =  offset + md.uv_index_bytes * 4;
 					stride =  offset + md.uv_index_bytes * 4;
-				
+
 				for( i = 0; i < md.nquad_smooth_uv; ++i ) {
 				for( i = 0; i < md.nquad_smooth_uv; ++i ) {
-					
+
 					add_quad_n( start, i, stride );
 					add_quad_n( start, i, stride );
 					add_uv4( start, i, stride, offset );
 					add_uv4( start, i, stride, offset );
-					
+
 				}
 				}
-				
+
 				return md.nquad_smooth * stride;
 				return md.nquad_smooth * stride;
-				
+
 			}
 			}
-			
+
 		}
 		}
-		
+
 		Model.prototype = new THREE.Geometry();
 		Model.prototype = new THREE.Geometry();
 		Model.prototype.constructor = Model;
 		Model.prototype.constructor = Model;
-		
+
 		callback( new Model( urlbase ) );
 		callback( new Model( urlbase ) );
-		
+
 	},
 	},
-	
+
 	createModel: function ( data, callback, urlbase ) {
 	createModel: function ( data, callback, urlbase ) {
-		
+
 		var Model = function ( urlbase ) {
 		var Model = function ( urlbase ) {
-			
+
 			var scope = this;
 			var scope = this;
 
 
 			THREE.Geometry.call(this);
 			THREE.Geometry.call(this);
-			
+
 			THREE.Loader.prototype.init_materials( scope, data.materials, urlbase );
 			THREE.Loader.prototype.init_materials( scope, data.materials, urlbase );
-			
+
 			init_vertices();
 			init_vertices();
 			init_faces();
 			init_faces();
-			
+
 			this.computeCentroids();
 			this.computeCentroids();
 			this.computeNormals();
 			this.computeNormals();
-			
+
 			function init_vertices() {
 			function init_vertices() {
-			
+
 				var i, l, x, y, z;
 				var i, l, x, y, z;
-				
-				for( i = 0, l = data.vertices.length/3; i < l; i++ ) {
-					
-					x = data.vertices[ i*3     ];
-					y = data.vertices[ i*3 + 1 ];
-					z = data.vertices[ i*3 + 2 ];
-					
+
+				for( i = 0, l = data.vertices.length; i < l; i += 3 ) {
+
+					x = data.vertices[ i     ];
+					y = data.vertices[ i + 1 ];
+					z = data.vertices[ i + 2 ];
+
 					THREE.Loader.prototype.v( scope, x, y, z );
 					THREE.Loader.prototype.v( scope, x, y, z );
-					
+
 				}
 				}
-			
+
 			}
 			}
 
 
 			function init_faces() {
 			function init_faces() {
-			
-				function add_tri( src, i, stride ) {
+
+				function add_tri( src, i ) {
 
 
 					var a, b, c, m;
 					var a, b, c, m;
-					
-					a = src[ i*stride     ];
-					b = src[ i*stride + 1 ];
-					c = src[ i*stride + 2 ];
-					
-					m = src[ i*stride + 3 ];
-					
+
+					a = src[ i ];
+					b = src[ i + 1 ];
+					c = src[ i + 2 ];
+
+					m = src[ i + 3 ];
+
 					THREE.Loader.prototype.f3( scope, a, b, c, m );
 					THREE.Loader.prototype.f3( scope, a, b, c, m );
-					
+
 				}
 				}
 
 
-				function add_tri_n( src, i, stride ) {
-					
+				function add_tri_n( src, i ) {
+
 					var a, b, c, m, na, nb, nc;
 					var a, b, c, m, na, nb, nc;
-					
-					a  = src[ i*stride     ];
-					b  = src[ i*stride + 1 ];
-					c  = src[ i*stride + 2 ];
-					
-					m  = src[ i*stride + 3 ];
-					
-					na = src[ i*stride + 4 ];
-					nb = src[ i*stride + 5 ];
-					nc = src[ i*stride + 6 ];
-					
+
+					a  = src[ i ];
+					b  = src[ i + 1 ];
+					c  = src[ i + 2 ];
+
+					m  = src[ i + 3 ];
+
+					na = src[ i + 4 ];
+					nb = src[ i + 5 ];
+					nc = src[ i + 6 ];
+
 					THREE.Loader.prototype.f3n( scope, data.normals, a, b, c, m, na, nb, nc );
 					THREE.Loader.prototype.f3n( scope, data.normals, a, b, c, m, na, nb, nc );
-					
+
 				}
 				}
-				
-				function add_quad( src, i, stride ) {
-					
+
+				function add_quad( src, i ) {
+
 					var a, b, c, d, m;
 					var a, b, c, d, m;
-					
-					a = src[ i*stride     ];
-					b = src[ i*stride + 1 ];
-					c = src[ i*stride + 2 ];
-					d = src[ i*stride + 3 ];
-					
-					m = src[ i*stride + 4 ];
-					
+
+					a = src[ i ];
+					b = src[ i + 1 ];
+					c = src[ i + 2 ];
+					d = src[ i + 3 ];
+
+					m = src[ i + 4 ];
+
 					THREE.Loader.prototype.f4( scope, a, b, c, d, m );
 					THREE.Loader.prototype.f4( scope, a, b, c, d, m );
-					
+
 				}
 				}
 
 
-				function add_quad_n( src, i, stride ) {
-					
+				function add_quad_n( src, i ) {
+
 					var a, b, c, d, m, na, nb, nc, nd;
 					var a, b, c, d, m, na, nb, nc, nd;
-					
-					a  = src[ i*stride     ];
-					b  = src[ i*stride + 1 ];
-					c  = src[ i*stride + 2 ];
-					d  = src[ i*stride + 3 ];
-					
-					m  = src[ i*stride + 4 ];
-
-					na = src[ i*stride + 5 ];
-					nb = src[ i*stride + 6 ];
-					nc = src[ i*stride + 7 ];
-					nd = src[ i*stride + 8 ];
-					
+
+					a  = src[ i ];
+					b  = src[ i + 1 ];
+					c  = src[ i + 2 ];
+					d  = src[ i + 3 ];
+
+					m  = src[ i + 4 ];
+
+					na = src[ i + 5 ];
+					nb = src[ i + 6 ];
+					nc = src[ i + 7 ];
+					nd = src[ i + 8 ];
+
 					THREE.Loader.prototype.f4n( scope, data.normals, a, b, c, d, m, na, nb, nc, nd );
 					THREE.Loader.prototype.f4n( scope, data.normals, a, b, c, d, m, na, nb, nc, nd );
-					
+
 				}
 				}
-				
-				function add_uv3( src, i, stride, offset ) {
-					
+
+				function add_uv3( src, i ) {
+
 					var uva, uvb, uvc, u1, u2, u3, v1, v2, v3;
 					var uva, uvb, uvc, u1, u2, u3, v1, v2, v3;
 
 
-					uva = src[ i*stride + offset ];
-					uvb = src[ i*stride + offset + 1 ];
-					uvc = src[ i*stride + offset + 2 ];
-					
-					u1 = data.uvs[ uva*2 ];
-					v1 = data.uvs[ uva*2 + 1 ];
-					
-					u2 = data.uvs[ uvb*2 ];
-					v2 = data.uvs[ uvb*2 + 1 ];
-					
-					u3 = data.uvs[ uvc*2 ];
-					v3 = data.uvs[ uvc*2 + 1 ];
-					
+					uva = src[ i ];
+					uvb = src[ i + 1 ];
+					uvc = src[ i + 2 ];
+
+					u1 = data.uvs[ uva * 2 ];
+					v1 = data.uvs[ uva * 2 + 1 ];
+
+					u2 = data.uvs[ uvb * 2 ];
+					v2 = data.uvs[ uvb * 2 + 1 ];
+
+					u3 = data.uvs[ uvc * 2 ];
+					v3 = data.uvs[ uvc * 2 + 1 ];
+
 					THREE.Loader.prototype.uv( scope, u1, v1, u2, v2, u3, v3 );
 					THREE.Loader.prototype.uv( scope, u1, v1, u2, v2, u3, v3 );
-					
+
 				}
 				}
-				
-				function add_uv4( src, i, stride, offset ) {
-					
+
+				function add_uv4( src, i ) {
+
 					var uva, uvb, uvc, uvd, u1, u2, u3, u4, v1, v2, v3, v4;
 					var uva, uvb, uvc, uvd, u1, u2, u3, u4, v1, v2, v3, v4;
-					
-					uva = src[ i*stride + offset ];
-					uvb = src[ i*stride + offset + 1 ];
-					uvc = src[ i*stride + offset + 2 ];
-					uvd = src[ i*stride + offset + 3 ];
-					
-					u1 = data.uvs[ uva*2 ];
-					v1 = data.uvs[ uva*2 + 1 ];
-					
-					u2 = data.uvs[ uvb*2 ];
-					v2 = data.uvs[ uvb*2 + 1 ];
-					
-					u3 = data.uvs[ uvc*2 ];
-					v3 = data.uvs[ uvc*2 + 1 ];
-					
-					u4 = data.uvs[ uvd*2 ];
-					v4 = data.uvs[ uvd*2 + 1 ];
-					
+
+					uva = src[ i ];
+					uvb = src[ i + 1 ];
+					uvc = src[ i + 2 ];
+					uvd = src[ i + 3 ];
+
+					u1 = data.uvs[ uva * 2 ];
+					v1 = data.uvs[ uva * 2 + 1 ];
+
+					u2 = data.uvs[ uvb * 2 ];
+					v2 = data.uvs[ uvb * 2 + 1 ];
+
+					u3 = data.uvs[ uvc * 2 ];
+					v3 = data.uvs[ uvc * 2 + 1 ];
+
+					u4 = data.uvs[ uvd * 2 ];
+					v4 = data.uvs[ uvd * 2 + 1 ];
+
 					THREE.Loader.prototype.uv( scope, u1, v1, u2, v2, u3, v3, u4, v4 );
 					THREE.Loader.prototype.uv( scope, u1, v1, u2, v2, u3, v3, u4, v4 );
-					
+
 				}
 				}
-				
+
 				var i, l;
 				var i, l;
-				
-				for( i = 0, l = data.triangles.length/4; i < l; i++ ) {
-				
-					add_tri( data.triangles, i, 4 );
-					
+
+				for ( i = 0, l = data.triangles.length; i < l; i += 4 ) {
+
+					add_tri( data.triangles, i );
+
 				}
 				}
 
 
-				for( i = 0, l = data.triangles_uv.length/7; i < l; i++ ) {
-					
-					add_tri( data.triangles_uv, i, 7 );	
-					add_uv3( data.triangles_uv, i, 7, 4 );
-				
+				for ( i = 0, l = data.triangles_uv.length; i < l; i+= 7 ) {
+
+					add_tri( data.triangles_uv, i );
+					add_uv3( data.triangles_uv, i + 4 );
+
 				}
 				}
 
 
-				for( i = 0, l = data.triangles_n.length/7; i < l; i++ ) {
-					
-					add_tri_n( data.triangles_n, i, 7 );
-					
+				for ( i = 0, l = data.triangles_n.length; i < l; i += 7 ) {
+
+					add_tri_n( data.triangles_n, i );
+
 				}
 				}
 
 
-				for( i = 0, l = data.triangles_n_uv.length/10; i < l; i++ ) {
-					
-					add_tri_n( data.triangles_n_uv, i, 10 );
-					add_uv3( data.triangles_n_uv, i, 10, 7 );
-				
+				for ( i = 0, l = data.triangles_n_uv.length; i < l; i += 10 ) {
+
+					add_tri_n( data.triangles_n_uv, i );
+					add_uv3( data.triangles_n_uv, i + 7 );
+
 				}
 				}
 
 
-				
-				for( i = 0, l = data.quads.length/5; i < l; i++ ) {
-					
-					add_quad( data.quads, i, 5 );
-					
+
+				for ( i = 0, l = data.quads.length; i < l; i += 5 ) {
+
+					add_quad( data.quads, i );
+
 				}
 				}
 
 
-				for( i = 0, l = data.quads_uv.length/9; i < l; i++ ) {
-					
-					add_quad( data.quads_uv, i, 9 );
-					add_uv4( data.quads_uv, i, 9, 5 );
-				
+				for ( i = 0, l = data.quads_uv.length; i < l; i += 9 ) {
+
+					add_quad( data.quads_uv, i );
+					add_uv4( data.quads_uv, i + 5 );
+
 				}
 				}
 
 
-				for( i = 0, l = data.quads_n.length/9; i < l; i++ ) {
-					
-					add_quad_n( data.quads_n, i, 9 );
-					
+				for ( i = 0, l = data.quads_n.length; i < l; i += 9 ) {
+
+					add_quad_n( data.quads_n, i );
+
 				}
 				}
 
 
-				for( i = 0, l = data.quads_n_uv.length/13; i < l; i++ ) {
-					
-					add_quad_n( data.quads_n_uv, i, 13 );
-					add_uv4( data.quads_n_uv, i, 13, 9 );
-				
+				for ( i = 0, l = data.quads_n_uv.length; i < l; i += 13 ) {
+
+					add_quad_n( data.quads_n_uv, i );
+					add_uv4( data.quads_n_uv, i + 9 );
+
 				}
 				}
-				
-			}			
-			
+
+			}
+
 		}
 		}
 
 
 		Model.prototype = new THREE.Geometry();
 		Model.prototype = new THREE.Geometry();
 		Model.prototype.constructor = Model;
 		Model.prototype.constructor = Model;
-		
+
 		callback( new Model( urlbase ) );
 		callback( new Model( urlbase ) );
 
 
 	},
 	},
 
 
 	v: function( scope, x, y, z ) {
 	v: function( scope, x, y, z ) {
-	
+
 		scope.vertices.push( new THREE.Vertex( new THREE.Vector3( x, y, z ) ) );
 		scope.vertices.push( new THREE.Vertex( new THREE.Vector3( x, y, z ) ) );
-	
+
 	},
 	},
-	
+
 	f3: function( scope, a, b, c, mi ) {
 	f3: function( scope, a, b, c, mi ) {
-		
+
 		var material = scope.materials[ mi ];
 		var material = scope.materials[ mi ];
 		scope.faces.push( new THREE.Face3( a, b, c, null, material ) );
 		scope.faces.push( new THREE.Face3( a, b, c, null, material ) );
-		
+
 	},
 	},
-	
+
 	f4: function( scope, a, b, c, d, mi ) {
 	f4: function( scope, a, b, c, d, mi ) {
-		
+
 		var material = scope.materials[ mi ];
 		var material = scope.materials[ mi ];
 		scope.faces.push( new THREE.Face4( a, b, c, d, null, material ) );
 		scope.faces.push( new THREE.Face4( a, b, c, d, null, material ) );
-		
+
 	},
 	},
-	
+
 	f3n: function( scope, normals, a, b, c, mi, na, nb, nc ) {
 	f3n: function( scope, normals, a, b, c, mi, na, nb, nc ) {
-		
+
 		var material = scope.materials[ mi ],
 		var material = scope.materials[ mi ],
 			nax = normals[ na*3     ],
 			nax = normals[ na*3     ],
 			nay = normals[ na*3 + 1 ],
 			nay = normals[ na*3 + 1 ],
 			naz = normals[ na*3 + 2 ],
 			naz = normals[ na*3 + 2 ],
-		
+
 			nbx = normals[ nb*3     ],
 			nbx = normals[ nb*3     ],
 			nby = normals[ nb*3 + 1 ],
 			nby = normals[ nb*3 + 1 ],
 			nbz = normals[ nb*3 + 2 ],
 			nbz = normals[ nb*3 + 2 ],
-		
+
 			ncx = normals[ nc*3     ],
 			ncx = normals[ nc*3     ],
 			ncy = normals[ nc*3 + 1 ],
 			ncy = normals[ nc*3 + 1 ],
 			ncz = normals[ nc*3 + 2 ];
 			ncz = normals[ nc*3 + 2 ];
-		
+
 		scope.faces.push( new THREE.Face3( a, b, c, 
 		scope.faces.push( new THREE.Face3( a, b, c, 
 						  [new THREE.Vector3( nax, nay, naz ), 
 						  [new THREE.Vector3( nax, nay, naz ), 
 						   new THREE.Vector3( nbx, nby, nbz ), 
 						   new THREE.Vector3( nbx, nby, nbz ), 
 						   new THREE.Vector3( ncx, ncy, ncz )], 
 						   new THREE.Vector3( ncx, ncy, ncz )], 
 						  material ) );
 						  material ) );
-		
+
 	},
 	},
-	
+
 	f4n: function( scope, normals, a, b, c, d, mi, na, nb, nc, nd ) {
 	f4n: function( scope, normals, a, b, c, d, mi, na, nb, nc, nd ) {
-		
+
 		var material = scope.materials[ mi ],
 		var material = scope.materials[ mi ],
 			nax = normals[ na*3     ],
 			nax = normals[ na*3     ],
 			nay = normals[ na*3 + 1 ],
 			nay = normals[ na*3 + 1 ],
 			naz = normals[ na*3 + 2 ],
 			naz = normals[ na*3 + 2 ],
-		
+
 			nbx = normals[ nb*3     ],
 			nbx = normals[ nb*3     ],
 			nby = normals[ nb*3 + 1 ],
 			nby = normals[ nb*3 + 1 ],
 			nbz = normals[ nb*3 + 2 ],
 			nbz = normals[ nb*3 + 2 ],
-		
+
 			ncx = normals[ nc*3     ],
 			ncx = normals[ nc*3     ],
 			ncy = normals[ nc*3 + 1 ],
 			ncy = normals[ nc*3 + 1 ],
 			ncz = normals[ nc*3 + 2 ],
 			ncz = normals[ nc*3 + 2 ],
-		
+
 			ndx = normals[ nd*3     ],
 			ndx = normals[ nd*3     ],
 			ndy = normals[ nd*3 + 1 ],
 			ndy = normals[ nd*3 + 1 ],
 			ndz = normals[ nd*3 + 2 ];
 			ndz = normals[ nd*3 + 2 ];
-		
+
 		scope.faces.push( new THREE.Face4( a, b, c, d,
 		scope.faces.push( new THREE.Face4( a, b, c, d,
 						  [new THREE.Vector3( nax, nay, naz ), 
 						  [new THREE.Vector3( nax, nay, naz ), 
 						   new THREE.Vector3( nbx, nby, nbz ), 
 						   new THREE.Vector3( nbx, nby, nbz ), 
 						   new THREE.Vector3( ncx, ncy, ncz ), 
 						   new THREE.Vector3( ncx, ncy, ncz ), 
 						   new THREE.Vector3( ndx, ndy, ndz )], 
 						   new THREE.Vector3( ndx, ndy, ndz )], 
 						  material ) );
 						  material ) );
-		
+
 	},
 	},
-	
+
 	uv: function( scope, u1, v1, u2, v2, u3, v3, u4, v4 ) {
 	uv: function( scope, u1, v1, u2, v2, u3, v3, u4, v4 ) {
-		
+
 		var uv = [];
 		var uv = [];
 		uv.push( new THREE.UV( u1, v1 ) );
 		uv.push( new THREE.UV( u1, v1 ) );
 		uv.push( new THREE.UV( u2, v2 ) );
 		uv.push( new THREE.UV( u2, v2 ) );
 		uv.push( new THREE.UV( u3, v3 ) );
 		uv.push( new THREE.UV( u3, v3 ) );
 		if ( u4 && v4 ) uv.push( new THREE.UV( u4, v4 ) );
 		if ( u4 && v4 ) uv.push( new THREE.UV( u4, v4 ) );
 		scope.uvs.push( uv );
 		scope.uvs.push( uv );
-		
+
 	},
 	},
-	
+
 	init_materials: function( scope, materials, urlbase ) {
 	init_materials: function( scope, materials, urlbase ) {
-		
+
 		scope.materials = [];
 		scope.materials = [];
-		
-		for( var i = 0; i < materials.length; ++i ) {
-			
+
+		for ( var i = 0; i < materials.length; ++i ) {
+
 			scope.materials[i] = [ THREE.Loader.prototype.createMaterial( materials[i], urlbase ) ];
 			scope.materials[i] = [ THREE.Loader.prototype.createMaterial( materials[i], urlbase ) ];
-			
+
 		}
 		}
-		
+
 	},
 	},
-	
-	createMaterial: function( m, urlbase ) {
-	
+
+	createMaterial: function ( m, urlbase ) {
+
 		function is_pow2( n ) {
 		function is_pow2( n ) {
-			
+
 			var l = Math.log(n) / Math.LN2;
 			var l = Math.log(n) / Math.LN2;
 			return Math.floor(l) == l;
 			return Math.floor(l) == l;
-			
+
 		}
 		}
-		
+
 		function nearest_pow2( n ) {
 		function nearest_pow2( n ) {
-			
+
 			var l = Math.log(n) / Math.LN2;
 			var l = Math.log(n) / Math.LN2;
 			return Math.pow( 2, Math.round(l) );
 			return Math.pow( 2, Math.round(l) );
-			
+
 		}
 		}
 
 
 		var material, texture, image, color;
 		var material, texture, image, color;
-		
-		if( m.map_diffuse && urlbase ) {
-			
+
+		if ( m.map_diffuse && urlbase ) {
+
 			texture = document.createElement( 'canvas' );
 			texture = document.createElement( 'canvas' );
 			material = new THREE.MeshBitmapMaterial( texture );
 			material = new THREE.MeshBitmapMaterial( texture );
-			
+
 			image = new Image();
 			image = new Image();
 			image.onload = function () {
 			image.onload = function () {
-				
+
 				if ( !is_pow2( this.width ) || !is_pow2( this.height ) ) {
 				if ( !is_pow2( this.width ) || !is_pow2( this.height ) ) {
-				
+
 					var w = nearest_pow2( this.width ),
 					var w = nearest_pow2( this.width ),
 						h = nearest_pow2( this.height );
 						h = nearest_pow2( this.height );
-					
+
 					material.bitmap.width = w;
 					material.bitmap.width = w;
 					material.bitmap.height = h;
 					material.bitmap.height = h;
 					material.bitmap.getContext("2d").drawImage( this, 0, 0, w, h );
 					material.bitmap.getContext("2d").drawImage( this, 0, 0, w, h );
-					
+
 				} else {
 				} else {
-					
+
 					material.bitmap = this;
 					material.bitmap = this;
-					
+
 				}
 				}
-				
+
 				material.loaded = 1;
 				material.loaded = 1;
-				
+
 			};
 			};
-			
+
 			image.src = urlbase + "/" + m.map_diffuse;
 			image.src = urlbase + "/" + m.map_diffuse;
-			
-		} else if( m.col_diffuse ) {
-			
+
+		} else if ( m.col_diffuse ) {
+
 			color = (m.col_diffuse[0]*255 << 16) + (m.col_diffuse[1]*255 << 8) + m.col_diffuse[2]*255;
 			color = (m.col_diffuse[0]*255 << 16) + (m.col_diffuse[1]*255 << 8) + m.col_diffuse[2]*255;
 			material = new THREE.MeshColorFillMaterial( color, m.transparency );
 			material = new THREE.MeshColorFillMaterial( color, m.transparency );
-			
-		} else if( m.a_dbg_color ) {
-			
+
+		} else if ( m.a_dbg_color ) {
+
 			material = new THREE.MeshColorFillMaterial( m.a_dbg_color );
 			material = new THREE.MeshColorFillMaterial( m.a_dbg_color );
-			
+
 		} else {
 		} else {
-			
+
 			material = new THREE.MeshColorFillMaterial( 0xeeeeee );
 			material = new THREE.MeshColorFillMaterial( 0xeeeeee );
-			
+
 		}
 		}
 
 
 		return material;
 		return material;
-		
+
 	}
 	}
-	
-};
+
+};

Some files were not shown because too many files changed in this diff