GLTFLoader.js 35.0 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
				path: path || this.path,
T
Takahiro 已提交
53
				crossOrigin: this.crossOrigin
54

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

T
Takahiro 已提交
57
			parser.parse( function ( scene, scenes, cameras, animations ) {
58

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

					var object = objects[ name ];
113

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

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

M
Mr.doob 已提交
118
					}
119

M
Mr.doob 已提交
120
				}
121

M
Mr.doob 已提交
122
			}
123

M
Mr.doob 已提交
124
		};
125

M
Mr.doob 已提交
126
	}
127

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

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

	/* GLTFSHADER */

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

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

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

		var uniforms = targetNode.material.uniforms;

		for ( var uniformId in uniforms ) {

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

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

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

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

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

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

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

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

			}
166

M
Mr.doob 已提交
167
		}
168

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

M
Mr.doob 已提交
172
	}
173

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

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

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

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

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

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

		for ( var name in boundUniforms ) {

			var boundUniform = boundUniforms[ name ];
191

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

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

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

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
229
					}
230

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

				default :
234

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

			}

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

	};
243 244


245
	/* ANIMATION */
246

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

		update: function () {

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

		}

	};

M
Mr.doob 已提交
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274
	/*********************************/
	/********** 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,
275
		LINES: 1,
M
Mr.doob 已提交
276 277 278 279 280 281
		UNSIGNED_BYTE: 5121,
		UNSIGNED_SHORT: 5123,

		VERTEX_SHADER: 35633,
		FRAGMENT_SHADER: 35632
	};
282

M
Mr.doob 已提交
283 284 285 286 287 288 289 290 291 292
	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
	};
293

M
Mr.doob 已提交
294 295 296 297 298 299 300 301
	var WEBGL_COMPONENT_TYPES = {
		5120: Int8Array,
		5121: Uint8Array,
		5122: Int16Array,
		5123: Uint16Array,
		5125: Uint32Array,
		5126: Float32Array
	};
302

M
Mr.doob 已提交
303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327
	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
	};

328 329 330 331 332 333 334
	var PATH_PROPERTIES = {
		scale: 'scale',
		translation: 'position',
		rotation: 'quaternion'
	};

	var INTERPOLATION = {
335 336
		LINEAR: THREE.InterpolateLinear,
		STEP: THREE.InterpolateDiscrete
337 338
	};

M
Mr.doob 已提交
339 340 341 342 343 344
	/* UTILITY FUNCTIONS */

	function _each( object, callback, thisObj ) {

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

M
Mr.doob 已提交
347 348 349 350
		var results;
		var fns = [];

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

M
Mr.doob 已提交
352
			results = [];
R
Rich Tibbett 已提交
353

M
Mr.doob 已提交
354 355 356
			var length = object.length;
			for ( var idx = 0; idx < length; idx ++ ) {
				var value = callback.call( thisObj || this, object[ idx ], idx );
R
Rich Tibbett 已提交
357 358 359 360
				if ( value ) {
					fns.push( value );
					if ( value instanceof Promise ) {
						value.then( function( key, value ) {
M
Mr.doob 已提交
361
							results[ idx ] = value;
R
Rich Tibbett 已提交
362 363
						}.bind( this, key ));
					} else {
M
Mr.doob 已提交
364
						results[ idx ] = value;
R
Rich Tibbett 已提交
365 366
					}
				}
367
			}
R
Rich Tibbett 已提交
368

M
Mr.doob 已提交
369
		} else {
R
Rich Tibbett 已提交
370

M
Mr.doob 已提交
371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387
			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 已提交
388

M
Mr.doob 已提交
389
		}
R
Rich Tibbett 已提交
390

M
Mr.doob 已提交
391 392 393
		return Promise.all( fns ).then( function() {
			return results;
		});
R
Rich Tibbett 已提交
394 395 396

	}

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

M
Mr.doob 已提交
399 400 401
		// Invalid URL
		if ( typeof url !== 'string' || url === '' )
			return '';
402

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

M
Mr.doob 已提交
406
			return url;
R
Rich Tibbett 已提交
407

M
Mr.doob 已提交
408
		}
R
Rich Tibbett 已提交
409

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

M
Mr.doob 已提交
413
			return url;
R
Rich Tibbett 已提交
414

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

M
Mr.doob 已提交
417 418
		// Relative URL
		return ( path || '' ) + url;
R
Rich Tibbett 已提交
419

M
Mr.doob 已提交
420
	}
R
Rich Tibbett 已提交
421

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

M
Mr.doob 已提交
426 427
		// Expected technique attributes
		var attributes = {};
R
Rich Tibbett 已提交
428

M
Mr.doob 已提交
429 430 431
		for ( var attributeId in technique.attributes ) {

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

M
Mr.doob 已提交
433 434 435
			var param = technique.parameters[ pname ];
			var atype = param.type;
			var semantic = param.semantic;
R
Rich Tibbett 已提交
436

M
Mr.doob 已提交
437 438 439 440
			attributes[ attributeId ] = {
				type: atype,
				semantic: semantic
			};
441

M
Mr.doob 已提交
442
		}
443

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

M
Mr.doob 已提交
446 447 448
		var shaderParams = technique.parameters;
		var shaderAttributes = technique.attributes;
		var params = {};
449

M
Mr.doob 已提交
450
		for ( var attributeId in attributes ) {
451

M
Mr.doob 已提交
452 453 454 455
			var pname = shaderAttributes[ attributeId ];
			var shaderParam = shaderParams[ pname ];
			var semantic = shaderParam.semantic;
			if ( semantic ) {
456

M
Mr.doob 已提交
457
				params[ attributeId ] = shaderParam;
458

M
Mr.doob 已提交
459
			}
R
Rich Tibbett 已提交
460

M
Mr.doob 已提交
461
		}
R
Rich Tibbett 已提交
462

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

M
Mr.doob 已提交
465
			var param = params[ pname ];
M
Mr.doob 已提交
466
			var semantic = param.semantic;
R
Rich Tibbett 已提交
467

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

M
Mr.doob 已提交
470
			switch ( semantic ) {
R
Rich Tibbett 已提交
471

M
Mr.doob 已提交
472
				case "POSITION":
R
Rich Tibbett 已提交
473

M
Mr.doob 已提交
474 475
					shaderText = shaderText.replace( regEx, 'position' );
					break;
R
Rich Tibbett 已提交
476

M
Mr.doob 已提交
477
				case "NORMAL":
R
Rich Tibbett 已提交
478

M
Mr.doob 已提交
479 480
					shaderText = shaderText.replace( regEx, 'normal' );
					break;
481

M
Mr.doob 已提交
482 483 484
				case 'TEXCOORD_0':
				case 'TEXCOORD0':
				case 'TEXCOORD':
485

M
Mr.doob 已提交
486 487
					shaderText = shaderText.replace( regEx, 'uv' );
					break;
488

489 490 491 492 493 494 495
				case 'COLOR_0':
				case 'COLOR0':
				case 'COLOR':

					shaderText = shaderText.replace( regEx, 'color' );
					break;

M
Mr.doob 已提交
496
				case "WEIGHT":
497

M
Mr.doob 已提交
498 499
					shaderText = shaderText.replace( regEx, 'skinWeight' );
					break;
500

M
Mr.doob 已提交
501
				case "JOINT":
502

M
Mr.doob 已提交
503 504
					shaderText = shaderText.replace( regEx, 'skinIndex' );
					break;
505

M
Mr.doob 已提交
506
			}
507

M
Mr.doob 已提交
508
		}
R
Rich Tibbett 已提交
509

M
Mr.doob 已提交
510
		return shaderText;
511

M
Mr.doob 已提交
512
	}
R
Rich Tibbett 已提交
513

M
Mr.doob 已提交
514 515
	// Deferred constructor for RawShaderMaterial types
	function DeferredShaderMaterial( params ) {
R
Rich Tibbett 已提交
516

M
Mr.doob 已提交
517
		this.isDeferredShaderMaterial = true;
R
Rich Tibbett 已提交
518

M
Mr.doob 已提交
519
		this.params = params;
520

M
Mr.doob 已提交
521
	}
522

M
Mr.doob 已提交
523
	DeferredShaderMaterial.prototype.create = function () {
524

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

M
Mr.doob 已提交
527 528 529
		for ( var uniformId in this.params.uniforms ) {

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

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

M
Mr.doob 已提交
533 534
				uniforms[ uniformId ].value = originalUniform.value;
				uniforms[ uniformId ].value.needsUpdate = true;
R
Rich Tibbett 已提交
535

M
Mr.doob 已提交
536
			}
R
Rich Tibbett 已提交
537

M
Mr.doob 已提交
538 539
			uniforms[ uniformId ].semantic = originalUniform.semantic;
			uniforms[ uniformId ].node = originalUniform.node;
R
Rich Tibbett 已提交
540

M
Mr.doob 已提交
541
		}
R
Rich Tibbett 已提交
542

M
Mr.doob 已提交
543
		this.params.uniforms = uniforms;
R
Rich Tibbett 已提交
544

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

M
Mr.doob 已提交
547
	};
R
Rich Tibbett 已提交
548

M
Mr.doob 已提交
549
	/* GLTF PARSER */
R
Rich Tibbett 已提交
550

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

M
Mr.doob 已提交
553 554
		this.json = json || {};
		this.options = options || {};
R
Rich Tibbett 已提交
555

M
Mr.doob 已提交
556 557
		// loader object cache
		this.cache = new GLTFRegistry();
R
Rich Tibbett 已提交
558

M
Mr.doob 已提交
559
	}
R
Rich Tibbett 已提交
560

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

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

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

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

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

M
Mr.doob 已提交
572
			if ( cached !== undefined ) {
573

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

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

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

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

M
Mr.doob 已提交
583
			}
R
Rich Tibbett 已提交
584

M
Mr.doob 已提交
585
		}
R
Rich Tibbett 已提交
586

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

M
Mr.doob 已提交
589
			return dependency;
R
Rich Tibbett 已提交
590

M
Mr.doob 已提交
591
		} );
R
Rich Tibbett 已提交
592

M
Mr.doob 已提交
593
	};
R
Rich Tibbett 已提交
594

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

M
Mr.doob 已提交
597 598
		var json = this.json;

M
Mr.doob 已提交
599 600
		// Clear the loader cache
		this.cache.removeAll();
R
Rich Tibbett 已提交
601

M
Mr.doob 已提交
602 603
		// Fire the callback on complete
		this._withDependencies( [
R
Rich Tibbett 已提交
604

M
Mr.doob 已提交
605 606
			"scenes",
			"cameras",
607
			"animations"
R
Rich Tibbett 已提交
608

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

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

T
Takahiro 已提交
613 614 615 616 617 618 619 620
			var scenes = [];

			for ( var name in dependencies.scenes ) {

				scenes.push( dependencies.scenes[ name ] );

			}

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

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

M
Mr.doob 已提交
625
				var camera = dependencies.cameras[ name ];
M
Mr.doob 已提交
626
				cameras.push( camera );
R
Rich Tibbett 已提交
627

M
Mr.doob 已提交
628
			}
R
Rich Tibbett 已提交
629

630
			var animations = [];
R
Rich Tibbett 已提交
631

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

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

M
Mr.doob 已提交
636
			}
R
Rich Tibbett 已提交
637

T
Takahiro 已提交
638
			callback( scene, scenes, cameras, animations );
R
Rich Tibbett 已提交
639

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

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

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

M
Mr.doob 已提交
646 647 648 649
		var json = this.json;
		var options = this.options;

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

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

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

M
Mr.doob 已提交
657
					resolve( shaderText );
R
Rich Tibbett 已提交
658 659 660

				} );

M
Mr.doob 已提交
661
			} );
R
Rich Tibbett 已提交
662

M
Mr.doob 已提交
663
		} );
R
Rich Tibbett 已提交
664

M
Mr.doob 已提交
665
	};
R
Rich Tibbett 已提交
666

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

M
Mr.doob 已提交
669 670 671 672
		var json = this.json;
		var options = this.options;

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

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

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

M
Mr.doob 已提交
678 679
					var loader = new THREE.FileLoader();
					loader.responseType = 'arraybuffer';
M
Mr.doob 已提交
680
					loader.load( resolveURL( buffer.uri, options.path ), function ( buffer ) {
R
Rich Tibbett 已提交
681

M
Mr.doob 已提交
682
						resolve( buffer );
R
Rich Tibbett 已提交
683

M
Mr.doob 已提交
684
					} );
R
Rich Tibbett 已提交
685

M
Mr.doob 已提交
686
				} );
R
Rich Tibbett 已提交
687

M
Mr.doob 已提交
688
			}
R
Rich Tibbett 已提交
689

M
Mr.doob 已提交
690
		} );
R
Rich Tibbett 已提交
691

M
Mr.doob 已提交
692
	};
R
Rich Tibbett 已提交
693

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

M
Mr.doob 已提交
696 697
		var json = this.json;

M
Mr.doob 已提交
698
		return this._withDependencies( [
R
Rich Tibbett 已提交
699

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

M
Mr.doob 已提交
702
		] ).then( function ( dependencies ) {
703

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

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

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

M
Mr.doob 已提交
710
			} );
711

M
Mr.doob 已提交
712
		} );
713

M
Mr.doob 已提交
714
	};
715

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

M
Mr.doob 已提交
718 719
		var json = this.json;

M
Mr.doob 已提交
720 721 722 723 724
		return this._withDependencies( [

			"bufferViews"

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

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

M
Mr.doob 已提交
728 729 730
				var arraybuffer = dependencies.bufferViews[ accessor.bufferView ];
				var itemSize = WEBGL_TYPE_SIZES[ accessor.type ];
				var TypedArray = WEBGL_COMPONENT_TYPES[ accessor.componentType ];
R
Rich Tibbett 已提交
731

M
Mr.doob 已提交
732 733 734
				// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.
				var elementBytes = TypedArray.BYTES_PER_ELEMENT;
				var itemBytes = elementBytes * itemSize;
R
Rich Tibbett 已提交
735

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

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

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

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

M
Mr.doob 已提交
747 748 749
				} else {

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

M
Mr.doob 已提交
751
					return new THREE.BufferAttribute( array, itemSize );
R
Rich Tibbett 已提交
752 753 754

				}

M
Mr.doob 已提交
755
			} );
R
Rich Tibbett 已提交
756

M
Mr.doob 已提交
757
		} );
R
Rich Tibbett 已提交
758

M
Mr.doob 已提交
759
	};
R
Rich Tibbett 已提交
760

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

M
Mr.doob 已提交
763 764 765 766
		var json = this.json;
		var options = this.options;

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

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

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

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

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

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

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

M
Mr.doob 已提交
780
					}
R
Rich Tibbett 已提交
781

782
					textureLoader.setCrossOrigin( options.crossOrigin );
R
Rich Tibbett 已提交
783

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

M
Mr.doob 已提交
786
						_texture.flipY = false;
R
Rich Tibbett 已提交
787

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

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

M
Mr.doob 已提交
792 793 794 795
							_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 已提交
796

M
Mr.doob 已提交
797 798 799
						}

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

M
Mr.doob 已提交
801
					}, undefined, function () {
802 803 804 805

						resolve();

					} );
R
Rich Tibbett 已提交
806

M
Mr.doob 已提交
807
				} );
R
Rich Tibbett 已提交
808 809 810

			}

M
Mr.doob 已提交
811
		} );
R
Rich Tibbett 已提交
812

M
Mr.doob 已提交
813
	};
R
Rich Tibbett 已提交
814

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

M
Mr.doob 已提交
817 818
		var json = this.json;

M
Mr.doob 已提交
819
		return this._withDependencies( [
R
Rich Tibbett 已提交
820

M
Mr.doob 已提交
821 822
			"shaders",
			"textures"
R
Rich Tibbett 已提交
823

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

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

M
Mr.doob 已提交
828 829 830
				var materialType;
				var materialValues = {};
				var materialParams = {};
R
Rich Tibbett 已提交
831

M
Mr.doob 已提交
832
				var khr_material;
R
Rich Tibbett 已提交
833

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

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

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

M
Mr.doob 已提交
840
					khr_material = json.extensions.KHR_materials_common;
R
Rich Tibbett 已提交
841 842 843

				}

M
Mr.doob 已提交
844
				if ( khr_material ) {
R
Rich Tibbett 已提交
845

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

M
Mr.doob 已提交
848 849 850 851
						case 'BLINN' :
						case 'PHONG' :
							materialType = THREE.MeshPhongMaterial;
							break;
R
Rich Tibbett 已提交
852

M
Mr.doob 已提交
853 854 855
						case 'LAMBERT' :
							materialType = THREE.MeshLambertMaterial;
							break;
R
Rich Tibbett 已提交
856

M
Mr.doob 已提交
857 858 859 860
						case 'CONSTANT' :
						default :
							materialType = THREE.MeshBasicMaterial;
							break;
R
Rich Tibbett 已提交
861

M
Mr.doob 已提交
862
					}
R
Rich Tibbett 已提交
863

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

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

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

M
Mr.doob 已提交
870
					}
R
Rich Tibbett 已提交
871

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

M
Mr.doob 已提交
874 875
						materialParams.transparent = true;
						materialParams.opacity = ( materialValues.transparency !== undefined ) ? materialValues.transparency : 1;
R
Rich Tibbett 已提交
876 877 878

					}

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

M
Mr.doob 已提交
881
					materialType = THREE.MeshPhongMaterial;
R
Rich Tibbett 已提交
882

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

M
Mr.doob 已提交
885
				} else {
R
Rich Tibbett 已提交
886

M
Mr.doob 已提交
887
					materialType = DeferredShaderMaterial;
R
Rich Tibbett 已提交
888

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

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

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

M
Mr.doob 已提交
895
					if ( program ) {
R
Rich Tibbett 已提交
896

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

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

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

M
Mr.doob 已提交
904
						}
R
Rich Tibbett 已提交
905

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

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

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

M
Mr.doob 已提交
913
						}
R
Rich Tibbett 已提交
914

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

M
Mr.doob 已提交
918
						var uniforms = technique.uniforms;
R
Rich Tibbett 已提交
919

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

M
Mr.doob 已提交
922
							var pname = uniforms[ uniformId ];
M
Mr.doob 已提交
923
							var shaderParam = technique.parameters[ pname ];
R
Rich Tibbett 已提交
924

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

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

M
Mr.doob 已提交
929 930
								var pcount = shaderParam.count;
								var value = material.values[ pname ];
R
Rich Tibbett 已提交
931

M
Mr.doob 已提交
932 933 934
								var uvalue = new WEBGL_TYPE[ ptype ]();
								var usemantic = shaderParam.semantic;
								var unode = shaderParam.node;
R
Rich Tibbett 已提交
935

M
Mr.doob 已提交
936
								switch ( ptype ) {
R
Rich Tibbett 已提交
937

M
Mr.doob 已提交
938
									case WEBGL_CONSTANTS.FLOAT:
R
Rich Tibbett 已提交
939

M
Mr.doob 已提交
940
										uvalue = shaderParam.value;
R
Rich Tibbett 已提交
941

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

M
Mr.doob 已提交
944
											materialParams.transparent = true;
R
Rich Tibbett 已提交
945

M
Mr.doob 已提交
946
										}
R
Rich Tibbett 已提交
947

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

M
Mr.doob 已提交
950
											uvalue = value;
R
Rich Tibbett 已提交
951

M
Mr.doob 已提交
952
										}
R
Rich Tibbett 已提交
953

M
Mr.doob 已提交
954
										break;
R
Rich Tibbett 已提交
955

M
Mr.doob 已提交
956 957 958 959
									case WEBGL_CONSTANTS.FLOAT_VEC2:
									case WEBGL_CONSTANTS.FLOAT_VEC3:
									case WEBGL_CONSTANTS.FLOAT_VEC4:
									case WEBGL_CONSTANTS.FLOAT_MAT3:
R
Rich Tibbett 已提交
960 961 962

										if ( shaderParam && shaderParam.value ) {

M
Mr.doob 已提交
963
											uvalue.fromArray( shaderParam.value );
R
Rich Tibbett 已提交
964 965 966 967 968 969 970 971 972

										}

										if ( value ) {

											uvalue.fromArray( value );

										}

M
Mr.doob 已提交
973
										break;
R
Rich Tibbett 已提交
974

M
Mr.doob 已提交
975
									case WEBGL_CONSTANTS.FLOAT_MAT2:
R
Rich Tibbett 已提交
976

M
Mr.doob 已提交
977 978 979
										// what to do?
										console.warn( "FLOAT_MAT2 is not a supported uniform type" );
										break;
R
Rich Tibbett 已提交
980

M
Mr.doob 已提交
981
									case WEBGL_CONSTANTS.FLOAT_MAT4:
R
Rich Tibbett 已提交
982

M
Mr.doob 已提交
983
										if ( pcount ) {
R
Rich Tibbett 已提交
984

M
Mr.doob 已提交
985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019
											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 已提交
1020 1021 1022

										}

M
Mr.doob 已提交
1023
										break;
R
Rich Tibbett 已提交
1024

M
Mr.doob 已提交
1025
									case WEBGL_CONSTANTS.SAMPLER_2D:
R
Rich Tibbett 已提交
1026

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

M
Mr.doob 已提交
1029
										break;
R
Rich Tibbett 已提交
1030

M
Mr.doob 已提交
1031
								}
R
Rich Tibbett 已提交
1032

M
Mr.doob 已提交
1033 1034 1035 1036 1037
								materialParams.uniforms[ uniformId ] = {
									value: uvalue,
									semantic: usemantic,
									node: unode
								};
R
Rich Tibbett 已提交
1038

M
Mr.doob 已提交
1039
							} else {
R
Rich Tibbett 已提交
1040

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

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

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

M
Mr.doob 已提交
1047
					}
R
Rich Tibbett 已提交
1048 1049 1050

				}

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

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

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

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

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

M
Mr.doob 已提交
1061
				delete materialParams.diffuse;
R
Rich Tibbett 已提交
1062

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

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

M
Mr.doob 已提交
1067
				}
R
Rich Tibbett 已提交
1068

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

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

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

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

1077 1078 1079 1080 1081 1082 1083 1084 1085
					if ( materialType === THREE.MeshBasicMaterial ) {

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

					} else {

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

					}
R
Rich Tibbett 已提交
1086

1087 1088
				} else if ( typeof( materialValues.emission ) === 'string' ) {

1089
					if ( materialType === THREE.MeshBasicMaterial ) {
1090

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

1093 1094 1095 1096 1097 1098 1099
					} else {

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

					}

				}
1100

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

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

1105 1106 1107 1108
				} else if ( typeof( materialValues.specular ) === 'string' ) {

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

1109
				}
1110

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;
1143 1144

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

M
Mr.doob 已提交
1146
				var primitives = mesh.primitives;
R
Rich Tibbett 已提交
1147

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

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

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

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

M
Mr.doob 已提交
1156
						var attributes = primitive.attributes;
R
Rich Tibbett 已提交
1157

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

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

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

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

M
Mr.doob 已提交
1166
							switch ( attributeId ) {
R
Rich Tibbett 已提交
1167

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

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

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

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

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

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

M
Mr.doob 已提交
1192
						}
R
Rich Tibbett 已提交
1193

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

M
Mr.doob 已提交
1196
							geometry.setIndex( dependencies.accessors[ primitive.indices ] );
R
Rich Tibbett 已提交
1197

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

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

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

1205
						if ( primitive.extras ) meshNode.userData = primitive.extras;
M
Mr.doob 已提交
1206

1207 1208
						group.add( meshNode );

M
Mr.doob 已提交
1209
					} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {
1210 1211 1212 1213 1214

						var geometry = new THREE.BufferGeometry();

						var attributes = primitive.attributes;

B
bdysvik 已提交
1215

1216 1217 1218
						for ( var attributeId in attributes ) {

							var attributeEntry = attributes[ attributeId ];
1219

M
Mr.doob 已提交
1220
							if ( ! attributeEntry ) return;
1221 1222 1223 1224 1225 1226 1227 1228

							var bufferAttribute = dependencies.accessors[ attributeEntry ];

							switch ( attributeId ) {

								case 'POSITION':
									geometry.addAttribute( 'position', bufferAttribute );
									break;
B
bdysvik 已提交
1229
				
1230 1231
								case 'COLOR_0':
								case 'COLOR0':
1232
								case 'COLOR':
M
Mr.doob 已提交
1233 1234
									geometry.addAttribute( 'color', bufferAttribute );
									break;
1235 1236

							}
1237
						};
1238

M
Mr.doob 已提交
1239 1240 1241
						var material = dependencies.materials[ primitive.material ];

						var meshNode;
1242 1243 1244

						if ( primitive.indices ) {

M
Mr.doob 已提交
1245
							geometry.setIndex( dependencies.accessors[ primitive.indices ] );
1246

M
Mr.doob 已提交
1247
							meshNode = new THREE.LineSegments( geometry, material );
1248

M
Mr.doob 已提交
1249
						} else {
1250

M
Mr.doob 已提交
1251
							meshNode = new THREE.Line( geometry, material );
1252 1253 1254

						}

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

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

M
Mr.doob 已提交
1259
					} else {
R
Rich Tibbett 已提交
1260

1261
						console.warn( "Only triangular and line primitives are supported" );
R
Rich Tibbett 已提交
1262

M
Mr.doob 已提交
1263
					}
R
Rich Tibbett 已提交
1264

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

M
Mr.doob 已提交
1267
				return group;
R
Rich Tibbett 已提交
1268

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

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

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

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

M
Mr.doob 已提交
1277 1278 1279
		var json = this.json;

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

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

M
Mr.doob 已提交
1283 1284 1285
				var yfov = camera.perspective.yfov;
				var xfov = camera.perspective.xfov;
				var aspect_ratio = camera.perspective.aspect_ratio || 1;
R
Rich Tibbett 已提交
1286

M
Mr.doob 已提交
1287 1288 1289
				// According to COLLADA spec...
				// aspect_ratio = xfov / yfov
				xfov = ( xfov === undefined && yfov ) ? yfov * aspect_ratio : xfov;
R
Rich Tibbett 已提交
1290

M
Mr.doob 已提交
1291 1292 1293
				// According to COLLADA spec...
				// aspect_ratio = xfov / yfov
				// yfov = ( yfov === undefined && xfov ) ? xfov / aspect_ratio : yfov;
R
Rich Tibbett 已提交
1294

M
Mr.doob 已提交
1295 1296
				var _camera = new THREE.PerspectiveCamera( THREE.Math.radToDeg( xfov ), aspect_ratio, camera.perspective.znear || 1, camera.perspective.zfar || 2e6 );
				_camera.name = camera.name;
1297 1298

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

M
Mr.doob 已提交
1300
				return _camera;
R
Rich Tibbett 已提交
1301

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

M
Mr.doob 已提交
1304 1305
				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;
1306 1307

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

M
Mr.doob 已提交
1309
				return _camera;
R
Rich Tibbett 已提交
1310

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

M
Mr.doob 已提交
1313
		} );
R
Rich Tibbett 已提交
1314

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

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

M
Mr.doob 已提交
1319
		var json = this.json;
R
Rich Tibbett 已提交
1320

M
Mr.doob 已提交
1321
		return this._withDependencies( [
R
Rich Tibbett 已提交
1322

M
Mr.doob 已提交
1323
			"accessors"
R
Rich Tibbett 已提交
1324

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

M
Mr.doob 已提交
1327
			return _each( json.skins, function ( skin ) {
M
Mr.doob 已提交
1328 1329 1330 1331 1332 1333 1334 1335 1336 1337

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

				return _skin;

			} );
R
Rich Tibbett 已提交
1338

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

M
Mr.doob 已提交
1341 1342
	};

1343
	GLTFParser.prototype.loadAnimations = function () {
R
Rich Tibbett 已提交
1344

M
Mr.doob 已提交
1345
		var json = this.json;
R
Rich Tibbett 已提交
1346

M
Mr.doob 已提交
1347
		return this._withDependencies( [
R
Rich Tibbett 已提交
1348

M
Mr.doob 已提交
1349 1350
			"accessors",
			"nodes"
R
Rich Tibbett 已提交
1351

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

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

D
Don McCurdy 已提交
1356
				var tracks = [];
R
Rich Tibbett 已提交
1357

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

M
Mr.doob 已提交
1360
					var channel = animation.channels[ channelId ];
M
Mr.doob 已提交
1361 1362 1363
					var sampler = animation.samplers[ channel.sampler ];

					if ( sampler && animation.parameters ) {
R
Rich Tibbett 已提交
1364 1365 1366

						var target = channel.target;
						var name = target.id;
M
Mr.doob 已提交
1367 1368
						var input = animation.parameters[ sampler.input ];
						var output = animation.parameters[ sampler.output ];
R
Rich Tibbett 已提交
1369 1370 1371 1372 1373 1374 1375 1376

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

						var node = dependencies.nodes[ name ];

						if ( node ) {

D
Don McCurdy 已提交
1377 1378
							node.updateMatrix();
							node.matrixAutoUpdate = true;
R
Rich Tibbett 已提交
1379

D
Don McCurdy 已提交
1380 1381 1382
							var TypedKeyframeTrack = PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.rotation
								? THREE.QuaternionKeyframeTrack
								: THREE.VectorKeyframeTrack;
R
Rich Tibbett 已提交
1383

D
Don McCurdy 已提交
1384 1385 1386 1387 1388 1389 1390 1391 1392
							// 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.
							tracks.push( new TypedKeyframeTrack(
								node.name + '.' + PATH_PROPERTIES[ target.path ],
								THREE.AnimationUtils.arraySlice( inputAccessor.array, 0 ),
								THREE.AnimationUtils.arraySlice( outputAccessor.array, 0 ),
								INTERPOLATION[ sampler.interpolation ]
							) );
R
Rich Tibbett 已提交
1393 1394 1395

						}

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

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

D
Don McCurdy 已提交
1400
				return new THREE.AnimationClip( "animation_" + animationId, undefined, tracks );
R
Rich Tibbett 已提交
1401

M
Mr.doob 已提交
1402
			} );
R
Rich Tibbett 已提交
1403

M
Mr.doob 已提交
1404
		} );
R
Rich Tibbett 已提交
1405

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

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

M
Mr.doob 已提交
1410 1411 1412 1413
		var json = this.json;
		var scope = this;

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

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

M
Mr.doob 已提交
1417
			var _node;
R
Rich Tibbett 已提交
1418

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

M
Mr.doob 已提交
1421 1422
				_node = new THREE.Bone();
				_node.jointName = node.jointName;
R
Rich Tibbett 已提交
1423

M
Mr.doob 已提交
1424
			} else {
R
Rich Tibbett 已提交
1425

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

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

M
Mr.doob 已提交
1430
			_node.name = node.name;
1431 1432

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

M
Mr.doob 已提交
1434
			_node.matrixAutoUpdate = false;
R
Rich Tibbett 已提交
1435

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

M
Mr.doob 已提交
1438 1439
				matrix.fromArray( node.matrix );
				_node.applyMatrix( matrix );
R
Rich Tibbett 已提交
1440

M
Mr.doob 已提交
1441
			} else {
R
Rich Tibbett 已提交
1442

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

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

M
Mr.doob 已提交
1447
				}
R
Rich Tibbett 已提交
1448

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

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

M
Mr.doob 已提交
1453 1454 1455
				}

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

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

M
Mr.doob 已提交
1459
				}
R
Rich Tibbett 已提交
1460 1461 1462

			}

M
Mr.doob 已提交
1463
			return _node;
R
Rich Tibbett 已提交
1464

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

M
Mr.doob 已提交
1467
			return scope._withDependencies( [
R
Rich Tibbett 已提交
1468

M
Mr.doob 已提交
1469 1470 1471 1472
				"meshes",
				"skins",
				"cameras",
				"extensions"
R
Rich Tibbett 已提交
1473

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

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

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

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

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

M
Mr.doob 已提交
1484 1485
							var mesh = node.meshes[ meshId ];
							var group = dependencies.meshes[ mesh ];
R
Rich Tibbett 已提交
1486

1487 1488 1489 1490 1491 1492 1493
							if ( group === undefined ) {

								console.warn( 'GLTFLoader: Couldn\'t find node "' + mesh + '".' );
								continue;

							}

M
Mr.doob 已提交
1494 1495 1496
							for ( var childrenId in group.children ) {

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

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

M
Mr.doob 已提交
1500 1501
								var originalMaterial = child.material;
								var originalGeometry = child.geometry;
1502
								var originalUserData = child.userData;
R
Rich Tibbett 已提交
1503

M
Mr.doob 已提交
1504
								var material;
R
Rich Tibbett 已提交
1505

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

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

M
Mr.doob 已提交
1510
								} else {
R
Rich Tibbett 已提交
1511

M
Mr.doob 已提交
1512
									material = originalMaterial;
R
Rich Tibbett 已提交
1513

M
Mr.doob 已提交
1514
								}
M
Mr.doob 已提交
1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528

								switch ( child.type ) {

									case 'LineSegments':
										child = new THREE.LineSegments( originalGeometry, material );
										break;

									case 'Line':
										child = new THREE.Line( originalGeometry, material );
										break;

									default:
										child = new THREE.Mesh( originalGeometry, material );

1529
								}
M
Mr.doob 已提交
1530

M
Mr.doob 已提交
1531
								child.castShadow = true;
1532
								child.userData = originalUserData;
R
Rich Tibbett 已提交
1533

M
Mr.doob 已提交
1534
								var skinEntry;
M
Mr.doob 已提交
1535

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

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

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

M
Mr.doob 已提交
1542 1543
								// Replace Mesh with SkinnedMesh in library
								if ( skinEntry ) {
R
Rich Tibbett 已提交
1544

M
Mr.doob 已提交
1545 1546 1547
									var geometry = originalGeometry;
									var material = originalMaterial;
									material.skinning = true;
R
Rich Tibbett 已提交
1548

M
Mr.doob 已提交
1549 1550
									child = new THREE.SkinnedMesh( geometry, material, false );
									child.castShadow = true;
1551
									child.userData = originalUserData;
R
Rich Tibbett 已提交
1552

M
Mr.doob 已提交
1553 1554
									var bones = [];
									var boneInverses = [];
R
Rich Tibbett 已提交
1555

T
Takahiro 已提交
1556 1557
									var keys = Object.keys( __nodes );

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

M
Mr.doob 已提交
1560
										var jointId = skinEntry.jointNames[ i ];
T
Takahiro 已提交
1561 1562 1563 1564 1565

										var jointNode;

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

T
Takahiro 已提交
1566
											var n = __nodes[ keys[ j ] ];
T
Takahiro 已提交
1567

T
Takahiro 已提交
1568
											if ( n.jointName === jointId ) {
T
Takahiro 已提交
1569

T
Takahiro 已提交
1570
												jointNode = n;
T
Takahiro 已提交
1571 1572 1573 1574 1575
												break;

											}

										}
R
Rich Tibbett 已提交
1576

M
Mr.doob 已提交
1577
										if ( jointNode ) {
R
Rich Tibbett 已提交
1578

M
Mr.doob 已提交
1579
											jointNode.skin = child;
M
Mr.doob 已提交
1580
											bones.push( jointNode );
R
Rich Tibbett 已提交
1581

M
Mr.doob 已提交
1582 1583 1584
											var m = skinEntry.inverseBindMatrices.array;
											var mat = new THREE.Matrix4().fromArray( m, i * 16 );
											boneInverses.push( mat );
R
Rich Tibbett 已提交
1585

M
Mr.doob 已提交
1586
										} else {
R
Rich Tibbett 已提交
1587

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

M
Mr.doob 已提交
1590
										}
R
Rich Tibbett 已提交
1591

M
Mr.doob 已提交
1592
									}
R
Rich Tibbett 已提交
1593

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

M
Mr.doob 已提交
1596
								}
R
Rich Tibbett 已提交
1597

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

M
Mr.doob 已提交
1600
							}
R
Rich Tibbett 已提交
1601

M
Mr.doob 已提交
1602
						}
R
Rich Tibbett 已提交
1603

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

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
1622
					return _node;
R
Rich Tibbett 已提交
1623

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

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

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

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

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

M
Mr.doob 已提交
1634 1635 1636
		var json = this.json;

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

M
Mr.doob 已提交
1638
			switch ( extensionId ) {
R
Rich Tibbett 已提交
1639

M
Mr.doob 已提交
1640
				case "KHR_materials_common":
R
Rich Tibbett 已提交
1641

M
Mr.doob 已提交
1642 1643 1644
					var extensionNode = {
						lights: {}
					};
R
Rich Tibbett 已提交
1645

M
Mr.doob 已提交
1646
					var lights = extension.lights;
R
Rich Tibbett 已提交
1647

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

M
Mr.doob 已提交
1650
						var light = lights[ lightId ];
M
Mr.doob 已提交
1651
						var lightNode;
R
Rich Tibbett 已提交
1652

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

M
Mr.doob 已提交
1656 1657 1658 1659 1660 1661
						switch ( light.type ) {

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

M
Mr.doob 已提交
1663 1664 1665
							case "point":
								lightNode = new THREE.PointLight( color );
								break;
R
Rich Tibbett 已提交
1666

M
Mr.doob 已提交
1667 1668 1669 1670
							case "spot ":
								lightNode = new THREE.SpotLight( color );
								lightNode.position.set( 0, 0, 1 );
								break;
R
Rich Tibbett 已提交
1671

M
Mr.doob 已提交
1672 1673 1674
							case "ambient":
								lightNode = new THREE.AmbientLight( color );
								break;
R
Rich Tibbett 已提交
1675

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

M
Mr.doob 已提交
1678
						if ( lightNode ) {
R
Rich Tibbett 已提交
1679

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

M
Mr.doob 已提交
1682
						}
R
Rich Tibbett 已提交
1683

M
Mr.doob 已提交
1684
					}
R
Rich Tibbett 已提交
1685

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

M
Mr.doob 已提交
1688
					break;
R
Rich Tibbett 已提交
1689

M
Mr.doob 已提交
1690
			}
R
Rich Tibbett 已提交
1691

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

M
Mr.doob 已提交
1694
	};
R
Rich Tibbett 已提交
1695

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

M
Mr.doob 已提交
1698
		var json = this.json;
M
Mr.doob 已提交
1699 1700 1701 1702 1703 1704 1705 1706

		// scene node hierachy builder

		function buildNodeHierachy( nodeId, parentObject, allNodes ) {

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

M
Mr.doob 已提交
1707
			var node = json.nodes[ nodeId ];
M
Mr.doob 已提交
1708 1709 1710

			if ( node.children ) {

M
Mr.doob 已提交
1711 1712 1713
				var children = node.children;

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

M
Mr.doob 已提交
1715
					var child = children[ i ];
M
Mr.doob 已提交
1716 1717
					buildNodeHierachy( child, _node, allNodes );

M
Mr.doob 已提交
1718
				}
M
Mr.doob 已提交
1719 1720

			}
R
Rich Tibbett 已提交
1721 1722 1723

		}

M
Mr.doob 已提交
1724
		return this._withDependencies( [
R
Rich Tibbett 已提交
1725

M
Mr.doob 已提交
1726
			"nodes"
R
Rich Tibbett 已提交
1727

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

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

M
Mr.doob 已提交
1732 1733
				var _scene = new THREE.Scene();
				_scene.name = scene.name;
1734 1735

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

M
Mr.doob 已提交
1737
				var nodes = scene.nodes;
R
Rich Tibbett 已提交
1738

M
Mr.doob 已提交
1739 1740 1741
				for ( var i = 0, l = nodes.length; i < l; i ++ ) {

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

M
Mr.doob 已提交
1744
				}
R
Rich Tibbett 已提交
1745

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

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

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

M
Mr.doob 已提交
1754 1755 1756 1757 1758 1759 1760
					}

				} );

				return _scene;

			} );
R
Rich Tibbett 已提交
1761

M
Mr.doob 已提交
1762 1763 1764
		} );

	};
R
Rich Tibbett 已提交
1765

M
Mr.doob 已提交
1766
	return GLTFLoader;
R
Rich Tibbett 已提交
1767

1768
} )();