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

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

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
26
			var loader = new THREE.FileLoader( scope.manager );
R
Rich Tibbett 已提交
27

28 29 30 31
			loader.setResponseType( 'arraybuffer' );

			loader.load( url, function ( data ) {

M
Mr.doob 已提交
32
				scope.parse( data, onLoad, path );
33

M
Mr.doob 已提交
34
			}, onProgress, onError );
35

M
Mr.doob 已提交
36
		},
37

M
Mr.doob 已提交
38
		setCrossOrigin: function ( value ) {
39

M
Mr.doob 已提交
40
			this.crossOrigin = value;
41

M
Mr.doob 已提交
42
		},
43

M
Mr.doob 已提交
44
		setPath: function ( value ) {
45

M
Mr.doob 已提交
46
			this.path = value;
47

M
Mr.doob 已提交
48
		},
49

50 51
		parse: function ( data, callback, path ) {

M
Mr.doob 已提交
52
			var content;
53 54 55 56 57 58 59
			var extensions = {};

			var magic = convertUint8ArrayToString( new Uint8Array( data, 0, 4 ) );

			if ( magic === BINARY_EXTENSION_HEADER_DEFAULTS.magic ) {

				extensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data );
M
Mr.doob 已提交
60
				content = extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content;
61 62 63

			} else {

M
Mr.doob 已提交
64
				content = convertUint8ArrayToString( new Uint8Array( data ) );
65 66 67

			}

M
Mr.doob 已提交
68
			var json = JSON.parse( content );
69 70 71 72 73 74

			if ( json.extensionsUsed && json.extensionsUsed.indexOf( EXTENSIONS.KHR_MATERIALS_COMMON ) >= 0 ) {

				extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ] = new GLTFMaterialsCommonExtension( json );

			}
75

M
Mr.doob 已提交
76
			console.time( 'GLTFLoader' );
77

78
			var parser = new GLTFParser( json, extensions, {
79

M
Mr.doob 已提交
80
				path: path || this.path,
T
Takahiro 已提交
81
				crossOrigin: this.crossOrigin
82

M
Mr.doob 已提交
83
			} );
84

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

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

M
Mr.doob 已提交
89 90
				var glTF = {
					"scene": scene,
T
Takahiro 已提交
91
					"scenes": scenes,
M
Mr.doob 已提交
92
					"cameras": cameras,
93
					"animations": animations
M
Mr.doob 已提交
94
				};
R
Rich Tibbett 已提交
95

M
Mr.doob 已提交
96
				callback( glTF );
R
Rich Tibbett 已提交
97

M
Mr.doob 已提交
98
			} );
R
Rich Tibbett 已提交
99

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

M
Mr.doob 已提交
102
	};
R
Rich Tibbett 已提交
103

M
Mr.doob 已提交
104
	/* GLTFREGISTRY */
R
Rich Tibbett 已提交
105

M
Mr.doob 已提交
106
	function GLTFRegistry() {
107

M
Mr.doob 已提交
108
		var objects = {};
109

M
Mr.doob 已提交
110
		return	{
R
Rich Tibbett 已提交
111

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

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

M
Mr.doob 已提交
116
			},
R
Rich Tibbett 已提交
117

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

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

M
Mr.doob 已提交
122
			},
R
Rich Tibbett 已提交
123

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

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

M
Mr.doob 已提交
128
			},
R
Rich Tibbett 已提交
129

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

M
Mr.doob 已提交
132
				objects = {};
R
Rich Tibbett 已提交
133

M
Mr.doob 已提交
134
			},
R
Rich Tibbett 已提交
135

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

M
Mr.doob 已提交
138 139 140
				for ( var name in objects ) {

					var object = objects[ name ];
141

M
Mr.doob 已提交
142
					if ( object.update ) {
143

M
Mr.doob 已提交
144
						object.update( scene, camera );
145

M
Mr.doob 已提交
146
					}
147

M
Mr.doob 已提交
148
				}
149

M
Mr.doob 已提交
150
			}
151

M
Mr.doob 已提交
152
		};
153

M
Mr.doob 已提交
154
	}
155

M
Mr.doob 已提交
156
	/* GLTFSHADERS */
157

158 159 160 161 162 163 164 165 166
	GLTFLoader.Shaders = {

		update: function () {

			console.warn( 'THREE.GLTFLoader.Shaders has been deprecated, and now updates automatically.' );

		}

	};
M
Mr.doob 已提交
167 168 169 170

	/* GLTFSHADER */

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

M
Mr.doob 已提交
172
		var boundUniforms = {};
M
Mr.doob 已提交
173 174

		// bind each uniform to its source node
M
Mr.doob 已提交
175 176 177 178 179 180

		var uniforms = targetNode.material.uniforms;

		for ( var uniformId in uniforms ) {

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

M
Mr.doob 已提交
182
			if ( uniform.semantic ) {
183

M
Mr.doob 已提交
184
				var sourceNodeRef = uniform.node;
185

M
Mr.doob 已提交
186
				var sourceNode = targetNode;
187

M
Mr.doob 已提交
188
				if ( sourceNodeRef ) {
189

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

M
Mr.doob 已提交
192
				}
R
Rich Tibbett 已提交
193

M
Mr.doob 已提交
194
				boundUniforms[ uniformId ] = {
M
Mr.doob 已提交
195 196 197 198 199
					semantic: uniform.semantic,
					sourceNode: sourceNode,
					targetNode: targetNode,
					uniform: uniform
				};
R
Rich Tibbett 已提交
200 201

			}
202

M
Mr.doob 已提交
203
		}
204

M
Mr.doob 已提交
205
		this.boundUniforms = boundUniforms;
M
Mr.doob 已提交
206
		this._m4 = new THREE.Matrix4();
207

M
Mr.doob 已提交
208
	}
209

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

M
Mr.doob 已提交
213 214 215 216 217
		var boundUniforms = this.boundUniforms;

		for ( var name in boundUniforms ) {

			var boundUniform = boundUniforms[ name ];
218

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

M
Mr.doob 已提交
221
				case "MODELVIEW":
R
Rich Tibbett 已提交
222

M
Mr.doob 已提交
223 224 225
					var m4 = boundUniform.uniform.value;
					m4.multiplyMatrices( camera.matrixWorldInverse, boundUniform.sourceNode.matrixWorld );
					break;
R
Rich Tibbett 已提交
226

M
Mr.doob 已提交
227
				case "MODELVIEWINVERSETRANSPOSE":
R
Rich Tibbett 已提交
228

M
Mr.doob 已提交
229 230 231 232
					var m3 = boundUniform.uniform.value;
					this._m4.multiplyMatrices( camera.matrixWorldInverse, boundUniform.sourceNode.matrixWorld );
					m3.getNormalMatrix( this._m4 );
					break;
R
Rich Tibbett 已提交
233

M
Mr.doob 已提交
234
				case "PROJECTION":
235

M
Mr.doob 已提交
236 237 238
					var m4 = boundUniform.uniform.value;
					m4.copy( camera.projectionMatrix );
					break;
R
Rich Tibbett 已提交
239

M
Mr.doob 已提交
240
				case "JOINTMATRIX":
R
Rich Tibbett 已提交
241

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

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

M
Mr.doob 已提交
246 247
						// So it goes like this:
						// SkinnedMesh world matrix is already baked into MODELVIEW;
T
Takahiro 已提交
248
						// transform joints to local space,
M
Mr.doob 已提交
249 250 251 252
						// then transform using joint's inverse
						m4v[ mi ]
							.getInverse( boundUniform.sourceNode.matrixWorld )
							.multiply( boundUniform.targetNode.skeleton.bones[ mi ].matrixWorld )
T
Takahiro 已提交
253 254
							.multiply( boundUniform.targetNode.skeleton.boneInverses[ mi ] )
							.multiply( boundUniform.targetNode.bindMatrix );
R
Rich Tibbett 已提交
255

M
Mr.doob 已提交
256
					}
257

M
Mr.doob 已提交
258 259 260
					break;

				default :
261

M
Mr.doob 已提交
262 263 264 265 266
					console.warn( "Unhandled shader semantic: " + boundUniform.semantic );
					break;

			}

M
Mr.doob 已提交
267
		}
M
Mr.doob 已提交
268 269

	};
270 271


272
	/* ANIMATION */
273

M
Mr.doob 已提交
274 275 276 277 278 279 280 281 282 283
	GLTFLoader.Animations = {

		update: function () {

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

		}

	};

284 285 286 287 288 289 290 291 292 293 294
	/*********************************/
	/********** EXTENSIONS ***********/
	/*********************************/

	var EXTENSIONS = {
		KHR_BINARY_GLTF: 'KHR_binary_glTF',
		KHR_MATERIALS_COMMON: 'KHR_materials_common'
	};

	/* MATERIALS COMMON EXTENSION */

M
Mr.doob 已提交
295
	function GLTFMaterialsCommonExtension( json ) {
296 297 298 299 300

		this.name = EXTENSIONS.KHR_MATERIALS_COMMON;

		this.lights = {};

A
Al McElrath 已提交
301 302
		var extension = ( json.extensions && json.extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ] ) || {};
		var lights = extension.lights || {};
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 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351

		for ( var lightId in lights ) {

			var light = lights[ lightId ];
			var lightNode;

			var lightParams = light[ light.type ];
			var color = new THREE.Color().fromArray( lightParams.color );

			switch ( light.type ) {

				case "directional":
					lightNode = new THREE.DirectionalLight( color );
					lightNode.position.set( 0, 0, 1 );
					break;

				case "point":
					lightNode = new THREE.PointLight( color );
					break;

				case "spot":
					lightNode = new THREE.SpotLight( color );
					lightNode.position.set( 0, 0, 1 );
					break;

				case "ambient":
					lightNode = new THREE.AmbientLight( color );
					break;

			}

			if ( lightNode ) {

				this.lights[ lightId ] = lightNode;

			}

		}

	}

	/* BINARY EXTENSION */

	var BINARY_EXTENSION_BUFFER_NAME = 'binary_glTF';

	var BINARY_EXTENSION_HEADER_DEFAULTS = { magic: 'glTF', version: 1, contentFormat: 0 };

	var BINARY_EXTENSION_HEADER_LENGTH = 20;

M
Mr.doob 已提交
352
	function GLTFBinaryExtension( data ) {
353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404

		this.name = EXTENSIONS.KHR_BINARY_GLTF;

		var headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH );

		var header = {
			magic: convertUint8ArrayToString( new Uint8Array( data.slice( 0, 4 ) ) ),
			version: headerView.getUint32( 4, true ),
			length: headerView.getUint32( 8, true ),
			contentLength: headerView.getUint32( 12, true ),
			contentFormat: headerView.getUint32( 16, true )
		};

		for ( var key in BINARY_EXTENSION_HEADER_DEFAULTS ) {

			var value = BINARY_EXTENSION_HEADER_DEFAULTS[ key ];

			if ( header[ key ] !== value ) {

				throw new Error( 'Unsupported glTF-Binary header: Expected "%s" to be "%s".', key, value );

			}

		}

		var contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH, header.contentLength );

		this.header = header;
		this.content = convertUint8ArrayToString( contentArray );
		this.body = data.slice( BINARY_EXTENSION_HEADER_LENGTH + header.contentLength, header.length );

	}

	GLTFBinaryExtension.prototype.loadShader = function ( shader, bufferViews ) {

		var bufferView = bufferViews[ shader.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].bufferView ];
		var array = new Uint8Array( bufferView );

		return convertUint8ArrayToString( array );

	};

	GLTFBinaryExtension.prototype.loadTextureSourceUri = function ( source, bufferViews ) {

		var metadata = source.extensions[ EXTENSIONS.KHR_BINARY_GLTF ];
		var bufferView = bufferViews[ metadata.bufferView ];
		var stringData = convertUint8ArrayToString( new Uint8Array( bufferView ) );

		return 'data:' + metadata.mimeType + ';base64,' + btoa( stringData );

	};

M
Mr.doob 已提交
405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422
	/*********************************/
	/********** 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,
423
		LINES: 1,
M
Mr.doob 已提交
424 425 426 427 428 429
		UNSIGNED_BYTE: 5121,
		UNSIGNED_SHORT: 5123,

		VERTEX_SHADER: 35633,
		FRAGMENT_SHADER: 35632
	};
430

M
Mr.doob 已提交
431 432 433 434 435 436 437 438 439 440
	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
	};
441

M
Mr.doob 已提交
442 443 444 445 446 447 448 449
	var WEBGL_COMPONENT_TYPES = {
		5120: Int8Array,
		5121: Uint8Array,
		5122: Int16Array,
		5123: Uint16Array,
		5125: Uint32Array,
		5126: Float32Array
	};
450

M
Mr.doob 已提交
451 452 453 454 455 456 457 458 459 460 461 462 463 464 465
	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
	};

466 467 468 469 470 471 472 473
	var WEBGL_TEXTURE_FORMATS = {
		6406: THREE.AlphaFormat,
		6407: THREE.RGBFormat,
		6408: THREE.RGBAFormat,
		6409: THREE.LuminanceFormat,
		6410: THREE.LuminanceAlphaFormat
	};

474
	var WEBGL_TEXTURE_DATATYPES = {
475 476 477 478 479 480
		5121: THREE.UnsignedByteType,
		32819: THREE.UnsignedShort4444Type,
		32820: THREE.UnsignedShort5551Type,
		33635: THREE.UnsignedShort565Type
	};

481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522
	var WEBGL_SIDES = {
		1028: THREE.BackSide,  // Culling front
		1029: THREE.FrontSide  // Culling back
		//1032: THREE.NoSide   // Culling front and back, what to do?
	};

	var WEBGL_DEPTH_FUNCS = {
		512: THREE.NeverDepth,
		513: THREE.LessDepth,
		514: THREE.EqualDepth,
		515: THREE.LessEqualDepth,
		516: THREE.GreaterEqualDepth,
		517: THREE.NotEqualDepth,
		518: THREE.GreaterEqualDepth,
		519: THREE.AlwaysDepth
	};

	var WEBGL_BLEND_EQUATIONS = {
		32774: THREE.AddEquation,
		32778: THREE.SubtractEquation,
		32779: THREE.ReverseSubtractEquation
	};

	var WEBGL_BLEND_FUNCS = {
		0: THREE.ZeroFactor,
		1: THREE.OneFactor,
		768: THREE.SrcColorFactor,
		769: THREE.OneMinusSrcColorFactor,
		770: THREE.SrcAlphaFactor,
		771: THREE.OneMinusSrcAlphaFactor,
		772: THREE.DstAlphaFactor,
		773: THREE.OneMinusDstAlphaFactor,
		774: THREE.DstColorFactor,
		775: THREE.OneMinusDstColorFactor,
		776: THREE.SrcAlphaSaturateFactor
		// The followings are not supported by Three.js yet
		//32769: CONSTANT_COLOR,
		//32770: ONE_MINUS_CONSTANT_COLOR,
		//32771: CONSTANT_ALPHA,
		//32772: ONE_MINUS_CONSTANT_COLOR
	};

M
Mr.doob 已提交
523 524 525 526 527 528 529 530 531 532
	var WEBGL_TYPE_SIZES = {
		'SCALAR': 1,
		'VEC2': 2,
		'VEC3': 3,
		'VEC4': 4,
		'MAT2': 4,
		'MAT3': 9,
		'MAT4': 16
	};

533 534 535 536 537 538 539
	var PATH_PROPERTIES = {
		scale: 'scale',
		translation: 'position',
		rotation: 'quaternion'
	};

	var INTERPOLATION = {
540 541
		LINEAR: THREE.InterpolateLinear,
		STEP: THREE.InterpolateDiscrete
542 543
	};

544 545 546 547 548 549 550 551 552
	var STATES_ENABLES = {
		2884: 'CULL_FACE',
		2929: 'DEPTH_TEST',
		3042: 'BLEND',
		3089: 'SCISSOR_TEST',
		32823: 'POLYGON_OFFSET_FILL',
		32926: 'SAMPLE_ALPHA_TO_COVERAGE'
	};

M
Mr.doob 已提交
553 554 555 556 557 558
	/* UTILITY FUNCTIONS */

	function _each( object, callback, thisObj ) {

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

M
Mr.doob 已提交
561 562 563 564
		var results;
		var fns = [];

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

M
Mr.doob 已提交
566
			results = [];
R
Rich Tibbett 已提交
567

M
Mr.doob 已提交
568
			var length = object.length;
T
Takahiro 已提交
569

M
Mr.doob 已提交
570
			for ( var idx = 0; idx < length; idx ++ ) {
T
Takahiro 已提交
571

M
Mr.doob 已提交
572
				var value = callback.call( thisObj || this, object[ idx ], idx );
T
Takahiro 已提交
573

R
Rich Tibbett 已提交
574
				if ( value ) {
T
Takahiro 已提交
575

R
Rich Tibbett 已提交
576
					fns.push( value );
T
Takahiro 已提交
577

R
Rich Tibbett 已提交
578
					if ( value instanceof Promise ) {
T
Takahiro 已提交
579

R
Rich Tibbett 已提交
580
						value.then( function( key, value ) {
T
Takahiro 已提交
581

582
							results[ key ] = value;
T
Takahiro 已提交
583

584
						}.bind( this, idx ));
T
Takahiro 已提交
585

R
Rich Tibbett 已提交
586
					} else {
T
Takahiro 已提交
587

M
Mr.doob 已提交
588
						results[ idx ] = value;
T
Takahiro 已提交
589

R
Rich Tibbett 已提交
590
					}
T
Takahiro 已提交
591

R
Rich Tibbett 已提交
592
				}
T
Takahiro 已提交
593

594
			}
R
Rich Tibbett 已提交
595

M
Mr.doob 已提交
596
		} else {
R
Rich Tibbett 已提交
597

M
Mr.doob 已提交
598 599 600
			results = {};

			for ( var key in object ) {
T
Takahiro 已提交
601

M
Mr.doob 已提交
602
				if ( object.hasOwnProperty( key ) ) {
T
Takahiro 已提交
603

M
Mr.doob 已提交
604
					var value = callback.call( thisObj || this, object[ key ], key );
T
Takahiro 已提交
605

M
Mr.doob 已提交
606
					if ( value ) {
T
Takahiro 已提交
607

M
Mr.doob 已提交
608
						fns.push( value );
T
Takahiro 已提交
609

M
Mr.doob 已提交
610
						if ( value instanceof Promise ) {
T
Takahiro 已提交
611

M
Mr.doob 已提交
612
							value.then( function( key, value ) {
T
Takahiro 已提交
613

M
Mr.doob 已提交
614
								results[ key ] = value;
T
Takahiro 已提交
615

M
Mr.doob 已提交
616
							}.bind( this, key ));
T
Takahiro 已提交
617

M
Mr.doob 已提交
618
						} else {
T
Takahiro 已提交
619

M
Mr.doob 已提交
620
							results[ key ] = value;
T
Takahiro 已提交
621

M
Mr.doob 已提交
622
						}
T
Takahiro 已提交
623

M
Mr.doob 已提交
624
					}
T
Takahiro 已提交
625

M
Mr.doob 已提交
626
				}
T
Takahiro 已提交
627

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

M
Mr.doob 已提交
630
		}
R
Rich Tibbett 已提交
631

M
Mr.doob 已提交
632
		return Promise.all( fns ).then( function() {
T
Takahiro 已提交
633

M
Mr.doob 已提交
634
			return results;
T
Takahiro 已提交
635

M
Mr.doob 已提交
636
		});
R
Rich Tibbett 已提交
637 638 639

	}

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

M
Mr.doob 已提交
642 643 644
		// Invalid URL
		if ( typeof url !== 'string' || url === '' )
			return '';
645

0
06wj 已提交
646 647
		// Absolute URL http://,https://,//
		if ( /^(https?:)?\/\//i.test( url ) ) {
R
Rich Tibbett 已提交
648

M
Mr.doob 已提交
649
			return url;
R
Rich Tibbett 已提交
650

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

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

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

M
Mr.doob 已提交
658
		}
R
Rich Tibbett 已提交
659

M
Mr.doob 已提交
660 661
		// Relative URL
		return ( path || '' ) + url;
R
Rich Tibbett 已提交
662

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

M
Mr.doob 已提交
665 666
	function convertUint8ArrayToString( array ) {

667 668 669 670 671 672 673 674 675
		if ( window.TextDecoder !== undefined ) {

			//return new TextDecoder().decode( array );

		}

		// Avoid the String.fromCharCode.apply(null, array) shortcut, which
		// throws a "maximum call stack size exceeded" error for large arrays.

676 677
		var s = '';

678
		for ( var i = 0, il = array.length; i < il; i ++ ) {
679 680 681 682 683 684

			s += String.fromCharCode( array[ i ] );

		}

		return s;
M
Mr.doob 已提交
685

686 687
	}

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

M
Mr.doob 已提交
692 693
		// Expected technique attributes
		var attributes = {};
R
Rich Tibbett 已提交
694

M
Mr.doob 已提交
695 696 697
		for ( var attributeId in technique.attributes ) {

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

M
Mr.doob 已提交
699 700 701
			var param = technique.parameters[ pname ];
			var atype = param.type;
			var semantic = param.semantic;
R
Rich Tibbett 已提交
702

M
Mr.doob 已提交
703 704 705 706
			attributes[ attributeId ] = {
				type: atype,
				semantic: semantic
			};
707

M
Mr.doob 已提交
708
		}
709

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

M
Mr.doob 已提交
712 713 714
		var shaderParams = technique.parameters;
		var shaderAttributes = technique.attributes;
		var params = {};
715

M
Mr.doob 已提交
716
		for ( var attributeId in attributes ) {
717

M
Mr.doob 已提交
718 719 720 721
			var pname = shaderAttributes[ attributeId ];
			var shaderParam = shaderParams[ pname ];
			var semantic = shaderParam.semantic;
			if ( semantic ) {
722

M
Mr.doob 已提交
723
				params[ attributeId ] = shaderParam;
724

M
Mr.doob 已提交
725
			}
R
Rich Tibbett 已提交
726

M
Mr.doob 已提交
727
		}
R
Rich Tibbett 已提交
728

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

M
Mr.doob 已提交
731
			var param = params[ pname ];
M
Mr.doob 已提交
732
			var semantic = param.semantic;
R
Rich Tibbett 已提交
733

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

M
Mr.doob 已提交
736
			switch ( semantic ) {
R
Rich Tibbett 已提交
737

M
Mr.doob 已提交
738
				case "POSITION":
R
Rich Tibbett 已提交
739

M
Mr.doob 已提交
740 741
					shaderText = shaderText.replace( regEx, 'position' );
					break;
R
Rich Tibbett 已提交
742

M
Mr.doob 已提交
743
				case "NORMAL":
R
Rich Tibbett 已提交
744

M
Mr.doob 已提交
745 746
					shaderText = shaderText.replace( regEx, 'normal' );
					break;
747

M
Mr.doob 已提交
748 749 750
				case 'TEXCOORD_0':
				case 'TEXCOORD0':
				case 'TEXCOORD':
751

M
Mr.doob 已提交
752 753
					shaderText = shaderText.replace( regEx, 'uv' );
					break;
754

755 756 757 758 759
				case 'TEXCOORD_1':

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

760 761 762 763 764 765 766
				case 'COLOR_0':
				case 'COLOR0':
				case 'COLOR':

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

M
Mr.doob 已提交
767
				case "WEIGHT":
768

M
Mr.doob 已提交
769 770
					shaderText = shaderText.replace( regEx, 'skinWeight' );
					break;
771

M
Mr.doob 已提交
772
				case "JOINT":
773

M
Mr.doob 已提交
774 775
					shaderText = shaderText.replace( regEx, 'skinIndex' );
					break;
776

M
Mr.doob 已提交
777
			}
778

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

M
Mr.doob 已提交
781
		return shaderText;
782

M
Mr.doob 已提交
783
	}
R
Rich Tibbett 已提交
784

T
Takahiro 已提交
785 786 787 788 789 790 791 792 793 794 795 796
	function createDefaultMaterial() {

		return new THREE.MeshPhongMaterial( {
			color: 0x00000,
			emissive: 0x888888,
			specular: 0x000000,
			shininess: 0,
			transparent: false,
			depthTest: true,
			side: THREE.FrontSide
		} );

M
Mr.doob 已提交
797
	}
T
Takahiro 已提交
798

M
Mr.doob 已提交
799 800
	// Deferred constructor for RawShaderMaterial types
	function DeferredShaderMaterial( params ) {
R
Rich Tibbett 已提交
801

M
Mr.doob 已提交
802
		this.isDeferredShaderMaterial = true;
R
Rich Tibbett 已提交
803

M
Mr.doob 已提交
804
		this.params = params;
805

M
Mr.doob 已提交
806
	}
807

M
Mr.doob 已提交
808
	DeferredShaderMaterial.prototype.create = function () {
809

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

M
Mr.doob 已提交
812 813 814
		for ( var uniformId in this.params.uniforms ) {

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

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

M
Mr.doob 已提交
818 819
				uniforms[ uniformId ].value = originalUniform.value;
				uniforms[ uniformId ].value.needsUpdate = true;
R
Rich Tibbett 已提交
820

M
Mr.doob 已提交
821
			}
R
Rich Tibbett 已提交
822

M
Mr.doob 已提交
823 824
			uniforms[ uniformId ].semantic = originalUniform.semantic;
			uniforms[ uniformId ].node = originalUniform.node;
R
Rich Tibbett 已提交
825

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

M
Mr.doob 已提交
828
		this.params.uniforms = uniforms;
R
Rich Tibbett 已提交
829

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

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

M
Mr.doob 已提交
834
	/* GLTF PARSER */
R
Rich Tibbett 已提交
835

836
	function GLTFParser( json, extensions, options ) {
R
Rich Tibbett 已提交
837

M
Mr.doob 已提交
838
		this.json = json || {};
839
		this.extensions = extensions || {};
M
Mr.doob 已提交
840
		this.options = options || {};
R
Rich Tibbett 已提交
841

M
Mr.doob 已提交
842 843
		// loader object cache
		this.cache = new GLTFRegistry();
R
Rich Tibbett 已提交
844

M
Mr.doob 已提交
845
	}
R
Rich Tibbett 已提交
846

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

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

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

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

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

M
Mr.doob 已提交
858
			if ( cached !== undefined ) {
859

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

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

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

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

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

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

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

M
Mr.doob 已提交
875
			return dependency;
R
Rich Tibbett 已提交
876

M
Mr.doob 已提交
877
		} );
R
Rich Tibbett 已提交
878

M
Mr.doob 已提交
879
	};
R
Rich Tibbett 已提交
880

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

M
Mr.doob 已提交
883 884
		var json = this.json;

M
Mr.doob 已提交
885 886
		// Clear the loader cache
		this.cache.removeAll();
R
Rich Tibbett 已提交
887

M
Mr.doob 已提交
888 889
		// Fire the callback on complete
		this._withDependencies( [
R
Rich Tibbett 已提交
890

M
Mr.doob 已提交
891 892
			"scenes",
			"cameras",
893
			"animations"
R
Rich Tibbett 已提交
894

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

T
Takahiro 已提交
897 898 899 900 901 902 903 904
			var scenes = [];

			for ( var name in dependencies.scenes ) {

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

			}

905 906
			var scene = json.scene !== undefined ? dependencies.scenes[ json.scene ] : scenes[ 0 ];

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

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

M
Mr.doob 已提交
911
				var camera = dependencies.cameras[ name ];
M
Mr.doob 已提交
912
				cameras.push( camera );
R
Rich Tibbett 已提交
913

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

916
			var animations = [];
R
Rich Tibbett 已提交
917

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

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

M
Mr.doob 已提交
922
			}
R
Rich Tibbett 已提交
923

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

M
Mr.doob 已提交
926
		} );
R
Rich Tibbett 已提交
927

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

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

M
Mr.doob 已提交
932
		var json = this.json;
933
		var extensions = this.extensions;
M
Mr.doob 已提交
934 935
		var options = this.options;

936 937 938 939 940 941 942 943 944 945 946 947 948 949 950
		return this._withDependencies( [

			"bufferViews"

		] ).then( function ( dependencies ) {

			return _each( json.shaders, function ( shader ) {

				if ( shader.extensions && shader.extensions[ EXTENSIONS.KHR_BINARY_GLTF ] ) {

					return extensions[ EXTENSIONS.KHR_BINARY_GLTF ].loadShader( shader, dependencies.bufferViews );

				}

				return new Promise( function ( resolve ) {
R
Rich Tibbett 已提交
951

952 953 954
					var loader = new THREE.FileLoader();
					loader.setResponseType( 'text' );
					loader.load( resolveURL( shader.uri, options.path ), function ( shaderText ) {
R
Rich Tibbett 已提交
955

956
						resolve( shaderText );
R
Rich Tibbett 已提交
957

958
					} );
R
Rich Tibbett 已提交
959 960 961

				} );

M
Mr.doob 已提交
962
			} );
R
Rich Tibbett 已提交
963

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

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

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

M
Mr.doob 已提交
970
		var json = this.json;
971
		var extensions = this.extensions;
M
Mr.doob 已提交
972 973
		var options = this.options;

974 975 976 977 978 979 980
		return _each( json.buffers, function ( buffer, name ) {

			if ( name === BINARY_EXTENSION_BUFFER_NAME ) {

				return extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body;

			}
R
Rich Tibbett 已提交
981

T
Takahiro 已提交
982
			if ( buffer.type === 'arraybuffer' || buffer.type === undefined ) {
R
Rich Tibbett 已提交
983

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

M
Mr.doob 已提交
986
					var loader = new THREE.FileLoader();
987
					loader.setResponseType( 'arraybuffer' );
M
Mr.doob 已提交
988
					loader.load( resolveURL( buffer.uri, options.path ), function ( buffer ) {
R
Rich Tibbett 已提交
989

M
Mr.doob 已提交
990
						resolve( buffer );
R
Rich Tibbett 已提交
991

M
Mr.doob 已提交
992
					} );
R
Rich Tibbett 已提交
993

M
Mr.doob 已提交
994
				} );
R
Rich Tibbett 已提交
995

T
Takahiro 已提交
996 997 998 999
			} else {

				console.warn( 'THREE.GLTFLoader: ' + buffer.type + ' buffer type is not supported' );

M
Mr.doob 已提交
1000
			}
R
Rich Tibbett 已提交
1001

M
Mr.doob 已提交
1002
		} );
R
Rich Tibbett 已提交
1003

M
Mr.doob 已提交
1004
	};
R
Rich Tibbett 已提交
1005

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

M
Mr.doob 已提交
1008 1009
		var json = this.json;

M
Mr.doob 已提交
1010
		return this._withDependencies( [
R
Rich Tibbett 已提交
1011

M
Mr.doob 已提交
1012
			"buffers"
R
Rich Tibbett 已提交
1013

M
Mr.doob 已提交
1014
		] ).then( function ( dependencies ) {
1015

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

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

1020 1021 1022
				var byteLength = bufferView.byteLength !== undefined ? bufferView.byteLength : 0;

				return arraybuffer.slice( bufferView.byteOffset, bufferView.byteOffset + byteLength );
1023

M
Mr.doob 已提交
1024
			} );
1025

M
Mr.doob 已提交
1026
		} );
1027

M
Mr.doob 已提交
1028
	};
1029

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

M
Mr.doob 已提交
1032 1033
		var json = this.json;

M
Mr.doob 已提交
1034 1035 1036 1037 1038
		return this._withDependencies( [

			"bufferViews"

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

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

M
Mr.doob 已提交
1042 1043 1044
				var arraybuffer = dependencies.bufferViews[ accessor.bufferView ];
				var itemSize = WEBGL_TYPE_SIZES[ accessor.type ];
				var TypedArray = WEBGL_COMPONENT_TYPES[ accessor.componentType ];
R
Rich Tibbett 已提交
1045

M
Mr.doob 已提交
1046 1047 1048
				// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.
				var elementBytes = TypedArray.BYTES_PER_ELEMENT;
				var itemBytes = elementBytes * itemSize;
R
Rich Tibbett 已提交
1049

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

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

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

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

M
Mr.doob 已提交
1061 1062 1063
				} else {

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

M
Mr.doob 已提交
1065
					return new THREE.BufferAttribute( array, itemSize );
R
Rich Tibbett 已提交
1066 1067 1068

				}

M
Mr.doob 已提交
1069
			} );
R
Rich Tibbett 已提交
1070

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

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

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

M
Mr.doob 已提交
1077
		var json = this.json;
1078
		var extensions = this.extensions;
M
Mr.doob 已提交
1079 1080
		var options = this.options;

1081
		return this._withDependencies( [
R
Rich Tibbett 已提交
1082

1083
			"bufferViews"
R
Rich Tibbett 已提交
1084

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

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

1089
				if ( texture.source ) {
R
Rich Tibbett 已提交
1090

1091
					return new Promise( function ( resolve ) {
R
Rich Tibbett 已提交
1092

1093 1094
						var source = json.images[ texture.source ];
						var sourceUri = source.uri;
R
Rich Tibbett 已提交
1095

M
Mr.doob 已提交
1096
						if ( source.extensions && source.extensions[ EXTENSIONS.KHR_BINARY_GLTF ] ) {
R
Rich Tibbett 已提交
1097

1098
							sourceUri = extensions[ EXTENSIONS.KHR_BINARY_GLTF ].loadTextureSourceUri( source, dependencies.bufferViews );
R
Rich Tibbett 已提交
1099

1100
						}
R
Rich Tibbett 已提交
1101

1102
						var textureLoader = THREE.Loader.Handlers.get( sourceUri );
R
Rich Tibbett 已提交
1103

1104
						if ( textureLoader === null ) {
R
Rich Tibbett 已提交
1105

1106
							textureLoader = new THREE.TextureLoader();
R
Rich Tibbett 已提交
1107

M
Mr.doob 已提交
1108 1109
						}

1110 1111 1112 1113 1114 1115
						textureLoader.setCrossOrigin( options.crossOrigin );

						textureLoader.load( resolveURL( sourceUri, options.path ), function ( _texture ) {

							_texture.flipY = false;

T
Takahiro 已提交
1116 1117
							if ( texture.name !== undefined ) _texture.name = texture.name;

T
Takahiro 已提交
1118 1119 1120 1121 1122
							_texture.format = texture.format !== undefined ? WEBGL_TEXTURE_FORMATS[ texture.format ] : THREE.RGBAFormat;

							if ( texture.internalFormat !== undefined && _texture.format !== WEBGL_TEXTURE_FORMATS[ texture.internalFormat ] ) {

								console.warn( 'THREE.GLTFLoader: Three.js doesn\'t support texture internalFormat which is different from texture format. ' +
1123
															'internalFormat will be forced to be the same value as format.' );
T
Takahiro 已提交
1124 1125 1126

							}

1127
							_texture.type = texture.type !== undefined ? WEBGL_TEXTURE_DATATYPES[ texture.type ] : THREE.UnsignedByteType;
1128

1129 1130 1131 1132
							if ( texture.sampler ) {

								var sampler = json.samplers[ texture.sampler ];

1133 1134 1135 1136
								_texture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || THREE.LinearFilter;
								_texture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || THREE.NearestMipMapLinearFilter;
								_texture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || THREE.RepeatWrapping;
								_texture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || THREE.RepeatWrapping;
1137 1138 1139 1140 1141 1142

							}

							resolve( _texture );

						}, undefined, function () {
R
Rich Tibbett 已提交
1143

1144
							resolve();
1145

1146
						} );
1147 1148

					} );
R
Rich Tibbett 已提交
1149

1150
				}
R
Rich Tibbett 已提交
1151

1152
			} );
R
Rich Tibbett 已提交
1153

M
Mr.doob 已提交
1154
		} );
R
Rich Tibbett 已提交
1155

M
Mr.doob 已提交
1156
	};
R
Rich Tibbett 已提交
1157

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

M
Mr.doob 已提交
1160 1161
		var json = this.json;

M
Mr.doob 已提交
1162
		return this._withDependencies( [
R
Rich Tibbett 已提交
1163

M
Mr.doob 已提交
1164 1165
			"shaders",
			"textures"
R
Rich Tibbett 已提交
1166

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

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

M
Mr.doob 已提交
1171 1172 1173
				var materialType;
				var materialValues = {};
				var materialParams = {};
R
Rich Tibbett 已提交
1174

M
Mr.doob 已提交
1175
				var khr_material;
R
Rich Tibbett 已提交
1176

1177
				if ( material.extensions && material.extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ] ) {
R
Rich Tibbett 已提交
1178

1179
					khr_material = material.extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ];
R
Rich Tibbett 已提交
1180 1181 1182

				}

M
Mr.doob 已提交
1183
				if ( khr_material ) {
R
Rich Tibbett 已提交
1184

T
Takahiro 已提交
1185 1186 1187
					// don't copy over unused values to avoid material warning spam
					var keys = [ 'ambient', 'emission', 'transparent', 'transparency', 'doubleSided' ];

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

M
Mr.doob 已提交
1190 1191 1192
						case 'BLINN' :
						case 'PHONG' :
							materialType = THREE.MeshPhongMaterial;
T
Takahiro 已提交
1193
							keys.push( 'diffuse', 'specular', 'shininess' );
M
Mr.doob 已提交
1194
							break;
R
Rich Tibbett 已提交
1195

M
Mr.doob 已提交
1196 1197
						case 'LAMBERT' :
							materialType = THREE.MeshLambertMaterial;
T
Takahiro 已提交
1198
							keys.push( 'diffuse' );
M
Mr.doob 已提交
1199
							break;
R
Rich Tibbett 已提交
1200

M
Mr.doob 已提交
1201 1202 1203 1204
						case 'CONSTANT' :
						default :
							materialType = THREE.MeshBasicMaterial;
							break;
R
Rich Tibbett 已提交
1205

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

T
Takahiro 已提交
1208 1209 1210 1211 1212
					keys.forEach( function( v ) {

						if ( khr_material.values[ v ] !== undefined ) materialValues[ v ] = khr_material.values[ v ];

					} );
R
Rich Tibbett 已提交
1213

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

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

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

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

M
Mr.doob 已提交
1222 1223
						materialParams.transparent = true;
						materialParams.opacity = ( materialValues.transparency !== undefined ) ? materialValues.transparency : 1;
R
Rich Tibbett 已提交
1224 1225 1226

					}

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

M
Mr.doob 已提交
1229
					materialType = THREE.MeshPhongMaterial;
R
Rich Tibbett 已提交
1230

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

M
Mr.doob 已提交
1233
				} else {
R
Rich Tibbett 已提交
1234

M
Mr.doob 已提交
1235
					materialType = DeferredShaderMaterial;
R
Rich Tibbett 已提交
1236

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

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

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

M
Mr.doob 已提交
1243
					if ( program ) {
R
Rich Tibbett 已提交
1244

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

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

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

M
Mr.doob 已提交
1252
						}
R
Rich Tibbett 已提交
1253

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

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

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

M
Mr.doob 已提交
1261
						}
R
Rich Tibbett 已提交
1262

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

M
Mr.doob 已提交
1266
						var uniforms = technique.uniforms;
R
Rich Tibbett 已提交
1267

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

M
Mr.doob 已提交
1270
							var pname = uniforms[ uniformId ];
M
Mr.doob 已提交
1271
							var shaderParam = technique.parameters[ pname ];
R
Rich Tibbett 已提交
1272

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

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

M
Mr.doob 已提交
1277
								var pcount = shaderParam.count;
1278 1279 1280
								var value;

								if ( material.values !== undefined ) value = material.values[ pname ];
R
Rich Tibbett 已提交
1281

M
Mr.doob 已提交
1282 1283 1284
								var uvalue = new WEBGL_TYPE[ ptype ]();
								var usemantic = shaderParam.semantic;
								var unode = shaderParam.node;
R
Rich Tibbett 已提交
1285

M
Mr.doob 已提交
1286
								switch ( ptype ) {
R
Rich Tibbett 已提交
1287

M
Mr.doob 已提交
1288
									case WEBGL_CONSTANTS.FLOAT:
R
Rich Tibbett 已提交
1289

M
Mr.doob 已提交
1290
										uvalue = shaderParam.value;
R
Rich Tibbett 已提交
1291

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

M
Mr.doob 已提交
1294
											materialParams.transparent = true;
R
Rich Tibbett 已提交
1295

M
Mr.doob 已提交
1296
										}
R
Rich Tibbett 已提交
1297

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

M
Mr.doob 已提交
1300
											uvalue = value;
R
Rich Tibbett 已提交
1301

M
Mr.doob 已提交
1302
										}
R
Rich Tibbett 已提交
1303

M
Mr.doob 已提交
1304
										break;
R
Rich Tibbett 已提交
1305

M
Mr.doob 已提交
1306 1307 1308 1309
									case WEBGL_CONSTANTS.FLOAT_VEC2:
									case WEBGL_CONSTANTS.FLOAT_VEC3:
									case WEBGL_CONSTANTS.FLOAT_VEC4:
									case WEBGL_CONSTANTS.FLOAT_MAT3:
R
Rich Tibbett 已提交
1310 1311 1312

										if ( shaderParam && shaderParam.value ) {

M
Mr.doob 已提交
1313
											uvalue.fromArray( shaderParam.value );
R
Rich Tibbett 已提交
1314 1315 1316 1317 1318 1319 1320 1321 1322

										}

										if ( value ) {

											uvalue.fromArray( value );

										}

M
Mr.doob 已提交
1323
										break;
R
Rich Tibbett 已提交
1324

M
Mr.doob 已提交
1325
									case WEBGL_CONSTANTS.FLOAT_MAT2:
R
Rich Tibbett 已提交
1326

M
Mr.doob 已提交
1327 1328 1329
										// what to do?
										console.warn( "FLOAT_MAT2 is not a supported uniform type" );
										break;
R
Rich Tibbett 已提交
1330

M
Mr.doob 已提交
1331
									case WEBGL_CONSTANTS.FLOAT_MAT4:
R
Rich Tibbett 已提交
1332

M
Mr.doob 已提交
1333
										if ( pcount ) {
R
Rich Tibbett 已提交
1334

M
Mr.doob 已提交
1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355
											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 );

											}

T
Takahiro 已提交
1356
										} else {
M
Mr.doob 已提交
1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369

											if ( shaderParam && shaderParam.value ) {

												var m4 = shaderParam.value;
												uvalue.fromArray( m4 );

											}

											if ( value ) {

												uvalue.fromArray( value );

											}
R
Rich Tibbett 已提交
1370 1371 1372

										}

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

M
Mr.doob 已提交
1375
									case WEBGL_CONSTANTS.SAMPLER_2D:
R
Rich Tibbett 已提交
1376

1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389
										if ( value !== undefined ) {

											uvalue = dependencies.textures[ value ];

										} else if ( shaderParam.value !== undefined ) {

											uvalue = dependencies.textures[ shaderParam.value ];

										} else {

											uvalue = null;

										}
R
Rich Tibbett 已提交
1390

M
Mr.doob 已提交
1391
										break;
R
Rich Tibbett 已提交
1392

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

M
Mr.doob 已提交
1395 1396 1397 1398 1399
								materialParams.uniforms[ uniformId ] = {
									value: uvalue,
									semantic: usemantic,
									node: unode
								};
R
Rich Tibbett 已提交
1400

M
Mr.doob 已提交
1401
							} else {
R
Rich Tibbett 已提交
1402

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

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

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

1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420
						var states = technique.states || {};
						var enables = states.enable || [];
						var functions = states.functions || {};

						var enableCullFace = false;
						var enableDepthTest = false;
						var enableBlend = false;

						for ( var i = 0, il = enables.length; i < il; i ++ ) {

							var enable = enables[ i ];

M
Mr.doob 已提交
1421
							switch ( STATES_ENABLES[ enable ] ) {
1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467

								case 'CULL_FACE':

									enableCullFace = true;

									break;

								case 'DEPTH_TEST':

									enableDepthTest = true;

									break;

								case 'BLEND':

									enableBlend = true;

									break;

								// TODO: implement
								case 'SCISSOR_TEST':
								case 'POLYGON_OFFSET_FILL':
								case 'SAMPLE_ALPHA_TO_COVERAGE':

									break;

								default:

									throw new Error( "Unknown technique.states.enable: " + enable );

							}

						}

						if ( enableCullFace ) {

							materialParams.side = functions.cullFace !== undefined ? WEBGL_SIDES[ functions.cullFace ] : THREE.FrontSide;

						} else {

							materialParams.side = THREE.DoubleSide;

						}

						materialParams.depthTest = enableDepthTest;
						materialParams.depthFunc = functions.depthFunc !== undefined ? WEBGL_DEPTH_FUNCS[ functions.depthFunc ] : THREE.LessDepth;
1468
						materialParams.depthWrite = functions.depthMask !== undefined ? functions.depthMask[ 0 ] : true;
1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504

						materialParams.blending = enableBlend ? THREE.CustomBlending : THREE.NoBlending;
						materialParams.transparent = enableBlend;

						var blendEquationSeparate = functions.blendEquationSeparate;

						if ( blendEquationSeparate !== undefined ) {

							materialParams.blendEquation = WEBGL_BLEND_EQUATIONS[ blendEquationSeparate[ 0 ] ];
							materialParams.blendEquationAlpha = WEBGL_BLEND_EQUATIONS[ blendEquationSeparate[ 1 ] ];

						} else {

							materialParams.blendEquation = THREE.AddEquation;
							materialParams.blendEquationAlpha = THREE.AddEquation;

						}

						var blendFuncSeparate = functions.blendFuncSeparate;

						if ( blendFuncSeparate !== undefined ) {

							materialParams.blendSrc = WEBGL_BLEND_FUNCS[ blendFuncSeparate[ 0 ] ];
							materialParams.blendDst = WEBGL_BLEND_FUNCS[ blendFuncSeparate[ 1 ] ];
							materialParams.blendSrcAlpha = WEBGL_BLEND_FUNCS[ blendFuncSeparate[ 2 ] ];
							materialParams.blendDstAlpha = WEBGL_BLEND_FUNCS[ blendFuncSeparate[ 3 ] ];

						} else {

							materialParams.blendSrc = THREE.OneFactor;
							materialParams.blendDst = THREE.ZeroFactor;
							materialParams.blendSrcAlpha = THREE.OneFactor;
							materialParams.blendDstAlpha = THREE.ZeroFactor;

						}

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

				}

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

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

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

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

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

M
Mr.doob 已提交
1519
				delete materialParams.diffuse;
R
Rich Tibbett 已提交
1520

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

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

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

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

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

M
Mr.doob 已提交
1531
				}
R
Rich Tibbett 已提交
1532

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

1535 1536 1537 1538 1539 1540 1541 1542 1543
					if ( materialType === THREE.MeshBasicMaterial ) {

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

					} else {

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

					}
R
Rich Tibbett 已提交
1544

1545 1546
				} else if ( typeof( materialValues.emission ) === 'string' ) {

1547
					if ( materialType === THREE.MeshBasicMaterial ) {
1548

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

1551 1552 1553 1554 1555 1556 1557
					} else {

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

					}

				}
1558

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

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

1563 1564 1565 1566
				} else if ( typeof( materialValues.specular ) === 'string' ) {

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

1567
				}
1568

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

M
Mr.doob 已提交
1571
					materialParams.shininess = materialValues.shininess;
R
Rich Tibbett 已提交
1572

M
Mr.doob 已提交
1573
				}
R
Rich Tibbett 已提交
1574

M
Mr.doob 已提交
1575
				var _material = new materialType( materialParams );
1576
				if ( material.name !== undefined ) _material.name = material.name;
R
Rich Tibbett 已提交
1577

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

M
Mr.doob 已提交
1580
			} );
R
Rich Tibbett 已提交
1581

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

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

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

M
Mr.doob 已提交
1588 1589
		var json = this.json;

M
Mr.doob 已提交
1590
		return this._withDependencies( [
R
Rich Tibbett 已提交
1591

M
Mr.doob 已提交
1592 1593
			"accessors",
			"materials"
R
Rich Tibbett 已提交
1594

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

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

1599
				var group = new THREE.Group();
1600
				if ( mesh.name !== undefined ) group.name = mesh.name;
1601 1602

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

1604
				var primitives = mesh.primitives || [];
R
Rich Tibbett 已提交
1605

M
Mr.doob 已提交
1606 1607 1608
				for ( var name in primitives ) {

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

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

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

M
Mr.doob 已提交
1614
						var attributes = primitive.attributes;
R
Rich Tibbett 已提交
1615

M
Mr.doob 已提交
1616 1617 1618
						for ( var attributeId in attributes ) {

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

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

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

M
Mr.doob 已提交
1624
							switch ( attributeId ) {
R
Rich Tibbett 已提交
1625

M
Mr.doob 已提交
1626 1627 1628
								case 'POSITION':
									geometry.addAttribute( 'position', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1629

M
Mr.doob 已提交
1630 1631 1632
								case 'NORMAL':
									geometry.addAttribute( 'normal', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1633

M
Mr.doob 已提交
1634 1635 1636 1637 1638
								case 'TEXCOORD_0':
								case 'TEXCOORD0':
								case 'TEXCOORD':
									geometry.addAttribute( 'uv', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1639

S
Steven Vergenz 已提交
1640 1641 1642 1643
								case 'TEXCOORD_1':
									geometry.addAttribute( 'uv2', bufferAttribute );
									break;

1644 1645 1646 1647 1648
								case 'COLOR_0':
								case 'COLOR0':
								case 'COLOR':
									geometry.addAttribute( 'color', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1649

M
Mr.doob 已提交
1650 1651 1652
								case 'WEIGHT':
									geometry.addAttribute( 'skinWeight', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1653

M
Mr.doob 已提交
1654 1655 1656
								case 'JOINT':
									geometry.addAttribute( 'skinIndex', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1657

M
Mr.doob 已提交
1658
							}
R
Rich Tibbett 已提交
1659

M
Mr.doob 已提交
1660
						}
R
Rich Tibbett 已提交
1661

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

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

M
Mr.doob 已提交
1666
						}
R
Rich Tibbett 已提交
1667

1668
						var material = dependencies.materials !== undefined ? dependencies.materials[ primitive.material ] : createDefaultMaterial();
R
Rich Tibbett 已提交
1669

M
Mr.doob 已提交
1670 1671
						var meshNode = new THREE.Mesh( geometry, material );
						meshNode.castShadow = true;
A
Al McElrath 已提交
1672
						meshNode.name = ( name === "0" ? group.name : group.name + name );
M
Mr.doob 已提交
1673

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

1676 1677
						group.add( meshNode );

M
Mr.doob 已提交
1678
					} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {
1679 1680 1681 1682 1683

						var geometry = new THREE.BufferGeometry();

						var attributes = primitive.attributes;

1684 1685 1686
						for ( var attributeId in attributes ) {

							var attributeEntry = attributes[ attributeId ];
1687

M
Mr.doob 已提交
1688
							if ( ! attributeEntry ) return;
1689 1690 1691 1692 1693 1694 1695 1696

							var bufferAttribute = dependencies.accessors[ attributeEntry ];

							switch ( attributeId ) {

								case 'POSITION':
									geometry.addAttribute( 'position', bufferAttribute );
									break;
1697

1698 1699
								case 'COLOR_0':
								case 'COLOR0':
1700
								case 'COLOR':
M
Mr.doob 已提交
1701 1702 1703
									geometry.addAttribute( 'color', bufferAttribute );
									break;

1704
							}
M
Mr.doob 已提交
1705 1706

						}
M
Mr.doob 已提交
1707 1708 1709 1710

						var material = dependencies.materials[ primitive.material ];

						var meshNode;
1711 1712 1713

						if ( primitive.indices ) {

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

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

M
Mr.doob 已提交
1718
						} else {
1719

M
Mr.doob 已提交
1720
							meshNode = new THREE.Line( geometry, material );
1721 1722 1723

						}

A
Al McElrath 已提交
1724 1725
						meshNode.name = ( name === "0" ? group.name : group.name + name );

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

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

M
Mr.doob 已提交
1730
					} else {
R
Rich Tibbett 已提交
1731

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

M
Mr.doob 已提交
1734
					}
R
Rich Tibbett 已提交
1735

M
Mr.doob 已提交
1736
				}
R
Rich Tibbett 已提交
1737

M
Mr.doob 已提交
1738
				return group;
R
Rich Tibbett 已提交
1739

M
Mr.doob 已提交
1740
			} );
R
Rich Tibbett 已提交
1741

M
Mr.doob 已提交
1742
		} );
R
Rich Tibbett 已提交
1743

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

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

M
Mr.doob 已提交
1748 1749 1750
		var json = this.json;

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

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

M
Mr.doob 已提交
1754
				var yfov = camera.perspective.yfov;
1755
				var aspectRatio = camera.perspective.aspectRatio !== undefined ? camera.perspective.aspectRatio : 1;
R
Rich Tibbett 已提交
1756

M
Mr.doob 已提交
1757
				// According to COLLADA spec...
1758 1759
				// aspectRatio = xfov / yfov
				var xfov = yfov * aspectRatio;
R
Rich Tibbett 已提交
1760

1761
				var _camera = new THREE.PerspectiveCamera( THREE.Math.radToDeg( xfov ), aspectRatio, camera.perspective.znear || 1, camera.perspective.zfar || 2e6 );
1762
				if ( camera.name !== undefined ) _camera.name = camera.name;
1763 1764

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

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

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

M
Mr.doob 已提交
1770
				var _camera = new THREE.OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, camera.orthographic.znear, camera.orthographic.zfar );
1771
				if ( camera.name !== undefined ) _camera.name = camera.name;
1772 1773

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

M
Mr.doob 已提交
1775
				return _camera;
R
Rich Tibbett 已提交
1776

M
Mr.doob 已提交
1777
			}
R
Rich Tibbett 已提交
1778

M
Mr.doob 已提交
1779
		} );
R
Rich Tibbett 已提交
1780

M
Mr.doob 已提交
1781
	};
R
Rich Tibbett 已提交
1782

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

M
Mr.doob 已提交
1785
		var json = this.json;
R
Rich Tibbett 已提交
1786

M
Mr.doob 已提交
1787
		return this._withDependencies( [
R
Rich Tibbett 已提交
1788

M
Mr.doob 已提交
1789
			"accessors"
R
Rich Tibbett 已提交
1790

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

M
Mr.doob 已提交
1793
			return _each( json.skins, function ( skin ) {
M
Mr.doob 已提交
1794

T
Takahiro 已提交
1795 1796 1797 1798
				var bindShapeMatrix = new THREE.Matrix4();

				if ( skin.bindShapeMatrix !== undefined ) bindShapeMatrix.fromArray( skin.bindShapeMatrix );

M
Mr.doob 已提交
1799
				var _skin = {
T
Takahiro 已提交
1800
					bindShapeMatrix: bindShapeMatrix,
M
Mr.doob 已提交
1801 1802 1803 1804 1805 1806 1807
					jointNames: skin.jointNames,
					inverseBindMatrices: dependencies.accessors[ skin.inverseBindMatrices ]
				};

				return _skin;

			} );
R
Rich Tibbett 已提交
1808

M
Mr.doob 已提交
1809
		} );
R
Rich Tibbett 已提交
1810

M
Mr.doob 已提交
1811 1812
	};

1813
	GLTFParser.prototype.loadAnimations = function () {
R
Rich Tibbett 已提交
1814

M
Mr.doob 已提交
1815
		var json = this.json;
R
Rich Tibbett 已提交
1816

M
Mr.doob 已提交
1817
		return this._withDependencies( [
R
Rich Tibbett 已提交
1818

M
Mr.doob 已提交
1819 1820
			"accessors",
			"nodes"
R
Rich Tibbett 已提交
1821

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

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

D
Don McCurdy 已提交
1826
				var tracks = [];
R
Rich Tibbett 已提交
1827

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

M
Mr.doob 已提交
1830
					var channel = animation.channels[ channelId ];
M
Mr.doob 已提交
1831 1832
					var sampler = animation.samplers[ channel.sampler ];

1833
					if ( sampler ) {
R
Rich Tibbett 已提交
1834 1835 1836

						var target = channel.target;
						var name = target.id;
1837 1838
						var input = animation.parameters !== undefined ? animation.parameters[ sampler.input ] : sampler.input;
						var output = animation.parameters !== undefined ? animation.parameters[ sampler.output ] : sampler.output;
R
Rich Tibbett 已提交
1839 1840 1841 1842 1843 1844 1845 1846

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

						var node = dependencies.nodes[ name ];

						if ( node ) {

D
Don McCurdy 已提交
1847 1848 1849 1850 1851 1852
							node.updateMatrix();
							node.matrixAutoUpdate = true;

							var TypedKeyframeTrack = PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.rotation
								? THREE.QuaternionKeyframeTrack
								: THREE.VectorKeyframeTrack;
1853

1854
							var targetName = node.name ? node.name : node.uuid;
1855
							var interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : THREE.InterpolateLinear;
R
Rich Tibbett 已提交
1856

D
Don McCurdy 已提交
1857 1858 1859 1860
							// 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(
1861
								targetName + '.' + PATH_PROPERTIES[ target.path ],
D
Don McCurdy 已提交
1862 1863
								THREE.AnimationUtils.arraySlice( inputAccessor.array, 0 ),
								THREE.AnimationUtils.arraySlice( outputAccessor.array, 0 ),
1864
								interpolation
D
Don McCurdy 已提交
1865
							) );
R
Rich Tibbett 已提交
1866 1867 1868

						}

M
Mr.doob 已提交
1869
					}
R
Rich Tibbett 已提交
1870

M
Mr.doob 已提交
1871
				}
R
Rich Tibbett 已提交
1872

T
Takahiro 已提交
1873 1874 1875
				var name = animation.name !== undefined ? animation.name : "animation_" + animationId;

				return new THREE.AnimationClip( name, undefined, tracks );
R
Rich Tibbett 已提交
1876

M
Mr.doob 已提交
1877
			} );
R
Rich Tibbett 已提交
1878

M
Mr.doob 已提交
1879
		} );
R
Rich Tibbett 已提交
1880

M
Mr.doob 已提交
1881
	};
R
Rich Tibbett 已提交
1882

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

M
Mr.doob 已提交
1885
		var json = this.json;
1886
		var extensions = this.extensions;
M
Mr.doob 已提交
1887 1888 1889
		var scope = this;

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

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

M
Mr.doob 已提交
1893
			var _node;
R
Rich Tibbett 已提交
1894

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

M
Mr.doob 已提交
1897
				_node = new THREE.Bone();
1898
				_node.name = node.name !== undefined ? node.name : node.jointName;
M
Mr.doob 已提交
1899
				_node.jointName = node.jointName;
R
Rich Tibbett 已提交
1900

M
Mr.doob 已提交
1901
			} else {
R
Rich Tibbett 已提交
1902

M
Mr.doob 已提交
1903
				_node = new THREE.Object3D();
1904
				if ( node.name !== undefined ) _node.name = node.name;
R
Rich Tibbett 已提交
1905

M
Mr.doob 已提交
1906
			}
R
Rich Tibbett 已提交
1907

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

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

M
Mr.doob 已提交
1912 1913
				matrix.fromArray( node.matrix );
				_node.applyMatrix( matrix );
R
Rich Tibbett 已提交
1914

M
Mr.doob 已提交
1915
			} else {
R
Rich Tibbett 已提交
1916

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

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

M
Mr.doob 已提交
1921
				}
R
Rich Tibbett 已提交
1922

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

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

M
Mr.doob 已提交
1927 1928 1929
				}

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

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

M
Mr.doob 已提交
1933
				}
R
Rich Tibbett 已提交
1934 1935 1936

			}

M
Mr.doob 已提交
1937
			return _node;
R
Rich Tibbett 已提交
1938

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

M
Mr.doob 已提交
1941
			return scope._withDependencies( [
R
Rich Tibbett 已提交
1942

M
Mr.doob 已提交
1943 1944
				"meshes",
				"skins",
1945
				"cameras"
R
Rich Tibbett 已提交
1946

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

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

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

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

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

M
Mr.doob 已提交
1957 1958
							var mesh = node.meshes[ meshId ];
							var group = dependencies.meshes[ mesh ];
R
Rich Tibbett 已提交
1959

1960 1961 1962 1963 1964 1965 1966
							if ( group === undefined ) {

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

							}

M
Mr.doob 已提交
1967 1968 1969
							for ( var childrenId in group.children ) {

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

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

M
Mr.doob 已提交
1973 1974
								var originalMaterial = child.material;
								var originalGeometry = child.geometry;
1975
								var originalUserData = child.userData;
A
Al McElrath 已提交
1976
								var originalName = child.name;
R
Rich Tibbett 已提交
1977

M
Mr.doob 已提交
1978
								var material;
R
Rich Tibbett 已提交
1979

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

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

M
Mr.doob 已提交
1984
								} else {
R
Rich Tibbett 已提交
1985

M
Mr.doob 已提交
1986
									material = originalMaterial;
R
Rich Tibbett 已提交
1987

M
Mr.doob 已提交
1988
								}
M
Mr.doob 已提交
1989 1990 1991 1992 1993 1994 1995

								switch ( child.type ) {

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

1996 1997 1998 1999
									case 'LineLoop':
										child = new THREE.LineLoop( originalGeometry, material );
										break;

M
Mr.doob 已提交
2000 2001 2002 2003 2004 2005 2006
									case 'Line':
										child = new THREE.Line( originalGeometry, material );
										break;

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

2007
								}
M
Mr.doob 已提交
2008

M
Mr.doob 已提交
2009
								child.castShadow = true;
2010
								child.userData = originalUserData;
A
Al McElrath 已提交
2011
								child.name = originalName;
R
Rich Tibbett 已提交
2012

M
Mr.doob 已提交
2013
								var skinEntry;
M
Mr.doob 已提交
2014

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

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

M
Mr.doob 已提交
2019
								}
R
Rich Tibbett 已提交
2020

M
Mr.doob 已提交
2021 2022
								// Replace Mesh with SkinnedMesh in library
								if ( skinEntry ) {
R
Rich Tibbett 已提交
2023

2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037
									var getJointNode = function ( jointId ) {

										var keys = Object.keys( __nodes );

										for ( var i = 0, il = keys.length; i < il; i ++ ) {

											var n = __nodes[ keys[ i ] ];

											if ( n.jointName === jointId ) return n;

										}

										return null;

M
Mr.doob 已提交
2038
									};
2039

M
Mr.doob 已提交
2040 2041
									var geometry = originalGeometry;
									var material = originalMaterial;
2042
									material.skinning = true;
R
Rich Tibbett 已提交
2043

M
Mr.doob 已提交
2044 2045
									child = new THREE.SkinnedMesh( geometry, material, false );
									child.castShadow = true;
2046
									child.userData = originalUserData;
A
Al McElrath 已提交
2047
									child.name = originalName;
R
Rich Tibbett 已提交
2048

M
Mr.doob 已提交
2049 2050
									var bones = [];
									var boneInverses = [];
R
Rich Tibbett 已提交
2051

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

M
Mr.doob 已提交
2054
										var jointId = skinEntry.jointNames[ i ];
2055
										var jointNode = getJointNode( jointId );
R
Rich Tibbett 已提交
2056

M
Mr.doob 已提交
2057
										if ( jointNode ) {
R
Rich Tibbett 已提交
2058

M
Mr.doob 已提交
2059
											bones.push( jointNode );
R
Rich Tibbett 已提交
2060

M
Mr.doob 已提交
2061 2062 2063
											var m = skinEntry.inverseBindMatrices.array;
											var mat = new THREE.Matrix4().fromArray( m, i * 16 );
											boneInverses.push( mat );
R
Rich Tibbett 已提交
2064

M
Mr.doob 已提交
2065
										} else {
R
Rich Tibbett 已提交
2066

T
Takahiro 已提交
2067
											console.warn( "WARNING: joint: '" + jointId + "' could not be found" );
R
Rich Tibbett 已提交
2068

M
Mr.doob 已提交
2069
										}
R
Rich Tibbett 已提交
2070

M
Mr.doob 已提交
2071
									}
R
Rich Tibbett 已提交
2072

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

T
Takahiro 已提交
2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095
									var buildBoneGraph = function ( parentJson, parentObject, property ) {

										var children = parentJson[ property ];

										if ( children === undefined ) return;

										for ( var i = 0, il = children.length; i < il; i ++ ) {

											var nodeId = children[ i ];
											var bone = __nodes[ nodeId ];
											var boneJson = json.nodes[ nodeId ];

											if ( bone !== undefined && bone.isBone === true && boneJson !== undefined ) {

												parentObject.add( bone );
												buildBoneGraph( boneJson, bone, 'children' );

											}

										}

M
Mr.doob 已提交
2096
									};
T
Takahiro 已提交
2097 2098 2099

									buildBoneGraph( node, child, 'skeletons' );

M
Mr.doob 已提交
2100
								}
R
Rich Tibbett 已提交
2101

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

M
Mr.doob 已提交
2104
							}
R
Rich Tibbett 已提交
2105

M
Mr.doob 已提交
2106
						}
R
Rich Tibbett 已提交
2107

M
Mr.doob 已提交
2108
					}
R
Rich Tibbett 已提交
2109

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

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

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

M
Mr.doob 已提交
2116
					}
R
Rich Tibbett 已提交
2117

2118 2119 2120
					if ( node.extensions
							 && node.extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ]
							 && node.extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ].light ) {
R
Rich Tibbett 已提交
2121

2122 2123
						var extensionLights = extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ].lights;
						var light = extensionLights[ node.extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ].light ];
R
Rich Tibbett 已提交
2124

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

M
Mr.doob 已提交
2127
					}
R
Rich Tibbett 已提交
2128

M
Mr.doob 已提交
2129
					return _node;
R
Rich Tibbett 已提交
2130

M
Mr.doob 已提交
2131
				} );
R
Rich Tibbett 已提交
2132

M
Mr.doob 已提交
2133
			} );
R
Rich Tibbett 已提交
2134

M
Mr.doob 已提交
2135
		} );
R
Rich Tibbett 已提交
2136

M
Mr.doob 已提交
2137
	};
R
Rich Tibbett 已提交
2138

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

M
Mr.doob 已提交
2141
		var json = this.json;
M
Mr.doob 已提交
2142 2143 2144 2145 2146 2147 2148 2149

		// scene node hierachy builder

		function buildNodeHierachy( nodeId, parentObject, allNodes ) {

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

M
Mr.doob 已提交
2150
			var node = json.nodes[ nodeId ];
M
Mr.doob 已提交
2151 2152 2153

			if ( node.children ) {

M
Mr.doob 已提交
2154 2155 2156
				var children = node.children;

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

M
Mr.doob 已提交
2158
					var child = children[ i ];
M
Mr.doob 已提交
2159 2160
					buildNodeHierachy( child, _node, allNodes );

M
Mr.doob 已提交
2161
				}
M
Mr.doob 已提交
2162 2163

			}
R
Rich Tibbett 已提交
2164 2165 2166

		}

M
Mr.doob 已提交
2167
		return this._withDependencies( [
R
Rich Tibbett 已提交
2168

M
Mr.doob 已提交
2169
			"nodes"
R
Rich Tibbett 已提交
2170

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

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

M
Mr.doob 已提交
2175
				var _scene = new THREE.Scene();
2176
				if ( scene.name !== undefined ) _scene.name = scene.name;
2177 2178

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

T
Takahiro 已提交
2180
				var nodes = scene.nodes || [];
R
Rich Tibbett 已提交
2181

M
Mr.doob 已提交
2182 2183 2184
				for ( var i = 0, l = nodes.length; i < l; i ++ ) {

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

M
Mr.doob 已提交
2187
				}
R
Rich Tibbett 已提交
2188

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

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

2194 2195 2196 2197
						child.gltfShader = new GLTFShader( child, dependencies.nodes );
						child.onBeforeRender = function(renderer, scene, camera){
							this.gltfShader.update(scene, camera);
						};
R
Rich Tibbett 已提交
2198

M
Mr.doob 已提交
2199 2200 2201 2202 2203 2204 2205
					}

				} );

				return _scene;

			} );
R
Rich Tibbett 已提交
2206

M
Mr.doob 已提交
2207 2208 2209
		} );

	};
R
Rich Tibbett 已提交
2210

M
Mr.doob 已提交
2211
	return GLTFLoader;
R
Rich Tibbett 已提交
2212

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