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

5 6 7 8 9
THREE.ObjectLoader = function ( manager ) {

	this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;

};
M
Mr.doob 已提交
10

11
THREE.ObjectLoader.prototype = {
M
Mr.doob 已提交
12

13
	constructor: THREE.ObjectLoader,
M
Mr.doob 已提交
14

15
	load: function ( url, onLoad, onProgress, onError ) {
M
Mr.doob 已提交
16

M
Mr.doob 已提交
17 18 19 20 21 22
		if ( this.texturePath === undefined ) {

			this.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );

		}

M
Mr.doob 已提交
23 24
		var scope = this;

25
		var loader = new THREE.XHRLoader( scope.manager );
26 27
		loader.setCrossOrigin( this.crossOrigin );
		loader.load( url, function ( text ) {
M
Mr.doob 已提交
28

29
			scope.parse( JSON.parse( text ), onLoad );
M
Mr.doob 已提交
30

31
		}, onProgress, onError );
32 33

	},
M
Mr.doob 已提交
34

M
Mr.doob 已提交
35
	setTexturePath: function ( value ) {
36

M
Mr.doob 已提交
37
		this.texturePath = value;
38 39 40

	},

41
	setCrossOrigin: function ( value ) {
M
Mr.doob 已提交
42

43
		this.crossOrigin = value;
M
Mr.doob 已提交
44 45 46

	},

47 48
	parse: function ( json, onLoad ) {

49
		var geometries = this.parseGeometries( json.geometries );
50

51 52 53 54 55
		var images = this.parseImages( json.images, function () {

			if ( onLoad !== undefined ) onLoad( object );

		} );
56 57
		var textures  = this.parseTextures( json.textures, images );
		var materials = this.parseMaterials( json.materials, textures );
58
		var object = this.parseObject( json.object, geometries, materials );
59

60 61 62 63 64 65
		if ( json.images === undefined || json.images.length === 0 ) {

			if ( onLoad !== undefined ) onLoad( object );

		}

66
		return object;
67

68 69 70 71
	},

	parseGeometries: function ( json ) {

M
Mr.doob 已提交
72
		var geometries = {};
73 74

		if ( json !== undefined ) {
M
Mr.doob 已提交
75

76 77
			var geometryLoader = new THREE.JSONLoader();
			var bufferGeometryLoader = new THREE.BufferGeometryLoader();
M
Mr.doob 已提交
78

M
Mr.doob 已提交
79
			for ( var i = 0, l = json.length; i < l; i ++ ) {
80

81
				var geometry;
M
Mr.doob 已提交
82
				var data = json[ i ];
83

84
				switch ( data.type ) {
85

86
					case 'PlaneGeometry':
87

88 89 90 91 92 93
						geometry = new THREE.PlaneGeometry(
							data.width,
							data.height,
							data.widthSegments,
							data.heightSegments
						);
94

95
						break;
96

M
Mr.doob 已提交
97
					case 'BoxGeometry':
98
					case 'CubeGeometry': // backwards compatible
99

M
Mr.doob 已提交
100
						geometry = new THREE.BoxGeometry(
101 102 103 104 105 106 107
							data.width,
							data.height,
							data.depth,
							data.widthSegments,
							data.heightSegments,
							data.depthSegments
						);
108

109
						break;
110

M
Mr.doob 已提交
111 112 113 114 115 116 117 118 119
					case 'CircleGeometry':

						geometry = new THREE.CircleGeometry(
							data.radius,
							data.segments
						);

						break;

120
					case 'CylinderGeometry':
121

122 123 124 125
						geometry = new THREE.CylinderGeometry(
							data.radiusTop,
							data.radiusBottom,
							data.height,
126
							data.radialSegments,
127 128 129
							data.heightSegments,
							data.openEnded
						);
130

131
						break;
132

133
					case 'SphereGeometry':
134

135 136 137 138 139 140 141 142 143
						geometry = new THREE.SphereGeometry(
							data.radius,
							data.widthSegments,
							data.heightSegments,
							data.phiStart,
							data.phiLength,
							data.thetaStart,
							data.thetaLength
						);
144

145
						break;
146

147
					case 'IcosahedronGeometry':
148

149 150 151 152
						geometry = new THREE.IcosahedronGeometry(
							data.radius,
							data.detail
						);
153

154
						break;
155

156
					case 'TorusGeometry':
157

158 159 160 161 162 163 164
						geometry = new THREE.TorusGeometry(
							data.radius,
							data.tube,
							data.radialSegments,
							data.tubularSegments,
							data.arc
						);
165

166
						break;
M
Mr.doob 已提交
167

168
					case 'TorusKnotGeometry':
M
Mr.doob 已提交
169

170 171 172 173 174 175 176 177 178
						geometry = new THREE.TorusKnotGeometry(
							data.radius,
							data.tube,
							data.radialSegments,
							data.tubularSegments,
							data.p,
							data.q,
							data.heightScale
						);
M
Mr.doob 已提交
179

180
						break;
181

182 183 184 185 186 187
					case 'BufferGeometry':

						geometry = bufferGeometryLoader.parse( data.data );

						break;

188
					case 'Geometry':
189

190
						geometry = geometryLoader.parse( data.data ).geometry;
191

192 193 194 195
						break;

				}

196 197
				geometry.uuid = data.uuid;

198
				if ( data.name !== undefined ) geometry.name = data.name;
M
Mr.doob 已提交
199

200
				geometries[ data.uuid ] = geometry;
201

202
			}
M
Mr.doob 已提交
203 204 205

		}

206 207 208
		return geometries;

	},
M
Mr.doob 已提交
209

210
	parseMaterials: function ( json, textures ) {
211

M
Mr.doob 已提交
212
		var materials = {};
213 214

		if ( json !== undefined ) {
215

M
Mr.doob 已提交
216 217 218 219 220 221 222 223 224 225 226 227
			var getTexture = function ( name ) {

				if ( textures[ name ] === undefined ) {

					THREE.warn( 'THREE.ObjectLoader: Undefined texture', name );

				}

				return textures[ name ];

			};

228
			var loader = new THREE.MaterialLoader();
229

M
Mr.doob 已提交
230
			for ( var i = 0, l = json.length; i < l; i ++ ) {
231

M
Mr.doob 已提交
232
				var data = json[ i ];
233
				var material = loader.parse( data );
234

235 236
				material.uuid = data.uuid;

237
				if ( data.name !== undefined ) material.name = data.name;
238

M
Mr.doob 已提交
239
				if ( data.map !== undefined ) {
240

M
Mr.doob 已提交
241
					material.map = getTexture( data.map );
M
Mr.doob 已提交
242

M
Mr.doob 已提交
243
				}
244

M
Mr.doob 已提交
245
				if ( data.bumpMap !== undefined ) {
M
Mr.doob 已提交
246

M
Mr.doob 已提交
247
					material.bumpMap = getTexture( data.bumpMap );
248 249

				}
M
Mr.doob 已提交
250 251 252 253 254

				if ( data.alphaMap !== undefined ) {

					material.alphaMap = getTexture( data.alphaMap );

255
				}
M
Mr.doob 已提交
256 257 258 259 260

				if ( data.envMap !== undefined ) {

					material.envMap = getTexture( data.envMap );

261
				}
M
Mr.doob 已提交
262 263 264 265 266

				if ( data.normalMap !== undefined ) {

					material.normalMap = getTexture( data.normalMap );

267
				}
M
Mr.doob 已提交
268 269 270 271 272

				if ( data.lightMap !== undefined ) {

					material.lightMap = getTexture( data.lightMap );

273
				}
M
Mr.doob 已提交
274 275 276 277 278

				if ( data.specularMap !== undefined ) {

					material.specularMap = getTexture( data.specularMap );

279
				}
280

281
				materials[ data.uuid ] = material;
282 283

			}
284 285 286

		}

287
		return materials;
M
Mr.doob 已提交
288

289
	},
M
Mr.doob 已提交
290

M
Mr.doob 已提交
291
	parseImages: function ( json, onLoad ) {
292

M
Mr.doob 已提交
293
		var scope = this;
294 295
		var images = {};

M
Mr.doob 已提交
296 297 298
		if ( json !== undefined && json.length > 0 ) {

			var manager = new THREE.LoadingManager( onLoad );
299 300 301 302

			var loader = new THREE.ImageLoader( manager );
			loader.setCrossOrigin( this.crossOrigin );

303
			var loadImage = function ( url ) {
304

M
Mr.doob 已提交
305
				scope.manager.itemStart( url );
306

307
				return loader.load( url, function () {
308

M
Mr.doob 已提交
309
					scope.manager.itemEnd( url );
310

M
Mr.doob 已提交
311 312 313
				} );

			};
314

M
Mr.doob 已提交
315
			for ( var i = 0, l = json.length; i < l; i ++ ) {
316

317 318 319
				var image = json[ i ];

				images[ image.uuid ] = loadImage( scope.texturePath + image.url );
320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338

			}

		}

		return images;

	},

	parseTextures: function ( json, images ) {

		var textures = {};

		if ( json !== undefined ) {

			for ( var i = 0, l = json.length; i < l; i ++ ) {

				var data = json[ i ];

M
Mr.doob 已提交
339 340
				if ( data.image === undefined ) {

M
Mr.doob 已提交
341
					THREE.warn( 'THREE.ObjectLoader: No "image" speficied for', data.uuid );
M
Mr.doob 已提交
342

343 344
				}

M
Mr.doob 已提交
345 346
				if ( images[ data.image ] === undefined ) {

M
Mr.doob 已提交
347
					THREE.warn( 'THREE.ObjectLoader: Undefined image', data.image );
M
Mr.doob 已提交
348

349 350
				}

M
Mr.doob 已提交
351
				var texture = new THREE.Texture( images[ data.image ] );
352 353 354 355 356
				texture.needsUpdate = true;

				texture.uuid = data.uuid;

				if ( data.name !== undefined ) texture.name = data.name;
M
Mr.doob 已提交
357 358 359
				if ( data.repeat !== undefined ) texture.repeat = new THREE.Vector2( data.repeat[ 0 ], data.repeat[ 1 ] );
				if ( data.minFilter !== undefined ) texture.minFilter = THREE[ data.minFilter ];
				if ( data.magFilter !== undefined ) texture.magFilter = THREE[ data.magFilter ];
360 361 362
				if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;
				if ( data.wrap instanceof Array ) {

M
Mr.doob 已提交
363 364
					texture.wrapS = THREE[ data.wrap[ 0 ] ];
					texture.wrapT = THREE[ data.wrap[ 1 ] ];
365 366 367 368 369 370 371 372 373 374 375 376 377

				}

				textures[ data.uuid ] = texture;

			}

		}

		return textures;

	},

378
	parseObject: function () {
M
Mr.doob 已提交
379

380
		var matrix = new THREE.Matrix4();
M
Mr.doob 已提交
381

382
		return function ( data, geometries, materials ) {
M
Mr.doob 已提交
383

384
			var object;
M
Mr.doob 已提交
385

M
Mr.doob 已提交
386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409
			var getGeometry = function ( name ) {

				if ( geometries[ name ] === undefined ) {

					THREE.warn( 'THREE.ObjectLoader: Undefined geometry', name );

				}

				return geometries[ name ];

			};

			var getMaterial = function ( name ) {

				if ( materials[ name ] === undefined ) {

					THREE.warn( 'THREE.ObjectLoader: Undefined material', name );

				}

				return materials[ name ];

			};

410
			switch ( data.type ) {
M
Mr.doob 已提交
411

412
				case 'Scene':
M
Mr.doob 已提交
413

414
					object = new THREE.Scene();
M
Mr.doob 已提交
415

416
					break;
M
Mr.doob 已提交
417

418
				case 'PerspectiveCamera':
M
Mr.doob 已提交
419

420
					object = new THREE.PerspectiveCamera( data.fov, data.aspect, data.near, data.far );
M
Mr.doob 已提交
421

422
					break;
423

424
				case 'OrthographicCamera':
M
Mr.doob 已提交
425

426
					object = new THREE.OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );
427

428
					break;
M
Mr.doob 已提交
429

430
				case 'AmbientLight':
M
Mr.doob 已提交
431

432
					object = new THREE.AmbientLight( data.color );
M
Mr.doob 已提交
433

434
					break;
M
Mr.doob 已提交
435

436
				case 'DirectionalLight':
M
Mr.doob 已提交
437

438
					object = new THREE.DirectionalLight( data.color, data.intensity );
M
Mr.doob 已提交
439

440
					break;
M
Mr.doob 已提交
441

442
				case 'PointLight':
M
Mr.doob 已提交
443

M
Mr.doob 已提交
444
					object = new THREE.PointLight( data.color, data.intensity, data.distance, data.decay );
M
Mr.doob 已提交
445

446
					break;
M
Mr.doob 已提交
447

448
				case 'SpotLight':
M
Mr.doob 已提交
449

M
Mr.doob 已提交
450
					object = new THREE.SpotLight( data.color, data.intensity, data.distance, data.angle, data.exponent, data.decay );
M
Mr.doob 已提交
451

452
					break;
M
Mr.doob 已提交
453

454
				case 'HemisphereLight':
M
Mr.doob 已提交
455

456
					object = new THREE.HemisphereLight( data.color, data.groundColor, data.intensity );
M
Mr.doob 已提交
457

458
					break;
M
Mr.doob 已提交
459

460
				case 'Mesh':
M
Mr.doob 已提交
461

M
Mr.doob 已提交
462
					object = new THREE.Mesh( getGeometry( data.geometry ), getMaterial( data.material ) );
M
Mr.doob 已提交
463

464
					break;
M
Mr.doob 已提交
465

M
Mr.doob 已提交
466 467
				case 'Line':

M
Mr.doob 已提交
468
					object = new THREE.Line( getGeometry( data.geometry ), getMaterial( data.material ) );
M
Mr.doob 已提交
469 470

					break;
471

M
Mr.doob 已提交
472
				case 'PointCloud':
473

M
Mr.doob 已提交
474
					object = new THREE.PointCloud( getGeometry( data.geometry ), getMaterial( data.material ) );
475 476

					break;
M
Mr.doob 已提交
477

M
Mr.doob 已提交
478 479
				case 'Sprite':

M
Mr.doob 已提交
480
					object = new THREE.Sprite( getMaterial( data.material ) );
M
Mr.doob 已提交
481 482 483

					break;

484 485 486 487 488 489
				case 'Group':

					object = new THREE.Group();

					break;

490 491 492 493 494 495
				default:

					object = new THREE.Object3D();

			}

496 497 498
			object.uuid = data.uuid;

			if ( data.name !== undefined ) object.name = data.name;
499
			if ( data.matrix !== undefined ) {
500

501 502 503 504 505 506 507 508 509 510
				matrix.fromArray( data.matrix );
				matrix.decompose( object.position, object.quaternion, object.scale );

			} else {

				if ( data.position !== undefined ) object.position.fromArray( data.position );
				if ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );
				if ( data.scale !== undefined ) object.scale.fromArray( data.scale );

			}
511

512 513
			if ( data.visible !== undefined ) object.visible = data.visible;
			if ( data.userData !== undefined ) object.userData = data.userData;
514

515
			if ( data.children !== undefined ) {
M
Mr.doob 已提交
516

517
				for ( var child in data.children ) {
M
Mr.doob 已提交
518

519 520 521
					object.add( this.parseObject( data.children[ child ], geometries, materials ) );

				}
M
Mr.doob 已提交
522 523 524

			}

525
			return object;
M
Mr.doob 已提交
526

527
		}
M
Mr.doob 已提交
528

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

531
};