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

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

	this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;
M
mese79 已提交
8
	this.texturePath = '';
9 10

};
M
Mr.doob 已提交
11

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

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

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

E
elephantatwork 已提交
18
		if(typeof url !==  "string" ){
M
Mr.doob 已提交
19

E
elephantatwork 已提交
20
			this.parse(url.scene, onLoad);
M
Mr.doob 已提交
21 22


E
elephantatwork 已提交
23 24 25
		}else{

			if ( this.texturePath === '' ) {
M
Mr.doob 已提交
26

E
elephantatwork 已提交
27
				this.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );
M
Mr.doob 已提交
28

E
elephantatwork 已提交
29 30 31
			}

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

E
elephantatwork 已提交
33 34 35 36 37 38 39 40
			var loader = new THREE.XHRLoader( scope.manager );
			loader.setCrossOrigin( this.crossOrigin );
			loader.load( url, function ( text ) {

				scope.parse( JSON.parse( text ), onLoad );

			}, onProgress, onError );
		}
41 42

	},
M
Mr.doob 已提交
43

M
Mr.doob 已提交
44
	setTexturePath: function ( value ) {
45

M
Mr.doob 已提交
46
		this.texturePath = value;
47 48 49

	},

50
	setCrossOrigin: function ( value ) {
M
Mr.doob 已提交
51

52
		this.crossOrigin = value;
M
Mr.doob 已提交
53 54 55

	},

56 57
	parse: function ( json, onLoad ) {

58
		var geometries = this.parseGeometries( json.geometries );
59

60 61 62 63 64
		var images = this.parseImages( json.images, function () {

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

		} );
E
elephantatwork 已提交
65

66 67
		var textures  = this.parseTextures( json.textures, images );
		var materials = this.parseMaterials( json.materials, textures );
68
		var object = this.parseObject( json.object, geometries, materials );
69

70 71 72 73 74
		if ( json.images === undefined || json.images.length === 0 ) {

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

		}
E
elephantatwork 已提交
75
		console.log(object);
76
		return object;
77

78 79 80 81
	},

	parseGeometries: function ( json ) {

M
Mr.doob 已提交
82
		var geometries = {};
83 84

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

86 87
			var geometryLoader = new THREE.JSONLoader();
			var bufferGeometryLoader = new THREE.BufferGeometryLoader();
M
Mr.doob 已提交
88

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

91
				var geometry;
M
Mr.doob 已提交
92
				var data = json[ i ];
93

94
				switch ( data.type ) {
95

96
					case 'PlaneGeometry':
97
					case 'PlaneBufferGeometry':
98

99
						geometry = new THREE[ data.type ](
100 101 102 103 104
							data.width,
							data.height,
							data.widthSegments,
							data.heightSegments
						);
105

106
						break;
107

M
Mr.doob 已提交
108
					case 'BoxGeometry':
109
					case 'CubeGeometry': // backwards compatible
110

M
Mr.doob 已提交
111
						geometry = new THREE.BoxGeometry(
112 113 114 115 116 117 118
							data.width,
							data.height,
							data.depth,
							data.widthSegments,
							data.heightSegments,
							data.depthSegments
						);
119

120
						break;
121

M
Mr.doob 已提交
122 123 124 125 126 127 128 129 130
					case 'CircleGeometry':

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

						break;

131
					case 'CylinderGeometry':
132

133 134 135 136
						geometry = new THREE.CylinderGeometry(
							data.radiusTop,
							data.radiusBottom,
							data.height,
137
							data.radialSegments,
138 139 140
							data.heightSegments,
							data.openEnded
						);
141

142
						break;
143

144
					case 'SphereGeometry':
145

146 147 148 149 150 151 152 153 154
						geometry = new THREE.SphereGeometry(
							data.radius,
							data.widthSegments,
							data.heightSegments,
							data.phiStart,
							data.phiLength,
							data.thetaStart,
							data.thetaLength
						);
155

156
						break;
157

158
					case 'IcosahedronGeometry':
159

160 161 162 163
						geometry = new THREE.IcosahedronGeometry(
							data.radius,
							data.detail
						);
164

165
						break;
166

167
					case 'TorusGeometry':
168

169 170 171 172 173 174 175
						geometry = new THREE.TorusGeometry(
							data.radius,
							data.tube,
							data.radialSegments,
							data.tubularSegments,
							data.arc
						);
176

177
						break;
M
Mr.doob 已提交
178

179
					case 'TorusKnotGeometry':
M
Mr.doob 已提交
180

181 182 183 184 185 186 187 188 189
						geometry = new THREE.TorusKnotGeometry(
							data.radius,
							data.tube,
							data.radialSegments,
							data.tubularSegments,
							data.p,
							data.q,
							data.heightScale
						);
M
Mr.doob 已提交
190

191
						break;
192

193 194
					case 'BufferGeometry':

M
makc 已提交
195
						geometry = bufferGeometryLoader.parse( data );
196 197 198

						break;

199
					case 'Geometry':
200

201
						geometry = geometryLoader.parse( data.data ).geometry;
202

203
						break;
E
elephantatwork 已提交
204

205 206 207 208 209 210 211 212
					case 'TextGeometry':
					
						geometry = new THREE.TextGeometry(
							data.text,
							data.data
						); 
						
						break;
213 214 215

				}

216 217
				geometry.uuid = data.uuid;

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

220
				geometries[ data.uuid ] = geometry;
221

222
			}
M
Mr.doob 已提交
223 224 225

		}

226 227 228
		return geometries;

	},
M
Mr.doob 已提交
229

230
	parseMaterials: function ( json, textures ) {
231

M
Mr.doob 已提交
232
		var materials = {};
233 234

		if ( json !== undefined ) {
235

M
Mr.doob 已提交
236 237 238 239 240 241 242 243 244 245 246 247
			var getTexture = function ( name ) {

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

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

				}

				return textures[ name ];

			};

248
			var loader = new THREE.MaterialLoader();
249

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

M
Mr.doob 已提交
252
				var data = json[ i ];
253
				var material = loader.parse( data );
254

255 256
				material.uuid = data.uuid;

E
elephantatwork 已提交
257 258 259
				if ( data.depthTest !== undefined ) material.depthTest = data.depthTest;
				if ( data.depthWrite !== undefined ) material.depthWrite = data.depthWrite;

260
				if ( data.name !== undefined ) material.name = data.name;
261

E
elephantatwork 已提交
262
				if ( data.map !== undefined ) material.map = getTexture( data.map );
263

E
elephantatwork 已提交
264
				if ( data.alphaMap !== undefined ) {
M
Mr.doob 已提交
265

E
elephantatwork 已提交
266 267 268 269 270
					material.alphaMap = getTexture( data.alphaMap );

					material.transparent = true;

				}	
271

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

M
Mr.doob 已提交
274
					material.bumpMap = getTexture( data.bumpMap );
E
elephantatwork 已提交
275
					if ( data.bumpScale !== undefined) material.bumpScale = data.bumpScale;
276
				}
M
Mr.doob 已提交
277

E
elephantatwork 已提交
278
				if ( data.normalMap !== undefined ) {
M
Mr.doob 已提交
279

E
elephantatwork 已提交
280 281 282
					material.normalMap = getTexture( data.normalMap );
					if ( data.normalScale )	material.normalScale = new THREE.Vector2( data.normalScale, data.normalScale );
					
283
				}
M
Mr.doob 已提交
284

E
elephantatwork 已提交
285 286
				if ( data.specularMap !== undefined ) material.specularMap = getTexture( data.specularMap );

M
Mr.doob 已提交
287 288 289
				if ( data.envMap !== undefined ) {

					material.envMap = getTexture( data.envMap );
E
elephantatwork 已提交
290 291 292 293
					if ( data.reflectivity ) material.reflectivity = data.reflectivity;
					
					material.envMap.mapping = THREE.EquirectangularRefractionMapping;
					material.combine = THREE.MultiplyOperation;
M
Mr.doob 已提交
294

295
				}
M
Mr.doob 已提交
296 297 298 299

				if ( data.lightMap !== undefined ) {

					material.lightMap = getTexture( data.lightMap );
E
elephantatwork 已提交
300
					if ( data.lightMapIntensity !== undefined ) material.lightMapIntensity = data.lightMapIntensity;
301

302
				}
M
Mr.doob 已提交
303

304
				if ( data.aoMap !== undefined ) {
B
Ben Houston 已提交
305

306
					material.aoMap = getTexture( data.aoMap );
307 308
					if ( data.aoMapIntensity !== undefined ) {
						material.aoMapIntensity = data.aoMapIntensity;
B
Ben Houston 已提交
309
					}
B
Ben Houston 已提交
310 311
				}

312
				materials[ data.uuid ] = material;
313 314

			}
315 316 317

		}

318
		return materials;
M
Mr.doob 已提交
319

320
	},
M
Mr.doob 已提交
321

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

M
Mr.doob 已提交
324
		var scope = this;
325 326
		var images = {};

M
Mr.doob 已提交
327 328 329
		if ( json !== undefined && json.length > 0 ) {

			var manager = new THREE.LoadingManager( onLoad );
330 331 332 333

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

334
			var loadImage = function ( url ) {
335

M
Mr.doob 已提交
336
				scope.manager.itemStart( url );
337

338
				return loader.load( url, function () {
339

M
Mr.doob 已提交
340
					scope.manager.itemEnd( url );
341

M
Mr.doob 已提交
342 343 344
				} );

			};
345

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

348
				var image = json[ i ];
E
elephantatwork 已提交
349
				var imageData = image.data64;
350

E
elephantatwork 已提交
351
				images[ image.uuid ] = loadImage(imageData);
352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370

			}

		}

		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 已提交
371 372
				if ( data.image === undefined ) {

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

375 376
				}

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

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

381 382
				}

M
Mr.doob 已提交
383
				var texture = new THREE.Texture( images[ data.image ] );
384 385 386 387 388
				texture.needsUpdate = true;

				texture.uuid = data.uuid;

				if ( data.name !== undefined ) texture.name = data.name;
M
Mr.doob 已提交
389 390 391
				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 ];
392 393 394
				if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;
				if ( data.wrap instanceof Array ) {

M
Mr.doob 已提交
395 396
					texture.wrapS = THREE[ data.wrap[ 0 ] ];
					texture.wrapT = THREE[ data.wrap[ 1 ] ];
397 398 399 400 401 402 403 404 405 406 407 408 409

				}

				textures[ data.uuid ] = texture;

			}

		}

		return textures;

	},

410
	parseObject: function () {
M
Mr.doob 已提交
411

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

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

416
			var object;
M
Mr.doob 已提交
417

M
Mr.doob 已提交
418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441
			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 ];

			};

E
elephantatwork 已提交
442 443 444
			console.log(data);
			console.log(data.type);

445
			switch ( data.type ) {
M
Mr.doob 已提交
446

447
				case 'Scene':
M
Mr.doob 已提交
448

449
					object = new THREE.Scene();
M
Mr.doob 已提交
450

451
					break;
M
Mr.doob 已提交
452

453
				case 'PerspectiveCamera':
M
Mr.doob 已提交
454

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

457
					break;
458

459
				case 'OrthographicCamera':
M
Mr.doob 已提交
460

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

463
					break;
M
Mr.doob 已提交
464

465
				case 'AmbientLight':
M
Mr.doob 已提交
466

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

469
					break;
M
Mr.doob 已提交
470

471
				case 'DirectionalLight':
M
Mr.doob 已提交
472

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

475
					break;
M
Mr.doob 已提交
476

477
				case 'PointLight':
M
Mr.doob 已提交
478

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

481
					break;
M
Mr.doob 已提交
482

483
				case 'SpotLight':
M
Mr.doob 已提交
484

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

487
					break;
M
Mr.doob 已提交
488

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

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

493
					break;
M
Mr.doob 已提交
494

495
				case 'Mesh':
M
Mr.doob 已提交
496

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

499
					break;
M
Mr.doob 已提交
500

M
Mr.doob 已提交
501 502
				case 'Line':

B
bGute 已提交
503
					object = new THREE.Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );
M
Mr.doob 已提交
504 505

					break;
506

M
Mr.doob 已提交
507
				case 'PointCloud':
508

M
Mr.doob 已提交
509
					object = new THREE.PointCloud( getGeometry( data.geometry ), getMaterial( data.material ) );
510 511

					break;
M
Mr.doob 已提交
512

M
Mr.doob 已提交
513 514
				case 'Sprite':

M
Mr.doob 已提交
515
					object = new THREE.Sprite( getMaterial( data.material ) );
M
Mr.doob 已提交
516 517 518

					break;

519 520 521 522 523 524
				case 'Group':

					object = new THREE.Group();

					break;

525 526 527 528 529 530
				default:

					object = new THREE.Object3D();

			}

531 532 533
			object.uuid = data.uuid;

			if ( data.name !== undefined ) object.name = data.name;
534
			if ( data.matrix !== undefined ) {
535

536 537 538 539 540 541 542 543 544 545
				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 );

			}
546

547 548
			if ( data.visible !== undefined ) object.visible = data.visible;
			if ( data.userData !== undefined ) object.userData = data.userData;
549

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

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

554 555 556
					object.add( this.parseObject( data.children[ child ], geometries, materials ) );

				}
M
Mr.doob 已提交
557 558 559

			}

560
			return object;
M
Mr.doob 已提交
561

562
		}
M
Mr.doob 已提交
563

564
	}()
M
Mr.doob 已提交
565

566
};