Jelajahi Sumber

Editor: Refactored file loading code.

Mr.doob 13 tahun lalu
induk
melakukan
41df0773d1
1 mengubah file dengan 119 tambahan dan 85 penghapusan
  1. 119 85
      editor/index.html

+ 119 - 85
editor/index.html

@@ -86,169 +86,203 @@
 
 				var file = event.dataTransfer.files[ 0 ];
 				var extension = file.name.split( '.' ).pop().toLowerCase();
-				var reader = new FileReader();
 
-				reader.onload = function ( event ) {
+				parseFile( file, extension );
 
-					parseFile( event.target.result, extension );
+			}, false );
 
-				};
+			var parseFile = function ( file, extension ) {
 
-				var binaryFormats = {
+				switch ( extension ) {
 
-					"ctm": true,
-					"utf8": true
+					case 'ctm':
 
-				};
+						var reader = new FileReader();
+						reader.addEventListener( 'load', function ( event ) {
 
-				if ( extension in binaryFormats ) {
+							var contents = event.target.result;
 
-					reader.readAsBinaryString( file );
+							var stream = new CTM.Stream( contents );
+							stream.offset = 0;
 
-				} else {
+							var loader = new THREE.CTMLoader();
+							loader.createModelClassic( new CTM.File( stream ), function( geometry ) {
 
-					reader.readAsText( file );
+								var material = new THREE.MeshLambertMaterial();
 
-				}
+								var mesh = new THREE.Mesh( geometry, material );
 
-			}, false );
+								signals.objectAdded.dispatch( mesh );
+								signals.objectSelected.dispatch( mesh );
 
-			var parseFile = function ( contents, extension ) {
+							} );
 
-				switch ( extension ) {
+						}, false );
+						reader.readAsBinaryString( file );
 
-					case 'ctm':
+						break;
 
-						var stream = new CTM.Stream( contents );
-						stream.offset = 0;
+					case 'dae':
 
-						var file = new CTM.File( stream );
+						var reader = new FileReader();
+						reader.addEventListener( 'load', function ( event ) {
 
-						var loader = new THREE.CTMLoader();
-						loader.createModelClassic( file, function( geometry ) {
+							var contents = event.target.result;
 
-							var material = new THREE.MeshLambertMaterial();
+							var parser = new DOMParser();
+							var xml = parser.parseFromString( contents, 'text/xml' );
 
-							var mesh = new THREE.Mesh( geometry, material );
+							var loader = new THREE.ColladaLoader();
+							loader.parse( xml, function ( collada ) {
 
-							signals.objectAdded.dispatch( mesh );
-							signals.objectSelected.dispatch( mesh );
+								signals.objectAdded.dispatch( collada.scene );
+								signals.objectSelected.dispatch( collada.scene );
+
+							} );
 
-						} );
+						}, false );
+						reader.readAsText( file );
 
 						break;
 
-					case 'dae':
+					case 'js':
 
-						var parser = new DOMParser();
-						var xml = parser.parseFromString( contents, 'text/xml' );
+						var reader = new FileReader();
+						reader.addEventListener( 'load', function ( event ) {
 
-						var loader = new THREE.ColladaLoader();
-						loader.parse( xml, function ( collada ) {
+							var contents = event.target.result;
 
-							signals.objectAdded.dispatch( collada.scene );
-							signals.objectSelected.dispatch( collada.scene );
+							// 2.0
 
-						} );
+							if ( contents.indexOf( 'postMessage' ) !== -1 ) {
 
-						break;
+								var blob = new Blob( [ contents ], { type: 'text/javascript' } );
+								var url = URL.createObjectURL( blob );
 
-					case 'js':
+								var worker = new Worker( url );
 
-						// 2.0
+								worker.onmessage = function ( event ) {
 
-						if ( contents.indexOf( 'postMessage' ) !== -1 ) {
+									event.data.metadata = { 'format': 2 };
+									parseFile( JSON.stringify( event.data ), extension );
 
-							var blob = new Blob( [ contents ], { type: 'text/javascript' } );
-							var url = URL.createObjectURL( blob );
+								};
 
-							var worker = new Worker( url );
+								worker.postMessage( new Date().getTime() );
 
-							worker.onmessage = function ( event ) {
+								return;
 
-								event.data.metadata = { 'format': 2 };
-								parseFile( JSON.stringify( event.data ), extension );
+							}
 
-							};
+							// 3.0
 
-							worker.postMessage( new Date().getTime() );
+							var data = JSON.parse( contents );
 
-							return;
+							if ( data.metadata === undefined ) data.metadata = { type: 'geometry' }; // 2.0
+							if ( data.metadata.type === undefined ) data.metadata.type = 'geometry'; // 3.0
 
-						}
+							if ( data.metadata.type === 'geometry' ) {
 
-						// 3.0
+								var geometry = new THREE.GeometryLoader().parse( data );
+								var material = new THREE.MeshLambertMaterial();
 
-						var data = JSON.parse( contents );
+								var mesh = new THREE.Mesh( geometry, material );
 
-						if ( data.metadata === undefined ) data.metadata = { type: 'geometry' }; // 2.0
-						if ( data.metadata.type === undefined ) data.metadata.type = 'geometry'; // 3.0
+								signals.objectAdded.dispatch( mesh );
+								signals.objectSelected.dispatch( mesh );
 
-						if ( data.metadata.type === 'geometry' ) {
+							} else if ( data.metadata.type === 'scene' ) {
 
-							var geometry = new THREE.GeometryLoader().parse( data );
-							var material = new THREE.MeshLambertMaterial();
+								new THREE.SceneLoader().parse( data, function ( scene ) {
 
-							var mesh = new THREE.Mesh( geometry, material );
+									signals.objectAdded.dispatch( scene );
+									signals.objectSelected.dispatch( scene );
 
-							signals.objectAdded.dispatch( mesh );
-							signals.objectSelected.dispatch( mesh );
+								}, '' );
 
-						} else if ( data.metadata.type === 'scene' ) {
+							}
 
-							new THREE.SceneLoader().parse( data, function ( scene ) {
+						}, false );
+						reader.readAsText( file );
 
-								signals.objectAdded.dispatch( scene );
-								signals.objectSelected.dispatch( scene );
+						break;
 
-							}, '' );
+					case 'obj':
 
-						}
+						var reader = new FileReader();
+						reader.addEventListener( 'load', function ( event ) {
 
-						break;
+							var contents = event.target.result;
 
-					case 'obj':
+							var object = new THREE.OBJLoader().parse( contents );
 
-						var object = new THREE.OBJLoader().parse( contents );
+							signals.objectAdded.dispatch( object );
+							signals.objectSelected.dispatch( object );
 
-						signals.objectAdded.dispatch( object );
-						signals.objectSelected.dispatch( object );
+						}, false );
+						reader.readAsText( file );
 
 						break;
 
 					case 'stl':
 
-						var geometry = new THREE.STLLoader().parse( contents );
-						var material = new THREE.MeshLambertMaterial();
+						var reader = new FileReader();
+						reader.addEventListener( 'load', function ( event ) {
+
+							var contents = event.target.result;
+
+							var geometry = new THREE.STLLoader().parse( contents );
+							var material = new THREE.MeshLambertMaterial();
+
+							var mesh = new THREE.Mesh( geometry, material );
 
-						var mesh = new THREE.Mesh( geometry, material );
+							signals.objectAdded.dispatch( mesh );
+							signals.objectSelected.dispatch( mesh );
 
-						signals.objectAdded.dispatch( mesh );
-						signals.objectSelected.dispatch( mesh );
+						}, false );
+						reader.readAsText( file );
 
 						break;
 
+					/*
 					case 'utf8':
 
-						var geometry = new THREE.UTF8Loader().parse( contents );
-						var material = new THREE.MeshLambertMaterial();
+						var reader = new FileReader();
+						reader.addEventListener( 'load', function ( event ) {
 
-						var mesh = new THREE.Mesh( geometry, material );
+							var contents = event.target.result;
 
-						signals.objectAdded.dispatch( mesh );
-						signals.objectSelected.dispatch( mesh );
+							var geometry = new THREE.UTF8Loader().parse( contents );
+							var material = new THREE.MeshLambertMaterial();
+
+							var mesh = new THREE.Mesh( geometry, material );
+
+							signals.objectAdded.dispatch( mesh );
+							signals.objectSelected.dispatch( mesh );
+
+						}, false );
+						reader.readAsBinaryString( file );
 
 						break;
+					*/
 
 					case 'vtk':
 
-						var geometry = new THREE.VTKLoader().parse( contents );
-						var material = new THREE.MeshLambertMaterial();
+						var reader = new FileReader();
+						reader.addEventListener( 'load', function ( event ) {
+
+							var contents = event.target.result;
 
-						var mesh = new THREE.Mesh( geometry, material );
+							var geometry = new THREE.VTKLoader().parse( contents );
+							var material = new THREE.MeshLambertMaterial();
+
+							var mesh = new THREE.Mesh( geometry, material );
+
+							signals.objectAdded.dispatch( mesh );
+							signals.objectSelected.dispatch( mesh );
 
-						signals.objectAdded.dispatch( mesh );
-						signals.objectSelected.dispatch( mesh );
+						}, false );
+						reader.readAsText( file );
 
 						break;