Browse Source

Editor: Added support to JSON 2.0 models.

Mr.doob 13 years ago
parent
commit
1a13ae2743
1 changed files with 83 additions and 53 deletions
  1. 83 53
      editor/index.html

+ 83 - 53
editor/index.html

@@ -85,66 +85,69 @@
 
 				reader.onload = function ( event ) {
 
-					var contents = event.target.result;
+					parseFile( event.target.result, extension );
 
-					switch ( extension ) {
+				};
+
+				reader.readAsText( file );
 
-						case 'dae':
+			}, false );
 
-							var parser = new DOMParser();
-							var xml = parser.parseFromString( contents, 'text/xml' );
+			var parseFile = function ( contents, extension ) {
 
-							// TODO: Update ColladaLoader
+				switch ( extension ) {
 
-							var loader = new THREE.ColladaLoader();
-							loader.parse( xml, function ( collada ) {
+					case 'dae':
 
-								signals.objectAdded.dispatch( collada.scene );
-								signals.objectSelected.dispatch( collada.scene );
+						var parser = new DOMParser();
+						var xml = parser.parseFromString( contents, 'text/xml' );
 
-							} );
+						// TODO: Update ColladaLoader
 
-							break;
+						var loader = new THREE.ColladaLoader();
+						loader.parse( xml, function ( collada ) {
 
-						case 'js':
+							signals.objectAdded.dispatch( collada.scene );
+							signals.objectSelected.dispatch( collada.scene );
 
-							var data = JSON.parse( contents );
+						} );
 
-							if ( data.metadata.type === 'scene' ) {
+						break;
 
-								new THREE.SceneLoader().parse( data, function ( scene ) {
+					case 'js':
 
-									signals.objectAdded.dispatch( scene );
-									signals.objectSelected.dispatch( scene );
+						// 2.0
 
-								}, '' );
+						if ( contents.indexOf( 'postMessage' ) !== -1 ) {
 
-							} else {
+							var blob = new Blob( [ contents ], { type: 'text/javascript' } );
+							var url = URL.createObjectURL( blob );
 
-								var geometry = new THREE.GeometryLoader().parse( data );
-								var material = new THREE.MeshLambertMaterial();
+							var worker = new Worker( url );
 
-								var mesh = new THREE.Mesh( geometry, material );
+							worker.onmessage = function ( event ) {
 
-								signals.objectAdded.dispatch( mesh );
-								signals.objectSelected.dispatch( mesh );
+								event.data.metadata = { 'format': 2 };
+								parseFile( JSON.stringify( event.data ), extension );
 
-							}
+							};
 
-							break;
+							worker.postMessage( new Date().getTime() );
 
-						case 'obj':
+							return;
 
-							var object = new THREE.OBJLoader().parse( contents );
+						}
 
-							signals.objectAdded.dispatch( object );
-							signals.objectSelected.dispatch( object );
+						// 3.0
 
-							break;
+						var data = JSON.parse( contents );
 
-						case 'stl':
+						if ( data.metadata === undefined ) data.metadata = { type: 'geometry' }; // 2.0
+						if ( data.metadata.type === undefined ) data.metadata.type = 'geometry'; // 3.0
 
-							var geometry = new THREE.STLLoader().parse( contents );
+						if ( data.metadata.type === 'geometry' ) {
+
+							var geometry = new THREE.GeometryLoader().parse( data );
 							var material = new THREE.MeshLambertMaterial();
 
 							var mesh = new THREE.Mesh( geometry, material );
@@ -152,40 +155,67 @@
 							signals.objectAdded.dispatch( mesh );
 							signals.objectSelected.dispatch( mesh );
 
-							break;
+						} else if ( data.metadata.type === 'scene' ) {
 
-						case 'utf8':
+							new THREE.SceneLoader().parse( data, function ( scene ) {
 
-							var geometry = new THREE.UTF8Loader().parse( contents );
-							var material = new THREE.MeshLambertMaterial();
+								signals.objectAdded.dispatch( scene );
+								signals.objectSelected.dispatch( scene );
 
-							var mesh = new THREE.Mesh( geometry, material );
+							}, '' );
 
-							signals.objectAdded.dispatch( mesh );
-							signals.objectSelected.dispatch( mesh );
+						}
 
-							break;
+						break;
 
-						case 'vtk':
+					case 'obj':
 
-							var geometry = new THREE.VTKLoader().parse( contents );
-							var material = new THREE.MeshLambertMaterial();
+						var object = new THREE.OBJLoader().parse( contents );
 
-							var mesh = new THREE.Mesh( geometry, material );
+						signals.objectAdded.dispatch( object );
+						signals.objectSelected.dispatch( object );
 
-							signals.objectAdded.dispatch( mesh );
-							signals.objectSelected.dispatch( mesh );
+						break;
 
-							break;
+					case 'stl':
 
-					}
+						var geometry = new THREE.STLLoader().parse( contents );
+						var material = new THREE.MeshLambertMaterial();
 
-				};
+						var mesh = new THREE.Mesh( geometry, material );
 
-				reader.readAsText( file );
+						signals.objectAdded.dispatch( mesh );
+						signals.objectSelected.dispatch( mesh );
 
-			}, false );
+						break;
+
+					case 'utf8':
+
+						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 );
+
+						break;
 
+					case 'vtk':
+
+						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 );
+
+						break;
+
+				}
+
+			}
 
 			//