GLTFLoader.js 32.9 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

1091 1092 1093 1094
				} else if ( typeof( materialValues.emission ) === 'string' ) {

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

M
Mr.doob 已提交
1095
				}
R
Rich Tibbett 已提交
1096

1097 1098
				delete materialParams.emission;

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

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

1103 1104 1105 1106
				} else if ( typeof( materialValues.specular ) === 'string' ) {

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

M
Mr.doob 已提交
1107
				}
R
Rich Tibbett 已提交
1108

1109 1110
				delete materialParams.specular;

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

M
Mr.doob 已提交
1113
					materialParams.shininess = materialValues.shininess;
R
Rich Tibbett 已提交
1114

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

M
Mr.doob 已提交
1117 1118
				var _material = new materialType( materialParams );
				_material.name = material.name;
R
Rich Tibbett 已提交
1119

M
Mr.doob 已提交
1120
				return _material;
R
Rich Tibbett 已提交
1121

M
Mr.doob 已提交
1122
			} );
R
Rich Tibbett 已提交
1123

M
Mr.doob 已提交
1124
		} );
R
Rich Tibbett 已提交
1125

M
Mr.doob 已提交
1126
	};
R
Rich Tibbett 已提交
1127

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

M
Mr.doob 已提交
1130 1131
		var json = this.json;

M
Mr.doob 已提交
1132
		return this._withDependencies( [
R
Rich Tibbett 已提交
1133

M
Mr.doob 已提交
1134 1135
			"accessors",
			"materials"
R
Rich Tibbett 已提交
1136

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

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

M
Mr.doob 已提交
1141 1142
				var group = new THREE.Object3D();
				group.name = mesh.name;
R
Rich Tibbett 已提交
1143

M
Mr.doob 已提交
1144
				var primitives = mesh.primitives;
R
Rich Tibbett 已提交
1145

M
Mr.doob 已提交
1146 1147 1148
				for ( var name in primitives ) {

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

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

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

M
Mr.doob 已提交
1154
						var attributes = primitive.attributes;
R
Rich Tibbett 已提交
1155

M
Mr.doob 已提交
1156 1157 1158
						for ( var attributeId in attributes ) {

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

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

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

M
Mr.doob 已提交
1164
							switch ( attributeId ) {
R
Rich Tibbett 已提交
1165

M
Mr.doob 已提交
1166 1167 1168
								case 'POSITION':
									geometry.addAttribute( 'position', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1169

M
Mr.doob 已提交
1170 1171 1172
								case 'NORMAL':
									geometry.addAttribute( 'normal', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1173

M
Mr.doob 已提交
1174 1175 1176 1177 1178
								case 'TEXCOORD_0':
								case 'TEXCOORD0':
								case 'TEXCOORD':
									geometry.addAttribute( 'uv', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1179

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

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

M
Mr.doob 已提交
1188
							}
R
Rich Tibbett 已提交
1189

M
Mr.doob 已提交
1190
						}
R
Rich Tibbett 已提交
1191

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

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

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

M
Mr.doob 已提交
1198
							var offset = {
R
Rich Tibbett 已提交
1199 1200 1201 1202 1203
								start: 0,
								index: 0,
								count: indexArray.count
							};

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

M
Mr.doob 已提交
1206
							geometry.computeBoundingSphere();
R
Rich Tibbett 已提交
1207

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


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

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

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

M
Mr.doob 已提交
1218
					} else {
R
Rich Tibbett 已提交
1219

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

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

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

M
Mr.doob 已提交
1226
				return group;
R
Rich Tibbett 已提交
1227

M
Mr.doob 已提交
1228
			} );
R
Rich Tibbett 已提交
1229

M
Mr.doob 已提交
1230
		} );
R
Rich Tibbett 已提交
1231

M
Mr.doob 已提交
1232
	};
R
Rich Tibbett 已提交
1233

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

M
Mr.doob 已提交
1236 1237 1238
		var json = this.json;

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

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

M
Mr.doob 已提交
1242 1243 1244
				var yfov = camera.perspective.yfov;
				var xfov = camera.perspective.xfov;
				var aspect_ratio = camera.perspective.aspect_ratio || 1;
R
Rich Tibbett 已提交
1245

M
Mr.doob 已提交
1246 1247 1248
				// According to COLLADA spec...
				// aspect_ratio = xfov / yfov
				xfov = ( xfov === undefined && yfov ) ? yfov * aspect_ratio : xfov;
R
Rich Tibbett 已提交
1249

M
Mr.doob 已提交
1250 1251 1252
				// According to COLLADA spec...
				// aspect_ratio = xfov / yfov
				// yfov = ( yfov === undefined && xfov ) ? xfov / aspect_ratio : yfov;
R
Rich Tibbett 已提交
1253

M
Mr.doob 已提交
1254 1255
				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 已提交
1256

M
Mr.doob 已提交
1257
				return _camera;
R
Rich Tibbett 已提交
1258

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

M
Mr.doob 已提交
1261 1262
				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 已提交
1263

M
Mr.doob 已提交
1264
				return _camera;
R
Rich Tibbett 已提交
1265

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

M
Mr.doob 已提交
1268
		} );
R
Rich Tibbett 已提交
1269

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

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

M
Mr.doob 已提交
1274
		var json = this.json;
R
Rich Tibbett 已提交
1275

M
Mr.doob 已提交
1276
		return this._withDependencies( [
R
Rich Tibbett 已提交
1277

M
Mr.doob 已提交
1278
			"accessors"
R
Rich Tibbett 已提交
1279

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

M
Mr.doob 已提交
1282
			return _each( json.skins, function ( skin ) {
M
Mr.doob 已提交
1283 1284 1285 1286 1287 1288 1289 1290 1291 1292

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

				return _skin;

			} );
R
Rich Tibbett 已提交
1293

M
Mr.doob 已提交
1294
		} );
R
Rich Tibbett 已提交
1295

M
Mr.doob 已提交
1296 1297
	};

1298
	GLTFParser.prototype.loadAnimations = function () {
R
Rich Tibbett 已提交
1299

M
Mr.doob 已提交
1300
		var json = this.json;
R
Rich Tibbett 已提交
1301

M
Mr.doob 已提交
1302
		return this._withDependencies( [
R
Rich Tibbett 已提交
1303

M
Mr.doob 已提交
1304 1305
			"accessors",
			"nodes"
R
Rich Tibbett 已提交
1306

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

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

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

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

M
Mr.doob 已提交
1315
					var channel = animation.channels[ channelId ];
M
Mr.doob 已提交
1316 1317 1318
					var sampler = animation.samplers[ channel.sampler ];

					if ( sampler && animation.parameters ) {
R
Rich Tibbett 已提交
1319 1320 1321

						var target = channel.target;
						var name = target.id;
M
Mr.doob 已提交
1322 1323
						var input = animation.parameters[ sampler.input ];
						var output = animation.parameters[ sampler.output ];
R
Rich Tibbett 已提交
1324 1325 1326 1327 1328 1329 1330 1331 1332

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

						var node = dependencies.nodes[ name ];

						if ( node ) {

							var interp = {
1333
								times: inputAccessor.array,
M
Mr.doob 已提交
1334 1335
								values: outputAccessor.array,
								target: node,
1336 1337
								type: INTERPOLATION[ sampler.interpolation ],
								name: node.name + '.' + PATH_PROPERTIES[ target.path ]
R
Rich Tibbett 已提交
1338 1339 1340 1341 1342 1343
							};

							interps.push( interp );

						}

M
Mr.doob 已提交
1344
					}
R
Rich Tibbett 已提交
1345

M
Mr.doob 已提交
1346
				}
R
Rich Tibbett 已提交
1347

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

M
Mr.doob 已提交
1350
			} );
R
Rich Tibbett 已提交
1351

M
Mr.doob 已提交
1352
		} );
R
Rich Tibbett 已提交
1353

M
Mr.doob 已提交
1354
	};
R
Rich Tibbett 已提交
1355

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

M
Mr.doob 已提交
1358 1359 1360 1361
		var json = this.json;
		var scope = this;

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

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

M
Mr.doob 已提交
1365
			var _node;
R
Rich Tibbett 已提交
1366

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

M
Mr.doob 已提交
1369 1370
				_node = new THREE.Bone();
				_node.jointName = node.jointName;
R
Rich Tibbett 已提交
1371

M
Mr.doob 已提交
1372
			} else {
R
Rich Tibbett 已提交
1373

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

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

M
Mr.doob 已提交
1378
			_node.name = node.name;
R
Rich Tibbett 已提交
1379

M
Mr.doob 已提交
1380
			_node.matrixAutoUpdate = false;
R
Rich Tibbett 已提交
1381

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

M
Mr.doob 已提交
1384 1385
				matrix.fromArray( node.matrix );
				_node.applyMatrix( matrix );
R
Rich Tibbett 已提交
1386

M
Mr.doob 已提交
1387
			} else {
R
Rich Tibbett 已提交
1388

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

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

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

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

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

M
Mr.doob 已提交
1399 1400 1401
				}

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

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

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

			}

M
Mr.doob 已提交
1409
			return _node;
R
Rich Tibbett 已提交
1410

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

M
Mr.doob 已提交
1413
			return scope._withDependencies( [
R
Rich Tibbett 已提交
1414

M
Mr.doob 已提交
1415 1416 1417 1418
				"meshes",
				"skins",
				"cameras",
				"extensions"
R
Rich Tibbett 已提交
1419

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

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

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

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

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

M
Mr.doob 已提交
1430 1431
							var mesh = node.meshes[ meshId ];
							var group = dependencies.meshes[ mesh ];
R
Rich Tibbett 已提交
1432

M
Mr.doob 已提交
1433 1434 1435
							for ( var childrenId in group.children ) {

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

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

M
Mr.doob 已提交
1439 1440
								var originalMaterial = child.material;
								var originalGeometry = child.geometry;
R
Rich Tibbett 已提交
1441

M
Mr.doob 已提交
1442
								var material;
R
Rich Tibbett 已提交
1443

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

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

M
Mr.doob 已提交
1448
								} else {
R
Rich Tibbett 已提交
1449

M
Mr.doob 已提交
1450
									material = originalMaterial;
R
Rich Tibbett 已提交
1451

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

M
Mr.doob 已提交
1454 1455
								child = new THREE.Mesh( originalGeometry, material );
								child.castShadow = true;
R
Rich Tibbett 已提交
1456

M
Mr.doob 已提交
1457
								var skinEntry;
M
Mr.doob 已提交
1458

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

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

M
Mr.doob 已提交
1463
								}
R
Rich Tibbett 已提交
1464

M
Mr.doob 已提交
1465 1466
								// Replace Mesh with SkinnedMesh in library
								if ( skinEntry ) {
R
Rich Tibbett 已提交
1467

M
Mr.doob 已提交
1468 1469 1470
									var geometry = originalGeometry;
									var material = originalMaterial;
									material.skinning = true;
R
Rich Tibbett 已提交
1471

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

M
Mr.doob 已提交
1475 1476
									var bones = [];
									var boneInverses = [];
R
Rich Tibbett 已提交
1477

T
Takahiro 已提交
1478 1479
									var keys = Object.keys( __nodes );

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

M
Mr.doob 已提交
1482
										var jointId = skinEntry.jointNames[ i ];
T
Takahiro 已提交
1483 1484 1485 1486 1487

										var jointNode;

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

T
Takahiro 已提交
1488
											var n = __nodes[ keys[ j ] ];
T
Takahiro 已提交
1489

T
Takahiro 已提交
1490
											if ( n.jointName === jointId ) {
T
Takahiro 已提交
1491

T
Takahiro 已提交
1492
												jointNode = n;
T
Takahiro 已提交
1493 1494 1495 1496 1497
												break;

											}

										}
R
Rich Tibbett 已提交
1498

M
Mr.doob 已提交
1499
										if ( jointNode ) {
R
Rich Tibbett 已提交
1500

M
Mr.doob 已提交
1501
											jointNode.skin = child;
M
Mr.doob 已提交
1502
											bones.push( jointNode );
R
Rich Tibbett 已提交
1503

M
Mr.doob 已提交
1504 1505 1506
											var m = skinEntry.inverseBindMatrices.array;
											var mat = new THREE.Matrix4().fromArray( m, i * 16 );
											boneInverses.push( mat );
R
Rich Tibbett 已提交
1507

M
Mr.doob 已提交
1508
										} else {
R
Rich Tibbett 已提交
1509

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

M
Mr.doob 已提交
1512
										}
R
Rich Tibbett 已提交
1513

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
1544
					return _node;
R
Rich Tibbett 已提交
1545

M
Mr.doob 已提交
1546
				} );
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
	GLTFParser.prototype.loadExtensions = function () {
R
Rich Tibbett 已提交
1555

M
Mr.doob 已提交
1556 1557 1558
		var json = this.json;

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

M
Mr.doob 已提交
1560
			switch ( extensionId ) {
R
Rich Tibbett 已提交
1561

M
Mr.doob 已提交
1562
				case "KHR_materials_common":
R
Rich Tibbett 已提交
1563

M
Mr.doob 已提交
1564 1565 1566
					var extensionNode = {
						lights: {}
					};
R
Rich Tibbett 已提交
1567

M
Mr.doob 已提交
1568
					var lights = extension.lights;
R
Rich Tibbett 已提交
1569

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

M
Mr.doob 已提交
1572
						var light = lights[ lightId ];
M
Mr.doob 已提交
1573
						var lightNode;
R
Rich Tibbett 已提交
1574

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

M
Mr.doob 已提交
1578 1579 1580 1581 1582 1583
						switch ( light.type ) {

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

M
Mr.doob 已提交
1585 1586 1587
							case "point":
								lightNode = new THREE.PointLight( color );
								break;
R
Rich Tibbett 已提交
1588

M
Mr.doob 已提交
1589 1590 1591 1592
							case "spot ":
								lightNode = new THREE.SpotLight( color );
								lightNode.position.set( 0, 0, 1 );
								break;
R
Rich Tibbett 已提交
1593

M
Mr.doob 已提交
1594 1595 1596
							case "ambient":
								lightNode = new THREE.AmbientLight( color );
								break;
R
Rich Tibbett 已提交
1597

M
Mr.doob 已提交
1598
						}
R
Rich Tibbett 已提交
1599

M
Mr.doob 已提交
1600
						if ( lightNode ) {
R
Rich Tibbett 已提交
1601

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

M
Mr.doob 已提交
1604
						}
R
Rich Tibbett 已提交
1605

M
Mr.doob 已提交
1606
					}
R
Rich Tibbett 已提交
1607

M
Mr.doob 已提交
1608
					return extensionNode;
R
Rich Tibbett 已提交
1609

M
Mr.doob 已提交
1610
					break;
R
Rich Tibbett 已提交
1611

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

M
Mr.doob 已提交
1614
		} );
R
Rich Tibbett 已提交
1615

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

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

M
Mr.doob 已提交
1620
		var json = this.json;
M
Mr.doob 已提交
1621 1622 1623 1624 1625 1626 1627 1628

		// scene node hierachy builder

		function buildNodeHierachy( nodeId, parentObject, allNodes ) {

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

M
Mr.doob 已提交
1629
			var node = json.nodes[ nodeId ];
M
Mr.doob 已提交
1630 1631 1632

			if ( node.children ) {

M
Mr.doob 已提交
1633 1634 1635
				var children = node.children;

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

M
Mr.doob 已提交
1637
					var child = children[ i ];
M
Mr.doob 已提交
1638 1639
					buildNodeHierachy( child, _node, allNodes );

M
Mr.doob 已提交
1640
				}
M
Mr.doob 已提交
1641 1642

			}
R
Rich Tibbett 已提交
1643 1644 1645

		}

M
Mr.doob 已提交
1646
		return this._withDependencies( [
R
Rich Tibbett 已提交
1647

M
Mr.doob 已提交
1648
			"nodes"
R
Rich Tibbett 已提交
1649

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

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

M
Mr.doob 已提交
1654 1655
				var _scene = new THREE.Scene();
				_scene.name = scene.name;
R
Rich Tibbett 已提交
1656

M
Mr.doob 已提交
1657
				var nodes = scene.nodes;
R
Rich Tibbett 已提交
1658

M
Mr.doob 已提交
1659 1660 1661
				for ( var i = 0, l = nodes.length; i < l; i ++ ) {

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

M
Mr.doob 已提交
1664
				}
R
Rich Tibbett 已提交
1665

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

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

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

M
Mr.doob 已提交
1674 1675 1676 1677 1678 1679 1680
					}

				} );

				return _scene;

			} );
R
Rich Tibbett 已提交
1681

M
Mr.doob 已提交
1682 1683 1684
		} );

	};
R
Rich Tibbett 已提交
1685

M
Mr.doob 已提交
1686
	return GLTFLoader;
R
Rich Tibbett 已提交
1687

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