SceneLoader.js 14.6 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

A
alteredq 已提交
26
		if ( xhr.readyState == 4 ) {
27

A
alteredq 已提交
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 187 188 189 190 191 192 193
						
						if ( m ) {
							
							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]);
							
194
						} else {
195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210
							
							object.position.set( p[0], p[1], p[2] );
	
							if ( q ) {
	
								object.quaternion.set( q[0], q[1], q[2], q[3] );
								object.useQuaternion = true;
	
							} else {
	
								object.rotation.set( r[0], r[1], r[2] );
	
							}
	
							object.scale.set( s[0], s[1], s[2] );
							
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

A
alteredq 已提交
316
		if( counter_models == 0 && counter_textures == 0 ) {
317

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

A
alteredq 已提交
320
		}
321

A
alteredq 已提交
322
	};
323

A
alteredq 已提交
324
	var callbackTexture = function( images ) {
325

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

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

A
alteredq 已提交
331
	};
332

A
alteredq 已提交
333
	// first go synchronous elements
334

A
alteredq 已提交
335
	// cameras
336

A
alteredq 已提交
337
	for( dc in data.cameras ) {
338

A
alteredq 已提交
339
		c = data.cameras[ dc ];
340

A
alteredq 已提交
341
		if ( c.type == "perspective" ) {
342

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

A
alteredq 已提交
345
		} else if ( c.type == "ortho" ) {
M
Mr.doob 已提交
346

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

A
alteredq 已提交
349
		}
350

A
alteredq 已提交
351 352
		p = c.position;
		t = c.target;
353
		u = c.up;
354

A
alteredq 已提交
355 356
		camera.position.set( p[0], p[1], p[2] );
		camera.target = new THREE.Vector3( t[0], t[1], t[2] );
357
		if ( u ) camera.up.set( u[0], u[1], u[2] );
358

A
alteredq 已提交
359
		result.cameras[ dc ] = camera;
360

A
alteredq 已提交
361
	}
362

A
alteredq 已提交
363
	// lights
364

A
alteredq 已提交
365
	var hex, intensity;
366

A
alteredq 已提交
367
	for ( dl in data.lights ) {
368

A
alteredq 已提交
369
		l = data.lights[ dl ];
370

A
alteredq 已提交
371 372
		hex = ( l.color !== undefined ) ? l.color : 0xffffff;
		intensity = ( l.intensity !== undefined ) ? l.intensity : 1;
373

A
alteredq 已提交
374
		if ( l.type == "directional" ) {
375

A
alteredq 已提交
376
			p = l.direction;
377

A
alteredq 已提交
378 379 380
			light = new THREE.DirectionalLight( hex, intensity );
			light.position.set( p[0], p[1], p[2] );
			light.position.normalize();
381

A
alteredq 已提交
382
		} else if ( l.type == "point" ) {
383

A
alteredq 已提交
384 385
			p = l.position;
			d = l.distance;
386

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

A
alteredq 已提交
390
		} else if ( l.type == "ambient" ) {
391

A
alteredq 已提交
392
			light = new THREE.AmbientLight( hex );
393

A
alteredq 已提交
394
		}
395

A
alteredq 已提交
396
		result.scene.add( light );
397

A
alteredq 已提交
398
		result.lights[ dl ] = light;
399

A
alteredq 已提交
400
	}
401

A
alteredq 已提交
402
	// fogs
403

A
alteredq 已提交
404
	for( df in data.fogs ) {
405

A
alteredq 已提交
406
		f = data.fogs[ df ];
407

A
alteredq 已提交
408
		if ( f.type == "linear" ) {
409

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

A
alteredq 已提交
412
		} else if ( f.type == "exp2" ) {
413

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

A
alteredq 已提交
416
		}
417

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

A
alteredq 已提交
421
		result.fogs[ df ] = fog;
422

A
alteredq 已提交
423
	}
424

A
alteredq 已提交
425
	// defaults
426

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

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

A
alteredq 已提交
431
	}
432

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

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

A
alteredq 已提交
437
	}
438

A
alteredq 已提交
439 440 441
	c = data.defaults.bgcolor;
	result.bgColor = new THREE.Color();
	result.bgColor.setRGB( c[0], c[1], c[2] );
442

A
alteredq 已提交
443
	result.bgColorAlpha = data.defaults.bgalpha;
444

A
alteredq 已提交
445
	// now come potentially asynchronous elements
446

A
alteredq 已提交
447
	// geometries
448

A
alteredq 已提交
449
	// count how many models will be loaded asynchronously
450

A
alteredq 已提交
451
	for( dg in data.geometries ) {
452

A
alteredq 已提交
453
		g = data.geometries[ dg ];
454

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

A
alteredq 已提交
457
			counter_models += 1;
458

A
alteredq 已提交
459
			scope.onLoadStart();
460

A
alteredq 已提交
461
		}
462

A
alteredq 已提交
463
	}
464

A
alteredq 已提交
465
	total_models = counter_models;
466

A
alteredq 已提交
467
	for ( dg in data.geometries ) {
468

A
alteredq 已提交
469
		g = data.geometries[ dg ];
470

A
alteredq 已提交
471
		if ( g.type == "cube" ) {
472

A
alteredq 已提交
473 474
			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;
475

A
alteredq 已提交
476
		} else if ( g.type == "plane" ) {
477

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

A
alteredq 已提交
481
		} else if ( g.type == "sphere" ) {
482

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

A
alteredq 已提交
486
		} else if ( g.type == "cylinder" ) {
487

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

A
alteredq 已提交
491
		} else if ( g.type == "torus" ) {
492

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

A
alteredq 已提交
496
		} else if ( g.type == "icosahedron" ) {
M
Mr.doob 已提交
497

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

A
alteredq 已提交
501
		} else if ( g.type == "bin_mesh" ) {
502

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

A
alteredq 已提交
505
		} else if ( g.type == "ascii_mesh" ) {
506

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

A
alteredq 已提交
509
		} else if ( g.type == "embedded_mesh" ) {
510

A
alteredq 已提交
511 512
			var modelJson = data.embeds[ g.id ],
				texture_path = "";
513

514 515
			// Pass metadata along to jsonLoader so it knows the format version.
			modelJson.metadata = data.metadata;
A
alteredq 已提交
516 517 518 519

			if ( modelJson ) {

				jsonLoader.createModel( modelJson, create_callback_embed( dg ), texture_path );
520 521 522

			}

A
alteredq 已提交
523
		}
524

A
alteredq 已提交
525
	}
526

A
alteredq 已提交
527
	// textures
528

A
alteredq 已提交
529
	// count how many textures will be loaded asynchronously
530

A
alteredq 已提交
531
	for( dt in data.textures ) {
532

A
alteredq 已提交
533
		tt = data.textures[ dt ];
534

A
alteredq 已提交
535
		if( tt.url instanceof Array ) {
536

A
alteredq 已提交
537
			counter_textures += tt.url.length;
538

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

A
alteredq 已提交
541
				scope.onLoadStart();
542

A
alteredq 已提交
543
			}
544

A
alteredq 已提交
545
		} else {
546

A
alteredq 已提交
547
			counter_textures += 1;
548

A
alteredq 已提交
549
			scope.onLoadStart();
550

A
alteredq 已提交
551
		}
552

A
alteredq 已提交
553
	}
M
Mr.doob 已提交
554

A
alteredq 已提交
555
	total_textures = counter_textures;
M
Mr.doob 已提交
556

A
alteredq 已提交
557
	for( dt in data.textures ) {
558

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

A
alteredq 已提交
561
		if ( tt.mapping != undefined && THREE[ tt.mapping ] != undefined  ) {
M
Mr.doob 已提交
562

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

A
alteredq 已提交
565
		}
M
Mr.doob 已提交
566

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

A
alteredq 已提交
569
			var url_array = [];
M
Mr.doob 已提交
570

A
alteredq 已提交
571
			for( var i = 0; i < tt.url.length; i ++ ) {
M
Mr.doob 已提交
572

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

A
alteredq 已提交
575
			}
M
Mr.doob 已提交
576

A
alteredq 已提交
577
			texture = THREE.ImageUtils.loadTextureCube( url_array, tt.mapping, callbackTexture );
578

A
alteredq 已提交
579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607
		} else {

			texture = THREE.ImageUtils.loadTexture( get_url( tt.url, data.urlBaseType ), tt.mapping, callbackTexture );

			if ( THREE[ tt.minFilter ] != undefined )
				texture.minFilter = THREE[ tt.minFilter ];

			if ( THREE[ tt.magFilter ] != undefined )
				texture.magFilter = THREE[ tt.magFilter ];


			if ( tt.repeat ) {

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

				if ( tt.repeat[ 0 ] != 1 ) texture.wrapS = THREE.RepeatWrapping;
				if ( tt.repeat[ 1 ] != 1 ) texture.wrapT = THREE.RepeatWrapping;

			}

			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 ) {
608

A
alteredq 已提交
609 610 611
				var wrapMap = {
				"repeat" 	: THREE.RepeatWrapping,
				"mirror"	: THREE.MirroredRepeatWrapping
612 613
				}

A
alteredq 已提交
614 615
				if ( wrapMap[ tt.wrap[ 0 ] ] !== undefined ) texture.wrapS = wrapMap[ tt.wrap[ 0 ] ];
				if ( wrapMap[ tt.wrap[ 1 ] ] !== undefined ) texture.wrapT = wrapMap[ tt.wrap[ 1 ] ];
616 617 618

			}

A
alteredq 已提交
619
		}
620

A
alteredq 已提交
621
		result.textures[ dt ] = texture;
622

A
alteredq 已提交
623
	}
624

A
alteredq 已提交
625
	// materials
626

A
alteredq 已提交
627
	for ( dm in data.materials ) {
628

A
alteredq 已提交
629
		m = data.materials[ dm ];
630

A
alteredq 已提交
631
		for ( pp in m.parameters ) {
632

A
alteredq 已提交
633
			if ( pp == "envMap" || pp == "map" || pp == "lightMap" ) {
634

A
alteredq 已提交
635
				m.parameters[ pp ] = result.textures[ m.parameters[ pp ] ];
636

A
alteredq 已提交
637
			} else if ( pp == "shading" ) {
638

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

A
alteredq 已提交
641
			} else if ( pp == "blending" ) {
642

643
				m.parameters[ pp ] = m.parameters[ pp ] in THREE ? THREE[ m.parameters[ pp ] ] : THREE.NormalBlending;
644

A
alteredq 已提交
645
			} else if ( pp == "combine" ) {
646

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

A
alteredq 已提交
649
			} else if ( pp == "vertexColors" ) {
650

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

A
alteredq 已提交
653
					m.parameters[ pp ] = THREE.FaceColors;
654

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

A
alteredq 已提交
657 658 659
				} else if ( m.parameters[ pp ] )   {

					m.parameters[ pp ] = THREE.VertexColors;
660 661 662

				}

A
alteredq 已提交
663
			}
M
Mr.doob 已提交
664

A
alteredq 已提交
665
		}
666

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

A
alteredq 已提交
669
			m.parameters.transparent = true;
M
Mr.doob 已提交
670

A
alteredq 已提交
671
		}
M
Mr.doob 已提交
672

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

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

A
alteredq 已提交
678 679 680 681
			var diffuse = m.parameters.color;
			var specular = m.parameters.specular;
			var ambient = m.parameters.ambient;
			var shininess = m.parameters.shininess;
M
Mr.doob 已提交
682

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

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

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

A
alteredq 已提交
689
			}
M
Mr.doob 已提交
690

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

A
alteredq 已提交
693 694
				uniforms[ "tDiffuse" ].texture = m.parameters.map;
				uniforms[ "enableDiffuse" ].value = true;
695

A
alteredq 已提交
696
			}
697

A
alteredq 已提交
698
			if ( m.parameters.lightMap ) {
699

A
alteredq 已提交
700 701
				uniforms[ "tAO" ].texture = m.parameters.lightMap;
				uniforms[ "enableAO" ].value = true;
702

A
alteredq 已提交
703
			}
704

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

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

A
alteredq 已提交
710
			}
M
Mr.doob 已提交
711

A
alteredq 已提交
712 713 714
			uniforms[ "uDiffuseColor" ].value.setHex( diffuse );
			uniforms[ "uSpecularColor" ].value.setHex( specular );
			uniforms[ "uAmbientColor" ].value.setHex( ambient );
M
Mr.doob 已提交
715

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

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

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

A
alteredq 已提交
722
			}
M
Mr.doob 已提交
723

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

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

A
alteredq 已提交
728
		} else {
M
Mr.doob 已提交
729

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

A
alteredq 已提交
732
		}
733

A
alteredq 已提交
734
		result.materials[ dm ] = material;
735

A
alteredq 已提交
736
	}
737

A
alteredq 已提交
738
	// objects ( synchronous init of procedural primitives )
739

A
alteredq 已提交
740
	handle_objects();
741

A
alteredq 已提交
742
	// synchronous callback
743

A
alteredq 已提交
744
	scope.callbackSync( result );
745

A
alteredq 已提交
746 747
	// just in case there are no async elements:
	async_callback_gate();
748

749 750

};