2 * @author mrdoob / http://mrdoob.com/
5 var Loader = function ( editor ) {
8 var signals = editor.signals;
10 this.texturePath = '';
12 this.loadFile = function ( file ) {
14 var filename = file.name;
15 var extension = filename.split( '.' ).pop().toLowerCase();
17 var reader = new FileReader();
18 reader.addEventListener( 'progress', function ( event ) {
20 var size = '(' + Math.floor( event.total / 1000 ).format() + ' KB)';
21 var progress = Math.floor( ( event.loaded / event.total ) * 100 ) + '%';
22 console.log( 'Loading', filename, size, progress );
26 switch ( extension ) {
30 reader.addEventListener( 'load', function ( event ) {
32 var loader = new THREE.TDSLoader();
33 var object = loader.parse( event.target.result );
35 editor.execute( new AddObjectCommand( object ) );
38 reader.readAsArrayBuffer( file );
44 reader.addEventListener( 'load', function ( event ) {
46 var loader = new THREE.AMFLoader();
47 var amfobject = loader.parse( event.target.result );
49 editor.execute( new AddObjectCommand( amfobject ) );
52 reader.readAsArrayBuffer( file );
58 reader.addEventListener( 'load', function ( event ) {
60 var loader = new THREE.AWDLoader();
61 var scene = loader.parse( event.target.result );
63 editor.execute( new SetSceneCommand( scene ) );
66 reader.readAsArrayBuffer( file );
72 reader.addEventListener( 'load', function ( event ) {
74 var contents = event.target.result;
75 var json = JSON.parse( contents );
77 var loader = new THREE.BabylonLoader();
78 var scene = loader.parse( json );
80 editor.execute( new SetSceneCommand( scene ) );
83 reader.readAsText( file );
87 case 'babylonmeshdata':
89 reader.addEventListener( 'load', function ( event ) {
91 var contents = event.target.result;
92 var json = JSON.parse( contents );
94 var loader = new THREE.BabylonLoader();
96 var geometry = loader.parseGeometry( json );
97 var material = new THREE.MeshStandardMaterial();
99 var mesh = new THREE.Mesh( geometry, material );
100 mesh.name = filename;
102 editor.execute( new AddObjectCommand( mesh ) );
105 reader.readAsText( file );
111 reader.addEventListener( 'load', function ( event ) {
113 var data = new Uint8Array( event.target.result );
115 var stream = new CTM.Stream( data );
118 var loader = new THREE.CTMLoader();
119 loader.createModel( new CTM.File( stream ), function( geometry ) {
121 geometry.sourceType = "ctm";
122 geometry.sourceFile = file.name;
124 var material = new THREE.MeshStandardMaterial();
126 var mesh = new THREE.Mesh( geometry, material );
127 mesh.name = filename;
129 editor.execute( new AddObjectCommand( mesh ) );
134 reader.readAsArrayBuffer( file );
140 reader.addEventListener( 'load', function ( event ) {
142 var contents = event.target.result;
144 var loader = new THREE.ColladaLoader();
145 var collada = loader.parse( contents );
147 collada.scene.name = filename;
149 editor.execute( new AddObjectCommand( collada.scene ) );
152 reader.readAsText( file );
158 reader.addEventListener( 'load', function ( event ) {
160 var contents = event.target.result;
162 var loader = new THREE.FBXLoader();
163 var object = loader.parse( contents );
165 editor.execute( new AddObjectCommand( object ) );
168 reader.readAsArrayBuffer( file );
175 reader.addEventListener( 'load', function ( event ) {
177 var contents = event.target.result;
179 var loader = new THREE.GLTFLoader();
180 loader.parse( contents, '', function ( result ) {
182 result.scene.name = filename;
183 editor.execute( new AddObjectCommand( result.scene ) );
188 reader.readAsArrayBuffer( file );
200 reader.addEventListener( 'load', function ( event ) {
202 var contents = event.target.result;
206 if ( contents.indexOf( 'postMessage' ) !== - 1 ) {
208 var blob = new Blob( [ contents ], { type: 'text/javascript' } );
209 var url = URL.createObjectURL( blob );
211 var worker = new Worker( url );
213 worker.onmessage = function ( event ) {
215 event.data.metadata = { version: 2 };
216 handleJSON( event.data, file, filename );
220 worker.postMessage( Date.now() );
232 data = JSON.parse( contents );
241 handleJSON( data, file, filename );
244 reader.readAsText( file );
251 reader.addEventListener( 'load', function ( event ) {
253 var loader = new THREE.KMZLoader();
254 var collada = loader.parse( event.target.result );
256 collada.scene.name = filename;
258 editor.execute( new AddObjectCommand( collada.scene ) );
261 reader.readAsArrayBuffer( file );
267 reader.addEventListener( 'load', function ( event ) {
269 var contents = event.target.result;
271 var geometry = new THREE.MD2Loader().parse( contents );
272 var material = new THREE.MeshStandardMaterial( {
277 var mesh = new THREE.Mesh( geometry, material );
278 mesh.mixer = new THREE.AnimationMixer( mesh );
279 mesh.name = filename;
281 editor.execute( new AddObjectCommand( mesh ) );
284 reader.readAsArrayBuffer( file );
290 reader.addEventListener( 'load', function ( event ) {
292 var contents = event.target.result;
294 var object = new THREE.OBJLoader().parse( contents );
295 object.name = filename;
297 editor.execute( new AddObjectCommand( object ) );
300 reader.readAsText( file );
306 reader.addEventListener( 'load', function ( event ) {
308 var contents = event.target.result;
309 var json = JSON.parse( contents );
311 var loader = new THREE.PlayCanvasLoader();
312 var object = loader.parse( json );
314 editor.execute( new AddObjectCommand( object ) );
317 reader.readAsText( file );
323 reader.addEventListener( 'load', function ( event ) {
325 var contents = event.target.result;
327 var geometry = new THREE.PLYLoader().parse( contents );
328 geometry.sourceType = "ply";
329 geometry.sourceFile = file.name;
331 var material = new THREE.MeshStandardMaterial();
333 var mesh = new THREE.Mesh( geometry, material );
334 mesh.name = filename;
336 editor.execute( new AddObjectCommand( mesh ) );
339 reader.readAsArrayBuffer( file );
345 reader.addEventListener( 'load', function ( event ) {
347 var contents = event.target.result;
349 var geometry = new THREE.STLLoader().parse( contents );
350 geometry.sourceType = "stl";
351 geometry.sourceFile = file.name;
353 var material = new THREE.MeshStandardMaterial();
355 var mesh = new THREE.Mesh( geometry, material );
356 mesh.name = filename;
358 editor.execute( new AddObjectCommand( mesh ) );
362 if ( reader.readAsBinaryString !== undefined ) {
364 reader.readAsBinaryString( file );
368 reader.readAsArrayBuffer( file );
377 reader.addEventListener( 'load', function ( event ) {
379 var contents = event.target.result;
381 var geometry = new THREE.UTF8Loader().parse( contents );
382 var material = new THREE.MeshLambertMaterial();
384 var mesh = new THREE.Mesh( geometry, material );
386 editor.execute( new AddObjectCommand( mesh ) );
389 reader.readAsBinaryString( file );
396 reader.addEventListener( 'load', function ( event ) {
398 var contents = event.target.result;
400 var geometry = new THREE.VTKLoader().parse( contents );
401 geometry.sourceType = "vtk";
402 geometry.sourceFile = file.name;
404 var material = new THREE.MeshStandardMaterial();
406 var mesh = new THREE.Mesh( geometry, material );
407 mesh.name = filename;
409 editor.execute( new AddObjectCommand( mesh ) );
412 reader.readAsText( file );
418 reader.addEventListener( 'load', function ( event ) {
420 var contents = event.target.result;
422 var result = new THREE.VRMLLoader().parse( contents );
424 editor.execute( new SetSceneCommand( result ) );
427 reader.readAsText( file );
433 reader.addEventListener( 'load', function ( event ) {
435 var contents = event.target.result;
437 var zip = new JSZip( contents );
441 if ( zip.files[ 'model.obj' ] && zip.files[ 'materials.mtl' ] ) {
443 var materials = new THREE.MTLLoader().parse( zip.file( 'materials.mtl' ).asText() );
444 var object = new THREE.OBJLoader().setMaterials( materials ).parse( zip.file( 'model.obj' ).asText() );
445 editor.execute( new AddObjectCommand( object ) );
450 reader.readAsBinaryString( file );
456 alert( 'Unsupported file format (' + extension + ').' );
464 function handleJSON( data, file, filename ) {
466 if ( data.metadata === undefined ) { // 2.0
468 data.metadata = { type: 'Geometry' };
472 if ( data.metadata.type === undefined ) { // 3.0
474 data.metadata.type = 'Geometry';
478 if ( data.metadata.formatVersion !== undefined ) {
480 data.metadata.version = data.metadata.formatVersion;
484 switch ( data.metadata.type.toLowerCase() ) {
486 case 'buffergeometry':
488 var loader = new THREE.BufferGeometryLoader();
489 var result = loader.parse( data );
491 var mesh = new THREE.Mesh( result );
493 editor.execute( new AddObjectCommand( mesh ) );
499 var loader = new THREE.JSONLoader();
500 loader.setTexturePath( scope.texturePath );
502 var result = loader.parse( data );
504 var geometry = result.geometry;
507 if ( result.materials !== undefined ) {
509 if ( result.materials.length > 1 ) {
511 material = new THREE.MultiMaterial( result.materials );
515 material = result.materials[ 0 ];
521 material = new THREE.MeshStandardMaterial();
525 geometry.sourceType = "ascii";
526 geometry.sourceFile = file.name;
530 if ( geometry.animation && geometry.animation.hierarchy ) {
532 mesh = new THREE.SkinnedMesh( geometry, material );
536 mesh = new THREE.Mesh( geometry, material );
540 mesh.name = filename;
542 editor.execute( new AddObjectCommand( mesh ) );
548 var loader = new THREE.ObjectLoader();
549 loader.setTexturePath( scope.texturePath );
551 var result = loader.parse( data );
553 if ( result instanceof THREE.Scene ) {
555 editor.execute( new SetSceneCommand( result ) );
559 editor.execute( new AddObjectCommand( result ) );
567 editor.fromJSON( data );