GLTFLoader.js 33.2 KB
Newer Older
1
/**
R
Rich Tibbett 已提交
2
 * @author Rich Tibbett / https://github.com/richtr
3
 * @author mrdoob / http://mrdoob.com/
R
Rich Tibbett 已提交
4
 * @author Tony Parisi / http://www.tonyparisi.com/
5 6
 */

M
Mr.doob 已提交
7
THREE.GLTFLoader = ( function () {
R
Rich Tibbett 已提交
8

M
Mr.doob 已提交
9
	function GLTFLoader( manager ) {
10

M
Mr.doob 已提交
11
		this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;
12

M
Mr.doob 已提交
13
	}
R
Rich Tibbett 已提交
14

M
Mr.doob 已提交
15
	GLTFLoader.prototype = {
16

M
Mr.doob 已提交
17
		constructor: GLTFLoader,
18

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

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

M
Mr.doob 已提交
23
			var path = this.path && ( typeof this.path === "string" ) ? this.path : THREE.Loader.prototype.extractUrlBase( url );
24

M
Mr.doob 已提交
25 26
			var loader = new THREE.FileLoader( scope.manager );
			loader.load( url, function ( text ) {
R
Rich Tibbett 已提交
27

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

M
Mr.doob 已提交
30
			}, onProgress, onError );
31

M
Mr.doob 已提交
32
		},
33

M
Mr.doob 已提交
34
		setCrossOrigin: function ( value ) {
35

M
Mr.doob 已提交
36
			this.crossOrigin = value;
37

M
Mr.doob 已提交
38
		},
39

M
Mr.doob 已提交
40
		setPath: function ( value ) {
41

M
Mr.doob 已提交
42
			this.path = value;
43

M
Mr.doob 已提交
44
		},
45

M
Mr.doob 已提交
46
		parse: function ( json, callback, path ) {
47

M
Mr.doob 已提交
48
			console.time( 'GLTFLoader' );
49

M
Mr.doob 已提交
50
			var parser = new GLTFParser( json, {
51

M
Mr.doob 已提交
52 53
				path: path || this.path,
				crossOrigin: !! this.crossOrigin
54

M
Mr.doob 已提交
55
			} );
56

57
			parser.parse( function ( scene, cameras, animations ) {
58

M
Mr.doob 已提交
59
				console.timeEnd( 'GLTFLoader' );
R
Rich Tibbett 已提交
60

M
Mr.doob 已提交
61 62 63
				var glTF = {
					"scene": scene,
					"cameras": cameras,
64
					"animations": animations
M
Mr.doob 已提交
65
				};
R
Rich Tibbett 已提交
66

M
Mr.doob 已提交
67
				callback( glTF );
R
Rich Tibbett 已提交
68

M
Mr.doob 已提交
69
			} );
R
Rich Tibbett 已提交
70

M
Mr.doob 已提交
71
		}
R
Rich Tibbett 已提交
72

M
Mr.doob 已提交
73
	};
R
Rich Tibbett 已提交
74

M
Mr.doob 已提交
75
	/* GLTFREGISTRY */
R
Rich Tibbett 已提交
76

M
Mr.doob 已提交
77
	function GLTFRegistry() {
78

M
Mr.doob 已提交
79
		var objects = {};
80

M
Mr.doob 已提交
81
		return	{
R
Rich Tibbett 已提交
82

M
Mr.doob 已提交
83
			get: function ( key ) {
R
Rich Tibbett 已提交
84

M
Mr.doob 已提交
85
				return objects[ key ];
R
Rich Tibbett 已提交
86

M
Mr.doob 已提交
87
			},
R
Rich Tibbett 已提交
88

M
Mr.doob 已提交
89
			add: function ( key, object ) {
R
Rich Tibbett 已提交
90

M
Mr.doob 已提交
91
				objects[ key ] = object;
R
Rich Tibbett 已提交
92

M
Mr.doob 已提交
93
			},
R
Rich Tibbett 已提交
94

M
Mr.doob 已提交
95
			remove: function ( key ) {
R
Rich Tibbett 已提交
96

M
Mr.doob 已提交
97
				delete objects[ key ];
R
Rich Tibbett 已提交
98

M
Mr.doob 已提交
99
			},
R
Rich Tibbett 已提交
100

M
Mr.doob 已提交
101
			removeAll: function () {
R
Rich Tibbett 已提交
102

M
Mr.doob 已提交
103
				objects = {};
R
Rich Tibbett 已提交
104

M
Mr.doob 已提交
105
			},
R
Rich Tibbett 已提交
106

M
Mr.doob 已提交
107
			update: function ( scene, camera ) {
108

M
Mr.doob 已提交
109 110 111
				for ( var name in objects ) {

					var object = objects[ name ];
112

M
Mr.doob 已提交
113
					if ( object.update ) {
114

M
Mr.doob 已提交
115
						object.update( scene, camera );
116

M
Mr.doob 已提交
117
					}
118

M
Mr.doob 已提交
119
				}
120

M
Mr.doob 已提交
121
			}
122

M
Mr.doob 已提交
123
		};
124

M
Mr.doob 已提交
125
	}
126

M
Mr.doob 已提交
127
	/* GLTFSHADERS */
128

M
Mr.doob 已提交
129 130 131 132 133
	GLTFLoader.Shaders = new GLTFRegistry();

	/* GLTFSHADER */

	function GLTFShader( targetNode, allNodes ) {
R
Rich Tibbett 已提交
134

M
Mr.doob 已提交
135
		var boundUniforms = {};
M
Mr.doob 已提交
136 137

		// bind each uniform to its source node
M
Mr.doob 已提交
138 139 140 141 142 143

		var uniforms = targetNode.material.uniforms;

		for ( var uniformId in uniforms ) {

			var uniform = uniforms[ uniformId ];
R
Rich Tibbett 已提交
144

M
Mr.doob 已提交
145
			if ( uniform.semantic ) {
146

M
Mr.doob 已提交
147
				var sourceNodeRef = uniform.node;
148

M
Mr.doob 已提交
149
				var sourceNode = targetNode;
150

M
Mr.doob 已提交
151
				if ( sourceNodeRef ) {
152

M
Mr.doob 已提交
153
					sourceNode = allNodes[ sourceNodeRef ];
R
Rich Tibbett 已提交
154

M
Mr.doob 已提交
155
				}
R
Rich Tibbett 已提交
156

M
Mr.doob 已提交
157
				boundUniforms[ uniformId ] = {
M
Mr.doob 已提交
158 159 160 161 162
					semantic: uniform.semantic,
					sourceNode: sourceNode,
					targetNode: targetNode,
					uniform: uniform
				};
R
Rich Tibbett 已提交
163 164

			}
165

M
Mr.doob 已提交
166
		}
167

M
Mr.doob 已提交
168
		this.boundUniforms = boundUniforms;
M
Mr.doob 已提交
169
		this._m4 = new THREE.Matrix4();
170

M
Mr.doob 已提交
171
	}
172

M
Mr.doob 已提交
173 174
	// Update - update all the uniform values
	GLTFShader.prototype.update = function ( scene, camera ) {
175

M
Mr.doob 已提交
176
		// update scene graph
177

M
Mr.doob 已提交
178
		scene.updateMatrixWorld();
179

M
Mr.doob 已提交
180
		// update camera matrices and frustum
181

M
Mr.doob 已提交
182 183
		camera.updateMatrixWorld();
		camera.matrixWorldInverse.getInverse( camera.matrixWorld );
184

M
Mr.doob 已提交
185 186 187 188 189
		var boundUniforms = this.boundUniforms;

		for ( var name in boundUniforms ) {

			var boundUniform = boundUniforms[ name ];
190

M
Mr.doob 已提交
191
			switch ( boundUniform.semantic ) {
R
Rich Tibbett 已提交
192

M
Mr.doob 已提交
193
				case "MODELVIEW":
R
Rich Tibbett 已提交
194

M
Mr.doob 已提交
195 196 197
					var m4 = boundUniform.uniform.value;
					m4.multiplyMatrices( camera.matrixWorldInverse, boundUniform.sourceNode.matrixWorld );
					break;
R
Rich Tibbett 已提交
198

M
Mr.doob 已提交
199
				case "MODELVIEWINVERSETRANSPOSE":
R
Rich Tibbett 已提交
200

M
Mr.doob 已提交
201 202 203 204
					var m3 = boundUniform.uniform.value;
					this._m4.multiplyMatrices( camera.matrixWorldInverse, boundUniform.sourceNode.matrixWorld );
					m3.getNormalMatrix( this._m4 );
					break;
R
Rich Tibbett 已提交
205

M
Mr.doob 已提交
206
				case "PROJECTION":
207

M
Mr.doob 已提交
208 209 210
					var m4 = boundUniform.uniform.value;
					m4.copy( camera.projectionMatrix );
					break;
R
Rich Tibbett 已提交
211

M
Mr.doob 已提交
212
				case "JOINTMATRIX":
R
Rich Tibbett 已提交
213

M
Mr.doob 已提交
214
					var m4v = boundUniform.uniform.value;
R
Rich Tibbett 已提交
215

M
Mr.doob 已提交
216
					for ( var mi = 0; mi < m4v.length; mi ++ ) {
R
Rich Tibbett 已提交
217

M
Mr.doob 已提交
218 219
						// So it goes like this:
						// SkinnedMesh world matrix is already baked into MODELVIEW;
T
Takahiro 已提交
220
						// transform joints to local space,
M
Mr.doob 已提交
221 222 223 224
						// then transform using joint's inverse
						m4v[ mi ]
							.getInverse( boundUniform.sourceNode.matrixWorld )
							.multiply( boundUniform.targetNode.skeleton.bones[ mi ].matrixWorld )
T
Takahiro 已提交
225 226
							.multiply( boundUniform.targetNode.skeleton.boneInverses[ mi ] )
							.multiply( boundUniform.targetNode.bindMatrix );
R
Rich Tibbett 已提交
227

M
Mr.doob 已提交
228
					}
229

M
Mr.doob 已提交
230 231 232
					break;

				default :
233

M
Mr.doob 已提交
234 235 236 237 238
					console.warn( "Unhandled shader semantic: " + boundUniform.semantic );
					break;

			}

M
Mr.doob 已提交
239
		}
M
Mr.doob 已提交
240 241

	};
242 243


244
	/* ANIMATION */
245

M
Mr.doob 已提交
246 247 248 249 250 251 252 253 254 255
	GLTFLoader.Animations = {

		update: function () {

			console.warn( 'THREE.GLTFLoader.Animation has been deprecated. Use THREE.AnimationMixer instead.' );

		}

	};

256 257
	function createAnimation( name, interps ) {

258
		var tracks = [];
259

M
Mr.doob 已提交
260
		for ( var i = 0, len = interps.length; i < len; i ++ ) {
261

262
			var interp = interps[ i ];
263

264 265 266 267 268 269 270 271
			// KeyframeTrack.optimize() will modify given 'times' and 'values'
			// buffers before creating a truncated copy to keep. Because buffers may
			// be reused by other tracks, make copies here.
			interp.times = THREE.AnimationUtils.arraySlice( interp.times, 0 );
			interp.values = THREE.AnimationUtils.arraySlice( interp.values, 0 );

			interp.target.updateMatrix();
			interp.target.matrixAutoUpdate = true;
272

273
			tracks.push( new THREE.KeyframeTrack(
274 275 276 277
				interp.name,
				interp.times,
				interp.values,
				interp.type
278
			) );
279

M
Mr.doob 已提交
280
		}
281

282
		return new THREE.AnimationClip( name, undefined, tracks );
283

M
Mr.doob 已提交
284
	}
285

M
Mr.doob 已提交
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309
	/*********************************/
	/********** INTERNALS ************/
	/*********************************/

	/* CONSTANTS */

	var WEBGL_CONSTANTS = {
		FLOAT: 5126,
		//FLOAT_MAT2: 35674,
		FLOAT_MAT3: 35675,
		FLOAT_MAT4: 35676,
		FLOAT_VEC2: 35664,
		FLOAT_VEC3: 35665,
		FLOAT_VEC4: 35666,
		LINEAR: 9729,
		REPEAT: 10497,
		SAMPLER_2D: 35678,
		TRIANGLES: 4,
		UNSIGNED_BYTE: 5121,
		UNSIGNED_SHORT: 5123,

		VERTEX_SHADER: 35633,
		FRAGMENT_SHADER: 35632
	};
310

M
Mr.doob 已提交
311 312 313 314 315 316 317 318 319 320
	var WEBGL_TYPE = {
		5126: Number,
		//35674: THREE.Matrix2,
		35675: THREE.Matrix3,
		35676: THREE.Matrix4,
		35664: THREE.Vector2,
		35665: THREE.Vector3,
		35666: THREE.Vector4,
		35678: THREE.Texture
	};
321

M
Mr.doob 已提交
322 323 324 325 326 327 328 329
	var WEBGL_COMPONENT_TYPES = {
		5120: Int8Array,
		5121: Uint8Array,
		5122: Int16Array,
		5123: Uint16Array,
		5125: Uint32Array,
		5126: Float32Array
	};
330

M
Mr.doob 已提交
331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355
	var WEBGL_FILTERS = {
		9728: THREE.NearestFilter,
		9729: THREE.LinearFilter,
		9984: THREE.NearestMipMapNearestFilter,
		9985: THREE.LinearMipMapNearestFilter,
		9986: THREE.NearestMipMapLinearFilter,
		9987: THREE.LinearMipMapLinearFilter
	};

	var WEBGL_WRAPPINGS = {
		33071: THREE.ClampToEdgeWrapping,
		33648: THREE.MirroredRepeatWrapping,
		10497: THREE.RepeatWrapping
	};

	var WEBGL_TYPE_SIZES = {
		'SCALAR': 1,
		'VEC2': 2,
		'VEC3': 3,
		'VEC4': 4,
		'MAT2': 4,
		'MAT3': 9,
		'MAT4': 16
	};

356 357 358 359 360 361 362
	var PATH_PROPERTIES = {
		scale: 'scale',
		translation: 'position',
		rotation: 'quaternion'
	};

	var INTERPOLATION = {
363 364
		LINEAR: THREE.InterpolateLinear,
		STEP: THREE.InterpolateDiscrete
365 366
	};

M
Mr.doob 已提交
367 368 369 370 371 372
	/* UTILITY FUNCTIONS */

	function _each( object, callback, thisObj ) {

		if ( !object ) {
			return Promise.resolve();
R
Rich Tibbett 已提交
373
		}
374

M
Mr.doob 已提交
375 376 377 378
		var results;
		var fns = [];

		if ( Object.prototype.toString.call( object ) === '[object Array]' ) {
R
Rich Tibbett 已提交
379

M
Mr.doob 已提交
380
			results = [];
R
Rich Tibbett 已提交
381

M
Mr.doob 已提交
382 383 384
			var length = object.length;
			for ( var idx = 0; idx < length; idx ++ ) {
				var value = callback.call( thisObj || this, object[ idx ], idx );
R
Rich Tibbett 已提交
385 386 387 388
				if ( value ) {
					fns.push( value );
					if ( value instanceof Promise ) {
						value.then( function( key, value ) {
M
Mr.doob 已提交
389
							results[ idx ] = value;
R
Rich Tibbett 已提交
390 391
						}.bind( this, key ));
					} else {
M
Mr.doob 已提交
392
						results[ idx ] = value;
R
Rich Tibbett 已提交
393 394
					}
				}
395
			}
R
Rich Tibbett 已提交
396

M
Mr.doob 已提交
397
		} else {
R
Rich Tibbett 已提交
398

M
Mr.doob 已提交
399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415
			results = {};

			for ( var key in object ) {
				if ( object.hasOwnProperty( key ) ) {
					var value = callback.call( thisObj || this, object[ key ], key );
					if ( value ) {
						fns.push( value );
						if ( value instanceof Promise ) {
							value.then( function( key, value ) {
								results[ key ] = value;
							}.bind( this, key ));
						} else {
							results[ key ] = value;
						}
					}
				}
			}
R
Rich Tibbett 已提交
416

M
Mr.doob 已提交
417
		}
R
Rich Tibbett 已提交
418

M
Mr.doob 已提交
419 420 421
		return Promise.all( fns ).then( function() {
			return results;
		});
R
Rich Tibbett 已提交
422 423 424

	}

M
Mr.doob 已提交
425
	function resolveURL( url, path ) {
R
Rich Tibbett 已提交
426

M
Mr.doob 已提交
427 428 429
		// Invalid URL
		if ( typeof url !== 'string' || url === '' )
			return '';
430

M
Mr.doob 已提交
431 432
		// Absolute URL
		if ( /^https?:\/\//i.test( url ) ) {
R
Rich Tibbett 已提交
433

M
Mr.doob 已提交
434
			return url;
R
Rich Tibbett 已提交
435

M
Mr.doob 已提交
436
		}
R
Rich Tibbett 已提交
437

M
Mr.doob 已提交
438 439
		// Data URI
		if ( /^data:.*,.*$/i.test( url ) ) {
R
Rich Tibbett 已提交
440

M
Mr.doob 已提交
441
			return url;
R
Rich Tibbett 已提交
442

M
Mr.doob 已提交
443
		}
R
Rich Tibbett 已提交
444

M
Mr.doob 已提交
445 446
		// Relative URL
		return ( path || '' ) + url;
R
Rich Tibbett 已提交
447

M
Mr.doob 已提交
448
	}
R
Rich Tibbett 已提交
449

M
Mr.doob 已提交
450 451 452
	// Three.js seems too dependent on attribute names so globally
	// replace those in the shader code
	function replaceTHREEShaderAttributes( shaderText, technique ) {
R
Rich Tibbett 已提交
453

M
Mr.doob 已提交
454 455
		// Expected technique attributes
		var attributes = {};
R
Rich Tibbett 已提交
456

M
Mr.doob 已提交
457 458 459
		for ( var attributeId in technique.attributes ) {

			var pname = technique.attributes[ attributeId ];
R
Rich Tibbett 已提交
460

M
Mr.doob 已提交
461 462 463
			var param = technique.parameters[ pname ];
			var atype = param.type;
			var semantic = param.semantic;
R
Rich Tibbett 已提交
464

M
Mr.doob 已提交
465 466 467 468
			attributes[ attributeId ] = {
				type: atype,
				semantic: semantic
			};
469

M
Mr.doob 已提交
470
		}
471

M
Mr.doob 已提交
472
		// Figure out which attributes to change in technique
473

M
Mr.doob 已提交
474 475 476
		var shaderParams = technique.parameters;
		var shaderAttributes = technique.attributes;
		var params = {};
477

M
Mr.doob 已提交
478
		for ( var attributeId in attributes ) {
479

M
Mr.doob 已提交
480 481 482 483
			var pname = shaderAttributes[ attributeId ];
			var shaderParam = shaderParams[ pname ];
			var semantic = shaderParam.semantic;
			if ( semantic ) {
484

M
Mr.doob 已提交
485
				params[ attributeId ] = shaderParam;
486

M
Mr.doob 已提交
487
			}
R
Rich Tibbett 已提交
488

M
Mr.doob 已提交
489
		}
R
Rich Tibbett 已提交
490

M
Mr.doob 已提交
491
		for ( var pname in params ) {
R
Rich Tibbett 已提交
492

M
Mr.doob 已提交
493
			var param = params[ pname ];
M
Mr.doob 已提交
494
			var semantic = param.semantic;
R
Rich Tibbett 已提交
495

M
Mr.doob 已提交
496
			var regEx = new RegExp( "\\b" + pname + "\\b", "g" );
R
Rich Tibbett 已提交
497

M
Mr.doob 已提交
498
			switch ( semantic ) {
R
Rich Tibbett 已提交
499

M
Mr.doob 已提交
500
				case "POSITION":
R
Rich Tibbett 已提交
501

M
Mr.doob 已提交
502 503
					shaderText = shaderText.replace( regEx, 'position' );
					break;
R
Rich Tibbett 已提交
504

M
Mr.doob 已提交
505
				case "NORMAL":
R
Rich Tibbett 已提交
506

M
Mr.doob 已提交
507 508
					shaderText = shaderText.replace( regEx, 'normal' );
					break;
509

M
Mr.doob 已提交
510 511 512
				case 'TEXCOORD_0':
				case 'TEXCOORD0':
				case 'TEXCOORD':
513

M
Mr.doob 已提交
514 515
					shaderText = shaderText.replace( regEx, 'uv' );
					break;
516

M
Mr.doob 已提交
517
				case "WEIGHT":
518

M
Mr.doob 已提交
519 520
					shaderText = shaderText.replace( regEx, 'skinWeight' );
					break;
521

M
Mr.doob 已提交
522
				case "JOINT":
523

M
Mr.doob 已提交
524 525
					shaderText = shaderText.replace( regEx, 'skinIndex' );
					break;
526

M
Mr.doob 已提交
527
			}
528

M
Mr.doob 已提交
529
		}
R
Rich Tibbett 已提交
530

M
Mr.doob 已提交
531
		return shaderText;
532

M
Mr.doob 已提交
533
	}
R
Rich Tibbett 已提交
534

M
Mr.doob 已提交
535 536
	// Deferred constructor for RawShaderMaterial types
	function DeferredShaderMaterial( params ) {
R
Rich Tibbett 已提交
537

M
Mr.doob 已提交
538
		this.isDeferredShaderMaterial = true;
R
Rich Tibbett 已提交
539

M
Mr.doob 已提交
540
		this.params = params;
541

M
Mr.doob 已提交
542
	}
543

M
Mr.doob 已提交
544
	DeferredShaderMaterial.prototype.create = function () {
545

M
Mr.doob 已提交
546
		var uniforms = THREE.UniformsUtils.clone( this.params.uniforms );
547

M
Mr.doob 已提交
548 549 550
		for ( var uniformId in this.params.uniforms ) {

			var originalUniform = this.params.uniforms[ uniformId ];
551

M
Mr.doob 已提交
552
			if ( originalUniform.value instanceof THREE.Texture ) {
R
Rich Tibbett 已提交
553

M
Mr.doob 已提交
554 555
				uniforms[ uniformId ].value = originalUniform.value;
				uniforms[ uniformId ].value.needsUpdate = true;
R
Rich Tibbett 已提交
556

M
Mr.doob 已提交
557
			}
R
Rich Tibbett 已提交
558

M
Mr.doob 已提交
559 560
			uniforms[ uniformId ].semantic = originalUniform.semantic;
			uniforms[ uniformId ].node = originalUniform.node;
R
Rich Tibbett 已提交
561

M
Mr.doob 已提交
562
		}
R
Rich Tibbett 已提交
563

M
Mr.doob 已提交
564
		this.params.uniforms = uniforms;
R
Rich Tibbett 已提交
565

M
Mr.doob 已提交
566
		return new THREE.RawShaderMaterial( this.params );
R
Rich Tibbett 已提交
567

M
Mr.doob 已提交
568
	};
R
Rich Tibbett 已提交
569

M
Mr.doob 已提交
570
	/* GLTF PARSER */
R
Rich Tibbett 已提交
571

M
Mr.doob 已提交
572
	function GLTFParser( json, options ) {
R
Rich Tibbett 已提交
573

M
Mr.doob 已提交
574 575
		this.json = json || {};
		this.options = options || {};
R
Rich Tibbett 已提交
576

M
Mr.doob 已提交
577 578
		// loader object cache
		this.cache = new GLTFRegistry();
R
Rich Tibbett 已提交
579

M
Mr.doob 已提交
580
	}
R
Rich Tibbett 已提交
581

M
Mr.doob 已提交
582
	GLTFParser.prototype._withDependencies = function ( dependencies ) {
R
Rich Tibbett 已提交
583

M
Mr.doob 已提交
584
		var _dependencies = {};
R
Rich Tibbett 已提交
585

M
Mr.doob 已提交
586
		for ( var i = 0; i < dependencies.length; i ++ ) {
R
Rich Tibbett 已提交
587

M
Mr.doob 已提交
588 589
			var dependency = dependencies[ i ];
			var fnName = "load" + dependency.charAt( 0 ).toUpperCase() + dependency.slice( 1 );
R
Rich Tibbett 已提交
590

M
Mr.doob 已提交
591
			var cached = this.cache.get( dependency );
592

M
Mr.doob 已提交
593
			if ( cached !== undefined ) {
594

M
Mr.doob 已提交
595
				_dependencies[ dependency ] = cached;
R
Rich Tibbett 已提交
596

M
Mr.doob 已提交
597
			} else if ( this[ fnName ] ) {
R
Rich Tibbett 已提交
598

M
Mr.doob 已提交
599 600
				var fn = this[ fnName ]();
				this.cache.add( dependency, fn );
R
Rich Tibbett 已提交
601

M
Mr.doob 已提交
602
				_dependencies[ dependency ] = fn;
R
Rich Tibbett 已提交
603

M
Mr.doob 已提交
604
			}
R
Rich Tibbett 已提交
605

M
Mr.doob 已提交
606
		}
R
Rich Tibbett 已提交
607

M
Mr.doob 已提交
608
		return _each( _dependencies, function ( dependency ) {
R
Rich Tibbett 已提交
609

M
Mr.doob 已提交
610
			return dependency;
R
Rich Tibbett 已提交
611

M
Mr.doob 已提交
612
		} );
R
Rich Tibbett 已提交
613

M
Mr.doob 已提交
614
	};
R
Rich Tibbett 已提交
615

M
Mr.doob 已提交
616
	GLTFParser.prototype.parse = function ( callback ) {
R
Rich Tibbett 已提交
617

M
Mr.doob 已提交
618 619
		var json = this.json;

M
Mr.doob 已提交
620 621
		// Clear the loader cache
		this.cache.removeAll();
R
Rich Tibbett 已提交
622

M
Mr.doob 已提交
623 624
		// Fire the callback on complete
		this._withDependencies( [
R
Rich Tibbett 已提交
625

M
Mr.doob 已提交
626 627
			"scenes",
			"cameras",
628
			"animations"
R
Rich Tibbett 已提交
629

M
Mr.doob 已提交
630
		] ).then( function ( dependencies ) {
R
Rich Tibbett 已提交
631

M
Mr.doob 已提交
632
			var scene = dependencies.scenes[ json.scene ];
R
Rich Tibbett 已提交
633

M
Mr.doob 已提交
634
			var cameras = [];
R
Rich Tibbett 已提交
635

M
Mr.doob 已提交
636
			for ( var name in dependencies.cameras ) {
R
Rich Tibbett 已提交
637

M
Mr.doob 已提交
638
				var camera = dependencies.cameras[ name ];
M
Mr.doob 已提交
639
				cameras.push( camera );
R
Rich Tibbett 已提交
640

M
Mr.doob 已提交
641
			}
R
Rich Tibbett 已提交
642

643
			var animations = [];
R
Rich Tibbett 已提交
644

645
			for ( var name in dependencies.animations ) {
R
Rich Tibbett 已提交
646

647
				animations.push( dependencies.animations[ name ] );
R
Rich Tibbett 已提交
648

M
Mr.doob 已提交
649
			}
R
Rich Tibbett 已提交
650

651
			callback( scene, cameras, animations );
R
Rich Tibbett 已提交
652

M
Mr.doob 已提交
653
		} );
R
Rich Tibbett 已提交
654

M
Mr.doob 已提交
655
	};
R
Rich Tibbett 已提交
656

M
Mr.doob 已提交
657
	GLTFParser.prototype.loadShaders = function () {
R
Rich Tibbett 已提交
658

M
Mr.doob 已提交
659 660 661 662
		var json = this.json;
		var options = this.options;

		return _each( json.shaders, function ( shader ) {
R
Rich Tibbett 已提交
663

M
Mr.doob 已提交
664
			return new Promise( function ( resolve ) {
R
Rich Tibbett 已提交
665

666
				var loader = new THREE.FileLoader();
M
Mr.doob 已提交
667
				loader.responseType = 'text';
M
Mr.doob 已提交
668
				loader.load( resolveURL( shader.uri, options.path ), function ( shaderText ) {
R
Rich Tibbett 已提交
669

M
Mr.doob 已提交
670
					resolve( shaderText );
R
Rich Tibbett 已提交
671 672 673

				} );

M
Mr.doob 已提交
674
			} );
R
Rich Tibbett 已提交
675

M
Mr.doob 已提交
676
		} );
R
Rich Tibbett 已提交
677

M
Mr.doob 已提交
678
	};
R
Rich Tibbett 已提交
679

M
Mr.doob 已提交
680
	GLTFParser.prototype.loadBuffers = function () {
R
Rich Tibbett 已提交
681

M
Mr.doob 已提交
682 683 684 685
		var json = this.json;
		var options = this.options;

		return _each( json.buffers, function ( buffer ) {
R
Rich Tibbett 已提交
686

M
Mr.doob 已提交
687
			if ( buffer.type === 'arraybuffer' ) {
R
Rich Tibbett 已提交
688

M
Mr.doob 已提交
689
				return new Promise( function ( resolve ) {
R
Rich Tibbett 已提交
690

M
Mr.doob 已提交
691 692
					var loader = new THREE.FileLoader();
					loader.responseType = 'arraybuffer';
M
Mr.doob 已提交
693
					loader.load( resolveURL( buffer.uri, options.path ), function ( buffer ) {
R
Rich Tibbett 已提交
694

M
Mr.doob 已提交
695
						resolve( buffer );
R
Rich Tibbett 已提交
696

M
Mr.doob 已提交
697
					} );
R
Rich Tibbett 已提交
698

M
Mr.doob 已提交
699
				} );
R
Rich Tibbett 已提交
700

M
Mr.doob 已提交
701
			}
R
Rich Tibbett 已提交
702

M
Mr.doob 已提交
703
		} );
R
Rich Tibbett 已提交
704

M
Mr.doob 已提交
705
	};
R
Rich Tibbett 已提交
706

M
Mr.doob 已提交
707
	GLTFParser.prototype.loadBufferViews = function () {
R
Rich Tibbett 已提交
708

M
Mr.doob 已提交
709 710
		var json = this.json;

M
Mr.doob 已提交
711
		return this._withDependencies( [
R
Rich Tibbett 已提交
712

M
Mr.doob 已提交
713
			"buffers"
R
Rich Tibbett 已提交
714

M
Mr.doob 已提交
715
		] ).then( function ( dependencies ) {
716

M
Mr.doob 已提交
717
			return _each( json.bufferViews, function ( bufferView ) {
718

M
Mr.doob 已提交
719
				var arraybuffer = dependencies.buffers[ bufferView.buffer ];
720

M
Mr.doob 已提交
721
				return arraybuffer.slice( bufferView.byteOffset, bufferView.byteOffset + bufferView.byteLength );
722

M
Mr.doob 已提交
723
			} );
724

M
Mr.doob 已提交
725
		} );
726

M
Mr.doob 已提交
727
	};
728

M
Mr.doob 已提交
729
	GLTFParser.prototype.loadAccessors = function () {
R
Rich Tibbett 已提交
730

M
Mr.doob 已提交
731 732
		var json = this.json;

M
Mr.doob 已提交
733 734 735 736 737
		return this._withDependencies( [

			"bufferViews"

		] ).then( function ( dependencies ) {
R
Rich Tibbett 已提交
738

M
Mr.doob 已提交
739
			return _each( json.accessors, function ( accessor ) {
R
Rich Tibbett 已提交
740

M
Mr.doob 已提交
741 742 743
				var arraybuffer = dependencies.bufferViews[ accessor.bufferView ];
				var itemSize = WEBGL_TYPE_SIZES[ accessor.type ];
				var TypedArray = WEBGL_COMPONENT_TYPES[ accessor.componentType ];
R
Rich Tibbett 已提交
744

M
Mr.doob 已提交
745 746 747
				// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.
				var elementBytes = TypedArray.BYTES_PER_ELEMENT;
				var itemBytes = elementBytes * itemSize;
R
Rich Tibbett 已提交
748

M
Mr.doob 已提交
749 750
				// The buffer is not interleaved if the stride is the item size in bytes.
				if ( accessor.byteStride && accessor.byteStride !== itemBytes ) {
R
Rich Tibbett 已提交
751

M
Mr.doob 已提交
752 753
					// Use the full buffer if it's interleaved.
					var array = new TypedArray( arraybuffer );
R
Rich Tibbett 已提交
754

M
Mr.doob 已提交
755 756
					// Integer parameters to IB/IBA are in array elements, not bytes.
					var ib = new THREE.InterleavedBuffer( array, accessor.byteStride / elementBytes );
R
Rich Tibbett 已提交
757

M
Mr.doob 已提交
758
					return new THREE.InterleavedBufferAttribute( ib, itemSize, accessor.byteOffset / elementBytes );
R
Rich Tibbett 已提交
759

M
Mr.doob 已提交
760 761 762
				} else {

					array = new TypedArray( arraybuffer, accessor.byteOffset, accessor.count * itemSize );
R
Rich Tibbett 已提交
763

M
Mr.doob 已提交
764
					return new THREE.BufferAttribute( array, itemSize );
R
Rich Tibbett 已提交
765 766 767

				}

M
Mr.doob 已提交
768
			} );
R
Rich Tibbett 已提交
769

M
Mr.doob 已提交
770
		} );
R
Rich Tibbett 已提交
771

M
Mr.doob 已提交
772
	};
R
Rich Tibbett 已提交
773

M
Mr.doob 已提交
774
	GLTFParser.prototype.loadTextures = function () {
R
Rich Tibbett 已提交
775

M
Mr.doob 已提交
776 777 778 779
		var json = this.json;
		var options = this.options;

		return _each( json.textures, function ( texture ) {
R
Rich Tibbett 已提交
780

M
Mr.doob 已提交
781
			if ( texture.source ) {
R
Rich Tibbett 已提交
782

M
Mr.doob 已提交
783
				return new Promise( function ( resolve ) {
R
Rich Tibbett 已提交
784

M
Mr.doob 已提交
785
					var source = json.images[ texture.source ];
R
Rich Tibbett 已提交
786

M
Mr.doob 已提交
787
					var textureLoader = THREE.Loader.Handlers.get( source.uri );
R
Rich Tibbett 已提交
788

M
Mr.doob 已提交
789
					if ( textureLoader === null ) {
R
Rich Tibbett 已提交
790

M
Mr.doob 已提交
791
						textureLoader = new THREE.TextureLoader();
R
Rich Tibbett 已提交
792

M
Mr.doob 已提交
793
					}
R
Rich Tibbett 已提交
794

M
Mr.doob 已提交
795
					textureLoader.crossOrigin = options.crossOrigin || false;
R
Rich Tibbett 已提交
796

M
Mr.doob 已提交
797
					textureLoader.load( resolveURL( source.uri, options.path ), function ( _texture ) {
R
Rich Tibbett 已提交
798

M
Mr.doob 已提交
799
						_texture.flipY = false;
R
Rich Tibbett 已提交
800

M
Mr.doob 已提交
801
						if ( texture.sampler ) {
R
Rich Tibbett 已提交
802

M
Mr.doob 已提交
803
							var sampler = json.samplers[ texture.sampler ];
R
Rich Tibbett 已提交
804

M
Mr.doob 已提交
805 806 807 808
							_texture.magFilter = WEBGL_FILTERS[ sampler.magFilter ];
							_texture.minFilter = WEBGL_FILTERS[ sampler.minFilter ];
							_texture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ];
							_texture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ];
R
Rich Tibbett 已提交
809

M
Mr.doob 已提交
810 811 812
						}

						resolve( _texture );
R
Rich Tibbett 已提交
813

M
Mr.doob 已提交
814
					}, undefined, function () {
815 816 817 818

						resolve();

					} );
R
Rich Tibbett 已提交
819

M
Mr.doob 已提交
820
				} );
R
Rich Tibbett 已提交
821 822 823

			}

M
Mr.doob 已提交
824
		} );
R
Rich Tibbett 已提交
825

M
Mr.doob 已提交
826
	};
R
Rich Tibbett 已提交
827

M
Mr.doob 已提交
828
	GLTFParser.prototype.loadMaterials = function () {
R
Rich Tibbett 已提交
829

M
Mr.doob 已提交
830 831
		var json = this.json;

M
Mr.doob 已提交
832
		return this._withDependencies( [
R
Rich Tibbett 已提交
833

M
Mr.doob 已提交
834 835
			"shaders",
			"textures"
R
Rich Tibbett 已提交
836

M
Mr.doob 已提交
837
		] ).then( function ( dependencies ) {
R
Rich Tibbett 已提交
838

M
Mr.doob 已提交
839
			return _each( json.materials, function ( material ) {
R
Rich Tibbett 已提交
840

M
Mr.doob 已提交
841 842 843
				var materialType;
				var materialValues = {};
				var materialParams = {};
R
Rich Tibbett 已提交
844

M
Mr.doob 已提交
845
				var khr_material;
R
Rich Tibbett 已提交
846

M
Mr.doob 已提交
847
				if ( material.extensions && material.extensions.KHR_materials_common ) {
R
Rich Tibbett 已提交
848

M
Mr.doob 已提交
849
					khr_material = material.extensions.KHR_materials_common;
R
Rich Tibbett 已提交
850

M
Mr.doob 已提交
851
				} else if ( json.extensions && json.extensions.KHR_materials_common ) {
M
Mr.doob 已提交
852

M
Mr.doob 已提交
853
					khr_material = json.extensions.KHR_materials_common;
R
Rich Tibbett 已提交
854 855 856

				}

M
Mr.doob 已提交
857
				if ( khr_material ) {
R
Rich Tibbett 已提交
858

M
Mr.doob 已提交
859
					switch ( khr_material.technique ) {
R
Rich Tibbett 已提交
860

M
Mr.doob 已提交
861 862 863 864
						case 'BLINN' :
						case 'PHONG' :
							materialType = THREE.MeshPhongMaterial;
							break;
R
Rich Tibbett 已提交
865

M
Mr.doob 已提交
866 867 868
						case 'LAMBERT' :
							materialType = THREE.MeshLambertMaterial;
							break;
R
Rich Tibbett 已提交
869

M
Mr.doob 已提交
870 871 872 873
						case 'CONSTANT' :
						default :
							materialType = THREE.MeshBasicMaterial;
							break;
R
Rich Tibbett 已提交
874

M
Mr.doob 已提交
875
					}
R
Rich Tibbett 已提交
876

M
Mr.doob 已提交
877
					Object.assign( materialValues, khr_material.values );
R
Rich Tibbett 已提交
878

M
Mr.doob 已提交
879
					if ( khr_material.doubleSided || materialValues.doubleSided ) {
R
Rich Tibbett 已提交
880

M
Mr.doob 已提交
881
						materialParams.side = THREE.DoubleSide;
R
Rich Tibbett 已提交
882

M
Mr.doob 已提交
883
					}
R
Rich Tibbett 已提交
884

M
Mr.doob 已提交
885
					if ( khr_material.transparent || materialValues.transparent ) {
R
Rich Tibbett 已提交
886

M
Mr.doob 已提交
887 888
						materialParams.transparent = true;
						materialParams.opacity = ( materialValues.transparency !== undefined ) ? materialValues.transparency : 1;
R
Rich Tibbett 已提交
889 890 891

					}

M
Mr.doob 已提交
892
				} else if ( material.technique === undefined ) {
R
Rich Tibbett 已提交
893

M
Mr.doob 已提交
894
					materialType = THREE.MeshPhongMaterial;
R
Rich Tibbett 已提交
895

M
Mr.doob 已提交
896
					Object.assign( materialValues, material.values );
R
Rich Tibbett 已提交
897

M
Mr.doob 已提交
898
				} else {
R
Rich Tibbett 已提交
899

M
Mr.doob 已提交
900
					materialType = DeferredShaderMaterial;
R
Rich Tibbett 已提交
901

M
Mr.doob 已提交
902
					var technique = json.techniques[ material.technique ];
R
Rich Tibbett 已提交
903

M
Mr.doob 已提交
904
					materialParams.uniforms = {};
R
Rich Tibbett 已提交
905

M
Mr.doob 已提交
906
					var program = json.programs[ technique.program ];
R
Rich Tibbett 已提交
907

M
Mr.doob 已提交
908
					if ( program ) {
R
Rich Tibbett 已提交
909

M
Mr.doob 已提交
910
						materialParams.fragmentShader = dependencies.shaders[ program.fragmentShader ];
R
Rich Tibbett 已提交
911

M
Mr.doob 已提交
912
						if ( ! materialParams.fragmentShader ) {
R
Rich Tibbett 已提交
913

M
Mr.doob 已提交
914 915
							console.warn( "ERROR: Missing fragment shader definition:", program.fragmentShader );
							materialType = THREE.MeshPhongMaterial;
R
Rich Tibbett 已提交
916

M
Mr.doob 已提交
917
						}
R
Rich Tibbett 已提交
918

M
Mr.doob 已提交
919
						var vertexShader = dependencies.shaders[ program.vertexShader ];
R
Rich Tibbett 已提交
920

M
Mr.doob 已提交
921
						if ( ! vertexShader ) {
R
Rich Tibbett 已提交
922

M
Mr.doob 已提交
923 924
							console.warn( "ERROR: Missing vertex shader definition:", program.vertexShader );
							materialType = THREE.MeshPhongMaterial;
R
Rich Tibbett 已提交
925

M
Mr.doob 已提交
926
						}
R
Rich Tibbett 已提交
927

M
Mr.doob 已提交
928 929
						// IMPORTANT: FIX VERTEX SHADER ATTRIBUTE DEFINITIONS
						materialParams.vertexShader = replaceTHREEShaderAttributes( vertexShader, technique );
R
Rich Tibbett 已提交
930

M
Mr.doob 已提交
931
						var uniforms = technique.uniforms;
R
Rich Tibbett 已提交
932

M
Mr.doob 已提交
933
						for ( var uniformId in uniforms ) {
R
Rich Tibbett 已提交
934

M
Mr.doob 已提交
935
							var pname = uniforms[ uniformId ];
M
Mr.doob 已提交
936
							var shaderParam = technique.parameters[ pname ];
R
Rich Tibbett 已提交
937

M
Mr.doob 已提交
938
							var ptype = shaderParam.type;
R
Rich Tibbett 已提交
939

M
Mr.doob 已提交
940
							if ( WEBGL_TYPE[ ptype ] ) {
R
Rich Tibbett 已提交
941

M
Mr.doob 已提交
942 943
								var pcount = shaderParam.count;
								var value = material.values[ pname ];
R
Rich Tibbett 已提交
944

M
Mr.doob 已提交
945 946 947
								var uvalue = new WEBGL_TYPE[ ptype ]();
								var usemantic = shaderParam.semantic;
								var unode = shaderParam.node;
R
Rich Tibbett 已提交
948

M
Mr.doob 已提交
949
								switch ( ptype ) {
R
Rich Tibbett 已提交
950

M
Mr.doob 已提交
951
									case WEBGL_CONSTANTS.FLOAT:
R
Rich Tibbett 已提交
952

M
Mr.doob 已提交
953
										uvalue = shaderParam.value;
R
Rich Tibbett 已提交
954

M
Mr.doob 已提交
955
										if ( pname == "transparency" ) {
R
Rich Tibbett 已提交
956

M
Mr.doob 已提交
957
											materialParams.transparent = true;
R
Rich Tibbett 已提交
958

M
Mr.doob 已提交
959
										}
R
Rich Tibbett 已提交
960

M
Mr.doob 已提交
961
										if ( value !== undefined ) {
R
Rich Tibbett 已提交
962

M
Mr.doob 已提交
963
											uvalue = value;
R
Rich Tibbett 已提交
964

M
Mr.doob 已提交
965
										}
R
Rich Tibbett 已提交
966

M
Mr.doob 已提交
967
										break;
R
Rich Tibbett 已提交
968

M
Mr.doob 已提交
969 970 971 972
									case WEBGL_CONSTANTS.FLOAT_VEC2:
									case WEBGL_CONSTANTS.FLOAT_VEC3:
									case WEBGL_CONSTANTS.FLOAT_VEC4:
									case WEBGL_CONSTANTS.FLOAT_MAT3:
R
Rich Tibbett 已提交
973 974 975

										if ( shaderParam && shaderParam.value ) {

M
Mr.doob 已提交
976
											uvalue.fromArray( shaderParam.value );
R
Rich Tibbett 已提交
977 978 979 980 981 982 983 984 985

										}

										if ( value ) {

											uvalue.fromArray( value );

										}

M
Mr.doob 已提交
986
										break;
R
Rich Tibbett 已提交
987

M
Mr.doob 已提交
988
									case WEBGL_CONSTANTS.FLOAT_MAT2:
R
Rich Tibbett 已提交
989

M
Mr.doob 已提交
990 991 992
										// what to do?
										console.warn( "FLOAT_MAT2 is not a supported uniform type" );
										break;
R
Rich Tibbett 已提交
993

M
Mr.doob 已提交
994
									case WEBGL_CONSTANTS.FLOAT_MAT4:
R
Rich Tibbett 已提交
995

M
Mr.doob 已提交
996
										if ( pcount ) {
R
Rich Tibbett 已提交
997

M
Mr.doob 已提交
998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032
											uvalue = new Array( pcount );

											for ( var mi = 0; mi < pcount; mi ++ ) {

												uvalue[ mi ] = new WEBGL_TYPE[ ptype ]();

											}

											if ( shaderParam && shaderParam.value ) {

												var m4v = shaderParam.value;
												uvalue.fromArray( m4v );

											}

											if ( value ) {

												uvalue.fromArray( value );

											}

										}	else {

											if ( shaderParam && shaderParam.value ) {

												var m4 = shaderParam.value;
												uvalue.fromArray( m4 );

											}

											if ( value ) {

												uvalue.fromArray( value );

											}
R
Rich Tibbett 已提交
1033 1034 1035

										}

M
Mr.doob 已提交
1036
										break;
R
Rich Tibbett 已提交
1037

M
Mr.doob 已提交
1038
									case WEBGL_CONSTANTS.SAMPLER_2D:
R
Rich Tibbett 已提交
1039

M
Mr.doob 已提交
1040
										uvalue = value ? dependencies.textures[ value ] : null;
R
Rich Tibbett 已提交
1041

M
Mr.doob 已提交
1042
										break;
R
Rich Tibbett 已提交
1043

M
Mr.doob 已提交
1044
								}
R
Rich Tibbett 已提交
1045

M
Mr.doob 已提交
1046 1047 1048 1049 1050
								materialParams.uniforms[ uniformId ] = {
									value: uvalue,
									semantic: usemantic,
									node: unode
								};
R
Rich Tibbett 已提交
1051

M
Mr.doob 已提交
1052
							} else {
R
Rich Tibbett 已提交
1053

M
Mr.doob 已提交
1054
								throw new Error( "Unknown shader uniform param type: " + ptype );
R
Rich Tibbett 已提交
1055

M
Mr.doob 已提交
1056
							}
R
Rich Tibbett 已提交
1057

M
Mr.doob 已提交
1058
						}
R
Rich Tibbett 已提交
1059

M
Mr.doob 已提交
1060
					}
R
Rich Tibbett 已提交
1061 1062 1063

				}

M
Mr.doob 已提交
1064
				if ( Array.isArray( materialValues.diffuse ) ) {
R
Rich Tibbett 已提交
1065

M
Mr.doob 已提交
1066
					materialParams.color = new THREE.Color().fromArray( materialValues.diffuse );
R
Rich Tibbett 已提交
1067

M
Mr.doob 已提交
1068
				} else if ( typeof( materialValues.diffuse ) === 'string' ) {
R
Rich Tibbett 已提交
1069

M
Mr.doob 已提交
1070
					materialParams.map = dependencies.textures[ materialValues.diffuse ];
R
Rich Tibbett 已提交
1071

M
Mr.doob 已提交
1072
				}
R
Rich Tibbett 已提交
1073

M
Mr.doob 已提交
1074
				delete materialParams.diffuse;
R
Rich Tibbett 已提交
1075

M
Mr.doob 已提交
1076
				if ( typeof( materialValues.reflective ) === 'string' ) {
R
Rich Tibbett 已提交
1077

M
Mr.doob 已提交
1078
					materialParams.envMap = dependencies.textures[ materialValues.reflective ];
R
Rich Tibbett 已提交
1079

M
Mr.doob 已提交
1080
				}
R
Rich Tibbett 已提交
1081

M
Mr.doob 已提交
1082
				if ( typeof( materialValues.bump ) === 'string' ) {
R
Rich Tibbett 已提交
1083

M
Mr.doob 已提交
1084
					materialParams.bumpMap = dependencies.textures[ materialValues.bump ];
R
Rich Tibbett 已提交
1085

M
Mr.doob 已提交
1086
				}
R
Rich Tibbett 已提交
1087

M
Mr.doob 已提交
1088
				if ( Array.isArray( materialValues.emission ) ) {
R
Rich Tibbett 已提交
1089

1090 1091 1092 1093 1094 1095 1096 1097 1098
					if ( materialType === THREE.MeshBasicMaterial ) {

						materialParams.color = new THREE.Color().fromArray( materialValues.emission );

					} else {

						materialParams.emissive = new THREE.Color().fromArray( materialValues.emission );

					}
R
Rich Tibbett 已提交
1099

1100 1101
				} else if ( typeof( materialValues.emission ) === 'string' ) {

1102
					if ( materialType === THREE.MeshBasicMaterial ) {
1103

1104
						materialParams.map = dependencies.textures[ materialValues.emission ];
R
Rich Tibbett 已提交
1105

1106 1107 1108 1109 1110 1111 1112
					} else {

						materialParams.emissiveMap = dependencies.textures[ materialValues.emission ];

					}

				}
1113

M
Mr.doob 已提交
1114
				if ( Array.isArray( materialValues.specular ) ) {
R
Rich Tibbett 已提交
1115

M
Mr.doob 已提交
1116
					materialParams.specular = new THREE.Color().fromArray( materialValues.specular );
R
Rich Tibbett 已提交
1117

1118 1119 1120 1121
				} else if ( typeof( materialValues.specular ) === 'string' ) {

					materialParams.specularMap = dependencies.textures[ materialValues.specular ];

1122
				}
1123

M
Mr.doob 已提交
1124
				if ( materialValues.shininess !== undefined ) {
R
Rich Tibbett 已提交
1125

M
Mr.doob 已提交
1126
					materialParams.shininess = materialValues.shininess;
R
Rich Tibbett 已提交
1127

M
Mr.doob 已提交
1128
				}
R
Rich Tibbett 已提交
1129

M
Mr.doob 已提交
1130 1131
				var _material = new materialType( materialParams );
				_material.name = material.name;
R
Rich Tibbett 已提交
1132

M
Mr.doob 已提交
1133
				return _material;
R
Rich Tibbett 已提交
1134

M
Mr.doob 已提交
1135
			} );
R
Rich Tibbett 已提交
1136

M
Mr.doob 已提交
1137
		} );
R
Rich Tibbett 已提交
1138

M
Mr.doob 已提交
1139
	};
R
Rich Tibbett 已提交
1140

M
Mr.doob 已提交
1141
	GLTFParser.prototype.loadMeshes = function () {
R
Rich Tibbett 已提交
1142

M
Mr.doob 已提交
1143 1144
		var json = this.json;

M
Mr.doob 已提交
1145
		return this._withDependencies( [
R
Rich Tibbett 已提交
1146

M
Mr.doob 已提交
1147 1148
			"accessors",
			"materials"
R
Rich Tibbett 已提交
1149

M
Mr.doob 已提交
1150
		] ).then( function ( dependencies ) {
R
Rich Tibbett 已提交
1151

M
Mr.doob 已提交
1152
			return _each( json.meshes, function ( mesh ) {
R
Rich Tibbett 已提交
1153

M
Mr.doob 已提交
1154 1155
				var group = new THREE.Object3D();
				group.name = mesh.name;
R
Rich Tibbett 已提交
1156

M
Mr.doob 已提交
1157
				var primitives = mesh.primitives;
R
Rich Tibbett 已提交
1158

M
Mr.doob 已提交
1159 1160 1161
				for ( var name in primitives ) {

					var primitive = primitives[ name ];
R
Rich Tibbett 已提交
1162

M
Mr.doob 已提交
1163
					if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES || primitive.mode === undefined ) {
R
Rich Tibbett 已提交
1164

M
Mr.doob 已提交
1165
						var geometry = new THREE.BufferGeometry();
R
Rich Tibbett 已提交
1166

M
Mr.doob 已提交
1167
						var attributes = primitive.attributes;
R
Rich Tibbett 已提交
1168

M
Mr.doob 已提交
1169 1170 1171
						for ( var attributeId in attributes ) {

							var attributeEntry = attributes[ attributeId ];
R
Rich Tibbett 已提交
1172

M
Mr.doob 已提交
1173
							if ( ! attributeEntry ) return;
R
Rich Tibbett 已提交
1174

M
Mr.doob 已提交
1175
							var bufferAttribute = dependencies.accessors[ attributeEntry ];
R
Rich Tibbett 已提交
1176

M
Mr.doob 已提交
1177
							switch ( attributeId ) {
R
Rich Tibbett 已提交
1178

M
Mr.doob 已提交
1179 1180 1181
								case 'POSITION':
									geometry.addAttribute( 'position', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1182

M
Mr.doob 已提交
1183 1184 1185
								case 'NORMAL':
									geometry.addAttribute( 'normal', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1186

M
Mr.doob 已提交
1187 1188 1189 1190 1191
								case 'TEXCOORD_0':
								case 'TEXCOORD0':
								case 'TEXCOORD':
									geometry.addAttribute( 'uv', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1192

M
Mr.doob 已提交
1193 1194 1195
								case 'WEIGHT':
									geometry.addAttribute( 'skinWeight', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1196

M
Mr.doob 已提交
1197 1198 1199
								case 'JOINT':
									geometry.addAttribute( 'skinIndex', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1200

M
Mr.doob 已提交
1201
							}
R
Rich Tibbett 已提交
1202

M
Mr.doob 已提交
1203
						}
R
Rich Tibbett 已提交
1204

M
Mr.doob 已提交
1205
						if ( primitive.indices ) {
R
Rich Tibbett 已提交
1206

M
Mr.doob 已提交
1207
							var indexArray = dependencies.accessors[ primitive.indices ];
R
Rich Tibbett 已提交
1208

M
Mr.doob 已提交
1209
							geometry.setIndex( indexArray );
R
Rich Tibbett 已提交
1210

M
Mr.doob 已提交
1211
							var offset = {
R
Rich Tibbett 已提交
1212 1213 1214 1215 1216
								start: 0,
								index: 0,
								count: indexArray.count
							};

M
Mr.doob 已提交
1217
							geometry.groups.push( offset );
R
Rich Tibbett 已提交
1218

M
Mr.doob 已提交
1219
							geometry.computeBoundingSphere();
R
Rich Tibbett 已提交
1220

M
Mr.doob 已提交
1221
						}
R
Rich Tibbett 已提交
1222 1223


M
Mr.doob 已提交
1224
						var material = dependencies.materials[ primitive.material ];
R
Rich Tibbett 已提交
1225

M
Mr.doob 已提交
1226 1227
						var meshNode = new THREE.Mesh( geometry, material );
						meshNode.castShadow = true;
R
Rich Tibbett 已提交
1228

M
Mr.doob 已提交
1229
						group.add( meshNode );
R
Rich Tibbett 已提交
1230

M
Mr.doob 已提交
1231
					} else {
R
Rich Tibbett 已提交
1232

M
Mr.doob 已提交
1233
						console.warn( "Non-triangular primitives are not supported" );
R
Rich Tibbett 已提交
1234

M
Mr.doob 已提交
1235
					}
R
Rich Tibbett 已提交
1236

M
Mr.doob 已提交
1237
				}
R
Rich Tibbett 已提交
1238

M
Mr.doob 已提交
1239
				return group;
R
Rich Tibbett 已提交
1240

M
Mr.doob 已提交
1241
			} );
R
Rich Tibbett 已提交
1242

M
Mr.doob 已提交
1243
		} );
R
Rich Tibbett 已提交
1244

M
Mr.doob 已提交
1245
	};
R
Rich Tibbett 已提交
1246

M
Mr.doob 已提交
1247
	GLTFParser.prototype.loadCameras = function () {
R
Rich Tibbett 已提交
1248

M
Mr.doob 已提交
1249 1250 1251
		var json = this.json;

		return _each( json.cameras, function ( camera ) {
R
Rich Tibbett 已提交
1252

M
Mr.doob 已提交
1253
			if ( camera.type == "perspective" && camera.perspective ) {
R
Rich Tibbett 已提交
1254

M
Mr.doob 已提交
1255 1256 1257
				var yfov = camera.perspective.yfov;
				var xfov = camera.perspective.xfov;
				var aspect_ratio = camera.perspective.aspect_ratio || 1;
R
Rich Tibbett 已提交
1258

M
Mr.doob 已提交
1259 1260 1261
				// According to COLLADA spec...
				// aspect_ratio = xfov / yfov
				xfov = ( xfov === undefined && yfov ) ? yfov * aspect_ratio : xfov;
R
Rich Tibbett 已提交
1262

M
Mr.doob 已提交
1263 1264 1265
				// According to COLLADA spec...
				// aspect_ratio = xfov / yfov
				// yfov = ( yfov === undefined && xfov ) ? xfov / aspect_ratio : yfov;
R
Rich Tibbett 已提交
1266

M
Mr.doob 已提交
1267 1268
				var _camera = new THREE.PerspectiveCamera( THREE.Math.radToDeg( xfov ), aspect_ratio, camera.perspective.znear || 1, camera.perspective.zfar || 2e6 );
				_camera.name = camera.name;
R
Rich Tibbett 已提交
1269

M
Mr.doob 已提交
1270
				return _camera;
R
Rich Tibbett 已提交
1271

M
Mr.doob 已提交
1272
			} else if ( camera.type == "orthographic" && camera.orthographic ) {
R
Rich Tibbett 已提交
1273

M
Mr.doob 已提交
1274 1275
				var _camera = new THREE.OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, camera.orthographic.znear, camera.orthographic.zfar );
				_camera.name = camera.name;
R
Rich Tibbett 已提交
1276

M
Mr.doob 已提交
1277
				return _camera;
R
Rich Tibbett 已提交
1278

M
Mr.doob 已提交
1279
			}
R
Rich Tibbett 已提交
1280

M
Mr.doob 已提交
1281
		} );
R
Rich Tibbett 已提交
1282

M
Mr.doob 已提交
1283
	};
R
Rich Tibbett 已提交
1284

M
Mr.doob 已提交
1285
	GLTFParser.prototype.loadSkins = function () {
R
Rich Tibbett 已提交
1286

M
Mr.doob 已提交
1287
		var json = this.json;
R
Rich Tibbett 已提交
1288

M
Mr.doob 已提交
1289
		return this._withDependencies( [
R
Rich Tibbett 已提交
1290

M
Mr.doob 已提交
1291
			"accessors"
R
Rich Tibbett 已提交
1292

M
Mr.doob 已提交
1293
		] ).then( function ( dependencies ) {
R
Rich Tibbett 已提交
1294

M
Mr.doob 已提交
1295
			return _each( json.skins, function ( skin ) {
M
Mr.doob 已提交
1296 1297 1298 1299 1300 1301 1302 1303 1304 1305

				var _skin = {
					bindShapeMatrix: new THREE.Matrix4().fromArray( skin.bindShapeMatrix ),
					jointNames: skin.jointNames,
					inverseBindMatrices: dependencies.accessors[ skin.inverseBindMatrices ]
				};

				return _skin;

			} );
R
Rich Tibbett 已提交
1306

M
Mr.doob 已提交
1307
		} );
R
Rich Tibbett 已提交
1308

M
Mr.doob 已提交
1309 1310
	};

1311
	GLTFParser.prototype.loadAnimations = function () {
R
Rich Tibbett 已提交
1312

M
Mr.doob 已提交
1313
		var json = this.json;
R
Rich Tibbett 已提交
1314

M
Mr.doob 已提交
1315
		return this._withDependencies( [
R
Rich Tibbett 已提交
1316

M
Mr.doob 已提交
1317 1318
			"accessors",
			"nodes"
R
Rich Tibbett 已提交
1319

M
Mr.doob 已提交
1320
		] ).then( function ( dependencies ) {
R
Rich Tibbett 已提交
1321

M
Mr.doob 已提交
1322
			return _each( json.animations, function ( animation, animationId ) {
R
Rich Tibbett 已提交
1323

M
Mr.doob 已提交
1324
				var interps = [];
R
Rich Tibbett 已提交
1325

M
Mr.doob 已提交
1326
				for ( var channelId in animation.channels ) {
M
Mr.doob 已提交
1327

M
Mr.doob 已提交
1328
					var channel = animation.channels[ channelId ];
M
Mr.doob 已提交
1329 1330 1331
					var sampler = animation.samplers[ channel.sampler ];

					if ( sampler && animation.parameters ) {
R
Rich Tibbett 已提交
1332 1333 1334

						var target = channel.target;
						var name = target.id;
M
Mr.doob 已提交
1335 1336
						var input = animation.parameters[ sampler.input ];
						var output = animation.parameters[ sampler.output ];
R
Rich Tibbett 已提交
1337 1338 1339 1340 1341 1342 1343 1344 1345

						var inputAccessor = dependencies.accessors[ input ];
						var outputAccessor = dependencies.accessors[ output ];

						var node = dependencies.nodes[ name ];

						if ( node ) {

							var interp = {
1346
								times: inputAccessor.array,
M
Mr.doob 已提交
1347 1348
								values: outputAccessor.array,
								target: node,
1349 1350
								type: INTERPOLATION[ sampler.interpolation ],
								name: node.name + '.' + PATH_PROPERTIES[ target.path ]
R
Rich Tibbett 已提交
1351 1352 1353 1354 1355 1356
							};

							interps.push( interp );

						}

M
Mr.doob 已提交
1357
					}
R
Rich Tibbett 已提交
1358

M
Mr.doob 已提交
1359
				}
R
Rich Tibbett 已提交
1360

1361
				return createAnimation( "animation_" + animationId, interps );
R
Rich Tibbett 已提交
1362

M
Mr.doob 已提交
1363
			} );
R
Rich Tibbett 已提交
1364

M
Mr.doob 已提交
1365
		} );
R
Rich Tibbett 已提交
1366

M
Mr.doob 已提交
1367
	};
R
Rich Tibbett 已提交
1368

M
Mr.doob 已提交
1369
	GLTFParser.prototype.loadNodes = function () {
R
Rich Tibbett 已提交
1370

M
Mr.doob 已提交
1371 1372 1373 1374
		var json = this.json;
		var scope = this;

		return _each( json.nodes, function ( node ) {
R
Rich Tibbett 已提交
1375

M
Mr.doob 已提交
1376
			var matrix = new THREE.Matrix4();
R
Rich Tibbett 已提交
1377

M
Mr.doob 已提交
1378
			var _node;
R
Rich Tibbett 已提交
1379

M
Mr.doob 已提交
1380
			if ( node.jointName ) {
R
Rich Tibbett 已提交
1381

M
Mr.doob 已提交
1382 1383
				_node = new THREE.Bone();
				_node.jointName = node.jointName;
R
Rich Tibbett 已提交
1384

M
Mr.doob 已提交
1385
			} else {
R
Rich Tibbett 已提交
1386

M
Mr.doob 已提交
1387
				_node = new THREE.Object3D();
R
Rich Tibbett 已提交
1388

M
Mr.doob 已提交
1389
			}
R
Rich Tibbett 已提交
1390

M
Mr.doob 已提交
1391
			_node.name = node.name;
R
Rich Tibbett 已提交
1392

M
Mr.doob 已提交
1393
			_node.matrixAutoUpdate = false;
R
Rich Tibbett 已提交
1394

M
Mr.doob 已提交
1395
			if ( node.matrix !== undefined ) {
R
Rich Tibbett 已提交
1396

M
Mr.doob 已提交
1397 1398
				matrix.fromArray( node.matrix );
				_node.applyMatrix( matrix );
R
Rich Tibbett 已提交
1399

M
Mr.doob 已提交
1400
			} else {
R
Rich Tibbett 已提交
1401

M
Mr.doob 已提交
1402
				if ( node.translation !== undefined ) {
R
Rich Tibbett 已提交
1403

M
Mr.doob 已提交
1404
					_node.position.fromArray( node.translation );
R
Rich Tibbett 已提交
1405

M
Mr.doob 已提交
1406
				}
R
Rich Tibbett 已提交
1407

M
Mr.doob 已提交
1408
				if ( node.rotation !== undefined ) {
R
Rich Tibbett 已提交
1409

M
Mr.doob 已提交
1410
					_node.quaternion.fromArray( node.rotation );
R
Rich Tibbett 已提交
1411

M
Mr.doob 已提交
1412 1413 1414
				}

				if ( node.scale !== undefined ) {
R
Rich Tibbett 已提交
1415

M
Mr.doob 已提交
1416
					_node.scale.fromArray( node.scale );
R
Rich Tibbett 已提交
1417

M
Mr.doob 已提交
1418
				}
R
Rich Tibbett 已提交
1419 1420 1421

			}

M
Mr.doob 已提交
1422
			return _node;
R
Rich Tibbett 已提交
1423

M
Mr.doob 已提交
1424
		} ).then( function ( __nodes ) {
R
Rich Tibbett 已提交
1425

M
Mr.doob 已提交
1426
			return scope._withDependencies( [
R
Rich Tibbett 已提交
1427

M
Mr.doob 已提交
1428 1429 1430 1431
				"meshes",
				"skins",
				"cameras",
				"extensions"
R
Rich Tibbett 已提交
1432

M
Mr.doob 已提交
1433
			] ).then( function ( dependencies ) {
R
Rich Tibbett 已提交
1434

M
Mr.doob 已提交
1435
				return _each( __nodes, function ( _node, nodeId ) {
R
Rich Tibbett 已提交
1436

M
Mr.doob 已提交
1437
					var node = json.nodes[ nodeId ];
R
Rich Tibbett 已提交
1438

M
Mr.doob 已提交
1439
					if ( node.meshes !== undefined ) {
R
Rich Tibbett 已提交
1440

M
Mr.doob 已提交
1441
						for ( var meshId in node.meshes ) {
R
Rich Tibbett 已提交
1442

M
Mr.doob 已提交
1443 1444
							var mesh = node.meshes[ meshId ];
							var group = dependencies.meshes[ mesh ];
R
Rich Tibbett 已提交
1445

M
Mr.doob 已提交
1446 1447 1448
							for ( var childrenId in group.children ) {

								var child = group.children[ childrenId ];
R
Rich Tibbett 已提交
1449

M
Mr.doob 已提交
1450
								// clone Mesh to add to _node
R
Rich Tibbett 已提交
1451

M
Mr.doob 已提交
1452 1453
								var originalMaterial = child.material;
								var originalGeometry = child.geometry;
R
Rich Tibbett 已提交
1454

M
Mr.doob 已提交
1455
								var material;
R
Rich Tibbett 已提交
1456

M
Mr.doob 已提交
1457
								if ( originalMaterial.isDeferredShaderMaterial ) {
R
Rich Tibbett 已提交
1458

M
Mr.doob 已提交
1459
									originalMaterial = material = originalMaterial.create();
R
Rich Tibbett 已提交
1460

M
Mr.doob 已提交
1461
								} else {
R
Rich Tibbett 已提交
1462

M
Mr.doob 已提交
1463
									material = originalMaterial;
R
Rich Tibbett 已提交
1464

M
Mr.doob 已提交
1465
								}
R
Rich Tibbett 已提交
1466

M
Mr.doob 已提交
1467 1468
								child = new THREE.Mesh( originalGeometry, material );
								child.castShadow = true;
R
Rich Tibbett 已提交
1469

M
Mr.doob 已提交
1470
								var skinEntry;
M
Mr.doob 已提交
1471

M
Mr.doob 已提交
1472
								if ( node.skin ) {
R
Rich Tibbett 已提交
1473

M
Mr.doob 已提交
1474
									skinEntry = dependencies.skins[ node.skin ];
R
Rich Tibbett 已提交
1475

M
Mr.doob 已提交
1476
								}
R
Rich Tibbett 已提交
1477

M
Mr.doob 已提交
1478 1479
								// Replace Mesh with SkinnedMesh in library
								if ( skinEntry ) {
R
Rich Tibbett 已提交
1480

M
Mr.doob 已提交
1481 1482 1483
									var geometry = originalGeometry;
									var material = originalMaterial;
									material.skinning = true;
R
Rich Tibbett 已提交
1484

M
Mr.doob 已提交
1485 1486
									child = new THREE.SkinnedMesh( geometry, material, false );
									child.castShadow = true;
R
Rich Tibbett 已提交
1487

M
Mr.doob 已提交
1488 1489
									var bones = [];
									var boneInverses = [];
R
Rich Tibbett 已提交
1490

T
Takahiro 已提交
1491 1492
									var keys = Object.keys( __nodes );

M
Mr.doob 已提交
1493
									for ( var i = 0, l = skinEntry.jointNames.length; i < l; i ++ ) {
R
Rich Tibbett 已提交
1494

M
Mr.doob 已提交
1495
										var jointId = skinEntry.jointNames[ i ];
T
Takahiro 已提交
1496 1497 1498 1499 1500

										var jointNode;

										for ( var j = 0, jl = keys.length; j < jl; j ++ ) {

T
Takahiro 已提交
1501
											var n = __nodes[ keys[ j ] ];
T
Takahiro 已提交
1502

T
Takahiro 已提交
1503
											if ( n.jointName === jointId ) {
T
Takahiro 已提交
1504

T
Takahiro 已提交
1505
												jointNode = n;
T
Takahiro 已提交
1506 1507 1508 1509 1510
												break;

											}

										}
R
Rich Tibbett 已提交
1511

M
Mr.doob 已提交
1512
										if ( jointNode ) {
R
Rich Tibbett 已提交
1513

M
Mr.doob 已提交
1514
											jointNode.skin = child;
M
Mr.doob 已提交
1515
											bones.push( jointNode );
R
Rich Tibbett 已提交
1516

M
Mr.doob 已提交
1517 1518 1519
											var m = skinEntry.inverseBindMatrices.array;
											var mat = new THREE.Matrix4().fromArray( m, i * 16 );
											boneInverses.push( mat );
R
Rich Tibbett 已提交
1520

M
Mr.doob 已提交
1521
										} else {
R
Rich Tibbett 已提交
1522

M
Mr.doob 已提交
1523
											console.warn( "WARNING: joint: ''" + jointId + "' could not be found" );
R
Rich Tibbett 已提交
1524

M
Mr.doob 已提交
1525
										}
R
Rich Tibbett 已提交
1526

M
Mr.doob 已提交
1527
									}
R
Rich Tibbett 已提交
1528

M
Mr.doob 已提交
1529
									child.bind( new THREE.Skeleton( bones, boneInverses, false ), skinEntry.bindShapeMatrix );
R
Rich Tibbett 已提交
1530

M
Mr.doob 已提交
1531
								}
R
Rich Tibbett 已提交
1532

M
Mr.doob 已提交
1533
								_node.add( child );
R
Rich Tibbett 已提交
1534

M
Mr.doob 已提交
1535
							}
R
Rich Tibbett 已提交
1536

M
Mr.doob 已提交
1537
						}
R
Rich Tibbett 已提交
1538

M
Mr.doob 已提交
1539
					}
R
Rich Tibbett 已提交
1540

M
Mr.doob 已提交
1541
					if ( node.camera !== undefined ) {
R
Rich Tibbett 已提交
1542

M
Mr.doob 已提交
1543
						var camera = dependencies.cameras[ node.camera ];
R
Rich Tibbett 已提交
1544

M
Mr.doob 已提交
1545
						_node.add( camera );
R
Rich Tibbett 已提交
1546

M
Mr.doob 已提交
1547
					}
R
Rich Tibbett 已提交
1548

M
Mr.doob 已提交
1549
					if ( node.extensions && node.extensions.KHR_materials_common && node.extensions.KHR_materials_common.light ) {
R
Rich Tibbett 已提交
1550

M
Mr.doob 已提交
1551
						var light = dependencies.extensions.KHR_materials_common.lights[ node.extensions.KHR_materials_common.light ];
R
Rich Tibbett 已提交
1552

M
Mr.doob 已提交
1553
						_node.add( light );
R
Rich Tibbett 已提交
1554

M
Mr.doob 已提交
1555
					}
R
Rich Tibbett 已提交
1556

M
Mr.doob 已提交
1557
					return _node;
R
Rich Tibbett 已提交
1558

M
Mr.doob 已提交
1559
				} );
R
Rich Tibbett 已提交
1560

M
Mr.doob 已提交
1561
			} );
R
Rich Tibbett 已提交
1562

M
Mr.doob 已提交
1563
		} );
R
Rich Tibbett 已提交
1564

M
Mr.doob 已提交
1565
	};
R
Rich Tibbett 已提交
1566

M
Mr.doob 已提交
1567
	GLTFParser.prototype.loadExtensions = function () {
R
Rich Tibbett 已提交
1568

M
Mr.doob 已提交
1569 1570 1571
		var json = this.json;

		return _each( json.extensions, function ( extension, extensionId ) {
R
Rich Tibbett 已提交
1572

M
Mr.doob 已提交
1573
			switch ( extensionId ) {
R
Rich Tibbett 已提交
1574

M
Mr.doob 已提交
1575
				case "KHR_materials_common":
R
Rich Tibbett 已提交
1576

M
Mr.doob 已提交
1577 1578 1579
					var extensionNode = {
						lights: {}
					};
R
Rich Tibbett 已提交
1580

M
Mr.doob 已提交
1581
					var lights = extension.lights;
R
Rich Tibbett 已提交
1582

M
Mr.doob 已提交
1583
					for ( var lightId in lights ) {
R
Rich Tibbett 已提交
1584

M
Mr.doob 已提交
1585
						var light = lights[ lightId ];
M
Mr.doob 已提交
1586
						var lightNode;
R
Rich Tibbett 已提交
1587

M
Mr.doob 已提交
1588 1589
						var lightParams = light[ light.type ];
						var color = new THREE.Color().fromArray( lightParams.color );
R
Rich Tibbett 已提交
1590

M
Mr.doob 已提交
1591 1592 1593 1594 1595 1596
						switch ( light.type ) {

							case "directional":
								lightNode = new THREE.DirectionalLight( color );
								lightNode.position.set( 0, 0, 1 );
								break;
R
Rich Tibbett 已提交
1597

M
Mr.doob 已提交
1598 1599 1600
							case "point":
								lightNode = new THREE.PointLight( color );
								break;
R
Rich Tibbett 已提交
1601

M
Mr.doob 已提交
1602 1603 1604 1605
							case "spot ":
								lightNode = new THREE.SpotLight( color );
								lightNode.position.set( 0, 0, 1 );
								break;
R
Rich Tibbett 已提交
1606

M
Mr.doob 已提交
1607 1608 1609
							case "ambient":
								lightNode = new THREE.AmbientLight( color );
								break;
R
Rich Tibbett 已提交
1610

M
Mr.doob 已提交
1611
						}
R
Rich Tibbett 已提交
1612

M
Mr.doob 已提交
1613
						if ( lightNode ) {
R
Rich Tibbett 已提交
1614

M
Mr.doob 已提交
1615
							extensionNode.lights[ lightId ] = lightNode;
R
Rich Tibbett 已提交
1616

M
Mr.doob 已提交
1617
						}
R
Rich Tibbett 已提交
1618

M
Mr.doob 已提交
1619
					}
R
Rich Tibbett 已提交
1620

M
Mr.doob 已提交
1621
					return extensionNode;
R
Rich Tibbett 已提交
1622

M
Mr.doob 已提交
1623
					break;
R
Rich Tibbett 已提交
1624

M
Mr.doob 已提交
1625
			}
R
Rich Tibbett 已提交
1626

M
Mr.doob 已提交
1627
		} );
R
Rich Tibbett 已提交
1628

M
Mr.doob 已提交
1629
	};
R
Rich Tibbett 已提交
1630

M
Mr.doob 已提交
1631
	GLTFParser.prototype.loadScenes = function () {
R
Rich Tibbett 已提交
1632

M
Mr.doob 已提交
1633
		var json = this.json;
M
Mr.doob 已提交
1634 1635 1636 1637 1638 1639 1640 1641

		// scene node hierachy builder

		function buildNodeHierachy( nodeId, parentObject, allNodes ) {

			var _node = allNodes[ nodeId ];
			parentObject.add( _node );

M
Mr.doob 已提交
1642
			var node = json.nodes[ nodeId ];
M
Mr.doob 已提交
1643 1644 1645

			if ( node.children ) {

M
Mr.doob 已提交
1646 1647 1648
				var children = node.children;

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

M
Mr.doob 已提交
1650
					var child = children[ i ];
M
Mr.doob 已提交
1651 1652
					buildNodeHierachy( child, _node, allNodes );

M
Mr.doob 已提交
1653
				}
M
Mr.doob 已提交
1654 1655

			}
R
Rich Tibbett 已提交
1656 1657 1658

		}

M
Mr.doob 已提交
1659
		return this._withDependencies( [
R
Rich Tibbett 已提交
1660

M
Mr.doob 已提交
1661
			"nodes"
R
Rich Tibbett 已提交
1662

M
Mr.doob 已提交
1663
		] ).then( function ( dependencies ) {
R
Rich Tibbett 已提交
1664

M
Mr.doob 已提交
1665
			return _each( json.scenes, function ( scene ) {
R
Rich Tibbett 已提交
1666

M
Mr.doob 已提交
1667 1668
				var _scene = new THREE.Scene();
				_scene.name = scene.name;
R
Rich Tibbett 已提交
1669

M
Mr.doob 已提交
1670
				var nodes = scene.nodes;
R
Rich Tibbett 已提交
1671

M
Mr.doob 已提交
1672 1673 1674
				for ( var i = 0, l = nodes.length; i < l; i ++ ) {

					var nodeId = nodes[ i ];
M
Mr.doob 已提交
1675
					buildNodeHierachy( nodeId, _scene, dependencies.nodes );
R
Rich Tibbett 已提交
1676

M
Mr.doob 已提交
1677
				}
R
Rich Tibbett 已提交
1678

M
Mr.doob 已提交
1679
				_scene.traverse( function ( child ) {
R
Rich Tibbett 已提交
1680

M
Mr.doob 已提交
1681 1682
					// Register raw material meshes with GLTFLoader.Shaders
					if ( child.material && child.material.isRawShaderMaterial ) {
R
Rich Tibbett 已提交
1683

M
Mr.doob 已提交
1684 1685
						var xshader = new GLTFShader( child, dependencies.nodes );
						GLTFLoader.Shaders.add( child.uuid, xshader );
R
Rich Tibbett 已提交
1686

M
Mr.doob 已提交
1687 1688 1689 1690 1691 1692 1693
					}

				} );

				return _scene;

			} );
R
Rich Tibbett 已提交
1694

M
Mr.doob 已提交
1695 1696 1697
		} );

	};
R
Rich Tibbett 已提交
1698

M
Mr.doob 已提交
1699
	return GLTFLoader;
R
Rich Tibbett 已提交
1700

M
Mr.doob 已提交
1701
} )();