ObjectLoader.js 10.8 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
					case 'TextGeometry':
206

207 208 209
						geometry = new THREE.TextGeometry(
							data.text,
							data.data
210 211
						);

212
						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
					material.alphaMap = getTexture( data.alphaMap );
					material.transparent = true;

269
				}
M
Mr.doob 已提交
270

271 272
				if ( data.bumpMap !== undefined ) material.bumpMap = getTexture( data.bumpMap );
				if ( data.bumpScale !== undefined ) material.bumpScale = data.bumpScale;
M
Mr.doob 已提交
273

274 275
				if ( data.normalMap !== undefined ) material.normalMap = getTexture( data.normalMap );
				if ( data.normalScale )	material.normalScale = new THREE.Vector2( data.normalScale, data.normalScale );
M
Mr.doob 已提交
276

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

M
Mr.doob 已提交
279 280 281
				if ( data.envMap !== undefined ) {

					material.envMap = getTexture( data.envMap );
E
elephantatwork 已提交
282
					material.combine = THREE.MultiplyOperation;
M
Mr.doob 已提交
283

284
				}
M
Mr.doob 已提交
285

286
				if ( data.reflectivity ) material.reflectivity = data.reflectivity;
M
Mr.doob 已提交
287

288 289
				if ( data.lightMap !== undefined ) material.lightMap = getTexture( data.lightMap );
				if ( data.lightMapIntensity !== undefined ) material.lightMapIntensity = data.lightMapIntensity;
290

291 292
				if ( data.aoMap !== undefined ) material.aoMap = getTexture( data.aoMap );
				if ( data.aoMapIntensity !== undefined ) material.aoMapIntensity = data.aoMapIntensity;
B
Ben Houston 已提交
293

294
				materials[ data.uuid ] = material;
295 296

			}
297 298 299

		}

300
		return materials;
M
Mr.doob 已提交
301

302
	},
M
Mr.doob 已提交
303

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

M
Mr.doob 已提交
306
		var scope = this;
307 308
		var images = {};

M
Mr.doob 已提交
309 310 311
		if ( json !== undefined && json.length > 0 ) {

			var manager = new THREE.LoadingManager( onLoad );
312 313 314 315

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

316
			var loadImage = function ( url ) {
317

M
Mr.doob 已提交
318
				scope.manager.itemStart( url );
319

320
				return loader.load( url, function () {
321

M
Mr.doob 已提交
322
					scope.manager.itemEnd( url );
323

M
Mr.doob 已提交
324 325 326
				} );

			};
327

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

330
				var image = json[ i ];
331
				images[ image.uuid ] = loadImage( image.src );
332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350

			}

		}

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

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

355 356
				}

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

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

361 362
				}

M
Mr.doob 已提交
363
				var texture = new THREE.Texture( images[ data.image ] );
364 365 366 367 368
				texture.needsUpdate = true;

				texture.uuid = data.uuid;

				if ( data.name !== undefined ) texture.name = data.name;
369
				if ( data.mapping !== undefined ) texture.mapping = data.mapping;
M
Mr.doob 已提交
370 371 372
				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 ];
373 374 375
				if ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;
				if ( data.wrap instanceof Array ) {

M
Mr.doob 已提交
376 377
					texture.wrapS = THREE[ data.wrap[ 0 ] ];
					texture.wrapT = THREE[ data.wrap[ 1 ] ];
378 379 380 381 382 383 384 385 386 387 388 389 390

				}

				textures[ data.uuid ] = texture;

			}

		}

		return textures;

	},

391
	parseObject: function () {
M
Mr.doob 已提交
392

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

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

397
			var object;
M
Mr.doob 已提交
398

M
Mr.doob 已提交
399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422
			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 ];

			};

423
			switch ( data.type ) {
M
Mr.doob 已提交
424

425
				case 'Scene':
M
Mr.doob 已提交
426

427
					object = new THREE.Scene();
M
Mr.doob 已提交
428

429
					break;
M
Mr.doob 已提交
430

431
				case 'PerspectiveCamera':
M
Mr.doob 已提交
432

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

435
					break;
436

437
				case 'OrthographicCamera':
M
Mr.doob 已提交
438

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

441
					break;
M
Mr.doob 已提交
442

443
				case 'AmbientLight':
M
Mr.doob 已提交
444

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

447
					break;
M
Mr.doob 已提交
448

449
				case 'DirectionalLight':
M
Mr.doob 已提交
450

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

453
					break;
M
Mr.doob 已提交
454

455
				case 'PointLight':
M
Mr.doob 已提交
456

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

459
					break;
M
Mr.doob 已提交
460

461
				case 'SpotLight':
M
Mr.doob 已提交
462

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

465
					break;
M
Mr.doob 已提交
466

467
				case 'HemisphereLight':
M
Mr.doob 已提交
468

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

471
					break;
M
Mr.doob 已提交
472

473
				case 'Mesh':
M
Mr.doob 已提交
474

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

477
					break;
M
Mr.doob 已提交
478

M
Mr.doob 已提交
479 480
				case 'Line':

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

					break;
484

M
Mr.doob 已提交
485
				case 'PointCloud':
486

M
Mr.doob 已提交
487
					object = new THREE.PointCloud( getGeometry( data.geometry ), getMaterial( data.material ) );
488 489

					break;
M
Mr.doob 已提交
490

M
Mr.doob 已提交
491 492
				case 'Sprite':

M
Mr.doob 已提交
493
					object = new THREE.Sprite( getMaterial( data.material ) );
M
Mr.doob 已提交
494 495 496

					break;

497 498 499 500 501 502
				case 'Group':

					object = new THREE.Group();

					break;

503 504 505 506 507 508
				default:

					object = new THREE.Object3D();

			}

509 510 511
			object.uuid = data.uuid;

			if ( data.name !== undefined ) object.name = data.name;
512
			if ( data.matrix !== undefined ) {
513

514 515 516 517 518 519 520 521 522 523
				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 );

			}
524

525 526
			if ( data.visible !== undefined ) object.visible = data.visible;
			if ( data.userData !== undefined ) object.userData = data.userData;
527

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

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

532 533 534
					object.add( this.parseObject( data.children[ child ], geometries, materials ) );

				}
M
Mr.doob 已提交
535 536 537

			}

538
			return object;
M
Mr.doob 已提交
539

540
		}
M
Mr.doob 已提交
541

542
	}()
M
Mr.doob 已提交
543

544
};