Loader.js 9.7 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 );

D
Daniel 已提交
27
					editor.execute( new CmdAddObject( 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 CmdSetScene( 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 CmdSetScene( scene ) );
61 62 63 64 65 66

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

				break;

67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
			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 );
					var material = new THREE.MeshPhongMaterial();

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

83
					editor.execute( new CmdAddObject( 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.MeshPhongMaterial();
107

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

111
						editor.execute( new CmdAddObject( 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 CmdAddObject( 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 CmdAddObject( 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 223 224 225
						var material = new THREE.MeshPhongMaterial( {
							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 CmdAddObject( 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 CmdAddObject( object ) );
249

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

M
Mr.doob 已提交
253
				break;
254

M
Mr.doob 已提交
255
			case 'ply':
256

M
Mr.doob 已提交
257 258
				var reader = new FileReader();
				reader.addEventListener( 'load', function ( event ) {
259

M
Mr.doob 已提交
260
					var contents = event.target.result;
261

M
Mr.doob 已提交
262 263 264
					var geometry = new THREE.PLYLoader().parse( contents );
					geometry.sourceType = "ply";
					geometry.sourceFile = file.name;
265

M
Mr.doob 已提交
266
					var material = new THREE.MeshPhongMaterial();
267

M
Mr.doob 已提交
268 269
					var mesh = new THREE.Mesh( geometry, material );
					mesh.name = filename;
270

271
					editor.execute( new CmdAddObject( mesh ) );
272

M
Mr.doob 已提交
273 274
				}, false );
				reader.readAsText( file );
275

M
Mr.doob 已提交
276
				break;
277

M
Mr.doob 已提交
278
			case 'stl':
279

M
Mr.doob 已提交
280 281
				var reader = new FileReader();
				reader.addEventListener( 'load', function ( event ) {
282

M
Mr.doob 已提交
283
					var contents = event.target.result;
284

M
Mr.doob 已提交
285 286 287
					var geometry = new THREE.STLLoader().parse( contents );
					geometry.sourceType = "stl";
					geometry.sourceFile = file.name;
288

M
Mr.doob 已提交
289
					var material = new THREE.MeshPhongMaterial();
290

M
Mr.doob 已提交
291 292
					var mesh = new THREE.Mesh( geometry, material );
					mesh.name = filename;
293

294
					editor.execute( new CmdAddObject( mesh ) );
295

M
Mr.doob 已提交
296
				}, false );
297

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

M
Mr.doob 已提交
300
					reader.readAsBinaryString( file );
301

M
Mr.doob 已提交
302
				} else {
303

M
Mr.doob 已提交
304
					reader.readAsArrayBuffer( file );
305

M
Mr.doob 已提交
306
				}
307

M
Mr.doob 已提交
308
				break;
309

M
Mr.doob 已提交
310 311
			/*
			case 'utf8':
312

M
Mr.doob 已提交
313 314
				var reader = new FileReader();
				reader.addEventListener( 'load', function ( event ) {
315

M
Mr.doob 已提交
316
					var contents = event.target.result;
317

M
Mr.doob 已提交
318 319
					var geometry = new THREE.UTF8Loader().parse( contents );
					var material = new THREE.MeshLambertMaterial();
320

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

323
					editor.execute( new CmdAddObject( mesh ) );
324

M
Mr.doob 已提交
325 326
				}, false );
				reader.readAsBinaryString( file );
327

M
Mr.doob 已提交
328 329
				break;
			*/
330

M
Mr.doob 已提交
331
			case 'vtk':
332

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

M
Mr.doob 已提交
336
					var contents = event.target.result;
337

M
Mr.doob 已提交
338 339 340
					var geometry = new THREE.VTKLoader().parse( contents );
					geometry.sourceType = "vtk";
					geometry.sourceFile = file.name;
341

M
Mr.doob 已提交
342
					var material = new THREE.MeshPhongMaterial();
343

M
Mr.doob 已提交
344 345
					var mesh = new THREE.Mesh( geometry, material );
					mesh.name = filename;
346

347
					editor.execute( new CmdAddObject( mesh ) );
M
Mr.doob 已提交
348 349 350 351 352 353 354 355 356 357 358 359 360 361 362

				}, 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 );

363
					editor.execute( new CmdSetScene( result ) );
364

M
Mr.doob 已提交
365 366 367 368 369
				}, false );
				reader.readAsText( file );

				break;

370 371
			default:

M
Mr.doob 已提交
372
				alert( 'Unsupported file format (' + extension +  ').' );
373 374 375

				break;

M
Mr.doob 已提交
376 377 378 379
		}

	}

M
Mr.doob 已提交
380 381 382 383
	var handleJSON = function ( data, file, filename ) {

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

384
			data.metadata = { type: 'Geometry' };
M
Mr.doob 已提交
385 386 387 388 389

		}

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

390
			data.metadata.type = 'Geometry';
M
Mr.doob 已提交
391 392 393 394 395 396 397 398 399

		}

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

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

		}

400 401 402 403 404 405 406
		if ( data.metadata.type === 'BufferGeometry' ) {

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

			var mesh = new THREE.Mesh( result );

407
			editor.execute( new CmdAddObject( mesh ) );
408 409

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

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

M
Mr.doob 已提交
414 415 416
			var result = loader.parse( data );

			var geometry = result.geometry;
417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435
			var material;

			if ( result.materials !== undefined ) {

				if ( result.materials.length > 1 ) {

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

				} else {

					material = result.materials[ 0 ];

				}

			} else {

				material = new THREE.MeshPhongMaterial();

			}
M
Mr.doob 已提交
436 437 438 439

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

M
Mr.doob 已提交
440 441 442 443 444 445 446 447 448 449 450 451
			var mesh;

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

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

			} else {

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

			}

M
Mr.doob 已提交
452 453
			mesh.name = filename;

454
			editor.execute( new CmdAddObject( mesh ) );
M
Mr.doob 已提交
455

456
		} else if ( data.metadata.type.toLowerCase() === 'object' ) {
M
Mr.doob 已提交
457 458

			var loader = new THREE.ObjectLoader();
459 460
			loader.setTexturePath( scope.texturePath );

M
Mr.doob 已提交
461 462 463 464
			var result = loader.parse( data );

			if ( result instanceof THREE.Scene ) {

465
				editor.execute( new CmdSetScene( result ) );
M
Mr.doob 已提交
466 467 468

			} else {

469
				editor.execute( new CmdAddObject( result ) );
M
Mr.doob 已提交
470 471 472

			}

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

475 476 477 478 479
			// DEPRECATED

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

480
				editor.execute( new CmdSetScene( result.scene ) );
481 482

			}, '' );
M
Mr.doob 已提交
483 484 485 486 487

		}

	};

M
Mr.doob 已提交
488
}