GLTFLoader.js 33.7 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 1157

				if ( mesh.extras ) group.userData = mesh.extras;
R
Rich Tibbett 已提交
1158

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

M
Mr.doob 已提交
1228 1229
						var meshNode = new THREE.Mesh( geometry, material );
						meshNode.castShadow = true;
1230 1231

						if ( primitive.extras ) meshNode.userData = primitive.extras;
R
Rich Tibbett 已提交
1232

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

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

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

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

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

M
Mr.doob 已提交
1243
				return group;
R
Rich Tibbett 已提交
1244

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

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

M
Mr.doob 已提交
1249
	};
R
Rich Tibbett 已提交
1250

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

M
Mr.doob 已提交
1253 1254 1255
		var json = this.json;

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

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

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

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

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

M
Mr.doob 已提交
1271 1272
				var _camera = new THREE.PerspectiveCamera( THREE.Math.radToDeg( xfov ), aspect_ratio, camera.perspective.znear || 1, camera.perspective.zfar || 2e6 );
				_camera.name = camera.name;
1273 1274

				if ( camera.extras ) _camera.userData = camera.extras;
R
Rich Tibbett 已提交
1275

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

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

M
Mr.doob 已提交
1280 1281
				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;
1282 1283

				if ( camera.extras ) _camera.userData = camera.extras;
R
Rich Tibbett 已提交
1284

M
Mr.doob 已提交
1285
				return _camera;
R
Rich Tibbett 已提交
1286

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

M
Mr.doob 已提交
1289
		} );
R
Rich Tibbett 已提交
1290

M
Mr.doob 已提交
1291
	};
R
Rich Tibbett 已提交
1292

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

M
Mr.doob 已提交
1295
		var json = this.json;
R
Rich Tibbett 已提交
1296

M
Mr.doob 已提交
1297
		return this._withDependencies( [
R
Rich Tibbett 已提交
1298

M
Mr.doob 已提交
1299
			"accessors"
R
Rich Tibbett 已提交
1300

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

M
Mr.doob 已提交
1303
			return _each( json.skins, function ( skin ) {
M
Mr.doob 已提交
1304 1305 1306 1307 1308 1309 1310 1311 1312 1313

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

				return _skin;

			} );
R
Rich Tibbett 已提交
1314

M
Mr.doob 已提交
1315
		} );
R
Rich Tibbett 已提交
1316

M
Mr.doob 已提交
1317 1318
	};

1319
	GLTFParser.prototype.loadAnimations = function () {
R
Rich Tibbett 已提交
1320

M
Mr.doob 已提交
1321
		var json = this.json;
R
Rich Tibbett 已提交
1322

M
Mr.doob 已提交
1323
		return this._withDependencies( [
R
Rich Tibbett 已提交
1324

M
Mr.doob 已提交
1325 1326
			"accessors",
			"nodes"
R
Rich Tibbett 已提交
1327

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

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

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

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

M
Mr.doob 已提交
1336
					var channel = animation.channels[ channelId ];
M
Mr.doob 已提交
1337 1338 1339
					var sampler = animation.samplers[ channel.sampler ];

					if ( sampler && animation.parameters ) {
R
Rich Tibbett 已提交
1340 1341 1342

						var target = channel.target;
						var name = target.id;
M
Mr.doob 已提交
1343 1344
						var input = animation.parameters[ sampler.input ];
						var output = animation.parameters[ sampler.output ];
R
Rich Tibbett 已提交
1345 1346 1347 1348 1349 1350 1351 1352 1353

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

						var node = dependencies.nodes[ name ];

						if ( node ) {

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

							interps.push( interp );

						}

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

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

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

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

M
Mr.doob 已提交
1373
		} );
R
Rich Tibbett 已提交
1374

M
Mr.doob 已提交
1375
	};
R
Rich Tibbett 已提交
1376

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

M
Mr.doob 已提交
1379 1380 1381 1382
		var json = this.json;
		var scope = this;

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

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

M
Mr.doob 已提交
1386
			var _node;
R
Rich Tibbett 已提交
1387

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

M
Mr.doob 已提交
1390 1391
				_node = new THREE.Bone();
				_node.jointName = node.jointName;
R
Rich Tibbett 已提交
1392

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

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

M
Mr.doob 已提交
1397
			}
R
Rich Tibbett 已提交
1398

M
Mr.doob 已提交
1399
			_node.name = node.name;
1400 1401

			if ( node.extras ) _node.userData = node.extras;
R
Rich Tibbett 已提交
1402

M
Mr.doob 已提交
1403
			_node.matrixAutoUpdate = false;
R
Rich Tibbett 已提交
1404

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

M
Mr.doob 已提交
1407 1408
				matrix.fromArray( node.matrix );
				_node.applyMatrix( matrix );
R
Rich Tibbett 已提交
1409

M
Mr.doob 已提交
1410
			} else {
R
Rich Tibbett 已提交
1411

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

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

M
Mr.doob 已提交
1416
				}
R
Rich Tibbett 已提交
1417

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

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

M
Mr.doob 已提交
1422 1423 1424
				}

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

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

M
Mr.doob 已提交
1428
				}
R
Rich Tibbett 已提交
1429 1430 1431

			}

M
Mr.doob 已提交
1432
			return _node;
R
Rich Tibbett 已提交
1433

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

M
Mr.doob 已提交
1436
			return scope._withDependencies( [
R
Rich Tibbett 已提交
1437

M
Mr.doob 已提交
1438 1439 1440 1441
				"meshes",
				"skins",
				"cameras",
				"extensions"
R
Rich Tibbett 已提交
1442

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

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

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

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

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

M
Mr.doob 已提交
1453 1454
							var mesh = node.meshes[ meshId ];
							var group = dependencies.meshes[ mesh ];
R
Rich Tibbett 已提交
1455

M
Mr.doob 已提交
1456 1457 1458
							for ( var childrenId in group.children ) {

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

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

M
Mr.doob 已提交
1462 1463
								var originalMaterial = child.material;
								var originalGeometry = child.geometry;
1464
								var originalUserData = child.userData;
R
Rich Tibbett 已提交
1465

M
Mr.doob 已提交
1466
								var material;
R
Rich Tibbett 已提交
1467

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

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

M
Mr.doob 已提交
1472
								} else {
R
Rich Tibbett 已提交
1473

M
Mr.doob 已提交
1474
									material = originalMaterial;
R
Rich Tibbett 已提交
1475

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

M
Mr.doob 已提交
1478 1479
								child = new THREE.Mesh( originalGeometry, material );
								child.castShadow = true;
1480
								child.userData = originalUserData;
R
Rich Tibbett 已提交
1481

M
Mr.doob 已提交
1482
								var skinEntry;
M
Mr.doob 已提交
1483

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

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

M
Mr.doob 已提交
1488
								}
R
Rich Tibbett 已提交
1489

M
Mr.doob 已提交
1490 1491
								// Replace Mesh with SkinnedMesh in library
								if ( skinEntry ) {
R
Rich Tibbett 已提交
1492

M
Mr.doob 已提交
1493 1494 1495
									var geometry = originalGeometry;
									var material = originalMaterial;
									material.skinning = true;
R
Rich Tibbett 已提交
1496

M
Mr.doob 已提交
1497 1498
									child = new THREE.SkinnedMesh( geometry, material, false );
									child.castShadow = true;
1499
									child.userData = originalUserData;
R
Rich Tibbett 已提交
1500

M
Mr.doob 已提交
1501 1502
									var bones = [];
									var boneInverses = [];
R
Rich Tibbett 已提交
1503

T
Takahiro 已提交
1504 1505
									var keys = Object.keys( __nodes );

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

M
Mr.doob 已提交
1508
										var jointId = skinEntry.jointNames[ i ];
T
Takahiro 已提交
1509 1510 1511 1512 1513

										var jointNode;

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

T
Takahiro 已提交
1514
											var n = __nodes[ keys[ j ] ];
T
Takahiro 已提交
1515

T
Takahiro 已提交
1516
											if ( n.jointName === jointId ) {
T
Takahiro 已提交
1517

T
Takahiro 已提交
1518
												jointNode = n;
T
Takahiro 已提交
1519 1520 1521 1522 1523
												break;

											}

										}
R
Rich Tibbett 已提交
1524

M
Mr.doob 已提交
1525
										if ( jointNode ) {
R
Rich Tibbett 已提交
1526

M
Mr.doob 已提交
1527
											jointNode.skin = child;
M
Mr.doob 已提交
1528
											bones.push( jointNode );
R
Rich Tibbett 已提交
1529

M
Mr.doob 已提交
1530 1531 1532
											var m = skinEntry.inverseBindMatrices.array;
											var mat = new THREE.Matrix4().fromArray( m, i * 16 );
											boneInverses.push( mat );
R
Rich Tibbett 已提交
1533

M
Mr.doob 已提交
1534
										} else {
R
Rich Tibbett 已提交
1535

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

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

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

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

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

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

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

M
Mr.doob 已提交
1550
						}
R
Rich Tibbett 已提交
1551

M
Mr.doob 已提交
1552
					}
R
Rich Tibbett 已提交
1553

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

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

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

M
Mr.doob 已提交
1560
					}
R
Rich Tibbett 已提交
1561

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

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

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

M
Mr.doob 已提交
1568
					}
R
Rich Tibbett 已提交
1569

M
Mr.doob 已提交
1570
					return _node;
R
Rich Tibbett 已提交
1571

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

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

M
Mr.doob 已提交
1576
		} );
R
Rich Tibbett 已提交
1577

M
Mr.doob 已提交
1578
	};
R
Rich Tibbett 已提交
1579

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

M
Mr.doob 已提交
1582 1583 1584
		var json = this.json;

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

M
Mr.doob 已提交
1586
			switch ( extensionId ) {
R
Rich Tibbett 已提交
1587

M
Mr.doob 已提交
1588
				case "KHR_materials_common":
R
Rich Tibbett 已提交
1589

M
Mr.doob 已提交
1590 1591 1592
					var extensionNode = {
						lights: {}
					};
R
Rich Tibbett 已提交
1593

M
Mr.doob 已提交
1594
					var lights = extension.lights;
R
Rich Tibbett 已提交
1595

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

M
Mr.doob 已提交
1598
						var light = lights[ lightId ];
M
Mr.doob 已提交
1599
						var lightNode;
R
Rich Tibbett 已提交
1600

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

M
Mr.doob 已提交
1604 1605 1606 1607 1608 1609
						switch ( light.type ) {

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

M
Mr.doob 已提交
1611 1612 1613
							case "point":
								lightNode = new THREE.PointLight( color );
								break;
R
Rich Tibbett 已提交
1614

M
Mr.doob 已提交
1615 1616 1617 1618
							case "spot ":
								lightNode = new THREE.SpotLight( color );
								lightNode.position.set( 0, 0, 1 );
								break;
R
Rich Tibbett 已提交
1619

M
Mr.doob 已提交
1620 1621 1622
							case "ambient":
								lightNode = new THREE.AmbientLight( color );
								break;
R
Rich Tibbett 已提交
1623

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

M
Mr.doob 已提交
1626
						if ( lightNode ) {
R
Rich Tibbett 已提交
1627

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

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

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

M
Mr.doob 已提交
1634
					return extensionNode;
R
Rich Tibbett 已提交
1635

M
Mr.doob 已提交
1636
					break;
R
Rich Tibbett 已提交
1637

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

M
Mr.doob 已提交
1640
		} );
R
Rich Tibbett 已提交
1641

M
Mr.doob 已提交
1642
	};
R
Rich Tibbett 已提交
1643

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

M
Mr.doob 已提交
1646
		var json = this.json;
M
Mr.doob 已提交
1647 1648 1649 1650 1651 1652 1653 1654

		// scene node hierachy builder

		function buildNodeHierachy( nodeId, parentObject, allNodes ) {

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

M
Mr.doob 已提交
1655
			var node = json.nodes[ nodeId ];
M
Mr.doob 已提交
1656 1657 1658

			if ( node.children ) {

M
Mr.doob 已提交
1659 1660 1661
				var children = node.children;

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

M
Mr.doob 已提交
1663
					var child = children[ i ];
M
Mr.doob 已提交
1664 1665
					buildNodeHierachy( child, _node, allNodes );

M
Mr.doob 已提交
1666
				}
M
Mr.doob 已提交
1667 1668

			}
R
Rich Tibbett 已提交
1669 1670 1671

		}

M
Mr.doob 已提交
1672
		return this._withDependencies( [
R
Rich Tibbett 已提交
1673

M
Mr.doob 已提交
1674
			"nodes"
R
Rich Tibbett 已提交
1675

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

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

M
Mr.doob 已提交
1680 1681
				var _scene = new THREE.Scene();
				_scene.name = scene.name;
1682 1683

				if ( scene.extras ) _scene.userData = scene.extras;
R
Rich Tibbett 已提交
1684

M
Mr.doob 已提交
1685
				var nodes = scene.nodes;
R
Rich Tibbett 已提交
1686

M
Mr.doob 已提交
1687 1688 1689
				for ( var i = 0, l = nodes.length; i < l; i ++ ) {

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

M
Mr.doob 已提交
1692
				}
R
Rich Tibbett 已提交
1693

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

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

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

M
Mr.doob 已提交
1702 1703 1704 1705 1706 1707 1708
					}

				} );

				return _scene;

			} );
R
Rich Tibbett 已提交
1709

M
Mr.doob 已提交
1710 1711 1712
		} );

	};
R
Rich Tibbett 已提交
1713

M
Mr.doob 已提交
1714
	return GLTFLoader;
R
Rich Tibbett 已提交
1715

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