Loader.js 10.2 KB
Newer Older
M
Mr.doob 已提交
1 2 3 4
/**
 * @author mrdoob / http://mrdoob.com/
 */

5
var Loader = function ( editor ) {
6

7 8
	var scope = this;
	var signals = editor.signals;
9

10 11
	this.texturePath = '';

12 13 14 15
	this.loadFile = function ( file ) {

		var filename = file.name;
		var extension = filename.split( '.' ).pop().toLowerCase();
16

M
Mr.doob 已提交
17 18 19 20
		var reader = new FileReader();
		reader.addEventListener( 'progress', function ( event ) {

			var size = '(' + Math.floor( event.total / 1000 ).format() + ' KB)';
M
Mr.doob 已提交
21
			var progress = Math.floor( ( event.loaded / event.total ) * 100 ) + '%';
M
Mr.doob 已提交
22 23 24 25
			console.log( 'Loading', filename, size, progress );

		} );

M
Mr.doob 已提交
26
		switch ( extension ) {
27

E
Elijah Snyder 已提交
28 29 30 31 32 33 34
			case 'amf':

				reader.addEventListener( 'load', function ( event ) {

					var loader = new THREE.AMFLoader();
					var amfobject = loader.parse( event.target.result );

35
					editor.execute( new AddObjectCommand( amfobject ) );
E
Elijah Snyder 已提交
36 37 38 39 40 41

				}, false );
				reader.readAsArrayBuffer( file );

				break;

M
Mr.doob 已提交
42 43 44 45 46 47 48
			case 'awd':

				reader.addEventListener( 'load', function ( event ) {

					var loader = new THREE.AWDLoader();
					var scene = loader.parse( event.target.result );

49
					editor.execute( new SetSceneCommand( scene ) );
M
Mr.doob 已提交
50 51 52 53 54 55

				}, false );
				reader.readAsArrayBuffer( file );

				break;

56 57 58 59 60 61 62 63 64 65
			case 'babylon':

				reader.addEventListener( 'load', function ( event ) {

					var contents = event.target.result;
					var json = JSON.parse( contents );

					var loader = new THREE.BabylonLoader();
					var scene = loader.parse( json );

66
					editor.execute( new SetSceneCommand( scene ) );
67 68 69 70 71 72

				}, false );
				reader.readAsText( file );

				break;

73 74 75 76 77 78 79 80 81 82
			case 'babylonmeshdata':

				reader.addEventListener( 'load', function ( event ) {

					var contents = event.target.result;
					var json = JSON.parse( contents );

					var loader = new THREE.BabylonLoader();

					var geometry = loader.parseGeometry( json );
M
Mr.doob 已提交
83
					var material = new THREE.MeshStandardMaterial();
84 85 86 87

					var mesh = new THREE.Mesh( geometry, material );
					mesh.name = filename;

88
					editor.execute( new AddObjectCommand( mesh ) );
89 90 91 92 93 94

				}, false );
				reader.readAsText( file );

				break;

M
Mr.doob 已提交
95
			case 'ctm':
96

M
Mr.doob 已提交
97
				reader.addEventListener( 'load', function ( event ) {
98

M
Mr.doob 已提交
99
					var data = new Uint8Array( event.target.result );
100

M
Mr.doob 已提交
101
					var stream = new CTM.Stream( data );
M
Mr.doob 已提交
102
					stream.offset = 0;
103

M
Mr.doob 已提交
104
					var loader = new THREE.CTMLoader();
M
Mr.doob 已提交
105
					loader.createModel( new CTM.File( stream ), function( geometry ) {
106

M
Mr.doob 已提交
107 108
						geometry.sourceType = "ctm";
						geometry.sourceFile = file.name;
109

M
Mr.doob 已提交
110
						var material = new THREE.MeshStandardMaterial();
111

M
Mr.doob 已提交
112 113
						var mesh = new THREE.Mesh( geometry, material );
						mesh.name = filename;
114

115
						editor.execute( new AddObjectCommand( mesh ) );
116

M
Mr.doob 已提交
117
					} );
118

M
Mr.doob 已提交
119
				}, false );
M
Mr.doob 已提交
120
				reader.readAsArrayBuffer( file );
121

M
Mr.doob 已提交
122
				break;
123

M
Mr.doob 已提交
124
			case 'dae':
125

M
Mr.doob 已提交
126
				reader.addEventListener( 'load', function ( event ) {
127

M
Mr.doob 已提交
128
					var contents = event.target.result;
129

M
Mr.doob 已提交
130
					var loader = new THREE.ColladaLoader();
M
Mr.doob 已提交
131
					var collada = loader.parse( contents );
132

M
Mr.doob 已提交
133
					collada.scene.name = filename;
134

135
					editor.execute( new AddObjectCommand( collada.scene ) );
136

M
Mr.doob 已提交
137 138
				}, false );
				reader.readAsText( file );
139

M
Mr.doob 已提交
140
				break;
141

M
Mr.doob 已提交
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
			case 'fbx':

				reader.addEventListener( 'load', function ( event ) {

					var contents = event.target.result;

					var loader = new THREE.FBXLoader();
					var object = loader.parse( contents );

					editor.execute( new AddObjectCommand( object ) );

				}, false );
				reader.readAsText( file );

				break;

M
Mr.doob 已提交
158 159
			case 'js':
			case 'json':
M
Mr.doob 已提交
160

161 162 163
			case '3geo':
			case '3mat':
			case '3obj':
M
Mr.doob 已提交
164
			case '3scn':
165

M
Mr.doob 已提交
166
				reader.addEventListener( 'load', function ( event ) {
167

M
Mr.doob 已提交
168
					var contents = event.target.result;
169

M
Mr.doob 已提交
170
					// 2.0
171

M
Mr.doob 已提交
172
					if ( contents.indexOf( 'postMessage' ) !== - 1 ) {
173

M
Mr.doob 已提交
174 175
						var blob = new Blob( [ contents ], { type: 'text/javascript' } );
						var url = URL.createObjectURL( blob );
176

M
Mr.doob 已提交
177
						var worker = new Worker( url );
178

M
Mr.doob 已提交
179
						worker.onmessage = function ( event ) {
180

M
Mr.doob 已提交
181
							event.data.metadata = { version: 2 };
M
Mr.doob 已提交
182
							handleJSON( event.data, file, filename );
183

M
Mr.doob 已提交
184
						};
185

M
Mr.doob 已提交
186
						worker.postMessage( Date.now() );
187

M
Mr.doob 已提交
188
						return;
189

M
Mr.doob 已提交
190
					}
191

M
Mr.doob 已提交
192
					// >= 3.0
193

M
Mr.doob 已提交
194
					var data;
195

M
Mr.doob 已提交
196
					try {
197

M
Mr.doob 已提交
198
						data = JSON.parse( contents );
199

M
Mr.doob 已提交
200
					} catch ( error ) {
201

M
Mr.doob 已提交
202 203
						alert( error );
						return;
204

M
Mr.doob 已提交
205
					}
206

M
Mr.doob 已提交
207
					handleJSON( data, file, filename );
208

M
Mr.doob 已提交
209 210
				}, false );
				reader.readAsText( file );
211

M
Mr.doob 已提交
212
				break;
213

M
Mr.doob 已提交
214

M
Mr.doob 已提交
215
			case 'kmz':
M
Mr.doob 已提交
216

M
Mr.doob 已提交
217
				reader.addEventListener( 'load', function ( event ) {
M
Mr.doob 已提交
218

M
Mr.doob 已提交
219 220
					var loader = new THREE.KMZLoader();
					var collada = loader.parse( event.target.result );
M
Mr.doob 已提交
221

M
Mr.doob 已提交
222
					collada.scene.name = filename;
M
Mr.doob 已提交
223

M
Mr.doob 已提交
224
					editor.execute( new AddObjectCommand( collada.scene ) );
M
Mr.doob 已提交
225

M
Mr.doob 已提交
226 227
				}, false );
				reader.readAsArrayBuffer( file );
M
Mr.doob 已提交
228

M
Mr.doob 已提交
229
				break;
M
Mr.doob 已提交
230

M
Mr.doob 已提交
231
			case 'md2':
M
Mr.doob 已提交
232

M
Mr.doob 已提交
233
				reader.addEventListener( 'load', function ( event ) {
M
Mr.doob 已提交
234

M
Mr.doob 已提交
235
					var contents = event.target.result;
M
Mr.doob 已提交
236

M
Mr.doob 已提交
237 238 239 240 241
					var geometry = new THREE.MD2Loader().parse( contents );
					var material = new THREE.MeshStandardMaterial( {
						morphTargets: true,
						morphNormals: true
					} );
M
Mr.doob 已提交
242

M
Mr.doob 已提交
243 244 245
					var mesh = new THREE.Mesh( geometry, material );
					mesh.mixer = new THREE.AnimationMixer( mesh );
					mesh.name = filename;
M
Mr.doob 已提交
246

M
Mr.doob 已提交
247
					editor.execute( new AddObjectCommand( mesh ) );
M
Mr.doob 已提交
248

M
Mr.doob 已提交
249 250
				}, false );
				reader.readAsArrayBuffer( file );
M
Mr.doob 已提交
251

M
Mr.doob 已提交
252
				break;
M
Mr.doob 已提交
253

M
Mr.doob 已提交
254
			case 'obj':
255

M
Mr.doob 已提交
256
				reader.addEventListener( 'load', function ( event ) {
257

M
Mr.doob 已提交
258
					var contents = event.target.result;
259

M
Mr.doob 已提交
260 261
					var object = new THREE.OBJLoader().parse( contents );
					object.name = filename;
262

263
					editor.execute( new AddObjectCommand( object ) );
264

M
Mr.doob 已提交
265 266
				}, false );
				reader.readAsText( file );
267

M
Mr.doob 已提交
268
				break;
269

M
Mr.doob 已提交
270 271 272 273 274 275 276 277 278 279
			case 'playcanvas':

				reader.addEventListener( 'load', function ( event ) {

					var contents = event.target.result;
					var json = JSON.parse( contents );

					var loader = new THREE.PlayCanvasLoader();
					var object = loader.parse( json );

280
					editor.execute( new AddObjectCommand( object ) );
M
Mr.doob 已提交
281 282 283 284 285 286

				}, false );
				reader.readAsText( file );

				break;

M
Mr.doob 已提交
287
			case 'ply':
288

M
Mr.doob 已提交
289
				reader.addEventListener( 'load', function ( event ) {
290

M
Mr.doob 已提交
291
					var contents = event.target.result;
292

M
Mr.doob 已提交
293 294 295
					var geometry = new THREE.PLYLoader().parse( contents );
					geometry.sourceType = "ply";
					geometry.sourceFile = file.name;
296

M
Mr.doob 已提交
297
					var material = new THREE.MeshStandardMaterial();
298

M
Mr.doob 已提交
299 300
					var mesh = new THREE.Mesh( geometry, material );
					mesh.name = filename;
301

302
					editor.execute( new AddObjectCommand( mesh ) );
303

M
Mr.doob 已提交
304 305
				}, false );
				reader.readAsText( file );
306

M
Mr.doob 已提交
307
				break;
308

M
Mr.doob 已提交
309
			case 'stl':
310

M
Mr.doob 已提交
311
				reader.addEventListener( 'load', function ( event ) {
312

M
Mr.doob 已提交
313
					var contents = event.target.result;
314

M
Mr.doob 已提交
315 316 317
					var geometry = new THREE.STLLoader().parse( contents );
					geometry.sourceType = "stl";
					geometry.sourceFile = file.name;
318

M
Mr.doob 已提交
319
					var material = new THREE.MeshStandardMaterial();
320

M
Mr.doob 已提交
321 322
					var mesh = new THREE.Mesh( geometry, material );
					mesh.name = filename;
323

324
					editor.execute( new AddObjectCommand( mesh ) );
325

M
Mr.doob 已提交
326
				}, false );
327

M
Mr.doob 已提交
328
				if ( reader.readAsBinaryString !== undefined ) {
329

M
Mr.doob 已提交
330
					reader.readAsBinaryString( file );
331

M
Mr.doob 已提交
332
				} else {
333

M
Mr.doob 已提交
334
					reader.readAsArrayBuffer( file );
335

M
Mr.doob 已提交
336
				}
337

M
Mr.doob 已提交
338
				break;
339

M
Mr.doob 已提交
340 341
			/*
			case 'utf8':
342

M
Mr.doob 已提交
343
				reader.addEventListener( 'load', function ( event ) {
344

M
Mr.doob 已提交
345
					var contents = event.target.result;
346

M
Mr.doob 已提交
347 348
					var geometry = new THREE.UTF8Loader().parse( contents );
					var material = new THREE.MeshLambertMaterial();
349

M
Mr.doob 已提交
350
					var mesh = new THREE.Mesh( geometry, material );
351

352
					editor.execute( new AddObjectCommand( mesh ) );
353

M
Mr.doob 已提交
354 355
				}, false );
				reader.readAsBinaryString( file );
356

M
Mr.doob 已提交
357 358
				break;
			*/
359

M
Mr.doob 已提交
360
			case 'vtk':
361

M
Mr.doob 已提交
362
				reader.addEventListener( 'load', function ( event ) {
363

M
Mr.doob 已提交
364
					var contents = event.target.result;
365

M
Mr.doob 已提交
366 367 368
					var geometry = new THREE.VTKLoader().parse( contents );
					geometry.sourceType = "vtk";
					geometry.sourceFile = file.name;
369

M
Mr.doob 已提交
370
					var material = new THREE.MeshStandardMaterial();
371

M
Mr.doob 已提交
372 373
					var mesh = new THREE.Mesh( geometry, material );
					mesh.name = filename;
374

375
					editor.execute( new AddObjectCommand( mesh ) );
M
Mr.doob 已提交
376 377 378 379 380 381 382 383 384 385 386 387 388 389

				}, false );
				reader.readAsText( file );

				break;

			case 'wrl':

				reader.addEventListener( 'load', function ( event ) {

					var contents = event.target.result;

					var result = new THREE.VRMLLoader().parse( contents );

390
					editor.execute( new SetSceneCommand( result ) );
391

M
Mr.doob 已提交
392 393 394 395 396
				}, false );
				reader.readAsText( file );

				break;

397 398
			default:

M
Mr.doob 已提交
399
				alert( 'Unsupported file format (' + extension +  ').' );
400 401 402

				break;

M
Mr.doob 已提交
403 404
		}

405
	};
M
Mr.doob 已提交
406

M
Mr.doob 已提交
407
	function handleJSON( data, file, filename ) {
M
Mr.doob 已提交
408 409 410

		if ( data.metadata === undefined ) { // 2.0

411
			data.metadata = { type: 'Geometry' };
M
Mr.doob 已提交
412 413 414 415 416

		}

		if ( data.metadata.type === undefined ) { // 3.0

417
			data.metadata.type = 'Geometry';
M
Mr.doob 已提交
418 419 420

		}

M
Mr.doob 已提交
421
		if ( data.metadata.formatVersion !== undefined ) {
M
Mr.doob 已提交
422 423 424 425 426

			data.metadata.version = data.metadata.formatVersion;

		}

M
Mr.doob 已提交
427
		switch ( data.metadata.type.toLowerCase() ) {
428

M
Mr.doob 已提交
429
			case 'buffergeometry':
430

M
Mr.doob 已提交
431 432
				var loader = new THREE.BufferGeometryLoader();
				var result = loader.parse( data );
433

M
Mr.doob 已提交
434
				var mesh = new THREE.Mesh( result );
435

M
Mr.doob 已提交
436
				editor.execute( new AddObjectCommand( mesh ) );
M
Mr.doob 已提交
437

M
Mr.doob 已提交
438 439 440 441 442 443 444 445
				break;

			case 'geometry':

				var loader = new THREE.JSONLoader();
				loader.setTexturePath( scope.texturePath );

				var result = loader.parse( data );
446

M
Mr.doob 已提交
447 448
				var geometry = result.geometry;
				var material;
M
Mr.doob 已提交
449

M
Mr.doob 已提交
450
				if ( result.materials !== undefined ) {
451

M
Mr.doob 已提交
452
					if ( result.materials.length > 1 ) {
453

M
Mugen87 已提交
454
						material = new THREE.MultiMaterial( result.materials );
455

M
Mr.doob 已提交
456 457 458 459 460
					} else {

						material = result.materials[ 0 ];

					}
461 462 463

				} else {

M
Mr.doob 已提交
464
					material = new THREE.MeshStandardMaterial();
465 466 467

				}

M
Mr.doob 已提交
468 469
				geometry.sourceType = "ascii";
				geometry.sourceFile = file.name;
470

M
Mr.doob 已提交
471
				var mesh;
472

M
Mr.doob 已提交
473
				if ( geometry.animation && geometry.animation.hierarchy ) {
M
Mr.doob 已提交
474

M
Mr.doob 已提交
475
					mesh = new THREE.SkinnedMesh( geometry, material );
M
Mr.doob 已提交
476

M
Mr.doob 已提交
477
				} else {
M
Mr.doob 已提交
478

M
Mr.doob 已提交
479
					mesh = new THREE.Mesh( geometry, material );
M
Mr.doob 已提交
480

M
Mr.doob 已提交
481
				}
M
Mr.doob 已提交
482

M
Mr.doob 已提交
483
				mesh.name = filename;
M
Mr.doob 已提交
484

M
Mr.doob 已提交
485
				editor.execute( new AddObjectCommand( mesh ) );
M
Mr.doob 已提交
486

M
Mr.doob 已提交
487
				break;
M
Mr.doob 已提交
488

M
Mr.doob 已提交
489
			case 'object':
M
Mr.doob 已提交
490

M
Mr.doob 已提交
491 492
				var loader = new THREE.ObjectLoader();
				loader.setTexturePath( scope.texturePath );
M
Mr.doob 已提交
493

M
Mr.doob 已提交
494
				var result = loader.parse( data );
M
Mr.doob 已提交
495

M
Mr.doob 已提交
496
				if ( result instanceof THREE.Scene ) {
497

M
Mr.doob 已提交
498
					editor.execute( new SetSceneCommand( result ) );
M
Mr.doob 已提交
499

M
Mr.doob 已提交
500
				} else {
M
Mr.doob 已提交
501

M
Mr.doob 已提交
502
					editor.execute( new AddObjectCommand( result ) );
M
Mr.doob 已提交
503

M
Mr.doob 已提交
504
				}
M
Mr.doob 已提交
505

M
Mr.doob 已提交
506
				break;
M
Mr.doob 已提交
507

M
Mr.doob 已提交
508
			case 'scene':
M
Mr.doob 已提交
509

M
Mr.doob 已提交
510
				// DEPRECATED
M
Mr.doob 已提交
511

M
Mr.doob 已提交
512 513
				var loader = new THREE.SceneLoader();
				loader.parse( data, function ( result ) {
514

M
Mr.doob 已提交
515
					editor.execute( new SetSceneCommand( result.scene ) );
516

M
Mr.doob 已提交
517
				}, '' );
518

M
Mr.doob 已提交
519
				break;
M
Mr.doob 已提交
520

M
Mr.doob 已提交
521 522
			case 'app':

M
Mr.doob 已提交
523
				editor.fromJSON( data );
M
Mr.doob 已提交
524 525 526

				break;

M
Mr.doob 已提交
527 528
		}

M
Mr.doob 已提交
529
	}
M
Mr.doob 已提交
530

M
Mr.doob 已提交
531
};