浏览代码

Merge remote branch 'alteredq/master'

Mr.doob 14 年之前
父节点
当前提交
06cef27b81
共有 4 个文件被更改,包括 199 次插入306 次删除
  1. 0 0
      build/Three.js
  2. 0 0
      build/ThreeDebug.js
  3. 4 4
      examples/obj_convert_test.html
  4. 195 302
      src/io/Loader.js

文件差异内容过多而无法显示
+ 0 - 0
build/Three.js


文件差异内容过多而无法显示
+ 0 - 0
build/ThreeDebug.js


+ 4 - 4
examples/obj_convert_test.html

@@ -42,11 +42,10 @@
 		
 		<pre id="log"></pre>
 
-		<script type="text/javascript" src="../build/Three.js"></script> 
 		<!--
+		<script type="text/javascript" src="../build/Three.js"></script> 
 		-->
 
-		<!--
 		<script type="text/javascript" src="../src/Three.js"></script>
 		<script type="text/javascript" src="../src/core/Color.js"></script>
 		<script type="text/javascript" src="../src/core/Vector2.js"></script>
@@ -87,6 +86,7 @@
 		<script type="text/javascript" src="../src/renderers/renderables/RenderableFace4.js"></script>
 		<script type="text/javascript" src="../src/renderers/renderables/RenderableParticle.js"></script>
 		<script type="text/javascript" src="../src/renderers/renderables/RenderableLine.js"></script>
+		<!--
 		-->
 		
 
@@ -246,8 +246,8 @@
 				
 				//loader.loadAscii( "obj/male02/Male02_slim.js",     function( geometry ) { createScene( geometry,  90, 50, FLOOR, 105 ) }, "obj/male02" );
 				//loader.loadAscii( "obj/female02/Female02_slim.js", function( geometry ) { createScene( geometry, -80, 50, FLOOR, 0 ) },   "obj/female02" );
-                
-                loader.loadBinary( "obj/male02/Male02_bin.js",     function( geometry ) { createScene( geometry,  90, 50, FLOOR, 105 ) }, "obj/male02" );
+
+				loader.loadBinary( "obj/male02/Male02_bin.js",     function( geometry ) { createScene( geometry,  90, 50, FLOOR, 105 ) }, "obj/male02" );
 				loader.loadBinary( "obj/female02/Female02_bin.js", function( geometry ) { createScene( geometry, -80, 50, FLOOR, 0 ) },   "obj/female02" );
 
 			}

+ 195 - 302
src/io/Loader.js

@@ -86,7 +86,6 @@ THREE.Loader.prototype = {
 	// https://groups.google.com/group/o3d-discuss/browse_thread/thread/a8967bc9ce1e0978
 
 	loadAjaxBuffers: function( buffers, materials, callback, urlbase ) {
-	
 
 		var xhr = new XMLHttpRequest(),
 			url = urlbase + "/" + buffers;
@@ -129,7 +128,7 @@ THREE.Loader.prototype = {
 			
 			THREE.Geometry.call(this);
 			
-			init_materials();
+			THREE.Loader.prototype.init_materials( scope, materials, urlbase );
 			
 			md = parseMetaData( data, currentOffset );
 			currentOffset += md.header_bytes;
@@ -213,6 +212,20 @@ THREE.Loader.prototype = {
 				log( "nquad_smooth: " + metaData.nquad_smooth );
 				log( "nquad_flat_uv: " + metaData.nquad_flat_uv );
 				log( "nquad_smooth_uv: " + metaData.nquad_smooth_uv );
+				
+				var total = metaData.header_bytes
+						  + metaData.nvertices * metaData.vertex_coordinate_bytes * 3
+						  + metaData.nnormals * metaData.normal_coordinate_bytes * 3
+						  + metaData.nuvs * metaData.uv_coordinate_bytes * 2
+						  + metaData.ntri_flat * ( metaData.vertex_index_bytes*3 + metaData.material_index_bytes )
+						  + metaData.ntri_smooth * ( metaData.vertex_index_bytes*3 + metaData.material_index_bytes + metaData.normal_index_bytes*3 )
+						  + metaData.ntri_flat_uv * ( metaData.vertex_index_bytes*3 + metaData.material_index_bytes + metaData.uv_index_bytes*3 )
+						  + metaData.ntri_smooth_uv * ( metaData.vertex_index_bytes*3 + metaData.material_index_bytes + metaData.normal_index_bytes*3 + metaData.uv_index_bytes*3 )
+						  + metaData.nquad_flat * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes )
+						  + metaData.nquad_smooth * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes + metaData.normal_index_bytes*4 )
+						  + metaData.nquad_flat_uv * ( metaData.vertex_index_bytes*4 + metaData.material_index_bytes + 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 );
 				*/
 				
 				return metaData;
@@ -284,7 +297,8 @@ THREE.Loader.prototype = {
 					x = parseFloat32( data, start + i*stride );
 					y = parseFloat32( data, start + i*stride + md.vertex_coordinate_bytes );
 					z = parseFloat32( data, start + i*stride + md.vertex_coordinate_bytes*2 );
-					scope.vertices.push( new THREE.Vertex( new THREE.Vector3( x, y, z ) ) );
+					
+					THREE.Loader.prototype.v( scope, x, y, z );
 					
 				}
 				
@@ -331,7 +345,7 @@ THREE.Loader.prototype = {
 			
 			function add_tri( start, i, stride ) {
 				
-				var a, b, c, m, material;
+				var a, b, c, m;
 				
 				a = parseUInt32( data, start + i*stride );
 				b = parseUInt32( data, start + i*stride + md.vertex_index_bytes );
@@ -339,15 +353,13 @@ THREE.Loader.prototype = {
 				
 				m = parseUInt16( data, start + i*stride + md.vertex_index_bytes*3 );
 				
-				material = scope.materials[ m ];
-				scope.faces.push( new THREE.Face3( a, b, c, null, material ) );
+				THREE.Loader.prototype.f3( scope, a, b, c, m );
 				
 			}
 			
 			function add_tri_n( start, i, stride ) {
 				
-				var a, b, c, m, na, nb, nc, material,
-					nax, nay, naz, nbx, nby, nbz, ncx, ncy, ncz;
+				var a, b, c, m, na, nb, nc;
 				
 				a  = parseUInt32( data, start + i*stride );
 				b  = parseUInt32( data, start + i*stride + md.vertex_index_bytes );
@@ -359,31 +371,13 @@ THREE.Loader.prototype = {
 				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 );
 				
-				material = scope.materials[ m ];
-				
-				nax = normals[ na*3     ],
-				nay = normals[ na*3 + 1 ],
-				naz = normals[ na*3 + 2 ],
-			
-				nbx = normals[ nb*3     ],
-				nby = normals[ nb*3 + 1 ],
-				nbz = normals[ nb*3 + 2 ],
-			
-				ncx = normals[ nc*3     ],
-				ncy = normals[ nc*3 + 1 ],
-				ncz = normals[ nc*3 + 2 ];
+				THREE.Loader.prototype.f3n( scope, normals, a, b, c, m, na, nb, nc );
 			
-				scope.faces.push( new THREE.Face3( a, b, c, 
-							  [new THREE.Vector3( nax, nay, naz ), 
-							   new THREE.Vector3( nbx, nby, nbz ), 
-							   new THREE.Vector3( ncx, ncy, ncz )], 
-							  material ) );
-							  
 			}
 			
 			function add_quad( start, i, stride ) {
 				
-				var a, b, c, d, m, material;
+				var a, b, c, d, m;
 				
 				a = parseUInt32( data, start + i*stride );
 				b = parseUInt32( data, start + i*stride + md.vertex_index_bytes );
@@ -392,15 +386,13 @@ THREE.Loader.prototype = {
 				
 				m = parseUInt16( data, start + i*stride + md.vertex_index_bytes*4 );
 				
-				material = scope.materials[ m ];
-				scope.faces.push( new THREE.Face4( a, b, c, d, null, material ) );
+				THREE.Loader.prototype.f4( scope, a, b, c, d, m );
 				
 			}
 			
 			function add_quad_n( start, i, stride ) {
 				
-				var a, b, c, d, m, na, nb, nc, nd, material,
-					nax, nay, naz, nbx, nby, nbz, ncx, ncy, ncz, ndx, ndy, ndz;
+				var a, b, c, d, m, na, nb, nc, nd;
 				
 				a  = parseUInt32( data, start + i*stride );
 				b  = parseUInt32( data, start + i*stride + md.vertex_index_bytes );
@@ -414,40 +406,17 @@ THREE.Loader.prototype = {
 				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 );
 				
-				material = scope.materials[ m ];
-				
-				nax = normals[ na*3     ],
-				nay = normals[ na*3 + 1 ],
-				naz = normals[ na*3 + 2 ],
-			
-				nbx = normals[ nb*3     ],
-				nby = normals[ nb*3 + 1 ],
-				nbz = normals[ nb*3 + 2 ],
+				THREE.Loader.prototype.f4n( scope, normals, a, b, c, d, m, na, nb, nc, nd );
 			
-				ncx = normals[ nc*3     ],
-				ncy = normals[ nc*3 + 1 ],
-				ncz = normals[ nc*3 + 2 ];
-
-				ndx = normals[ nd*3     ],
-				ndy = normals[ nd*3 + 1 ],
-				ndz = normals[ nd*3 + 2 ];
-
-				scope.faces.push( new THREE.Face4( a, b, c, d,
-							  [new THREE.Vector3( nax, nay, naz ), 
-							   new THREE.Vector3( nbx, nby, nbz ), 
-							   new THREE.Vector3( ncx, ncy, ncz ),
-							   new THREE.Vector3( ndx, ndy, ndz )], 
-							  material ) );
-
 			}
 			
 			function add_uv3( start, i, stride, offset ) {
 				
-				var uva, uvb, uvc, u1, u2, u3, v1, v2, v3, uv;
+				var uva, uvb, uvc, u1, u2, u3, v1, v2, v3;
 				
 				uva = parseUInt32( data, start + i*stride + offset );
 				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 ];
 				v1 = uvs[ uva*2 + 1];
@@ -458,23 +427,18 @@ THREE.Loader.prototype = {
 				u3 = uvs[ uvc*2 ];
 				v3 = uvs[ uvc*2 + 1];
 				
-				uv = [];
-				uv.push( new THREE.UV( u1, v1 ) );
-				uv.push( new THREE.UV( u2, v2 ) );
-				uv.push( new THREE.UV( u3, v3 ) );
-				
-				scope.uvs.push( uv );
+				THREE.Loader.prototype.uv( scope, u1, v1, u2, v2, u3, v3 );				
 				
 			}
 			
 			function add_uv4( start, i, stride, offset ) {
 				
-				var uva, uvb, uvc, uvd, u1, u2, u3, u4, v1, v2, v3, v4, uv;
+				var uva, uvb, uvc, uvd, u1, u2, u3, u4, v1, v2, v3, v4;
 				
 				uva = parseUInt32( data, start + i*stride + offset );
 				uvb = parseUInt32( data, start + i*stride + offset + md.uv_index_bytes );
-				uvc = parseUInt32( data, start + i*stride + offset + md.uv_index_bytes * 2 );					
-				uvd = parseUInt32( data, start + i*stride + offset + md.uv_index_bytes * 3 );					
+				uvc = parseUInt32( data, start + i*stride + offset + md.uv_index_bytes * 2 );
+				uvd = parseUInt32( data, start + i*stride + offset + md.uv_index_bytes * 3 );
 				
 				u1 = uvs[ uva*2 ];
 				v1 = uvs[ uva*2 + 1];
@@ -488,13 +452,7 @@ THREE.Loader.prototype = {
 				u4 = uvs[ uvd*2 ];
 				v4 = uvs[ uvd*2 + 1];
 				
-				uv = [];
-				uv.push( new THREE.UV( u1, v1 ) );
-				uv.push( new THREE.UV( u2, v2 ) );
-				uv.push( new THREE.UV( u3, v3 ) );
-				uv.push( new THREE.UV( u4, v4 ) );
-				
-				scope.uvs.push( uv );
+				THREE.Loader.prototype.uv( scope, u1, v1, u2, v2, u3, v3, u4, v4 );				
 				
 			}
 			
@@ -502,7 +460,7 @@ THREE.Loader.prototype = {
 				
 				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 );
 					
@@ -594,7 +552,7 @@ THREE.Loader.prototype = {
 				
 				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;
@@ -609,90 +567,14 @@ THREE.Loader.prototype = {
 				for( i = 0; i < md.nquad_smooth_uv; ++i ) {
 					
 					add_quad_n( start, i, stride );
-					add_uv4( start, i, stride, offset );					
+					add_uv4( start, i, stride, offset );
+					
 				}
 				
 				return md.nquad_smooth * stride;
 				
 			}
 			
-			function init_materials() {
-				
-				scope.materials = [];
-				for( var i = 0; i < materials.length; ++i ) {
-					scope.materials[i] = [ create_material( materials[i], urlbase ) ];
-				}
-				
-				//log( "materials: " + scope.materials.length );
-				
-			}
-			
-			function is_pow2( n ) {
-				
-				var l = Math.log(n) / Math.LN2;
-				return Math.floor(l) == l;
-				
-			}
-			
-			function nearest_pow2(n) {
-				
-				var l = Math.log(n) / Math.LN2;
-				return Math.pow( 2, Math.round(l) );
-				
-			}
-			
-			function create_material( m ) {
-				
-				var material, texture, image, color;
-				
-				if( m.map_diffuse && urlbase ) {
-					
-					texture = document.createElement( 'canvas' );
-					material = new THREE.MeshBitmapMaterial( texture );
-					
-					image = new Image();
-					image.onload = function () {
-						
-						if ( !is_pow2( this.width ) || !is_pow2( this.height ) ) {
-						
-							var w = nearest_pow2( this.width ),
-								h = nearest_pow2( this.height );
-							
-							material.bitmap.width = w;
-							material.bitmap.height = h;
-							material.bitmap.getContext("2d").drawImage( this, 0, 0, w, h );
-							
-						} else {
-							
-							material.bitmap = this;
-							
-						}
-						
-						material.loaded = 1;
-						
-					};
-					
-					image.src = urlbase + "/" + m.map_diffuse;
-					
-				} else if( m.col_diffuse ) {
-					
-					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 );
-					
-				} else if( m.a_dbg_color ) {
-					
-					material = new THREE.MeshColorFillMaterial( m.a_dbg_color );
-					
-				} else {
-					
-					material = new THREE.MeshColorFillMaterial( 0xeeeeee );
-					
-				}
-
-				return material;
-				
-			}
-			
 		}
 		
 		Model.prototype = new THREE.Geometry();
@@ -710,7 +592,8 @@ THREE.Loader.prototype = {
 
 			THREE.Geometry.call(this);
 			
-			init_materials();
+			THREE.Loader.prototype.init_materials( scope, data.materials, urlbase );
+			
 			init_vertices();
 			init_faces();
 			
@@ -726,7 +609,8 @@ THREE.Loader.prototype = {
 					x = data.vertices[ i*3     ];
 					y = data.vertices[ i*3 + 1 ];
 					z = data.vertices[ i*3 + 2 ];
-					v( x, y, z );
+					
+					THREE.Loader.prototype.v( scope, x, y, z );
 					
 				}
 			
@@ -744,7 +628,7 @@ THREE.Loader.prototype = {
 					
 					m = src[ i*stride + 3 ];
 					
-					f3( a, b, c, m );
+					THREE.Loader.prototype.f3( scope, a, b, c, m );
 					
 				}
 
@@ -762,7 +646,7 @@ THREE.Loader.prototype = {
 					nb = src[ i*stride + 5 ];
 					nc = src[ i*stride + 6 ];
 					
-					f3n( a, b, c, m, na, nb, nc );
+					THREE.Loader.prototype.f3n( scope, data.normals, a, b, c, m, na, nb, nc );
 					
 				}
 				
@@ -777,7 +661,7 @@ THREE.Loader.prototype = {
 					
 					m = src[ i*stride + 4 ];
 					
-					f4( a, b, c, d, m );
+					THREE.Loader.prototype.f4( scope, a, b, c, d, m );
 					
 				}
 
@@ -797,7 +681,7 @@ THREE.Loader.prototype = {
 					nc = src[ i*stride + 7 ];
 					nd = src[ i*stride + 8 ];
 					
-					f4n( 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 );
 					
 				}
 				
@@ -818,7 +702,7 @@ THREE.Loader.prototype = {
 					u3 = data.uvs[ uvc*2 ];
 					v3 = data.uvs[ uvc*2 + 1 ];
 					
-					uv( u1, v1, u2, v2, u3, v3 );
+					THREE.Loader.prototype.uv( scope, u1, v1, u2, v2, u3, v3 );
 					
 				}
 				
@@ -843,7 +727,7 @@ THREE.Loader.prototype = {
 					u4 = data.uvs[ uvd*2 ];
 					v4 = data.uvs[ uvd*2 + 1 ];
 					
-					uv( u1, v1, u2, v2, u3, v3, u4, v4 );
+					THREE.Loader.prototype.uv( scope, u1, v1, u2, v2, u3, v3, u4, v4 );
 					
 				}
 				
@@ -902,166 +786,175 @@ THREE.Loader.prototype = {
 				
 				}
 				
-			}
-			
-			function v( x, y, z ) {
-				
-				scope.vertices.push( new THREE.Vertex( new THREE.Vector3( x, y, z ) ) );
-				
-			}
-			
-			function f3( a, b, c, mi ) {
-				
-				var material = scope.materials[ mi ];
-				scope.faces.push( new THREE.Face3( a, b, c, null, material ) );
-				
-			}
+			}			
 			
-			function f4( a, b, c, d, mi ) {
-				
-				var material = scope.materials[ mi ];
-				scope.faces.push( new THREE.Face4( a, b, c, d, null, material ) );
-				
-			}
+		}
 
-			function f3n( a, b, c, mi, na, nb, nc ) {
-				
-				var material = scope.materials[ mi ],
-					nax = data.normals[ na*3     ],
-					nay = data.normals[ na*3 + 1 ],
-					naz = data.normals[ na*3 + 2 ],
-				
-					nbx = data.normals[ nb*3     ],
-					nby = data.normals[ nb*3 + 1 ],
-					nbz = data.normals[ nb*3 + 2 ],
-				
-					ncx = data.normals[ nc*3     ],
-					ncy = data.normals[ nc*3 + 1 ],
-					ncz = data.normals[ nc*3 + 2 ];
-				
-				scope.faces.push( new THREE.Face3( a, b, c, 
-								  [new THREE.Vector3( nax, nay, naz ), new THREE.Vector3( nbx, nby, nbz ), new THREE.Vector3( ncx, ncy, ncz )], 
-								  material ) );
-				
-			}
+		Model.prototype = new THREE.Geometry();
+		Model.prototype.constructor = Model;
+		
+		callback( new Model( urlbase ) );
 
-			function f4n( a, b, c, d, mi, na, nb, nc, nd ) {
-				
-				var material = scope.materials[ mi ],
-					nax = data.normals[ na*3     ],
-					nay = data.normals[ na*3 + 1 ],
-					naz = data.normals[ na*3 + 2 ],
-				
-					nbx = data.normals[ nb*3     ],
-					nby = data.normals[ nb*3 + 1 ],
-					nbz = data.normals[ nb*3 + 2 ],
-				
-					ncx = data.normals[ nc*3     ],
-					ncy = data.normals[ nc*3 + 1 ],
-					ncz = data.normals[ nc*3 + 2 ],
-				
-					ndx = data.normals[ nd*3     ],
-					ndy = data.normals[ nd*3 + 1 ],
-					ndz = data.normals[ nd*3 + 2 ];
-				
-				scope.faces.push( new THREE.Face4( a, b, c, d,
-								  [new THREE.Vector3( nax, nay, naz ), new THREE.Vector3( nbx, nby, nbz ), new THREE.Vector3( ncx, ncy, ncz ), new THREE.Vector3( ndx, ndy, ndz )], 
-								  material ) );
-				
-			}
+	},
+
+	v: function( scope, x, y, z ) {
+	
+		scope.vertices.push( new THREE.Vertex( new THREE.Vector3( x, y, z ) ) );
+	
+	},
+	
+	f3: function( scope, a, b, c, mi ) {
+		
+		var material = scope.materials[ mi ];
+		scope.faces.push( new THREE.Face3( a, b, c, null, material ) );
+		
+	},
+	
+	f4: function( scope, a, b, c, d, mi ) {
+		
+		var material = scope.materials[ mi ];
+		scope.faces.push( new THREE.Face4( a, b, c, d, null, material ) );
+		
+	},
+	
+	f3n: function( scope, normals, a, b, c, mi, na, nb, nc ) {
+		
+		var material = scope.materials[ mi ],
+			nax = normals[ na*3     ],
+			nay = normals[ na*3 + 1 ],
+			naz = normals[ na*3 + 2 ],
+		
+			nbx = normals[ nb*3     ],
+			nby = normals[ nb*3 + 1 ],
+			nbz = normals[ nb*3 + 2 ],
+		
+			ncx = normals[ nc*3     ],
+			ncy = normals[ nc*3 + 1 ],
+			ncz = normals[ nc*3 + 2 ];
+		
+		scope.faces.push( new THREE.Face3( a, b, c, 
+						  [new THREE.Vector3( nax, nay, naz ), 
+						   new THREE.Vector3( nbx, nby, nbz ), 
+						   new THREE.Vector3( ncx, ncy, ncz )], 
+						  material ) );
+		
+	},
+	
+	f4n: function( scope, normals, a, b, c, d, mi, na, nb, nc, nd ) {
+		
+		var material = scope.materials[ mi ],
+			nax = normals[ na*3     ],
+			nay = normals[ na*3 + 1 ],
+			naz = normals[ na*3 + 2 ],
+		
+			nbx = normals[ nb*3     ],
+			nby = normals[ nb*3 + 1 ],
+			nbz = normals[ nb*3 + 2 ],
+		
+			ncx = normals[ nc*3     ],
+			ncy = normals[ nc*3 + 1 ],
+			ncz = normals[ nc*3 + 2 ],
+		
+			ndx = normals[ nd*3     ],
+			ndy = normals[ nd*3 + 1 ],
+			ndz = normals[ nd*3 + 2 ];
+		
+		scope.faces.push( new THREE.Face4( a, b, c, d,
+						  [new THREE.Vector3( nax, nay, naz ), 
+						   new THREE.Vector3( nbx, nby, nbz ), 
+						   new THREE.Vector3( ncx, ncy, ncz ), 
+						   new THREE.Vector3( ndx, ndy, ndz )], 
+						  material ) );
+		
+	},
+	
+	uv: function( scope, u1, v1, u2, v2, u3, v3, u4, v4 ) {
+		
+		var uv = [];
+		uv.push( new THREE.UV( u1, v1 ) );
+		uv.push( new THREE.UV( u2, v2 ) );
+		uv.push( new THREE.UV( u3, v3 ) );
+		if ( u4 && v4 ) uv.push( new THREE.UV( u4, v4 ) );
+		scope.uvs.push( uv );
+		
+	},
+	
+	init_materials: function( scope, materials, urlbase ) {
+		
+		scope.materials = [];
+		
+		for( var i = 0; i < materials.length; ++i ) {
 			
-			function uv( u1, v1, u2, v2, u3, v3, u4, v4 ) {
-				
-				var uv = [];
-				uv.push( new THREE.UV( u1, v1 ) );
-				uv.push( new THREE.UV( u2, v2 ) );
-				uv.push( new THREE.UV( u3, v3 ) );
-				if ( u4 && v4 ) uv.push( new THREE.UV( u4, v4 ) );
-				scope.uvs.push( uv );
-				
-			}
+			scope.materials[i] = [ THREE.Loader.prototype.createMaterial( materials[i], urlbase ) ];
 			
-			function init_materials() {
-				
-				scope.materials = [];
-				for( var i = 0; i < data.materials.length; ++i ) {
-					scope.materials[i] = [ create_material( data.materials[i], urlbase ) ];
-				}
-				
-			}
+		}
 		
-			function is_pow2( n ) {
-				
-				var l = Math.log(n) / Math.LN2;
-				return Math.floor(l) == l;
-				
-			}
+	},
+	
+	createMaterial: function( m, urlbase ) {
+	
+		function is_pow2( n ) {
 			
-			function nearest_pow2(n) {
-				
-				var l = Math.log(n) / Math.LN2;
-				return Math.pow( 2, Math.round(l) );
-				
-			}
+			var l = Math.log(n) / Math.LN2;
+			return Math.floor(l) == l;
 			
-			function create_material( m ) {
+		}
+		
+		function nearest_pow2( n ) {
+			
+			var l = Math.log(n) / Math.LN2;
+			return Math.pow( 2, Math.round(l) );
+			
+		}
+
+		var material, texture, image, color;
+		
+		if( m.map_diffuse && urlbase ) {
+			
+			texture = document.createElement( 'canvas' );
+			material = new THREE.MeshBitmapMaterial( texture );
+			
+			image = new Image();
+			image.onload = function () {
 				
-				var material, texture, image, color;
+				if ( !is_pow2( this.width ) || !is_pow2( this.height ) ) {
 				
-				if( m.map_diffuse && urlbase ) {
-					
-					texture = document.createElement( 'canvas' );
-					material = new THREE.MeshBitmapMaterial( texture );
+					var w = nearest_pow2( this.width ),
+						h = nearest_pow2( this.height );
 					
-					image = new Image();
-					image.onload = function () {
-						
-						if ( !is_pow2( this.width ) || !is_pow2( this.height ) ) {
-						
-							var w = nearest_pow2( this.width ),
-								h = nearest_pow2( this.height );
-							
-							material.bitmap.width = w;
-							material.bitmap.height = h;
-							material.bitmap.getContext("2d").drawImage( this, 0, 0, w, h );
-							
-						} else {
-							
-							material.bitmap = this;
-							
-						}
-						
-						material.loaded = 1;
-						
-					};
-					
-					image.src = urlbase + "/" + m.map_diffuse;
-					
-				} else if( m.col_diffuse ) {
-					
-					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 );
-					
-				} else if( m.a_dbg_color ) {
-					
-					material = new THREE.MeshColorFillMaterial( m.a_dbg_color );
+					material.bitmap.width = w;
+					material.bitmap.height = h;
+					material.bitmap.getContext("2d").drawImage( this, 0, 0, w, h );
 					
 				} else {
 					
-					material = new THREE.MeshColorFillMaterial( 0xeeeeee );
+					material.bitmap = this;
 					
 				}
-
-				return material;
-			}
+				
+				material.loaded = 1;
+				
+			};
+			
+			image.src = urlbase + "/" + m.map_diffuse;
+			
+		} else if( m.col_diffuse ) {
+			
+			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 );
+			
+		} else if( m.a_dbg_color ) {
+			
+			material = new THREE.MeshColorFillMaterial( m.a_dbg_color );
+			
+		} else {
+			
+			material = new THREE.MeshColorFillMaterial( 0xeeeeee );
 			
 		}
 
-		Model.prototype = new THREE.Geometry();
-		Model.prototype.constructor = Model;
+		return material;
 		
-		callback( new Model( urlbase ) );
-
 	}
 	
 };

部分文件因为文件数量过多而无法显示