GLTFLoader.js 32.3 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 220 221 222 223 224 225
						// So it goes like this:
						// SkinnedMesh world matrix is already baked into MODELVIEW;
						// ransform joints to local space,
						// then transform using joint's inverse
						m4v[ mi ]
							.getInverse( boundUniform.sourceNode.matrixWorld )
							.multiply( boundUniform.targetNode.skeleton.bones[ mi ].matrixWorld )
							.multiply( boundUniform.targetNode.skeleton.boneInverses[ mi ] );
R
Rich Tibbett 已提交
226

M
Mr.doob 已提交
227
					}
228

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

				default :
232

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

			}

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

	};
241 242


243
	/* ANIMATION */
244

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

		update: function () {

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

		}

	};

255 256
	function createAnimation( name, interps ) {

257
		var tracks = [];
258

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

261
			var interp = interps[ i ];
262

263 264 265 266 267 268 269 270
			// 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;
271

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

M
Mr.doob 已提交
279
		}
280

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

M
Mr.doob 已提交
283
	}
284

M
Mr.doob 已提交
285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
	/*********************************/
	/********** 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
	};
309

M
Mr.doob 已提交
310 311 312 313 314 315 316 317 318 319
	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
	};
320

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

M
Mr.doob 已提交
330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354
	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
	};

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

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

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

	function _each( object, callback, thisObj ) {

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

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

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

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

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

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

M
Mr.doob 已提交
398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414
			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 已提交
415

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

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

	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
469
		}
470

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
526
			}
527

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

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

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

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

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

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

M
Mr.doob 已提交
541
	}
542

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

				} );

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
726
	};
727

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

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

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

			"bufferViews"

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

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

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

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

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

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

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

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

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

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

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

				}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
804 805 806 807
							_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 已提交
808

M
Mr.doob 已提交
809 810 811
						}

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

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

						resolve();

					} );
R
Rich Tibbett 已提交
818

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

			}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

				}

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

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

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

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

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

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

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

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

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

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

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

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

					}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

										if ( shaderParam && shaderParam.value ) {

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

										}

										if ( value ) {

											uvalue.fromArray( value );

										}

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

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

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

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

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

M
Mr.doob 已提交
997 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
											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 已提交
1032 1033 1034

										}

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

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

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

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

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

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

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

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

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

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

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

				}

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

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

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

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

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

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
1089
					materialParams.emissive = new THREE.Color().fromArray( materialValues.emission );
R
Rich Tibbett 已提交
1090

M
Mr.doob 已提交
1091
				}
R
Rich Tibbett 已提交
1092

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

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

M
Mr.doob 已提交
1097
				}
R
Rich Tibbett 已提交
1098

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

M
Mr.doob 已提交
1101
					materialParams.shininess = materialValues.shininess;
R
Rich Tibbett 已提交
1102

M
Mr.doob 已提交
1103
				}
R
Rich Tibbett 已提交
1104

M
Mr.doob 已提交
1105 1106
				var _material = new materialType( materialParams );
				_material.name = material.name;
R
Rich Tibbett 已提交
1107

M
Mr.doob 已提交
1108
				return _material;
R
Rich Tibbett 已提交
1109

M
Mr.doob 已提交
1110
			} );
R
Rich Tibbett 已提交
1111

M
Mr.doob 已提交
1112
		} );
R
Rich Tibbett 已提交
1113

M
Mr.doob 已提交
1114
	};
R
Rich Tibbett 已提交
1115

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

M
Mr.doob 已提交
1118 1119
		var json = this.json;

M
Mr.doob 已提交
1120
		return this._withDependencies( [
R
Rich Tibbett 已提交
1121

M
Mr.doob 已提交
1122 1123
			"accessors",
			"materials"
R
Rich Tibbett 已提交
1124

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

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

M
Mr.doob 已提交
1129 1130
				var group = new THREE.Object3D();
				group.name = mesh.name;
R
Rich Tibbett 已提交
1131

M
Mr.doob 已提交
1132
				var primitives = mesh.primitives;
R
Rich Tibbett 已提交
1133

M
Mr.doob 已提交
1134 1135 1136
				for ( var name in primitives ) {

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

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

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

M
Mr.doob 已提交
1142
						var attributes = primitive.attributes;
R
Rich Tibbett 已提交
1143

M
Mr.doob 已提交
1144 1145 1146
						for ( var attributeId in attributes ) {

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

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

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

M
Mr.doob 已提交
1152
							switch ( attributeId ) {
R
Rich Tibbett 已提交
1153

M
Mr.doob 已提交
1154 1155 1156
								case 'POSITION':
									geometry.addAttribute( 'position', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1157

M
Mr.doob 已提交
1158 1159 1160
								case 'NORMAL':
									geometry.addAttribute( 'normal', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1161

M
Mr.doob 已提交
1162 1163 1164 1165 1166
								case 'TEXCOORD_0':
								case 'TEXCOORD0':
								case 'TEXCOORD':
									geometry.addAttribute( 'uv', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1167

M
Mr.doob 已提交
1168 1169 1170
								case 'WEIGHT':
									geometry.addAttribute( 'skinWeight', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1171

M
Mr.doob 已提交
1172 1173 1174
								case 'JOINT':
									geometry.addAttribute( 'skinIndex', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1175

M
Mr.doob 已提交
1176
							}
R
Rich Tibbett 已提交
1177

M
Mr.doob 已提交
1178
						}
R
Rich Tibbett 已提交
1179

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

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

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

M
Mr.doob 已提交
1186
							var offset = {
R
Rich Tibbett 已提交
1187 1188 1189 1190 1191
								start: 0,
								index: 0,
								count: indexArray.count
							};

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

M
Mr.doob 已提交
1194
							geometry.computeBoundingSphere();
R
Rich Tibbett 已提交
1195

M
Mr.doob 已提交
1196
						}
R
Rich Tibbett 已提交
1197 1198


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

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

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

M
Mr.doob 已提交
1206
					} else {
R
Rich Tibbett 已提交
1207

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

M
Mr.doob 已提交
1210
					}
R
Rich Tibbett 已提交
1211

M
Mr.doob 已提交
1212
				}
R
Rich Tibbett 已提交
1213

M
Mr.doob 已提交
1214
				return group;
R
Rich Tibbett 已提交
1215

M
Mr.doob 已提交
1216
			} );
R
Rich Tibbett 已提交
1217

M
Mr.doob 已提交
1218
		} );
R
Rich Tibbett 已提交
1219

M
Mr.doob 已提交
1220
	};
R
Rich Tibbett 已提交
1221

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

M
Mr.doob 已提交
1224 1225 1226
		var json = this.json;

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

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

M
Mr.doob 已提交
1230 1231 1232
				var yfov = camera.perspective.yfov;
				var xfov = camera.perspective.xfov;
				var aspect_ratio = camera.perspective.aspect_ratio || 1;
R
Rich Tibbett 已提交
1233

M
Mr.doob 已提交
1234 1235 1236
				// According to COLLADA spec...
				// aspect_ratio = xfov / yfov
				xfov = ( xfov === undefined && yfov ) ? yfov * aspect_ratio : xfov;
R
Rich Tibbett 已提交
1237

M
Mr.doob 已提交
1238 1239 1240
				// According to COLLADA spec...
				// aspect_ratio = xfov / yfov
				// yfov = ( yfov === undefined && xfov ) ? xfov / aspect_ratio : yfov;
R
Rich Tibbett 已提交
1241

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

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

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

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

M
Mr.doob 已提交
1252
				return _camera;
R
Rich Tibbett 已提交
1253

M
Mr.doob 已提交
1254
			}
R
Rich Tibbett 已提交
1255

M
Mr.doob 已提交
1256
		} );
R
Rich Tibbett 已提交
1257

M
Mr.doob 已提交
1258
	};
R
Rich Tibbett 已提交
1259

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

M
Mr.doob 已提交
1262
		var json = this.json;
R
Rich Tibbett 已提交
1263

M
Mr.doob 已提交
1264
		return this._withDependencies( [
R
Rich Tibbett 已提交
1265

M
Mr.doob 已提交
1266
			"accessors"
R
Rich Tibbett 已提交
1267

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

M
Mr.doob 已提交
1270
			return _each( json.skins, function ( skin ) {
M
Mr.doob 已提交
1271 1272 1273 1274 1275 1276 1277 1278 1279 1280

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

				return _skin;

			} );
R
Rich Tibbett 已提交
1281

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

M
Mr.doob 已提交
1284 1285
	};

1286
	GLTFParser.prototype.loadAnimations = function () {
R
Rich Tibbett 已提交
1287

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

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

M
Mr.doob 已提交
1292 1293
			"accessors",
			"nodes"
R
Rich Tibbett 已提交
1294

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

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

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

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

M
Mr.doob 已提交
1303
					var channel = animation.channels[ channelId ];
M
Mr.doob 已提交
1304 1305 1306
					var sampler = animation.samplers[ channel.sampler ];

					if ( sampler && animation.parameters ) {
R
Rich Tibbett 已提交
1307 1308 1309

						var target = channel.target;
						var name = target.id;
M
Mr.doob 已提交
1310 1311
						var input = animation.parameters[ sampler.input ];
						var output = animation.parameters[ sampler.output ];
R
Rich Tibbett 已提交
1312 1313 1314 1315 1316 1317 1318 1319 1320

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

						var node = dependencies.nodes[ name ];

						if ( node ) {

							var interp = {
1321
								times: inputAccessor.array,
M
Mr.doob 已提交
1322 1323
								values: outputAccessor.array,
								target: node,
1324 1325
								type: INTERPOLATION[ sampler.interpolation ],
								name: node.name + '.' + PATH_PROPERTIES[ target.path ]
R
Rich Tibbett 已提交
1326 1327 1328 1329 1330 1331
							};

							interps.push( interp );

						}

M
Mr.doob 已提交
1332
					}
R
Rich Tibbett 已提交
1333

M
Mr.doob 已提交
1334
				}
R
Rich Tibbett 已提交
1335

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

M
Mr.doob 已提交
1338
			} );
R
Rich Tibbett 已提交
1339

M
Mr.doob 已提交
1340
		} );
R
Rich Tibbett 已提交
1341

M
Mr.doob 已提交
1342
	};
R
Rich Tibbett 已提交
1343

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

M
Mr.doob 已提交
1346 1347 1348 1349
		var json = this.json;
		var scope = this;

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

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

M
Mr.doob 已提交
1353
			var _node;
R
Rich Tibbett 已提交
1354

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

M
Mr.doob 已提交
1357 1358
				_node = new THREE.Bone();
				_node.jointName = node.jointName;
R
Rich Tibbett 已提交
1359

M
Mr.doob 已提交
1360
			} else {
R
Rich Tibbett 已提交
1361

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

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

M
Mr.doob 已提交
1366
			_node.name = node.name;
R
Rich Tibbett 已提交
1367

M
Mr.doob 已提交
1368
			_node.matrixAutoUpdate = false;
R
Rich Tibbett 已提交
1369

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

M
Mr.doob 已提交
1372 1373
				matrix.fromArray( node.matrix );
				_node.applyMatrix( matrix );
R
Rich Tibbett 已提交
1374

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

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

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

M
Mr.doob 已提交
1381
				}
R
Rich Tibbett 已提交
1382

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

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

M
Mr.doob 已提交
1387 1388 1389
				}

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

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

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

			}

M
Mr.doob 已提交
1397
			return _node;
R
Rich Tibbett 已提交
1398

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

M
Mr.doob 已提交
1401
			return scope._withDependencies( [
R
Rich Tibbett 已提交
1402

M
Mr.doob 已提交
1403 1404 1405 1406
				"meshes",
				"skins",
				"cameras",
				"extensions"
R
Rich Tibbett 已提交
1407

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

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

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

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

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

M
Mr.doob 已提交
1418 1419
							var mesh = node.meshes[ meshId ];
							var group = dependencies.meshes[ mesh ];
R
Rich Tibbett 已提交
1420

M
Mr.doob 已提交
1421 1422 1423
							for ( var childrenId in group.children ) {

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

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

M
Mr.doob 已提交
1427 1428
								var originalMaterial = child.material;
								var originalGeometry = child.geometry;
R
Rich Tibbett 已提交
1429

M
Mr.doob 已提交
1430
								var material;
R
Rich Tibbett 已提交
1431

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

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

M
Mr.doob 已提交
1436
								} else {
R
Rich Tibbett 已提交
1437

M
Mr.doob 已提交
1438
									material = originalMaterial;
R
Rich Tibbett 已提交
1439

M
Mr.doob 已提交
1440
								}
R
Rich Tibbett 已提交
1441

M
Mr.doob 已提交
1442 1443
								child = new THREE.Mesh( originalGeometry, material );
								child.castShadow = true;
R
Rich Tibbett 已提交
1444

M
Mr.doob 已提交
1445
								var skinEntry;
M
Mr.doob 已提交
1446

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

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

M
Mr.doob 已提交
1451
								}
R
Rich Tibbett 已提交
1452

M
Mr.doob 已提交
1453 1454
								// Replace Mesh with SkinnedMesh in library
								if ( skinEntry ) {
R
Rich Tibbett 已提交
1455

M
Mr.doob 已提交
1456 1457 1458
									var geometry = originalGeometry;
									var material = originalMaterial;
									material.skinning = true;
R
Rich Tibbett 已提交
1459

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

M
Mr.doob 已提交
1463 1464
									var bones = [];
									var boneInverses = [];
R
Rich Tibbett 已提交
1465

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

M
Mr.doob 已提交
1468
										var jointId = skinEntry.jointNames[ i ];
M
Mr.doob 已提交
1469
										var jointNode = __nodes[ jointId ];
R
Rich Tibbett 已提交
1470

M
Mr.doob 已提交
1471
										if ( jointNode ) {
R
Rich Tibbett 已提交
1472

M
Mr.doob 已提交
1473
											jointNode.skin = child;
M
Mr.doob 已提交
1474
											bones.push( jointNode );
R
Rich Tibbett 已提交
1475

M
Mr.doob 已提交
1476 1477 1478
											var m = skinEntry.inverseBindMatrices.array;
											var mat = new THREE.Matrix4().fromArray( m, i * 16 );
											boneInverses.push( mat );
R
Rich Tibbett 已提交
1479

M
Mr.doob 已提交
1480
										} else {
R
Rich Tibbett 已提交
1481

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

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

M
Mr.doob 已提交
1486
									}
R
Rich Tibbett 已提交
1487

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

M
Mr.doob 已提交
1490
								}
R
Rich Tibbett 已提交
1491

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

M
Mr.doob 已提交
1494
							}
R
Rich Tibbett 已提交
1495

M
Mr.doob 已提交
1496
						}
R
Rich Tibbett 已提交
1497

M
Mr.doob 已提交
1498
					}
R
Rich Tibbett 已提交
1499

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

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

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

M
Mr.doob 已提交
1506
					}
R
Rich Tibbett 已提交
1507

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

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

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

M
Mr.doob 已提交
1514
					}
R
Rich Tibbett 已提交
1515

M
Mr.doob 已提交
1516
					return _node;
R
Rich Tibbett 已提交
1517

M
Mr.doob 已提交
1518
				} );
R
Rich Tibbett 已提交
1519

M
Mr.doob 已提交
1520
			} );
R
Rich Tibbett 已提交
1521

M
Mr.doob 已提交
1522
		} );
R
Rich Tibbett 已提交
1523

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

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

M
Mr.doob 已提交
1528 1529 1530
		var json = this.json;

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

M
Mr.doob 已提交
1532
			switch ( extensionId ) {
R
Rich Tibbett 已提交
1533

M
Mr.doob 已提交
1534
				case "KHR_materials_common":
R
Rich Tibbett 已提交
1535

M
Mr.doob 已提交
1536 1537 1538
					var extensionNode = {
						lights: {}
					};
R
Rich Tibbett 已提交
1539

M
Mr.doob 已提交
1540
					var lights = extension.lights;
R
Rich Tibbett 已提交
1541

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

M
Mr.doob 已提交
1544
						var light = lights[ lightId ];
M
Mr.doob 已提交
1545
						var lightNode;
R
Rich Tibbett 已提交
1546

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

M
Mr.doob 已提交
1550 1551 1552 1553 1554 1555
						switch ( light.type ) {

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

M
Mr.doob 已提交
1557 1558 1559
							case "point":
								lightNode = new THREE.PointLight( color );
								break;
R
Rich Tibbett 已提交
1560

M
Mr.doob 已提交
1561 1562 1563 1564
							case "spot ":
								lightNode = new THREE.SpotLight( color );
								lightNode.position.set( 0, 0, 1 );
								break;
R
Rich Tibbett 已提交
1565

M
Mr.doob 已提交
1566 1567 1568
							case "ambient":
								lightNode = new THREE.AmbientLight( color );
								break;
R
Rich Tibbett 已提交
1569

M
Mr.doob 已提交
1570
						}
R
Rich Tibbett 已提交
1571

M
Mr.doob 已提交
1572
						if ( lightNode ) {
R
Rich Tibbett 已提交
1573

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

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

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

M
Mr.doob 已提交
1580
					return extensionNode;
R
Rich Tibbett 已提交
1581

M
Mr.doob 已提交
1582
					break;
R
Rich Tibbett 已提交
1583

M
Mr.doob 已提交
1584
			}
R
Rich Tibbett 已提交
1585

M
Mr.doob 已提交
1586
		} );
R
Rich Tibbett 已提交
1587

M
Mr.doob 已提交
1588
	};
R
Rich Tibbett 已提交
1589

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

M
Mr.doob 已提交
1592
		var json = this.json;
M
Mr.doob 已提交
1593 1594 1595 1596 1597 1598 1599 1600

		// scene node hierachy builder

		function buildNodeHierachy( nodeId, parentObject, allNodes ) {

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

M
Mr.doob 已提交
1601
			var node = json.nodes[ nodeId ];
M
Mr.doob 已提交
1602 1603 1604

			if ( node.children ) {

M
Mr.doob 已提交
1605 1606 1607
				var children = node.children;

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

M
Mr.doob 已提交
1609
					var child = children[ i ];
M
Mr.doob 已提交
1610 1611
					buildNodeHierachy( child, _node, allNodes );

M
Mr.doob 已提交
1612
				}
M
Mr.doob 已提交
1613 1614

			}
R
Rich Tibbett 已提交
1615 1616 1617

		}

M
Mr.doob 已提交
1618
		return this._withDependencies( [
R
Rich Tibbett 已提交
1619

M
Mr.doob 已提交
1620
			"nodes"
R
Rich Tibbett 已提交
1621

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

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

M
Mr.doob 已提交
1626 1627
				var _scene = new THREE.Scene();
				_scene.name = scene.name;
R
Rich Tibbett 已提交
1628

M
Mr.doob 已提交
1629
				var nodes = scene.nodes;
R
Rich Tibbett 已提交
1630

M
Mr.doob 已提交
1631 1632 1633
				for ( var i = 0, l = nodes.length; i < l; i ++ ) {

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

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

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

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

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

M
Mr.doob 已提交
1646 1647 1648 1649 1650 1651 1652
					}

				} );

				return _scene;

			} );
R
Rich Tibbett 已提交
1653

M
Mr.doob 已提交
1654 1655 1656
		} );

	};
R
Rich Tibbett 已提交
1657

M
Mr.doob 已提交
1658
	return GLTFLoader;
R
Rich Tibbett 已提交
1659

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