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
		switch ( extension ) {
18

E
Elijah Snyder 已提交
19 20 21 22 23 24 25 26
			case 'amf':

				var reader = new FileReader();
				reader.addEventListener( 'load', function ( event ) {

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

27
					editor.execute( new AddObjectCommand( amfobject ) );
E
Elijah Snyder 已提交
28 29 30 31 32 33

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

				break;

M
Mr.doob 已提交
34 35 36 37 38 39 40 41
			case 'awd':

				var reader = new FileReader();
				reader.addEventListener( 'load', function ( event ) {

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

42
					editor.execute( new SetSceneCommand( scene ) );
M
Mr.doob 已提交
43 44 45 46 47 48

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

				break;

49 50 51 52 53 54 55 56 57 58 59
			case 'babylon':

				var reader = new FileReader();
				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 );

60
					editor.execute( new SetSceneCommand( scene ) );
61 62 63 64 65 66

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

				break;

67 68 69 70 71 72 73 74 75 76 77
			case 'babylonmeshdata':

				var reader = new FileReader();
				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 已提交
78
					var material = new THREE.MeshStandardMaterial();
79 80 81 82

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

83
					editor.execute( new AddObjectCommand( mesh ) );
84 85 86 87 88 89

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

				break;

M
Mr.doob 已提交
90
			case 'ctm':
91

M
Mr.doob 已提交
92 93
				var reader = new FileReader();
				reader.addEventListener( 'load', function ( event ) {
94

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

M
Mr.doob 已提交
97
					var stream = new CTM.Stream( data );
M
Mr.doob 已提交
98
					stream.offset = 0;
99

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

M
Mr.doob 已提交
103 104
						geometry.sourceType = "ctm";
						geometry.sourceFile = file.name;
105

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

M
Mr.doob 已提交
108 109
						var mesh = new THREE.Mesh( geometry, material );
						mesh.name = filename;
110

111
						editor.execute( new AddObjectCommand( mesh ) );
112

M
Mr.doob 已提交
113
					} );
114

M
Mr.doob 已提交
115
				}, false );
M
Mr.doob 已提交
116
				reader.readAsArrayBuffer( file );
117

M
Mr.doob 已提交
118
				break;
119

M
Mr.doob 已提交
120
			case 'dae':
121

M
Mr.doob 已提交
122 123
				var reader = new FileReader();
				reader.addEventListener( 'load', function ( event ) {
124

M
Mr.doob 已提交
125
					var contents = event.target.result;
126

M
Mr.doob 已提交
127
					var loader = new THREE.ColladaLoader();
M
Mr.doob 已提交
128
					var collada = loader.parse( contents );
129

M
Mr.doob 已提交
130
					collada.scene.name = filename;
131

132
					editor.execute( new AddObjectCommand( collada.scene ) );
133

M
Mr.doob 已提交
134 135
				}, false );
				reader.readAsText( file );
136

M
Mr.doob 已提交
137
				break;
138

M
Mr.doob 已提交
139 140
			case 'js':
			case 'json':
M
Mr.doob 已提交
141

142 143 144
			case '3geo':
			case '3mat':
			case '3obj':
M
Mr.doob 已提交
145
			case '3scn':
146

M
Mr.doob 已提交
147 148
				var reader = new FileReader();
				reader.addEventListener( 'load', function ( event ) {
149

M
Mr.doob 已提交
150
					var contents = event.target.result;
151

M
Mr.doob 已提交
152
					// 2.0
153

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

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

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

M
Mr.doob 已提交
161
						worker.onmessage = function ( event ) {
162

M
Mr.doob 已提交
163
							event.data.metadata = { version: 2 };
M
Mr.doob 已提交
164
							handleJSON( event.data, file, filename );
165

M
Mr.doob 已提交
166
						};
167

M
Mr.doob 已提交
168
						worker.postMessage( Date.now() );
169

M
Mr.doob 已提交
170
						return;
171

M
Mr.doob 已提交
172
					}
173

M
Mr.doob 已提交
174
					// >= 3.0
175

M
Mr.doob 已提交
176
					var data;
177

M
Mr.doob 已提交
178
					try {
179

M
Mr.doob 已提交
180
						data = JSON.parse( contents );
181

M
Mr.doob 已提交
182
					} catch ( error ) {
183

M
Mr.doob 已提交
184 185
						alert( error );
						return;
186

M
Mr.doob 已提交
187
					}
188

M
Mr.doob 已提交
189
					handleJSON( data, file, filename );
190

M
Mr.doob 已提交
191 192
				}, false );
				reader.readAsText( file );
193

M
Mr.doob 已提交
194
				break;
195

M
Mr.doob 已提交
196 197 198 199 200 201 202 203 204 205 206

				case 'kmz':

					var reader = new FileReader();
					reader.addEventListener( 'load', function ( event ) {

						var loader = new THREE.KMZLoader();
						var collada = loader.parse( event.target.result );

						collada.scene.name = filename;

207
						editor.execute( new AddObjectCommand( collada.scene ) );
M
Mr.doob 已提交
208 209 210 211 212 213

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

					break;

M
Mr.doob 已提交
214 215 216 217 218 219 220 221
				case 'md2':

					var reader = new FileReader();
					reader.addEventListener( 'load', function ( event ) {

						var contents = event.target.result;

						var geometry = new THREE.MD2Loader().parse( contents );
M
Mr.doob 已提交
222
						var material = new THREE.MeshStandardMaterial( {
M
Mr.doob 已提交
223 224 225
							morphTargets: true,
							morphNormals: true
						} );
M
Mr.doob 已提交
226

M
Mr.doob 已提交
227 228 229
						var mesh = new THREE.Mesh( geometry, material );
						mesh.mixer = new THREE.AnimationMixer( mesh )
						mesh.name = filename;
M
Mr.doob 已提交
230

231
						editor.execute( new AddObjectCommand( mesh ) );
M
Mr.doob 已提交
232 233 234 235 236 237

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

					break;

M
Mr.doob 已提交
238
			case 'obj':
239

M
Mr.doob 已提交
240 241
				var reader = new FileReader();
				reader.addEventListener( 'load', function ( event ) {
242

M
Mr.doob 已提交
243
					var contents = event.target.result;
244

M
Mr.doob 已提交
245 246
					var object = new THREE.OBJLoader().parse( contents );
					object.name = filename;
247

248
					editor.execute( new AddObjectCommand( object ) );
249

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

M
Mr.doob 已提交
253
				break;
254

M
Mr.doob 已提交
255 256 257 258 259 260 261 262 263 264 265
			case 'playcanvas':

				var reader = new FileReader();
				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 );

266
					editor.execute( new AddObjectCommand( object ) );
M
Mr.doob 已提交
267 268 269 270 271 272

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

				break;

M
Mr.doob 已提交
273
			case 'ply':
274

M
Mr.doob 已提交
275 276
				var reader = new FileReader();
				reader.addEventListener( 'load', function ( event ) {
277

M
Mr.doob 已提交
278
					var contents = event.target.result;
279

M
Mr.doob 已提交
280 281 282
					var geometry = new THREE.PLYLoader().parse( contents );
					geometry.sourceType = "ply";
					geometry.sourceFile = file.name;
283

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

M
Mr.doob 已提交
286 287
					var mesh = new THREE.Mesh( geometry, material );
					mesh.name = filename;
288

289
					editor.execute( new AddObjectCommand( mesh ) );
290

M
Mr.doob 已提交
291 292
				}, false );
				reader.readAsText( file );
293

M
Mr.doob 已提交
294
				break;
295

M
Mr.doob 已提交
296
			case 'stl':
297

M
Mr.doob 已提交
298 299
				var reader = new FileReader();
				reader.addEventListener( 'load', function ( event ) {
300

M
Mr.doob 已提交
301
					var contents = event.target.result;
302

M
Mr.doob 已提交
303 304 305
					var geometry = new THREE.STLLoader().parse( contents );
					geometry.sourceType = "stl";
					geometry.sourceFile = file.name;
306

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

M
Mr.doob 已提交
309 310
					var mesh = new THREE.Mesh( geometry, material );
					mesh.name = filename;
311

312
					editor.execute( new AddObjectCommand( mesh ) );
313

M
Mr.doob 已提交
314
				}, false );
315

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

M
Mr.doob 已提交
318
					reader.readAsBinaryString( file );
319

M
Mr.doob 已提交
320
				} else {
321

M
Mr.doob 已提交
322
					reader.readAsArrayBuffer( file );
323

M
Mr.doob 已提交
324
				}
325

M
Mr.doob 已提交
326
				break;
327

M
Mr.doob 已提交
328 329
			/*
			case 'utf8':
330

M
Mr.doob 已提交
331 332
				var reader = new FileReader();
				reader.addEventListener( 'load', function ( event ) {
333

M
Mr.doob 已提交
334
					var contents = event.target.result;
335

M
Mr.doob 已提交
336 337
					var geometry = new THREE.UTF8Loader().parse( contents );
					var material = new THREE.MeshLambertMaterial();
338

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

341
					editor.execute( new AddObjectCommand( mesh ) );
342

M
Mr.doob 已提交
343 344
				}, false );
				reader.readAsBinaryString( file );
345

M
Mr.doob 已提交
346 347
				break;
			*/
348

M
Mr.doob 已提交
349
			case 'vtk':
350

M
Mr.doob 已提交
351 352
				var reader = new FileReader();
				reader.addEventListener( 'load', function ( event ) {
353

M
Mr.doob 已提交
354
					var contents = event.target.result;
355

M
Mr.doob 已提交
356 357 358
					var geometry = new THREE.VTKLoader().parse( contents );
					geometry.sourceType = "vtk";
					geometry.sourceFile = file.name;
359

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

M
Mr.doob 已提交
362 363
					var mesh = new THREE.Mesh( geometry, material );
					mesh.name = filename;
364

365
					editor.execute( new AddObjectCommand( mesh ) );
M
Mr.doob 已提交
366 367 368 369 370 371 372 373 374 375 376 377 378 379 380

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

				break;

			case 'wrl':

				var reader = new FileReader();
				reader.addEventListener( 'load', function ( event ) {

					var contents = event.target.result;

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

381
					editor.execute( new SetSceneCommand( result ) );
382

M
Mr.doob 已提交
383 384 385 386 387
				}, false );
				reader.readAsText( file );

				break;

388 389
			default:

M
Mr.doob 已提交
390
				alert( 'Unsupported file format (' + extension +  ').' );
391 392 393

				break;

M
Mr.doob 已提交
394 395 396 397
		}

	}

M
Mr.doob 已提交
398 399 400 401
	var handleJSON = function ( data, file, filename ) {

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

402
			data.metadata = { type: 'Geometry' };
M
Mr.doob 已提交
403 404 405 406 407

		}

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

408
			data.metadata.type = 'Geometry';
M
Mr.doob 已提交
409 410 411 412 413 414 415 416 417

		}

		if ( data.metadata.version === undefined ) {

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

		}

418 419 420 421 422 423 424
		if ( data.metadata.type === 'BufferGeometry' ) {

			var loader = new THREE.BufferGeometryLoader();
			var result = loader.parse( data );

			var mesh = new THREE.Mesh( result );

425
			editor.execute( new AddObjectCommand( mesh ) );
426 427

		} else if ( data.metadata.type.toLowerCase() === 'geometry' ) {
M
Mr.doob 已提交
428 429

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

M
Mr.doob 已提交
432 433 434
			var result = loader.parse( data );

			var geometry = result.geometry;
435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450
			var material;

			if ( result.materials !== undefined ) {

				if ( result.materials.length > 1 ) {

					material = new THREE.MeshFaceMaterial( result.materials );

				} else {

					material = result.materials[ 0 ];

				}

			} else {

M
Mr.doob 已提交
451
				material = new THREE.MeshStandardMaterial();
452 453

			}
M
Mr.doob 已提交
454 455 456 457

			geometry.sourceType = "ascii";
			geometry.sourceFile = file.name;

M
Mr.doob 已提交
458 459 460 461 462 463 464 465 466 467 468 469
			var mesh;

			if ( geometry.animation && geometry.animation.hierarchy ) {

				mesh = new THREE.SkinnedMesh( geometry, material );

			} else {

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

			}

M
Mr.doob 已提交
470 471
			mesh.name = filename;

472
			editor.execute( new AddObjectCommand( mesh ) );
M
Mr.doob 已提交
473

474
		} else if ( data.metadata.type.toLowerCase() === 'object' ) {
M
Mr.doob 已提交
475 476

			var loader = new THREE.ObjectLoader();
477 478
			loader.setTexturePath( scope.texturePath );

M
Mr.doob 已提交
479 480 481 482
			var result = loader.parse( data );

			if ( result instanceof THREE.Scene ) {

483
				editor.execute( new SetSceneCommand( result ) );
M
Mr.doob 已提交
484 485 486

			} else {

487
				editor.execute( new AddObjectCommand( result ) );
M
Mr.doob 已提交
488 489 490

			}

491
		} else if ( data.metadata.type.toLowerCase() === 'scene' ) {
M
Mr.doob 已提交
492

493 494 495 496 497
			// DEPRECATED

			var loader = new THREE.SceneLoader();
			loader.parse( data, function ( result ) {

498
				editor.execute( new SetSceneCommand( result.scene ) );
499 500

			}, '' );
M
Mr.doob 已提交
501 502 503 504 505

		}

	};

M
Mr.doob 已提交
506
}