GLTFLoader.js 33.6 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;
1156
  			group.userData = mesh.extras || {};
R
Rich Tibbett 已提交
1157

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

M
Mr.doob 已提交
1227 1228
						var meshNode = new THREE.Mesh( geometry, material );
						meshNode.castShadow = true;
1229
  					meshNode.userData = primitive.extras || {};
R
Rich Tibbett 已提交
1230

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

M
Mr.doob 已提交
1233
					} else {
R
Rich Tibbett 已提交
1234

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

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

M
Mr.doob 已提交
1239
				}
R
Rich Tibbett 已提交
1240

M
Mr.doob 已提交
1241
				return group;
R
Rich Tibbett 已提交
1242

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

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

M
Mr.doob 已提交
1247
	};
R
Rich Tibbett 已提交
1248

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

M
Mr.doob 已提交
1251 1252 1253
		var json = this.json;

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

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

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

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

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

M
Mr.doob 已提交
1269 1270
				var _camera = new THREE.PerspectiveCamera( THREE.Math.radToDeg( xfov ), aspect_ratio, camera.perspective.znear || 1, camera.perspective.zfar || 2e6 );
				_camera.name = camera.name;
1271
  			_camera.userData = camera.extras || {};
R
Rich Tibbett 已提交
1272

M
Mr.doob 已提交
1273
				return _camera;
R
Rich Tibbett 已提交
1274

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

M
Mr.doob 已提交
1277 1278
				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;
1279
  			_camera.userData = camera.extras || {};
R
Rich Tibbett 已提交
1280

M
Mr.doob 已提交
1281
				return _camera;
R
Rich Tibbett 已提交
1282

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

M
Mr.doob 已提交
1285
		} );
R
Rich Tibbett 已提交
1286

M
Mr.doob 已提交
1287
	};
R
Rich Tibbett 已提交
1288

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

M
Mr.doob 已提交
1291
		var json = this.json;
R
Rich Tibbett 已提交
1292

M
Mr.doob 已提交
1293
		return this._withDependencies( [
R
Rich Tibbett 已提交
1294

M
Mr.doob 已提交
1295
			"accessors"
R
Rich Tibbett 已提交
1296

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

M
Mr.doob 已提交
1299
			return _each( json.skins, function ( skin ) {
M
Mr.doob 已提交
1300 1301 1302 1303 1304 1305 1306 1307 1308 1309

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

				return _skin;

			} );
R
Rich Tibbett 已提交
1310

M
Mr.doob 已提交
1311
		} );
R
Rich Tibbett 已提交
1312

M
Mr.doob 已提交
1313 1314
	};

1315
	GLTFParser.prototype.loadAnimations = function () {
R
Rich Tibbett 已提交
1316

M
Mr.doob 已提交
1317
		var json = this.json;
R
Rich Tibbett 已提交
1318

M
Mr.doob 已提交
1319
		return this._withDependencies( [
R
Rich Tibbett 已提交
1320

M
Mr.doob 已提交
1321 1322
			"accessors",
			"nodes"
R
Rich Tibbett 已提交
1323

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

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

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

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

M
Mr.doob 已提交
1332
					var channel = animation.channels[ channelId ];
M
Mr.doob 已提交
1333 1334 1335
					var sampler = animation.samplers[ channel.sampler ];

					if ( sampler && animation.parameters ) {
R
Rich Tibbett 已提交
1336 1337 1338

						var target = channel.target;
						var name = target.id;
M
Mr.doob 已提交
1339 1340
						var input = animation.parameters[ sampler.input ];
						var output = animation.parameters[ sampler.output ];
R
Rich Tibbett 已提交
1341 1342 1343 1344 1345 1346 1347 1348 1349

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

						var node = dependencies.nodes[ name ];

						if ( node ) {

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

							interps.push( interp );

						}

M
Mr.doob 已提交
1361
					}
R
Rich Tibbett 已提交
1362

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

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

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

M
Mr.doob 已提交
1369
		} );
R
Rich Tibbett 已提交
1370

M
Mr.doob 已提交
1371
	};
R
Rich Tibbett 已提交
1372

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

M
Mr.doob 已提交
1375 1376 1377 1378
		var json = this.json;
		var scope = this;

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

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

M
Mr.doob 已提交
1382
			var _node;
R
Rich Tibbett 已提交
1383

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

M
Mr.doob 已提交
1386 1387
				_node = new THREE.Bone();
				_node.jointName = node.jointName;
R
Rich Tibbett 已提交
1388

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

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

M
Mr.doob 已提交
1393
			}
R
Rich Tibbett 已提交
1394

M
Mr.doob 已提交
1395
			_node.name = node.name;
1396
  		_node.userData = node.extras || {};
R
Rich Tibbett 已提交
1397

M
Mr.doob 已提交
1398
			_node.matrixAutoUpdate = false;
R
Rich Tibbett 已提交
1399

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

M
Mr.doob 已提交
1402 1403
				matrix.fromArray( node.matrix );
				_node.applyMatrix( matrix );
R
Rich Tibbett 已提交
1404

M
Mr.doob 已提交
1405
			} else {
R
Rich Tibbett 已提交
1406

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

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

M
Mr.doob 已提交
1411
				}
R
Rich Tibbett 已提交
1412

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

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

M
Mr.doob 已提交
1417 1418 1419
				}

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

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

M
Mr.doob 已提交
1423
				}
R
Rich Tibbett 已提交
1424 1425 1426

			}

M
Mr.doob 已提交
1427
			return _node;
R
Rich Tibbett 已提交
1428

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

M
Mr.doob 已提交
1431
			return scope._withDependencies( [
R
Rich Tibbett 已提交
1432

M
Mr.doob 已提交
1433 1434 1435 1436
				"meshes",
				"skins",
				"cameras",
				"extensions"
R
Rich Tibbett 已提交
1437

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

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

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

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

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

M
Mr.doob 已提交
1448 1449
							var mesh = node.meshes[ meshId ];
							var group = dependencies.meshes[ mesh ];
R
Rich Tibbett 已提交
1450

M
Mr.doob 已提交
1451 1452 1453
							for ( var childrenId in group.children ) {

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

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

M
Mr.doob 已提交
1457 1458
								var originalMaterial = child.material;
								var originalGeometry = child.geometry;
1459
  							var originalUserData = child.userData;
R
Rich Tibbett 已提交
1460

M
Mr.doob 已提交
1461
								var material;
R
Rich Tibbett 已提交
1462

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

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

M
Mr.doob 已提交
1467
								} else {
R
Rich Tibbett 已提交
1468

M
Mr.doob 已提交
1469
									material = originalMaterial;
R
Rich Tibbett 已提交
1470

M
Mr.doob 已提交
1471
								}
R
Rich Tibbett 已提交
1472

M
Mr.doob 已提交
1473 1474
								child = new THREE.Mesh( originalGeometry, material );
								child.castShadow = true;
1475
								child.userData = originalUserData;
R
Rich Tibbett 已提交
1476

M
Mr.doob 已提交
1477
								var skinEntry;
M
Mr.doob 已提交
1478

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

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

M
Mr.doob 已提交
1483
								}
R
Rich Tibbett 已提交
1484

M
Mr.doob 已提交
1485 1486
								// Replace Mesh with SkinnedMesh in library
								if ( skinEntry ) {
R
Rich Tibbett 已提交
1487

M
Mr.doob 已提交
1488 1489 1490
									var geometry = originalGeometry;
									var material = originalMaterial;
									material.skinning = true;
R
Rich Tibbett 已提交
1491

M
Mr.doob 已提交
1492 1493
									child = new THREE.SkinnedMesh( geometry, material, false );
									child.castShadow = true;
1494
  								child.userData = originalUserData;
R
Rich Tibbett 已提交
1495

M
Mr.doob 已提交
1496 1497
									var bones = [];
									var boneInverses = [];
R
Rich Tibbett 已提交
1498

T
Takahiro 已提交
1499 1500
									var keys = Object.keys( __nodes );

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

M
Mr.doob 已提交
1503
										var jointId = skinEntry.jointNames[ i ];
T
Takahiro 已提交
1504 1505 1506 1507 1508

										var jointNode;

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

T
Takahiro 已提交
1509
											var n = __nodes[ keys[ j ] ];
T
Takahiro 已提交
1510

T
Takahiro 已提交
1511
											if ( n.jointName === jointId ) {
T
Takahiro 已提交
1512

T
Takahiro 已提交
1513
												jointNode = n;
T
Takahiro 已提交
1514 1515 1516 1517 1518
												break;

											}

										}
R
Rich Tibbett 已提交
1519

M
Mr.doob 已提交
1520
										if ( jointNode ) {
R
Rich Tibbett 已提交
1521

M
Mr.doob 已提交
1522
											jointNode.skin = child;
M
Mr.doob 已提交
1523
											bones.push( jointNode );
R
Rich Tibbett 已提交
1524

M
Mr.doob 已提交
1525 1526 1527
											var m = skinEntry.inverseBindMatrices.array;
											var mat = new THREE.Matrix4().fromArray( m, i * 16 );
											boneInverses.push( mat );
R
Rich Tibbett 已提交
1528

M
Mr.doob 已提交
1529
										} else {
R
Rich Tibbett 已提交
1530

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

M
Mr.doob 已提交
1533
										}
R
Rich Tibbett 已提交
1534

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

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

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

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

M
Mr.doob 已提交
1543
							}
R
Rich Tibbett 已提交
1544

M
Mr.doob 已提交
1545
						}
R
Rich Tibbett 已提交
1546

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

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

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
1567
				} );
R
Rich Tibbett 已提交
1568

M
Mr.doob 已提交
1569
			} );
R
Rich Tibbett 已提交
1570

M
Mr.doob 已提交
1571
		} );
R
Rich Tibbett 已提交
1572

M
Mr.doob 已提交
1573
	};
R
Rich Tibbett 已提交
1574

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

M
Mr.doob 已提交
1577 1578 1579
		var json = this.json;

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

M
Mr.doob 已提交
1581
			switch ( extensionId ) {
R
Rich Tibbett 已提交
1582

M
Mr.doob 已提交
1583
				case "KHR_materials_common":
R
Rich Tibbett 已提交
1584

M
Mr.doob 已提交
1585 1586 1587
					var extensionNode = {
						lights: {}
					};
R
Rich Tibbett 已提交
1588

M
Mr.doob 已提交
1589
					var lights = extension.lights;
R
Rich Tibbett 已提交
1590

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

M
Mr.doob 已提交
1593
						var light = lights[ lightId ];
M
Mr.doob 已提交
1594
						var lightNode;
R
Rich Tibbett 已提交
1595

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

M
Mr.doob 已提交
1599 1600 1601 1602 1603 1604
						switch ( light.type ) {

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

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

M
Mr.doob 已提交
1610 1611 1612 1613
							case "spot ":
								lightNode = new THREE.SpotLight( color );
								lightNode.position.set( 0, 0, 1 );
								break;
R
Rich Tibbett 已提交
1614

M
Mr.doob 已提交
1615 1616 1617
							case "ambient":
								lightNode = new THREE.AmbientLight( color );
								break;
R
Rich Tibbett 已提交
1618

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

M
Mr.doob 已提交
1621
						if ( lightNode ) {
R
Rich Tibbett 已提交
1622

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

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

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

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

M
Mr.doob 已提交
1631
					break;
R
Rich Tibbett 已提交
1632

M
Mr.doob 已提交
1633
			}
R
Rich Tibbett 已提交
1634

M
Mr.doob 已提交
1635
		} );
R
Rich Tibbett 已提交
1636

M
Mr.doob 已提交
1637
	};
R
Rich Tibbett 已提交
1638

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

M
Mr.doob 已提交
1641
		var json = this.json;
M
Mr.doob 已提交
1642 1643 1644 1645 1646 1647 1648 1649

		// scene node hierachy builder

		function buildNodeHierachy( nodeId, parentObject, allNodes ) {

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

M
Mr.doob 已提交
1650
			var node = json.nodes[ nodeId ];
M
Mr.doob 已提交
1651 1652 1653

			if ( node.children ) {

M
Mr.doob 已提交
1654 1655 1656
				var children = node.children;

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

M
Mr.doob 已提交
1658
					var child = children[ i ];
M
Mr.doob 已提交
1659 1660
					buildNodeHierachy( child, _node, allNodes );

M
Mr.doob 已提交
1661
				}
M
Mr.doob 已提交
1662 1663

			}
R
Rich Tibbett 已提交
1664 1665 1666

		}

M
Mr.doob 已提交
1667
		return this._withDependencies( [
R
Rich Tibbett 已提交
1668

M
Mr.doob 已提交
1669
			"nodes"
R
Rich Tibbett 已提交
1670

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

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

M
Mr.doob 已提交
1675 1676
				var _scene = new THREE.Scene();
				_scene.name = scene.name;
1677
  			_scene.userData = scene.extras || {};
R
Rich Tibbett 已提交
1678

M
Mr.doob 已提交
1679
				var nodes = scene.nodes;
R
Rich Tibbett 已提交
1680

M
Mr.doob 已提交
1681 1682 1683
				for ( var i = 0, l = nodes.length; i < l; i ++ ) {

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

M
Mr.doob 已提交
1686
				}
R
Rich Tibbett 已提交
1687

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

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

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

M
Mr.doob 已提交
1696 1697 1698 1699 1700 1701 1702
					}

				} );

				return _scene;

			} );
R
Rich Tibbett 已提交
1703

M
Mr.doob 已提交
1704 1705 1706
		} );

	};
R
Rich Tibbett 已提交
1707

M
Mr.doob 已提交
1708
	return GLTFLoader;
R
Rich Tibbett 已提交
1709

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