SceneLoader.js 14.9 KB
Newer Older
1 2 3 4
/**
 * @author alteredq / http://alteredqualia.com/
 */

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

	this.onLoadStart = function () {};
	this.onLoadProgress = function() {};
	this.onLoadComplete = function () {};
10

A
alteredq 已提交
11 12
	this.callbackSync = function () {};
	this.callbackProgress = function () {};
13

14 15
};

A
alteredq 已提交
16
THREE.SceneLoader.prototype.constructor = THREE.SceneLoader;
17

A
alteredq 已提交
18
THREE.SceneLoader.prototype.load = function( url, callbackFinished ) {
19

A
alteredq 已提交
20
	var context = this;
21

A
alteredq 已提交
22
	var xhr = new XMLHttpRequest();
23

24
	xhr.onreadystatechange = function () {
25

26
		if ( xhr.readyState === 4 ) {
27

28
			if ( xhr.status === 200 || xhr.status === 0 ) {
29

M
Mr.doob 已提交
30
				var json = JSON.parse( xhr.responseText );
31 32
				context.createScene( json, callbackFinished, url );

A
alteredq 已提交
33
			} else {
A
alteredq 已提交
34

M
Mr.doob 已提交
35
				console.error( "THREE.SceneLoader: Couldn't load [" + url + "] [" + xhr.status + "]" );
36

A
alteredq 已提交
37
			}
A
alteredq 已提交
38

A
alteredq 已提交
39
		}
40

A
alteredq 已提交
41
	};
42

A
alteredq 已提交
43
	xhr.open( "GET", url, true );
44
	if ( xhr.overrideMimeType ) xhr.overrideMimeType( "text/plain; charset=x-user-defined" );
A
alteredq 已提交
45 46
	xhr.setRequestHeader( "Content-Type", "text/plain" );
	xhr.send( null );
47

A
alteredq 已提交
48
};
A
alteredq 已提交
49

A
alteredq 已提交
50
THREE.SceneLoader.prototype.createScene = function ( json, callbackFinished, url ) {
A
alteredq 已提交
51

A
alteredq 已提交
52
	var scope = this;
53

M
Mr.doob 已提交
54
	var urlBase = THREE.Loader.prototype.extractUrlBase( url );
55

A
alteredq 已提交
56
	var dg, dm, dd, dl, dc, df, dt,
57
		g, o, m, l, d, p, r, q, s, c, t, f, tt, pp, u,
A
alteredq 已提交
58 59
		geometry, material, camera, fog,
		texture, images,
60
		light,
A
alteredq 已提交
61 62 63 64
		data, binLoader, jsonLoader,
		counter_models, counter_textures,
		total_models, total_textures,
		result;
65

A
alteredq 已提交
66
	data = json;
67

A
alteredq 已提交
68 69
	binLoader = new THREE.BinaryLoader();
	jsonLoader = new THREE.JSONLoader();
70

A
alteredq 已提交
71 72
	counter_models = 0;
	counter_textures = 0;
73

A
alteredq 已提交
74
	result = {
75

A
alteredq 已提交
76 77 78 79 80 81 82 83 84
		scene: new THREE.Scene(),
		geometries: {},
		materials: {},
		textures: {},
		objects: {},
		cameras: {},
		lights: {},
		fogs: {},
		empties: {}
85

A
alteredq 已提交
86
	};
87

A
alteredq 已提交
88
	if ( data.transform ) {
89

A
alteredq 已提交
90 91 92
		var position = data.transform.position,
			rotation = data.transform.rotation,
			scale = data.transform.scale;
93

A
alteredq 已提交
94 95
		if ( position )
			result.scene.position.set( position[ 0 ], position[ 1 ], position [ 2 ] );
96

A
alteredq 已提交
97 98
		if ( rotation )
			result.scene.rotation.set( rotation[ 0 ], rotation[ 1 ], rotation [ 2 ] );
M
Mr.doob 已提交
99

A
alteredq 已提交
100 101
		if ( scale )
			result.scene.scale.set( scale[ 0 ], scale[ 1 ], scale [ 2 ] );
102

103 104
		if ( position || rotation || scale ) {

A
alteredq 已提交
105
			result.scene.updateMatrix();
106 107 108
			result.scene.updateMatrixWorld();

		}
109

A
alteredq 已提交
110
	}
111

A
alteredq 已提交
112
	function get_url( source_url, url_type ) {
M
Mr.doob 已提交
113

A
alteredq 已提交
114
		if ( url_type == "relativeToHTML" ) {
M
Mr.doob 已提交
115

A
alteredq 已提交
116
			return source_url;
M
Mr.doob 已提交
117

A
alteredq 已提交
118
		} else {
M
Mr.doob 已提交
119

A
alteredq 已提交
120
			return urlBase + "/" + source_url;
121

A
alteredq 已提交
122
		}
123

A
alteredq 已提交
124
	};
125

A
alteredq 已提交
126
	function handle_objects() {
127

A
alteredq 已提交
128
		var object;
129

A
alteredq 已提交
130
		for( dd in data.objects ) {
131

A
alteredq 已提交
132
			if ( !result.objects[ dd ] ) {
133

A
alteredq 已提交
134
				o = data.objects[ dd ];
135

A
alteredq 已提交
136
				if ( o.geometry !== undefined ) {
137

A
alteredq 已提交
138
					geometry = result.geometries[ o.geometry ];
139

A
alteredq 已提交
140
					// geometry already loaded
141

A
alteredq 已提交
142
					if ( geometry ) {
143

A
alteredq 已提交
144
						var hasNormals = false;
145

A
alteredq 已提交
146 147
						// not anymore support for multiple materials
						// shouldn't really be array
148

149 150
						material = result.materials[ o.materials[ 0 ] ];
						hasNormals = material instanceof THREE.ShaderMaterial;
151

A
alteredq 已提交
152
						if ( hasNormals ) {
153

A
alteredq 已提交
154
							geometry.computeTangents();
155

A
alteredq 已提交
156
						}
157

A
alteredq 已提交
158 159 160 161
						p = o.position;
						r = o.rotation;
						q = o.quaternion;
						s = o.scale;
162
						m = o.matrix;
163

A
alteredq 已提交
164
						// turn off quaternions, for the moment
165

A
alteredq 已提交
166
						q = 0;
M
Mr.doob 已提交
167

168
						if ( o.materials.length == 0 ) {
169

170
							material = new THREE.MeshFaceMaterial();
M
Mr.doob 已提交
171

A
alteredq 已提交
172
						}
173

A
alteredq 已提交
174 175
						// dirty hack to handle meshes with multiple materials
						// just use face materials defined in model
M
Mr.doob 已提交
176

177
						if ( o.materials.length > 1 ) {
M
Mr.doob 已提交
178

179
							material = new THREE.MeshFaceMaterial();
M
Mr.doob 已提交
180

A
alteredq 已提交
181
						}
182

183
						object = new THREE.Mesh( geometry, material );
A
alteredq 已提交
184
						object.name = dd;
185

186
						if ( m ) {
187

188 189 190 191 192
							object.matrixAutoUpdate = false;
							object.matrix.set( m[0], m[1], m[2], m[3],
											   m[4], m[5], m[6], m[7],
											   m[8], m[9], m[10], m[11],
											   m[12], m[13], m[14], m[15]);
193

194
						} else {
195

196
							object.position.set( p[0], p[1], p[2] );
197

198
							if ( q ) {
199

200 201
								object.quaternion.set( q[0], q[1], q[2], q[3] );
								object.useQuaternion = true;
202

203
							} else {
204

205
								object.rotation.set( r[0], r[1], r[2] );
206

207
							}
208

209
							object.scale.set( s[0], s[1], s[2] );
210

A
alteredq 已提交
211
						}
212

A
alteredq 已提交
213
						object.visible = o.visible;
214 215 216
						object.doubleSided = o.doubleSided;
						object.castShadow = o.castShadow;
						object.receiveShadow = o.receiveShadow;
217

A
alteredq 已提交
218
						result.scene.add( object );
219

A
alteredq 已提交
220
						result.objects[ dd ] = object;
221

222 223
					}

A
alteredq 已提交
224
				// pure Object3D
225

A
alteredq 已提交
226
				} else {
227

A
alteredq 已提交
228 229 230 231
					p = o.position;
					r = o.rotation;
					q = o.quaternion;
					s = o.scale;
232

A
alteredq 已提交
233
					// turn off quaternions, for the moment
234

A
alteredq 已提交
235
					q = 0;
236

A
alteredq 已提交
237 238 239
					object = new THREE.Object3D();
					object.name = dd;
					object.position.set( p[0], p[1], p[2] );
240

A
alteredq 已提交
241
					if ( q ) {
242

A
alteredq 已提交
243 244
						object.quaternion.set( q[0], q[1], q[2], q[3] );
						object.useQuaternion = true;
245

A
alteredq 已提交
246
					} else {
M
Mr.doob 已提交
247

A
alteredq 已提交
248
						object.rotation.set( r[0], r[1], r[2] );
249

A
alteredq 已提交
250
					}
251

A
alteredq 已提交
252 253
					object.scale.set( s[0], s[1], s[2] );
					object.visible = ( o.visible !== undefined ) ? o.visible : false;
254

A
alteredq 已提交
255
					result.scene.add( object );
256

A
alteredq 已提交
257 258
					result.objects[ dd ] = object;
					result.empties[ dd ] = object;
259 260 261

				}

A
alteredq 已提交
262
			}
263

A
alteredq 已提交
264
		}
265

A
alteredq 已提交
266
	};
267

A
alteredq 已提交
268
	function handle_mesh( geo, id ) {
269

A
alteredq 已提交
270 271
		result.geometries[ id ] = geo;
		handle_objects();
272

A
alteredq 已提交
273
	};
M
Mr.doob 已提交
274

A
alteredq 已提交
275
	function create_callback( id ) {
276

A
alteredq 已提交
277
		return function( geo ) {
278

A
alteredq 已提交
279
			handle_mesh( geo, id );
280

A
alteredq 已提交
281
			counter_models -= 1;
282

A
alteredq 已提交
283
			scope.onLoadComplete();
284

A
alteredq 已提交
285
			async_callback_gate();
286

A
alteredq 已提交
287
		}
288

A
alteredq 已提交
289
	};
290

A
alteredq 已提交
291
	function create_callback_embed( id ) {
292

A
alteredq 已提交
293
		return function( geo ) {
294

A
alteredq 已提交
295
			result.geometries[ id ] = geo;
296

A
alteredq 已提交
297
		}
298

A
alteredq 已提交
299
	};
300

A
alteredq 已提交
301
	function async_callback_gate() {
302

A
alteredq 已提交
303
		var progress = {
304

A
alteredq 已提交
305 306 307 308
			totalModels		: total_models,
			totalTextures	: total_textures,
			loadedModels	: total_models - counter_models,
			loadedTextures	: total_textures - counter_textures
309

A
alteredq 已提交
310
		};
311

A
alteredq 已提交
312
		scope.callbackProgress( progress, result );
313

A
alteredq 已提交
314
		scope.onLoadProgress();
315

316
		if( counter_models === 0 && counter_textures === 0 ) {
317

A
alteredq 已提交
318
			callbackFinished( result );
319

A
alteredq 已提交
320
		}
321

A
alteredq 已提交
322
	};
323

324
	var callbackTexture = function ( count ) {
325

326
		counter_textures -= count;
A
alteredq 已提交
327
		async_callback_gate();
328

A
alteredq 已提交
329
		scope.onLoadComplete();
330

A
alteredq 已提交
331
	};
332

333 334 335 336 337 338 339 340 341 342 343 344 345
	// must use this instead of just directly calling callbackTexture
	// because of closure in the calling context loop

	var generateTextureCallback = function ( count ) {

		return function() {

			callbackTexture( count );

		};

	};

A
alteredq 已提交
346
	// first go synchronous elements
347

A
alteredq 已提交
348
	// cameras
349

A
alteredq 已提交
350
	for( dc in data.cameras ) {
351

A
alteredq 已提交
352
		c = data.cameras[ dc ];
353

354
		if ( c.type === "perspective" ) {
355

A
alteredq 已提交
356
			camera = new THREE.PerspectiveCamera( c.fov, c.aspect, c.near, c.far );
M
Mr.doob 已提交
357

358
		} else if ( c.type === "ortho" ) {
M
Mr.doob 已提交
359

A
alteredq 已提交
360
			camera = new THREE.OrthographicCamera( c.left, c.right, c.top, c.bottom, c.near, c.far );
361

A
alteredq 已提交
362
		}
363

A
alteredq 已提交
364 365
		p = c.position;
		t = c.target;
366
		u = c.up;
367

A
alteredq 已提交
368 369
		camera.position.set( p[0], p[1], p[2] );
		camera.target = new THREE.Vector3( t[0], t[1], t[2] );
370
		if ( u ) camera.up.set( u[0], u[1], u[2] );
371

A
alteredq 已提交
372
		result.cameras[ dc ] = camera;
373

A
alteredq 已提交
374
	}
375

A
alteredq 已提交
376
	// lights
377

A
alteredq 已提交
378
	var hex, intensity;
379

A
alteredq 已提交
380
	for ( dl in data.lights ) {
381

A
alteredq 已提交
382
		l = data.lights[ dl ];
383

A
alteredq 已提交
384 385
		hex = ( l.color !== undefined ) ? l.color : 0xffffff;
		intensity = ( l.intensity !== undefined ) ? l.intensity : 1;
386

387
		if ( l.type === "directional" ) {
388

A
alteredq 已提交
389
			p = l.direction;
390

A
alteredq 已提交
391 392 393
			light = new THREE.DirectionalLight( hex, intensity );
			light.position.set( p[0], p[1], p[2] );
			light.position.normalize();
394

395
		} else if ( l.type === "point" ) {
396

A
alteredq 已提交
397 398
			p = l.position;
			d = l.distance;
399

A
alteredq 已提交
400 401
			light = new THREE.PointLight( hex, intensity, d );
			light.position.set( p[0], p[1], p[2] );
402

403
		} else if ( l.type === "ambient" ) {
404

A
alteredq 已提交
405
			light = new THREE.AmbientLight( hex );
406

A
alteredq 已提交
407
		}
408

A
alteredq 已提交
409
		result.scene.add( light );
410

A
alteredq 已提交
411
		result.lights[ dl ] = light;
412

A
alteredq 已提交
413
	}
414

A
alteredq 已提交
415
	// fogs
416

A
alteredq 已提交
417
	for( df in data.fogs ) {
418

A
alteredq 已提交
419
		f = data.fogs[ df ];
420

421
		if ( f.type === "linear" ) {
422

A
alteredq 已提交
423
			fog = new THREE.Fog( 0x000000, f.near, f.far );
424

425
		} else if ( f.type === "exp2" ) {
426

A
alteredq 已提交
427
			fog = new THREE.FogExp2( 0x000000, f.density );
428

A
alteredq 已提交
429
		}
430

A
alteredq 已提交
431 432
		c = f.color;
		fog.color.setRGB( c[0], c[1], c[2] );
M
Mr.doob 已提交
433

A
alteredq 已提交
434
		result.fogs[ df ] = fog;
435

A
alteredq 已提交
436
	}
437

A
alteredq 已提交
438
	// defaults
439

A
alteredq 已提交
440
	if ( result.cameras && data.defaults.camera ) {
441

A
alteredq 已提交
442
		result.currentCamera = result.cameras[ data.defaults.camera ];
443

A
alteredq 已提交
444
	}
445

A
alteredq 已提交
446
	if ( result.fogs && data.defaults.fog ) {
447

A
alteredq 已提交
448
		result.scene.fog = result.fogs[ data.defaults.fog ];
449

A
alteredq 已提交
450
	}
451

A
alteredq 已提交
452 453 454
	c = data.defaults.bgcolor;
	result.bgColor = new THREE.Color();
	result.bgColor.setRGB( c[0], c[1], c[2] );
455

A
alteredq 已提交
456
	result.bgColorAlpha = data.defaults.bgalpha;
457

A
alteredq 已提交
458
	// now come potentially asynchronous elements
459

A
alteredq 已提交
460
	// geometries
461

A
alteredq 已提交
462
	// count how many models will be loaded asynchronously
463

A
alteredq 已提交
464
	for( dg in data.geometries ) {
465

A
alteredq 已提交
466
		g = data.geometries[ dg ];
467

A
alteredq 已提交
468
		if ( g.type == "bin_mesh" || g.type == "ascii_mesh" ) {
469

A
alteredq 已提交
470
			counter_models += 1;
471

A
alteredq 已提交
472
			scope.onLoadStart();
473

A
alteredq 已提交
474
		}
475

A
alteredq 已提交
476
	}
477

A
alteredq 已提交
478
	total_models = counter_models;
479

A
alteredq 已提交
480
	for ( dg in data.geometries ) {
481

A
alteredq 已提交
482
		g = data.geometries[ dg ];
483

484
		if ( g.type === "cube" ) {
485

A
alteredq 已提交
486 487
			geometry = new THREE.CubeGeometry( g.width, g.height, g.depth, g.segmentsWidth, g.segmentsHeight, g.segmentsDepth, null, g.flipped, g.sides );
			result.geometries[ dg ] = geometry;
488

489
		} else if ( g.type === "plane" ) {
490

A
alteredq 已提交
491 492
			geometry = new THREE.PlaneGeometry( g.width, g.height, g.segmentsWidth, g.segmentsHeight );
			result.geometries[ dg ] = geometry;
493

494
		} else if ( g.type === "sphere" ) {
495

A
alteredq 已提交
496 497
			geometry = new THREE.SphereGeometry( g.radius, g.segmentsWidth, g.segmentsHeight );
			result.geometries[ dg ] = geometry;
498

499
		} else if ( g.type === "cylinder" ) {
500

A
alteredq 已提交
501 502
			geometry = new THREE.CylinderGeometry( g.topRad, g.botRad, g.height, g.radSegs, g.heightSegs );
			result.geometries[ dg ] = geometry;
503

504
		} else if ( g.type === "torus" ) {
505

A
alteredq 已提交
506 507
			geometry = new THREE.TorusGeometry( g.radius, g.tube, g.segmentsR, g.segmentsT );
			result.geometries[ dg ] = geometry;
508

509
		} else if ( g.type === "icosahedron" ) {
M
Mr.doob 已提交
510

511
			geometry = new THREE.IcosahedronGeometry( g.radius, g.subdivisions );
A
alteredq 已提交
512
			result.geometries[ dg ] = geometry;
M
Mr.doob 已提交
513

514
		} else if ( g.type === "bin_mesh" ) {
515

A
alteredq 已提交
516
			binLoader.load( get_url( g.url, data.urlBaseType ), create_callback( dg ) );
517

518
		} else if ( g.type === "ascii_mesh" ) {
519

A
alteredq 已提交
520
			jsonLoader.load( get_url( g.url, data.urlBaseType ), create_callback( dg ) );
521

522
		} else if ( g.type === "embedded_mesh" ) {
523

A
alteredq 已提交
524 525
			var modelJson = data.embeds[ g.id ],
				texture_path = "";
526

527 528
			// pass metadata along to jsonLoader so it knows the format version

529
			modelJson.metadata = data.metadata;
A
alteredq 已提交
530 531 532 533

			if ( modelJson ) {

				jsonLoader.createModel( modelJson, create_callback_embed( dg ), texture_path );
534 535 536

			}

A
alteredq 已提交
537
		}
538

A
alteredq 已提交
539
	}
540

A
alteredq 已提交
541
	// textures
542

A
alteredq 已提交
543
	// count how many textures will be loaded asynchronously
544

A
alteredq 已提交
545
	for( dt in data.textures ) {
546

A
alteredq 已提交
547
		tt = data.textures[ dt ];
548

A
alteredq 已提交
549
		if( tt.url instanceof Array ) {
550

A
alteredq 已提交
551
			counter_textures += tt.url.length;
552

A
alteredq 已提交
553
			for( var n = 0; n < tt.url.length; n ++ ) {
554

A
alteredq 已提交
555
				scope.onLoadStart();
556

A
alteredq 已提交
557
			}
558

A
alteredq 已提交
559
		} else {
560

A
alteredq 已提交
561
			counter_textures += 1;
562

A
alteredq 已提交
563
			scope.onLoadStart();
564

A
alteredq 已提交
565
		}
566

A
alteredq 已提交
567
	}
M
Mr.doob 已提交
568

A
alteredq 已提交
569
	total_textures = counter_textures;
M
Mr.doob 已提交
570

A
alteredq 已提交
571
	for( dt in data.textures ) {
572

A
alteredq 已提交
573
		tt = data.textures[ dt ];
M
Mr.doob 已提交
574

575
		if ( tt.mapping !== undefined && THREE[ tt.mapping ] !== undefined  ) {
M
Mr.doob 已提交
576

A
alteredq 已提交
577
			tt.mapping = new THREE[ tt.mapping ]();
M
Mr.doob 已提交
578

A
alteredq 已提交
579
		}
M
Mr.doob 已提交
580

A
alteredq 已提交
581
		if( tt.url instanceof Array ) {
M
Mr.doob 已提交
582

583
			var count = tt.url.length;
A
alteredq 已提交
584
			var url_array = [];
M
Mr.doob 已提交
585

586
			for( var i = 0; i < count; i ++ ) {
M
Mr.doob 已提交
587

A
alteredq 已提交
588
				url_array[ i ] = get_url( tt.url[ i ], data.urlBaseType );
M
Mr.doob 已提交
589

A
alteredq 已提交
590
			}
M
Mr.doob 已提交
591

592
			texture = THREE.ImageUtils.loadTextureCube( url_array, tt.mapping, generateTextureCallback( count ) );
593

A
alteredq 已提交
594 595
		} else {

596
			texture = THREE.ImageUtils.loadTexture( get_url( tt.url, data.urlBaseType ), tt.mapping, generateTextureCallback( 1 ) );
A
alteredq 已提交
597

598
			if ( THREE[ tt.minFilter ] !== undefined )
A
alteredq 已提交
599 600
				texture.minFilter = THREE[ tt.minFilter ];

601
			if ( THREE[ tt.magFilter ] !== undefined )
A
alteredq 已提交
602 603 604 605 606 607 608
				texture.magFilter = THREE[ tt.magFilter ];


			if ( tt.repeat ) {

				texture.repeat.set( tt.repeat[ 0 ], tt.repeat[ 1 ] );

609 610
				if ( tt.repeat[ 0 ] !== 1 ) texture.wrapS = THREE.RepeatWrapping;
				if ( tt.repeat[ 1 ] !== 1 ) texture.wrapT = THREE.RepeatWrapping;
A
alteredq 已提交
611 612 613 614 615 616 617 618 619 620 621 622

			}

			if ( tt.offset ) {

				texture.offset.set( tt.offset[ 0 ], tt.offset[ 1 ] );

			}

			// handle wrap after repeat so that default repeat can be overriden

			if ( tt.wrap ) {
623

A
alteredq 已提交
624 625 626
				var wrapMap = {
				"repeat" 	: THREE.RepeatWrapping,
				"mirror"	: THREE.MirroredRepeatWrapping
627 628
				}

A
alteredq 已提交
629 630
				if ( wrapMap[ tt.wrap[ 0 ] ] !== undefined ) texture.wrapS = wrapMap[ tt.wrap[ 0 ] ];
				if ( wrapMap[ tt.wrap[ 1 ] ] !== undefined ) texture.wrapT = wrapMap[ tt.wrap[ 1 ] ];
631 632 633

			}

A
alteredq 已提交
634
		}
635

A
alteredq 已提交
636
		result.textures[ dt ] = texture;
637

A
alteredq 已提交
638
	}
639

A
alteredq 已提交
640
	// materials
641

A
alteredq 已提交
642
	for ( dm in data.materials ) {
643

A
alteredq 已提交
644
		m = data.materials[ dm ];
645

A
alteredq 已提交
646
		for ( pp in m.parameters ) {
647

648
			if ( pp === "envMap" || pp === "map" || pp === "lightMap" ) {
649

A
alteredq 已提交
650
				m.parameters[ pp ] = result.textures[ m.parameters[ pp ] ];
651

652
			} else if ( pp === "shading" ) {
653

A
alteredq 已提交
654
				m.parameters[ pp ] = ( m.parameters[ pp ] == "flat" ) ? THREE.FlatShading : THREE.SmoothShading;
655

656
			} else if ( pp === "blending" ) {
657

658
				m.parameters[ pp ] = m.parameters[ pp ] in THREE ? THREE[ m.parameters[ pp ] ] : THREE.NormalBlending;
659

660
			} else if ( pp === "combine" ) {
661

A
alteredq 已提交
662
				m.parameters[ pp ] = ( m.parameters[ pp ] == "MixOperation" ) ? THREE.MixOperation : THREE.MultiplyOperation;
663

664
			} else if ( pp === "vertexColors" ) {
665

A
alteredq 已提交
666
				if ( m.parameters[ pp ] == "face" ) {
667

A
alteredq 已提交
668
					m.parameters[ pp ] = THREE.FaceColors;
669

A
alteredq 已提交
670
				// default to vertex colors if "vertexColors" is anything else face colors or 0 / null / false
671

A
alteredq 已提交
672 673 674
				} else if ( m.parameters[ pp ] )   {

					m.parameters[ pp ] = THREE.VertexColors;
675 676 677

				}

A
alteredq 已提交
678
			}
M
Mr.doob 已提交
679

A
alteredq 已提交
680
		}
681

A
alteredq 已提交
682
		if ( m.parameters.opacity !== undefined && m.parameters.opacity < 1.0 ) {
M
Mr.doob 已提交
683

A
alteredq 已提交
684
			m.parameters.transparent = true;
M
Mr.doob 已提交
685

A
alteredq 已提交
686
		}
M
Mr.doob 已提交
687

A
alteredq 已提交
688
		if ( m.parameters.normalMap ) {
M
Mr.doob 已提交
689

A
alteredq 已提交
690 691
			var shader = THREE.ShaderUtils.lib[ "normal" ];
			var uniforms = THREE.UniformsUtils.clone( shader.uniforms );
M
Mr.doob 已提交
692

A
alteredq 已提交
693 694 695 696
			var diffuse = m.parameters.color;
			var specular = m.parameters.specular;
			var ambient = m.parameters.ambient;
			var shininess = m.parameters.shininess;
M
Mr.doob 已提交
697

A
alteredq 已提交
698
			uniforms[ "tNormal" ].texture = result.textures[ m.parameters.normalMap ];
M
Mr.doob 已提交
699

A
alteredq 已提交
700
			if ( m.parameters.normalMapFactor ) {
M
Mr.doob 已提交
701

A
alteredq 已提交
702
				uniforms[ "uNormalScale" ].value = m.parameters.normalMapFactor;
M
Mr.doob 已提交
703

A
alteredq 已提交
704
			}
M
Mr.doob 已提交
705

A
alteredq 已提交
706
			if ( m.parameters.map ) {
M
Mr.doob 已提交
707

A
alteredq 已提交
708 709
				uniforms[ "tDiffuse" ].texture = m.parameters.map;
				uniforms[ "enableDiffuse" ].value = true;
710

A
alteredq 已提交
711
			}
712

A
alteredq 已提交
713
			if ( m.parameters.lightMap ) {
714

A
alteredq 已提交
715 716
				uniforms[ "tAO" ].texture = m.parameters.lightMap;
				uniforms[ "enableAO" ].value = true;
717

A
alteredq 已提交
718
			}
719

A
alteredq 已提交
720
			if ( m.parameters.specularMap ) {
M
Mr.doob 已提交
721

A
alteredq 已提交
722 723
				uniforms[ "tSpecular" ].texture = result.textures[ m.parameters.specularMap ];
				uniforms[ "enableSpecular" ].value = true;
M
Mr.doob 已提交
724

A
alteredq 已提交
725
			}
M
Mr.doob 已提交
726

A
alteredq 已提交
727 728 729
			uniforms[ "uDiffuseColor" ].value.setHex( diffuse );
			uniforms[ "uSpecularColor" ].value.setHex( specular );
			uniforms[ "uAmbientColor" ].value.setHex( ambient );
M
Mr.doob 已提交
730

A
alteredq 已提交
731
			uniforms[ "uShininess" ].value = shininess;
M
Mr.doob 已提交
732

A
alteredq 已提交
733
			if ( m.parameters.opacity ) {
M
Mr.doob 已提交
734

A
alteredq 已提交
735
				uniforms[ "uOpacity" ].value = m.parameters.opacity;
M
Mr.doob 已提交
736

A
alteredq 已提交
737
			}
M
Mr.doob 已提交
738

A
alteredq 已提交
739
			var parameters = { fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: uniforms, lights: true, fog: true };
M
Mr.doob 已提交
740

A
alteredq 已提交
741
			material = new THREE.ShaderMaterial( parameters );
M
Mr.doob 已提交
742

A
alteredq 已提交
743
		} else {
M
Mr.doob 已提交
744

A
alteredq 已提交
745
			material = new THREE[ m.type ]( m.parameters );
746

A
alteredq 已提交
747
		}
748

A
alteredq 已提交
749
		result.materials[ dm ] = material;
750

A
alteredq 已提交
751
	}
752

A
alteredq 已提交
753
	// objects ( synchronous init of procedural primitives )
754

A
alteredq 已提交
755
	handle_objects();
756

A
alteredq 已提交
757
	// synchronous callback
758

A
alteredq 已提交
759
	scope.callbackSync( result );
760

761
	// just in case there are no async elements
762

763
	async_callback_gate();
764 765

};