GLTFLoader.js 35.4 KB
Newer Older
1
/**
R
Rich Tibbett 已提交
2
 * @author Rich Tibbett / https://github.com/richtr
3
 * @author mrdoob / http://mrdoob.com/
R
Rich Tibbett 已提交
4
 * @author Tony Parisi / http://www.tonyparisi.com/
5 6
 */

M
Mr.doob 已提交
7
THREE.GLTFLoader = ( function () {
R
Rich Tibbett 已提交
8

M
Mr.doob 已提交
9
	function GLTFLoader( manager ) {
10

M
Mr.doob 已提交
11
		this.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;
12

M
Mr.doob 已提交
13
	}
R
Rich Tibbett 已提交
14

M
Mr.doob 已提交
15
	GLTFLoader.prototype = {
16

M
Mr.doob 已提交
17
		constructor: GLTFLoader,
18

M
Mr.doob 已提交
19
		load: function ( url, onLoad, onProgress, onError ) {
20

M
Mr.doob 已提交
21
			var scope = this;
22

M
Mr.doob 已提交
23
			var path = this.path && ( typeof this.path === "string" ) ? this.path : THREE.Loader.prototype.extractUrlBase( url );
24

M
Mr.doob 已提交
25 26
			var loader = new THREE.FileLoader( scope.manager );
			loader.load( url, function ( text ) {
R
Rich Tibbett 已提交
27

M
Mr.doob 已提交
28
				scope.parse( JSON.parse( text ), onLoad, path );
29

M
Mr.doob 已提交
30
			}, onProgress, onError );
31

M
Mr.doob 已提交
32
		},
33

M
Mr.doob 已提交
34
		setCrossOrigin: function ( value ) {
35

M
Mr.doob 已提交
36
			this.crossOrigin = value;
37

M
Mr.doob 已提交
38
		},
39

M
Mr.doob 已提交
40
		setPath: function ( value ) {
41

M
Mr.doob 已提交
42
			this.path = value;
43

M
Mr.doob 已提交
44
		},
45

M
Mr.doob 已提交
46
		parse: function ( json, callback, path ) {
47

M
Mr.doob 已提交
48
			console.time( 'GLTFLoader' );
49

M
Mr.doob 已提交
50
			var parser = new GLTFParser( json, {
51

M
Mr.doob 已提交
52 53
				path: path || this.path,
				crossOrigin: !! this.crossOrigin
54

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

57
			parser.parse( function ( scene, cameras, animations ) {
58

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

					var object = objects[ name ];
112

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

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

M
Mr.doob 已提交
117
					}
118

M
Mr.doob 已提交
119
				}
120

M
Mr.doob 已提交
121
			}
122

M
Mr.doob 已提交
123
		};
124

M
Mr.doob 已提交
125
	}
126

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

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

	/* GLTFSHADER */

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

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

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

		var uniforms = targetNode.material.uniforms;

		for ( var uniformId in uniforms ) {

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

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

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

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

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

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

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

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

			}
165

M
Mr.doob 已提交
166
		}
167

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

M
Mr.doob 已提交
171
	}
172

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

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

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

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

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

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

		for ( var name in boundUniforms ) {

			var boundUniform = boundUniforms[ name ];
190

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

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

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

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
228
					}
229

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

				default :
233

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

			}

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

	};
242 243


244
	/* ANIMATION */
245

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

		update: function () {

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

		}

	};

256 257
	function createAnimation( name, interps ) {

258
		var tracks = [];
259

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

262
			var interp = interps[ i ];
263

264 265 266 267 268 269 270 271
			// KeyframeTrack.optimize() will modify given 'times' and 'values'
			// buffers before creating a truncated copy to keep. Because buffers may
			// be reused by other tracks, make copies here.
			interp.times = THREE.AnimationUtils.arraySlice( interp.times, 0 );
			interp.values = THREE.AnimationUtils.arraySlice( interp.values, 0 );

			interp.target.updateMatrix();
			interp.target.matrixAutoUpdate = true;
272

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

M
Mr.doob 已提交
280
		}
281

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

M
Mr.doob 已提交
284
	}
285

M
Mr.doob 已提交
286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303
	/*********************************/
	/********** 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,
304
		LINES: 1,
M
Mr.doob 已提交
305 306 307 308 309 310
		UNSIGNED_BYTE: 5121,
		UNSIGNED_SHORT: 5123,

		VERTEX_SHADER: 35633,
		FRAGMENT_SHADER: 35632
	};
311

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

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

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

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

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

M
Mr.doob 已提交
368 369 370 371 372 373
	/* UTILITY FUNCTIONS */

	function _each( object, callback, thisObj ) {

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

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

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

M
Mr.doob 已提交
381
			results = [];
R
Rich Tibbett 已提交
382

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

M
Mr.doob 已提交
398
		} else {
R
Rich Tibbett 已提交
399

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

M
Mr.doob 已提交
418
		}
R
Rich Tibbett 已提交
419

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

	}

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

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

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

M
Mr.doob 已提交
435
			return url;
R
Rich Tibbett 已提交
436

M
Mr.doob 已提交
437
		}
R
Rich Tibbett 已提交
438

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

M
Mr.doob 已提交
442
			return url;
R
Rich Tibbett 已提交
443

M
Mr.doob 已提交
444
		}
R
Rich Tibbett 已提交
445

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

M
Mr.doob 已提交
449
	}
R
Rich Tibbett 已提交
450

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

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

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

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

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

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

M
Mr.doob 已提交
471
		}
472

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

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

M
Mr.doob 已提交
479
		for ( var attributeId in attributes ) {
480

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

M
Mr.doob 已提交
486
				params[ attributeId ] = shaderParam;
487

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

M
Mr.doob 已提交
490
		}
R
Rich Tibbett 已提交
491

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

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

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

M
Mr.doob 已提交
499
			switch ( semantic ) {
R
Rich Tibbett 已提交
500

M
Mr.doob 已提交
501
				case "POSITION":
R
Rich Tibbett 已提交
502

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

M
Mr.doob 已提交
506
				case "NORMAL":
R
Rich Tibbett 已提交
507

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

M
Mr.doob 已提交
511 512 513
				case 'TEXCOORD_0':
				case 'TEXCOORD0':
				case 'TEXCOORD':
514

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

M
Mr.doob 已提交
518
				case "WEIGHT":
519

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

M
Mr.doob 已提交
523
				case "JOINT":
524

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

M
Mr.doob 已提交
528
			}
529

M
Mr.doob 已提交
530
		}
R
Rich Tibbett 已提交
531

M
Mr.doob 已提交
532
		return shaderText;
533

M
Mr.doob 已提交
534
	}
R
Rich Tibbett 已提交
535

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

M
Mr.doob 已提交
539
		this.isDeferredShaderMaterial = true;
R
Rich Tibbett 已提交
540

M
Mr.doob 已提交
541
		this.params = params;
542

M
Mr.doob 已提交
543
	}
544

M
Mr.doob 已提交
545
	DeferredShaderMaterial.prototype.create = function () {
546

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

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

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

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

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

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

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

M
Mr.doob 已提交
563
		}
R
Rich Tibbett 已提交
564

M
Mr.doob 已提交
565
		this.params.uniforms = uniforms;
R
Rich Tibbett 已提交
566

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

M
Mr.doob 已提交
569
	};
R
Rich Tibbett 已提交
570

M
Mr.doob 已提交
571
	/* GLTF PARSER */
R
Rich Tibbett 已提交
572

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

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

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

M
Mr.doob 已提交
581
	}
R
Rich Tibbett 已提交
582

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

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

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

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

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

M
Mr.doob 已提交
594
			if ( cached !== undefined ) {
595

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

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

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

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

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

M
Mr.doob 已提交
607
		}
R
Rich Tibbett 已提交
608

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

M
Mr.doob 已提交
611
			return dependency;
R
Rich Tibbett 已提交
612

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

M
Mr.doob 已提交
615
	};
R
Rich Tibbett 已提交
616

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

M
Mr.doob 已提交
619 620
		var json = this.json;

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

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

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

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

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

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

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

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

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

644
			var animations = [];
R
Rich Tibbett 已提交
645

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

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

M
Mr.doob 已提交
650
			}
R
Rich Tibbett 已提交
651

652
			callback( scene, cameras, animations );
R
Rich Tibbett 已提交
653

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

M
Mr.doob 已提交
656
	};
R
Rich Tibbett 已提交
657

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

M
Mr.doob 已提交
660 661 662 663
		var json = this.json;
		var options = this.options;

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

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

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

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

				} );

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

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

M
Mr.doob 已提交
679
	};
R
Rich Tibbett 已提交
680

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

M
Mr.doob 已提交
683 684 685 686
		var json = this.json;
		var options = this.options;

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

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

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

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

M
Mr.doob 已提交
696
						resolve( buffer );
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
	};
R
Rich Tibbett 已提交
707

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

M
Mr.doob 已提交
710 711
		var json = this.json;

M
Mr.doob 已提交
712
		return this._withDependencies( [
R
Rich Tibbett 已提交
713

M
Mr.doob 已提交
714
			"buffers"
R
Rich Tibbett 已提交
715

M
Mr.doob 已提交
716
		] ).then( function ( dependencies ) {
717

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

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

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

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

M
Mr.doob 已提交
726
		} );
727

M
Mr.doob 已提交
728
	};
729

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

M
Mr.doob 已提交
732 733
		var json = this.json;

M
Mr.doob 已提交
734 735 736 737 738
		return this._withDependencies( [

			"bufferViews"

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
761 762 763
				} else {

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

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

				}

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

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

M
Mr.doob 已提交
773
	};
R
Rich Tibbett 已提交
774

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

M
Mr.doob 已提交
777 778 779 780
		var json = this.json;
		var options = this.options;

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

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

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

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

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

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

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

M
Mr.doob 已提交
794
					}
R
Rich Tibbett 已提交
795

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

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

M
Mr.doob 已提交
800
						_texture.flipY = false;
R
Rich Tibbett 已提交
801

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

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

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

M
Mr.doob 已提交
811 812 813
						}

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

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

						resolve();

					} );
R
Rich Tibbett 已提交
820

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

			}

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

M
Mr.doob 已提交
827
	};
R
Rich Tibbett 已提交
828

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

M
Mr.doob 已提交
831 832
		var json = this.json;

M
Mr.doob 已提交
833
		return this._withDependencies( [
R
Rich Tibbett 已提交
834

M
Mr.doob 已提交
835 836
			"shaders",
			"textures"
R
Rich Tibbett 已提交
837

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

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

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

M
Mr.doob 已提交
846
				var khr_material;
R
Rich Tibbett 已提交
847

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

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

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

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

				}

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

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

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

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

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

M
Mr.doob 已提交
876
					}
R
Rich Tibbett 已提交
877

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

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

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

M
Mr.doob 已提交
884
					}
R
Rich Tibbett 已提交
885

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

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

					}

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

M
Mr.doob 已提交
895
					materialType = THREE.MeshPhongMaterial;
R
Rich Tibbett 已提交
896

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

M
Mr.doob 已提交
899
				} else {
R
Rich Tibbett 已提交
900

M
Mr.doob 已提交
901
					materialType = DeferredShaderMaterial;
R
Rich Tibbett 已提交
902

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

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

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

M
Mr.doob 已提交
909
					if ( program ) {
R
Rich Tibbett 已提交
910

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

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

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

M
Mr.doob 已提交
918
						}
R
Rich Tibbett 已提交
919

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

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

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

M
Mr.doob 已提交
927
						}
R
Rich Tibbett 已提交
928

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

M
Mr.doob 已提交
932
						var uniforms = technique.uniforms;
R
Rich Tibbett 已提交
933

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

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

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

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

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

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

M
Mr.doob 已提交
950
								switch ( ptype ) {
R
Rich Tibbett 已提交
951

M
Mr.doob 已提交
952
									case WEBGL_CONSTANTS.FLOAT:
R
Rich Tibbett 已提交
953

M
Mr.doob 已提交
954
										uvalue = shaderParam.value;
R
Rich Tibbett 已提交
955

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

M
Mr.doob 已提交
958
											materialParams.transparent = true;
R
Rich Tibbett 已提交
959

M
Mr.doob 已提交
960
										}
R
Rich Tibbett 已提交
961

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

M
Mr.doob 已提交
964
											uvalue = value;
R
Rich Tibbett 已提交
965

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

M
Mr.doob 已提交
968
										break;
R
Rich Tibbett 已提交
969

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

										if ( shaderParam && shaderParam.value ) {

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

										}

										if ( value ) {

											uvalue.fromArray( value );

										}

M
Mr.doob 已提交
987
										break;
R
Rich Tibbett 已提交
988

M
Mr.doob 已提交
989
									case WEBGL_CONSTANTS.FLOAT_MAT2:
R
Rich Tibbett 已提交
990

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

M
Mr.doob 已提交
995
									case WEBGL_CONSTANTS.FLOAT_MAT4:
R
Rich Tibbett 已提交
996

M
Mr.doob 已提交
997
										if ( pcount ) {
R
Rich Tibbett 已提交
998

M
Mr.doob 已提交
999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033
											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 已提交
1034 1035 1036

										}

M
Mr.doob 已提交
1037
										break;
R
Rich Tibbett 已提交
1038

M
Mr.doob 已提交
1039
									case WEBGL_CONSTANTS.SAMPLER_2D:
R
Rich Tibbett 已提交
1040

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

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

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

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

M
Mr.doob 已提交
1053
							} else {
R
Rich Tibbett 已提交
1054

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

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

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

M
Mr.doob 已提交
1061
					}
R
Rich Tibbett 已提交
1062 1063 1064

				}

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

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

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

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

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

M
Mr.doob 已提交
1075
				delete materialParams.diffuse;
R
Rich Tibbett 已提交
1076

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

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

M
Mr.doob 已提交
1081
				}
R
Rich Tibbett 已提交
1082

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

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

M
Mr.doob 已提交
1087
				}
R
Rich Tibbett 已提交
1088

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

1091 1092 1093 1094 1095 1096 1097 1098 1099
					if ( materialType === THREE.MeshBasicMaterial ) {

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

					} else {

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

					}
R
Rich Tibbett 已提交
1100

1101 1102
				} else if ( typeof( materialValues.emission ) === 'string' ) {

1103
					if ( materialType === THREE.MeshBasicMaterial ) {
1104

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

1107 1108 1109 1110 1111 1112 1113
					} else {

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

					}

				}
1114

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

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

1119 1120 1121 1122
				} else if ( typeof( materialValues.specular ) === 'string' ) {

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

1123
				}
1124

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

M
Mr.doob 已提交
1127
					materialParams.shininess = materialValues.shininess;
R
Rich Tibbett 已提交
1128

M
Mr.doob 已提交
1129
				}
R
Rich Tibbett 已提交
1130

M
Mr.doob 已提交
1131 1132
				var _material = new materialType( materialParams );
				_material.name = material.name;
R
Rich Tibbett 已提交
1133

M
Mr.doob 已提交
1134
				return _material;
R
Rich Tibbett 已提交
1135

M
Mr.doob 已提交
1136
			} );
R
Rich Tibbett 已提交
1137

M
Mr.doob 已提交
1138
		} );
R
Rich Tibbett 已提交
1139

M
Mr.doob 已提交
1140
	};
R
Rich Tibbett 已提交
1141

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

M
Mr.doob 已提交
1144 1145
		var json = this.json;

M
Mr.doob 已提交
1146
		return this._withDependencies( [
R
Rich Tibbett 已提交
1147

M
Mr.doob 已提交
1148 1149
			"accessors",
			"materials"
R
Rich Tibbett 已提交
1150

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

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

M
Mr.doob 已提交
1155 1156
				var group = new THREE.Object3D();
				group.name = mesh.name;
1157 1158

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

M
Mr.doob 已提交
1229 1230
						var meshNode = new THREE.Mesh( geometry, material );
						meshNode.castShadow = true;
1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243
						
						if ( primitive.extras ) meshNode.userData = primitive.extras;
						
						group.add( meshNode );

					}
					
					else if ( primitive.mode === WEBGL_CONSTANTS.LINES) {

						var geometry = new THREE.BufferGeometry();

						var attributes = primitive.attributes;

1244 1245 1246
						for ( var attributeId in attributes ) {

							var attributeEntry = attributes[ attributeId ];
1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261

							if ( !attributeEntry ) {

								return;

							}

							var bufferAttribute = dependencies.accessors[ attributeEntry ];

							switch ( attributeId ) {

								case 'POSITION':
									geometry.addAttribute( 'position', bufferAttribute );
									break;
									
1262 1263
								case 'COLOR_0':
								case 'COLOR0':
1264 1265 1266 1267 1268 1269
								case 'COLOR':
								geometry.addAttribute( 'color', bufferAttribute );
								break;
								
							}

1270
						};
1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294

						if ( primitive.indices ) {

							var indexArray = dependencies.accessors[ primitive.indices ];

							if(indexArray) {

								geometry.setIndex(indexArray);

								var offset = {
									start: 0,
									index: 0,
									count: indexArray.count
								};

								geometry.groups.push(offset);
								geometry.computeBoundingSphere();
							}
						}

						var material = dependencies.materials[ primitive.material ];
						
						var meshNode = new THREE.Line( geometry, material );
						if ( primitive.indices ) meshNode = new THREE.LineSegments( geometry, material );
1295 1296

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

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

1300 1301 1302
				}
					
					else {
R
Rich Tibbett 已提交
1303

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

M
Mr.doob 已提交
1306
					}
R
Rich Tibbett 已提交
1307

M
Mr.doob 已提交
1308
				}
R
Rich Tibbett 已提交
1309

M
Mr.doob 已提交
1310
				return group;
R
Rich Tibbett 已提交
1311

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

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

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

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

M
Mr.doob 已提交
1320 1321 1322
		var json = this.json;

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

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

M
Mr.doob 已提交
1326 1327 1328
				var yfov = camera.perspective.yfov;
				var xfov = camera.perspective.xfov;
				var aspect_ratio = camera.perspective.aspect_ratio || 1;
R
Rich Tibbett 已提交
1329

M
Mr.doob 已提交
1330 1331 1332
				// According to COLLADA spec...
				// aspect_ratio = xfov / yfov
				xfov = ( xfov === undefined && yfov ) ? yfov * aspect_ratio : xfov;
R
Rich Tibbett 已提交
1333

M
Mr.doob 已提交
1334 1335 1336
				// According to COLLADA spec...
				// aspect_ratio = xfov / yfov
				// yfov = ( yfov === undefined && xfov ) ? xfov / aspect_ratio : yfov;
R
Rich Tibbett 已提交
1337

M
Mr.doob 已提交
1338 1339
				var _camera = new THREE.PerspectiveCamera( THREE.Math.radToDeg( xfov ), aspect_ratio, camera.perspective.znear || 1, camera.perspective.zfar || 2e6 );
				_camera.name = camera.name;
1340 1341

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

M
Mr.doob 已提交
1343
				return _camera;
R
Rich Tibbett 已提交
1344

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

M
Mr.doob 已提交
1347 1348
				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;
1349 1350

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

M
Mr.doob 已提交
1352
				return _camera;
R
Rich Tibbett 已提交
1353

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

M
Mr.doob 已提交
1356
		} );
R
Rich Tibbett 已提交
1357

M
Mr.doob 已提交
1358
	};
R
Rich Tibbett 已提交
1359

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

M
Mr.doob 已提交
1362
		var json = this.json;
R
Rich Tibbett 已提交
1363

M
Mr.doob 已提交
1364
		return this._withDependencies( [
R
Rich Tibbett 已提交
1365

M
Mr.doob 已提交
1366
			"accessors"
R
Rich Tibbett 已提交
1367

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

M
Mr.doob 已提交
1370
			return _each( json.skins, function ( skin ) {
M
Mr.doob 已提交
1371 1372 1373 1374 1375 1376 1377 1378 1379 1380

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

				return _skin;

			} );
R
Rich Tibbett 已提交
1381

M
Mr.doob 已提交
1382
		} );
R
Rich Tibbett 已提交
1383

M
Mr.doob 已提交
1384 1385
	};

1386
	GLTFParser.prototype.loadAnimations = function () {
R
Rich Tibbett 已提交
1387

M
Mr.doob 已提交
1388
		var json = this.json;
R
Rich Tibbett 已提交
1389

M
Mr.doob 已提交
1390
		return this._withDependencies( [
R
Rich Tibbett 已提交
1391

M
Mr.doob 已提交
1392 1393
			"accessors",
			"nodes"
R
Rich Tibbett 已提交
1394

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

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

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

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

M
Mr.doob 已提交
1403
					var channel = animation.channels[ channelId ];
M
Mr.doob 已提交
1404 1405 1406
					var sampler = animation.samplers[ channel.sampler ];

					if ( sampler && animation.parameters ) {
R
Rich Tibbett 已提交
1407 1408 1409

						var target = channel.target;
						var name = target.id;
M
Mr.doob 已提交
1410 1411
						var input = animation.parameters[ sampler.input ];
						var output = animation.parameters[ sampler.output ];
R
Rich Tibbett 已提交
1412 1413 1414 1415 1416 1417 1418 1419 1420

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

						var node = dependencies.nodes[ name ];

						if ( node ) {

							var interp = {
1421
								times: inputAccessor.array,
M
Mr.doob 已提交
1422 1423
								values: outputAccessor.array,
								target: node,
1424 1425
								type: INTERPOLATION[ sampler.interpolation ],
								name: node.name + '.' + PATH_PROPERTIES[ target.path ]
R
Rich Tibbett 已提交
1426 1427 1428 1429 1430 1431
							};

							interps.push( interp );

						}

M
Mr.doob 已提交
1432
					}
R
Rich Tibbett 已提交
1433

M
Mr.doob 已提交
1434
				}
R
Rich Tibbett 已提交
1435

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

M
Mr.doob 已提交
1438
			} );
R
Rich Tibbett 已提交
1439

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

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

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

M
Mr.doob 已提交
1446 1447 1448 1449
		var json = this.json;
		var scope = this;

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

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

M
Mr.doob 已提交
1453
			var _node;
R
Rich Tibbett 已提交
1454

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

M
Mr.doob 已提交
1457 1458
				_node = new THREE.Bone();
				_node.jointName = node.jointName;
R
Rich Tibbett 已提交
1459

M
Mr.doob 已提交
1460
			} else {
R
Rich Tibbett 已提交
1461

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

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

M
Mr.doob 已提交
1466
			_node.name = node.name;
1467 1468

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

M
Mr.doob 已提交
1470
			_node.matrixAutoUpdate = false;
R
Rich Tibbett 已提交
1471

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

M
Mr.doob 已提交
1474 1475
				matrix.fromArray( node.matrix );
				_node.applyMatrix( matrix );
R
Rich Tibbett 已提交
1476

M
Mr.doob 已提交
1477
			} else {
R
Rich Tibbett 已提交
1478

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

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

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

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

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

M
Mr.doob 已提交
1489 1490 1491
				}

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

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

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

			}

M
Mr.doob 已提交
1499
			return _node;
R
Rich Tibbett 已提交
1500

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

M
Mr.doob 已提交
1503
			return scope._withDependencies( [
R
Rich Tibbett 已提交
1504

M
Mr.doob 已提交
1505 1506 1507 1508
				"meshes",
				"skins",
				"cameras",
				"extensions"
R
Rich Tibbett 已提交
1509

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

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

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

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

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

M
Mr.doob 已提交
1520 1521
							var mesh = node.meshes[ meshId ];
							var group = dependencies.meshes[ mesh ];
R
Rich Tibbett 已提交
1522

M
Mr.doob 已提交
1523 1524 1525
							for ( var childrenId in group.children ) {

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

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

M
Mr.doob 已提交
1529 1530
								var originalMaterial = child.material;
								var originalGeometry = child.geometry;
1531
								var originalUserData = child.userData;
R
Rich Tibbett 已提交
1532

M
Mr.doob 已提交
1533
								var material;
R
Rich Tibbett 已提交
1534

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

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

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

M
Mr.doob 已提交
1541
									material = originalMaterial;
R
Rich Tibbett 已提交
1542

M
Mr.doob 已提交
1543
								}
1544 1545 1546 1547 1548 1549 1550
								if(child.type=="Line") {
									child = new THREE.Line(originalGeometry, material);
								}
								else if(child.type=="LineSegments") {
									child = new THREE.LineSegments(originalGeometry, material);
								}
								else child = new THREE.Mesh( originalGeometry, material );
M
Mr.doob 已提交
1551
								child.castShadow = true;
1552
								child.userData = originalUserData;
R
Rich Tibbett 已提交
1553

M
Mr.doob 已提交
1554
								var skinEntry;
M
Mr.doob 已提交
1555

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

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

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

M
Mr.doob 已提交
1562 1563
								// Replace Mesh with SkinnedMesh in library
								if ( skinEntry ) {
R
Rich Tibbett 已提交
1564

M
Mr.doob 已提交
1565 1566 1567
									var geometry = originalGeometry;
									var material = originalMaterial;
									material.skinning = true;
R
Rich Tibbett 已提交
1568

M
Mr.doob 已提交
1569 1570
									child = new THREE.SkinnedMesh( geometry, material, false );
									child.castShadow = true;
1571
									child.userData = originalUserData;
R
Rich Tibbett 已提交
1572

M
Mr.doob 已提交
1573 1574
									var bones = [];
									var boneInverses = [];
R
Rich Tibbett 已提交
1575

T
Takahiro 已提交
1576 1577
									var keys = Object.keys( __nodes );

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

M
Mr.doob 已提交
1580
										var jointId = skinEntry.jointNames[ i ];
T
Takahiro 已提交
1581 1582 1583 1584 1585

										var jointNode;

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

T
Takahiro 已提交
1586
											var n = __nodes[ keys[ j ] ];
T
Takahiro 已提交
1587

T
Takahiro 已提交
1588
											if ( n.jointName === jointId ) {
T
Takahiro 已提交
1589

T
Takahiro 已提交
1590
												jointNode = n;
T
Takahiro 已提交
1591 1592 1593 1594 1595
												break;

											}

										}
R
Rich Tibbett 已提交
1596

M
Mr.doob 已提交
1597
										if ( jointNode ) {
R
Rich Tibbett 已提交
1598

M
Mr.doob 已提交
1599
											jointNode.skin = child;
M
Mr.doob 已提交
1600
											bones.push( jointNode );
R
Rich Tibbett 已提交
1601

M
Mr.doob 已提交
1602 1603 1604
											var m = skinEntry.inverseBindMatrices.array;
											var mat = new THREE.Matrix4().fromArray( m, i * 16 );
											boneInverses.push( mat );
R
Rich Tibbett 已提交
1605

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
1622
						}
R
Rich Tibbett 已提交
1623

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

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

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
1644
				} );
R
Rich Tibbett 已提交
1645

M
Mr.doob 已提交
1646
			} );
R
Rich Tibbett 已提交
1647

M
Mr.doob 已提交
1648
		} );
R
Rich Tibbett 已提交
1649

M
Mr.doob 已提交
1650
	};
R
Rich Tibbett 已提交
1651

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

M
Mr.doob 已提交
1654 1655 1656
		var json = this.json;

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

M
Mr.doob 已提交
1658
			switch ( extensionId ) {
R
Rich Tibbett 已提交
1659

M
Mr.doob 已提交
1660
				case "KHR_materials_common":
R
Rich Tibbett 已提交
1661

M
Mr.doob 已提交
1662 1663 1664
					var extensionNode = {
						lights: {}
					};
R
Rich Tibbett 已提交
1665

M
Mr.doob 已提交
1666
					var lights = extension.lights;
R
Rich Tibbett 已提交
1667

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

M
Mr.doob 已提交
1670
						var light = lights[ lightId ];
M
Mr.doob 已提交
1671
						var lightNode;
R
Rich Tibbett 已提交
1672

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

M
Mr.doob 已提交
1676 1677 1678 1679 1680 1681
						switch ( light.type ) {

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

M
Mr.doob 已提交
1683 1684 1685
							case "point":
								lightNode = new THREE.PointLight( color );
								break;
R
Rich Tibbett 已提交
1686

M
Mr.doob 已提交
1687 1688 1689 1690
							case "spot ":
								lightNode = new THREE.SpotLight( color );
								lightNode.position.set( 0, 0, 1 );
								break;
R
Rich Tibbett 已提交
1691

M
Mr.doob 已提交
1692 1693 1694
							case "ambient":
								lightNode = new THREE.AmbientLight( color );
								break;
R
Rich Tibbett 已提交
1695

M
Mr.doob 已提交
1696
						}
R
Rich Tibbett 已提交
1697

M
Mr.doob 已提交
1698
						if ( lightNode ) {
R
Rich Tibbett 已提交
1699

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

M
Mr.doob 已提交
1702
						}
R
Rich Tibbett 已提交
1703

M
Mr.doob 已提交
1704
					}
R
Rich Tibbett 已提交
1705

M
Mr.doob 已提交
1706
					return extensionNode;
R
Rich Tibbett 已提交
1707

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

M
Mr.doob 已提交
1710
			}
R
Rich Tibbett 已提交
1711

M
Mr.doob 已提交
1712
		} );
R
Rich Tibbett 已提交
1713

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

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

M
Mr.doob 已提交
1718
		var json = this.json;
M
Mr.doob 已提交
1719 1720 1721 1722 1723 1724 1725 1726

		// scene node hierachy builder

		function buildNodeHierachy( nodeId, parentObject, allNodes ) {

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

M
Mr.doob 已提交
1727
			var node = json.nodes[ nodeId ];
M
Mr.doob 已提交
1728 1729 1730

			if ( node.children ) {

M
Mr.doob 已提交
1731 1732 1733
				var children = node.children;

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

M
Mr.doob 已提交
1735
					var child = children[ i ];
M
Mr.doob 已提交
1736 1737
					buildNodeHierachy( child, _node, allNodes );

M
Mr.doob 已提交
1738
				}
M
Mr.doob 已提交
1739 1740

			}
R
Rich Tibbett 已提交
1741 1742 1743

		}

M
Mr.doob 已提交
1744
		return this._withDependencies( [
R
Rich Tibbett 已提交
1745

M
Mr.doob 已提交
1746
			"nodes"
R
Rich Tibbett 已提交
1747

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

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

M
Mr.doob 已提交
1752 1753
				var _scene = new THREE.Scene();
				_scene.name = scene.name;
1754 1755

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

M
Mr.doob 已提交
1757
				var nodes = scene.nodes;
R
Rich Tibbett 已提交
1758

M
Mr.doob 已提交
1759 1760 1761
				for ( var i = 0, l = nodes.length; i < l; i ++ ) {

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

M
Mr.doob 已提交
1764
				}
R
Rich Tibbett 已提交
1765

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

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

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

M
Mr.doob 已提交
1774 1775 1776 1777 1778 1779 1780
					}

				} );

				return _scene;

			} );
R
Rich Tibbett 已提交
1781

M
Mr.doob 已提交
1782 1783 1784
		} );

	};
R
Rich Tibbett 已提交
1785

M
Mr.doob 已提交
1786
	return GLTFLoader;
R
Rich Tibbett 已提交
1787

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