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

665 666
	// Avoid the String.fromCharCode.apply(null, array) shortcut, which
	// throws a "maximum call stack size exceeded" error for large arrays.
M
Mr.doob 已提交
667 668
	function convertUint8ArrayToString( array ) {

669 670
		var s = '';

M
Mr.doob 已提交
671
		for ( var i = 0; i < array.length; i ++ ) {
672 673 674 675 676 677

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

		}

		return s;
M
Mr.doob 已提交
678

679 680
	}

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

M
Mr.doob 已提交
685 686
		// Expected technique attributes
		var attributes = {};
R
Rich Tibbett 已提交
687

M
Mr.doob 已提交
688 689 690
		for ( var attributeId in technique.attributes ) {

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

M
Mr.doob 已提交
692 693 694
			var param = technique.parameters[ pname ];
			var atype = param.type;
			var semantic = param.semantic;
R
Rich Tibbett 已提交
695

M
Mr.doob 已提交
696 697 698 699
			attributes[ attributeId ] = {
				type: atype,
				semantic: semantic
			};
700

M
Mr.doob 已提交
701
		}
702

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

M
Mr.doob 已提交
705 706 707
		var shaderParams = technique.parameters;
		var shaderAttributes = technique.attributes;
		var params = {};
708

M
Mr.doob 已提交
709
		for ( var attributeId in attributes ) {
710

M
Mr.doob 已提交
711 712 713 714
			var pname = shaderAttributes[ attributeId ];
			var shaderParam = shaderParams[ pname ];
			var semantic = shaderParam.semantic;
			if ( semantic ) {
715

M
Mr.doob 已提交
716
				params[ attributeId ] = shaderParam;
717

M
Mr.doob 已提交
718
			}
R
Rich Tibbett 已提交
719

M
Mr.doob 已提交
720
		}
R
Rich Tibbett 已提交
721

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

M
Mr.doob 已提交
724
			var param = params[ pname ];
M
Mr.doob 已提交
725
			var semantic = param.semantic;
R
Rich Tibbett 已提交
726

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

M
Mr.doob 已提交
729
			switch ( semantic ) {
R
Rich Tibbett 已提交
730

M
Mr.doob 已提交
731
				case "POSITION":
R
Rich Tibbett 已提交
732

M
Mr.doob 已提交
733 734
					shaderText = shaderText.replace( regEx, 'position' );
					break;
R
Rich Tibbett 已提交
735

M
Mr.doob 已提交
736
				case "NORMAL":
R
Rich Tibbett 已提交
737

M
Mr.doob 已提交
738 739
					shaderText = shaderText.replace( regEx, 'normal' );
					break;
740

M
Mr.doob 已提交
741 742 743
				case 'TEXCOORD_0':
				case 'TEXCOORD0':
				case 'TEXCOORD':
744

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

748 749 750 751 752 753 754
				case 'COLOR_0':
				case 'COLOR0':
				case 'COLOR':

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

M
Mr.doob 已提交
755
				case "WEIGHT":
756

M
Mr.doob 已提交
757 758
					shaderText = shaderText.replace( regEx, 'skinWeight' );
					break;
759

M
Mr.doob 已提交
760
				case "JOINT":
761

M
Mr.doob 已提交
762 763
					shaderText = shaderText.replace( regEx, 'skinIndex' );
					break;
764

M
Mr.doob 已提交
765
			}
766

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

M
Mr.doob 已提交
769
		return shaderText;
770

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

T
Takahiro 已提交
773 774 775 776 777 778 779 780 781 782 783 784
	function createDefaultMaterial() {

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

M
Mr.doob 已提交
785
	}
T
Takahiro 已提交
786

M
Mr.doob 已提交
787 788
	// Deferred constructor for RawShaderMaterial types
	function DeferredShaderMaterial( params ) {
R
Rich Tibbett 已提交
789

M
Mr.doob 已提交
790
		this.isDeferredShaderMaterial = true;
R
Rich Tibbett 已提交
791

M
Mr.doob 已提交
792
		this.params = params;
793

M
Mr.doob 已提交
794
	}
795

M
Mr.doob 已提交
796
	DeferredShaderMaterial.prototype.create = function () {
797

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

M
Mr.doob 已提交
800 801 802
		for ( var uniformId in this.params.uniforms ) {

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

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

M
Mr.doob 已提交
806 807
				uniforms[ uniformId ].value = originalUniform.value;
				uniforms[ uniformId ].value.needsUpdate = true;
R
Rich Tibbett 已提交
808

M
Mr.doob 已提交
809
			}
R
Rich Tibbett 已提交
810

M
Mr.doob 已提交
811 812
			uniforms[ uniformId ].semantic = originalUniform.semantic;
			uniforms[ uniformId ].node = originalUniform.node;
R
Rich Tibbett 已提交
813

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

M
Mr.doob 已提交
816
		this.params.uniforms = uniforms;
R
Rich Tibbett 已提交
817

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

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

M
Mr.doob 已提交
822
	/* GLTF PARSER */
R
Rich Tibbett 已提交
823

824
	function GLTFParser( json, extensions, options ) {
R
Rich Tibbett 已提交
825

M
Mr.doob 已提交
826
		this.json = json || {};
827
		this.extensions = extensions || {};
M
Mr.doob 已提交
828
		this.options = options || {};
R
Rich Tibbett 已提交
829

M
Mr.doob 已提交
830 831
		// loader object cache
		this.cache = new GLTFRegistry();
R
Rich Tibbett 已提交
832

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

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

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

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

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

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

M
Mr.doob 已提交
846
			if ( cached !== undefined ) {
847

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

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

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

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

M
Mr.doob 已提交
857
			}
R
Rich Tibbett 已提交
858

M
Mr.doob 已提交
859
		}
R
Rich Tibbett 已提交
860

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

M
Mr.doob 已提交
863
			return dependency;
R
Rich Tibbett 已提交
864

M
Mr.doob 已提交
865
		} );
R
Rich Tibbett 已提交
866

M
Mr.doob 已提交
867
	};
R
Rich Tibbett 已提交
868

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

M
Mr.doob 已提交
871 872
		var json = this.json;

M
Mr.doob 已提交
873 874
		// Clear the loader cache
		this.cache.removeAll();
R
Rich Tibbett 已提交
875

M
Mr.doob 已提交
876 877
		// Fire the callback on complete
		this._withDependencies( [
R
Rich Tibbett 已提交
878

M
Mr.doob 已提交
879 880
			"scenes",
			"cameras",
881
			"animations"
R
Rich Tibbett 已提交
882

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

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

T
Takahiro 已提交
887 888 889 890 891 892 893 894
			var scenes = [];

			for ( var name in dependencies.scenes ) {

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

			}

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

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

M
Mr.doob 已提交
899
				var camera = dependencies.cameras[ name ];
M
Mr.doob 已提交
900
				cameras.push( camera );
R
Rich Tibbett 已提交
901

M
Mr.doob 已提交
902
			}
R
Rich Tibbett 已提交
903

904
			var animations = [];
R
Rich Tibbett 已提交
905

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

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

M
Mr.doob 已提交
910
			}
R
Rich Tibbett 已提交
911

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

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

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

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

M
Mr.doob 已提交
920
		var json = this.json;
921
		var extensions = this.extensions;
M
Mr.doob 已提交
922 923
		var options = this.options;

924 925 926 927 928 929 930 931 932 933 934 935 936 937 938
		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 已提交
939

940 941 942
					var loader = new THREE.FileLoader();
					loader.setResponseType( 'text' );
					loader.load( resolveURL( shader.uri, options.path ), function ( shaderText ) {
R
Rich Tibbett 已提交
943

944
						resolve( shaderText );
R
Rich Tibbett 已提交
945

946
					} );
R
Rich Tibbett 已提交
947 948 949

				} );

M
Mr.doob 已提交
950
			} );
R
Rich Tibbett 已提交
951

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

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

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

M
Mr.doob 已提交
958
		var json = this.json;
959
		var extensions = this.extensions;
M
Mr.doob 已提交
960 961
		var options = this.options;

962 963 964 965 966 967 968
		return _each( json.buffers, function ( buffer, name ) {

			if ( name === BINARY_EXTENSION_BUFFER_NAME ) {

				return extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body;

			}
R
Rich Tibbett 已提交
969

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

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

M
Mr.doob 已提交
974
					var loader = new THREE.FileLoader();
975
					loader.setResponseType( 'arraybuffer' );
M
Mr.doob 已提交
976
					loader.load( resolveURL( buffer.uri, options.path ), function ( buffer ) {
R
Rich Tibbett 已提交
977

M
Mr.doob 已提交
978
						resolve( buffer );
R
Rich Tibbett 已提交
979

M
Mr.doob 已提交
980
					} );
R
Rich Tibbett 已提交
981

M
Mr.doob 已提交
982
				} );
R
Rich Tibbett 已提交
983

T
Takahiro 已提交
984 985 986 987
			} else {

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

M
Mr.doob 已提交
988
			}
R
Rich Tibbett 已提交
989

M
Mr.doob 已提交
990
		} );
R
Rich Tibbett 已提交
991

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

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

M
Mr.doob 已提交
996 997
		var json = this.json;

M
Mr.doob 已提交
998
		return this._withDependencies( [
R
Rich Tibbett 已提交
999

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

M
Mr.doob 已提交
1002
		] ).then( function ( dependencies ) {
1003

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

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

1008 1009 1010
				var byteLength = bufferView.byteLength !== undefined ? bufferView.byteLength : 0;

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

M
Mr.doob 已提交
1012
			} );
1013

M
Mr.doob 已提交
1014
		} );
1015

M
Mr.doob 已提交
1016
	};
1017

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

M
Mr.doob 已提交
1020 1021
		var json = this.json;

M
Mr.doob 已提交
1022 1023 1024 1025 1026
		return this._withDependencies( [

			"bufferViews"

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

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

M
Mr.doob 已提交
1030 1031 1032
				var arraybuffer = dependencies.bufferViews[ accessor.bufferView ];
				var itemSize = WEBGL_TYPE_SIZES[ accessor.type ];
				var TypedArray = WEBGL_COMPONENT_TYPES[ accessor.componentType ];
R
Rich Tibbett 已提交
1033

M
Mr.doob 已提交
1034 1035 1036
				// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.
				var elementBytes = TypedArray.BYTES_PER_ELEMENT;
				var itemBytes = elementBytes * itemSize;
R
Rich Tibbett 已提交
1037

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

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

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

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

M
Mr.doob 已提交
1049 1050 1051
				} else {

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

M
Mr.doob 已提交
1053
					return new THREE.BufferAttribute( array, itemSize );
R
Rich Tibbett 已提交
1054 1055 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

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

M
Mr.doob 已提交
1065
		var json = this.json;
1066
		var extensions = this.extensions;
M
Mr.doob 已提交
1067 1068
		var options = this.options;

1069
		return this._withDependencies( [
R
Rich Tibbett 已提交
1070

1071
			"bufferViews"
R
Rich Tibbett 已提交
1072

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

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

1077
				if ( texture.source ) {
R
Rich Tibbett 已提交
1078

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

1081 1082
						var source = json.images[ texture.source ];
						var sourceUri = source.uri;
R
Rich Tibbett 已提交
1083

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

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

1088
						}
R
Rich Tibbett 已提交
1089

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

1092
						if ( textureLoader === null ) {
R
Rich Tibbett 已提交
1093

1094
							textureLoader = new THREE.TextureLoader();
R
Rich Tibbett 已提交
1095

M
Mr.doob 已提交
1096 1097
						}

1098 1099 1100 1101 1102 1103
						textureLoader.setCrossOrigin( options.crossOrigin );

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

							_texture.flipY = false;

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

T
Takahiro 已提交
1106 1107 1108 1109 1110
							_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. ' +
1111
															'internalFormat will be forced to be the same value as format.' );
T
Takahiro 已提交
1112 1113 1114

							}

1115
							_texture.type = texture.type !== undefined ? WEBGL_TEXTURE_DATATYPES[ texture.type ] : THREE.UnsignedByteType;
1116

1117 1118 1119 1120
							if ( texture.sampler ) {

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

1121 1122 1123 1124
								_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;
1125 1126 1127 1128 1129 1130

							}

							resolve( _texture );

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

1132
							resolve();
1133

1134
						} );
1135 1136

					} );
R
Rich Tibbett 已提交
1137

1138
				}
R
Rich Tibbett 已提交
1139

1140
			} );
R
Rich Tibbett 已提交
1141

M
Mr.doob 已提交
1142
		} );
R
Rich Tibbett 已提交
1143

M
Mr.doob 已提交
1144
	};
R
Rich Tibbett 已提交
1145

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

M
Mr.doob 已提交
1148 1149
		var json = this.json;

M
Mr.doob 已提交
1150
		return this._withDependencies( [
R
Rich Tibbett 已提交
1151

M
Mr.doob 已提交
1152 1153
			"shaders",
			"textures"
R
Rich Tibbett 已提交
1154

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

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

M
Mr.doob 已提交
1159 1160 1161
				var materialType;
				var materialValues = {};
				var materialParams = {};
R
Rich Tibbett 已提交
1162

M
Mr.doob 已提交
1163
				var khr_material;
R
Rich Tibbett 已提交
1164

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

1167
					khr_material = material.extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ];
R
Rich Tibbett 已提交
1168 1169 1170

				}

M
Mr.doob 已提交
1171
				if ( khr_material ) {
R
Rich Tibbett 已提交
1172

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

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

M
Mr.doob 已提交
1178 1179 1180
						case 'BLINN' :
						case 'PHONG' :
							materialType = THREE.MeshPhongMaterial;
T
Takahiro 已提交
1181
							keys.push( 'diffuse', 'specular', 'shininess' );
M
Mr.doob 已提交
1182
							break;
R
Rich Tibbett 已提交
1183

M
Mr.doob 已提交
1184 1185
						case 'LAMBERT' :
							materialType = THREE.MeshLambertMaterial;
T
Takahiro 已提交
1186
							keys.push( 'diffuse' );
M
Mr.doob 已提交
1187
							break;
R
Rich Tibbett 已提交
1188

M
Mr.doob 已提交
1189 1190 1191 1192
						case 'CONSTANT' :
						default :
							materialType = THREE.MeshBasicMaterial;
							break;
R
Rich Tibbett 已提交
1193

M
Mr.doob 已提交
1194
					}
R
Rich Tibbett 已提交
1195

T
Takahiro 已提交
1196 1197 1198 1199 1200
					keys.forEach( function( v ) {

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

					} );
R
Rich Tibbett 已提交
1201

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

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

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

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

M
Mr.doob 已提交
1210 1211
						materialParams.transparent = true;
						materialParams.opacity = ( materialValues.transparency !== undefined ) ? materialValues.transparency : 1;
R
Rich Tibbett 已提交
1212 1213 1214

					}

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

M
Mr.doob 已提交
1217
					materialType = THREE.MeshPhongMaterial;
R
Rich Tibbett 已提交
1218

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

M
Mr.doob 已提交
1221
				} else {
R
Rich Tibbett 已提交
1222

M
Mr.doob 已提交
1223
					materialType = DeferredShaderMaterial;
R
Rich Tibbett 已提交
1224

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

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

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

M
Mr.doob 已提交
1231
					if ( program ) {
R
Rich Tibbett 已提交
1232

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

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

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

M
Mr.doob 已提交
1240
						}
R
Rich Tibbett 已提交
1241

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

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

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

M
Mr.doob 已提交
1249
						}
R
Rich Tibbett 已提交
1250

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

M
Mr.doob 已提交
1254
						var uniforms = technique.uniforms;
R
Rich Tibbett 已提交
1255

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

M
Mr.doob 已提交
1258
							var pname = uniforms[ uniformId ];
M
Mr.doob 已提交
1259
							var shaderParam = technique.parameters[ pname ];
R
Rich Tibbett 已提交
1260

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

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

M
Mr.doob 已提交
1265
								var pcount = shaderParam.count;
1266 1267 1268
								var value;

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

M
Mr.doob 已提交
1270 1271 1272
								var uvalue = new WEBGL_TYPE[ ptype ]();
								var usemantic = shaderParam.semantic;
								var unode = shaderParam.node;
R
Rich Tibbett 已提交
1273

M
Mr.doob 已提交
1274
								switch ( ptype ) {
R
Rich Tibbett 已提交
1275

M
Mr.doob 已提交
1276
									case WEBGL_CONSTANTS.FLOAT:
R
Rich Tibbett 已提交
1277

M
Mr.doob 已提交
1278
										uvalue = shaderParam.value;
R
Rich Tibbett 已提交
1279

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

M
Mr.doob 已提交
1282
											materialParams.transparent = true;
R
Rich Tibbett 已提交
1283

M
Mr.doob 已提交
1284
										}
R
Rich Tibbett 已提交
1285

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

M
Mr.doob 已提交
1288
											uvalue = value;
R
Rich Tibbett 已提交
1289

M
Mr.doob 已提交
1290
										}
R
Rich Tibbett 已提交
1291

M
Mr.doob 已提交
1292
										break;
R
Rich Tibbett 已提交
1293

M
Mr.doob 已提交
1294 1295 1296 1297
									case WEBGL_CONSTANTS.FLOAT_VEC2:
									case WEBGL_CONSTANTS.FLOAT_VEC3:
									case WEBGL_CONSTANTS.FLOAT_VEC4:
									case WEBGL_CONSTANTS.FLOAT_MAT3:
R
Rich Tibbett 已提交
1298 1299 1300

										if ( shaderParam && shaderParam.value ) {

M
Mr.doob 已提交
1301
											uvalue.fromArray( shaderParam.value );
R
Rich Tibbett 已提交
1302 1303 1304 1305 1306 1307 1308 1309 1310

										}

										if ( value ) {

											uvalue.fromArray( value );

										}

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

M
Mr.doob 已提交
1313
									case WEBGL_CONSTANTS.FLOAT_MAT2:
R
Rich Tibbett 已提交
1314

M
Mr.doob 已提交
1315 1316 1317
										// what to do?
										console.warn( "FLOAT_MAT2 is not a supported uniform type" );
										break;
R
Rich Tibbett 已提交
1318

M
Mr.doob 已提交
1319
									case WEBGL_CONSTANTS.FLOAT_MAT4:
R
Rich Tibbett 已提交
1320

M
Mr.doob 已提交
1321
										if ( pcount ) {
R
Rich Tibbett 已提交
1322

M
Mr.doob 已提交
1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343
											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 已提交
1344
										} else {
M
Mr.doob 已提交
1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357

											if ( shaderParam && shaderParam.value ) {

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

											}

											if ( value ) {

												uvalue.fromArray( value );

											}
R
Rich Tibbett 已提交
1358 1359 1360

										}

M
Mr.doob 已提交
1361
										break;
R
Rich Tibbett 已提交
1362

M
Mr.doob 已提交
1363
									case WEBGL_CONSTANTS.SAMPLER_2D:
R
Rich Tibbett 已提交
1364

1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377
										if ( value !== undefined ) {

											uvalue = dependencies.textures[ value ];

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

											uvalue = dependencies.textures[ shaderParam.value ];

										} else {

											uvalue = null;

										}
R
Rich Tibbett 已提交
1378

M
Mr.doob 已提交
1379
										break;
R
Rich Tibbett 已提交
1380

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

M
Mr.doob 已提交
1383 1384 1385 1386 1387
								materialParams.uniforms[ uniformId ] = {
									value: uvalue,
									semantic: usemantic,
									node: unode
								};
R
Rich Tibbett 已提交
1388

M
Mr.doob 已提交
1389
							} else {
R
Rich Tibbett 已提交
1390

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

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

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

1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408
						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 已提交
1409
							switch ( STATES_ENABLES[ enable ] ) {
1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 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

								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;
1456
						materialParams.depthWrite = functions.depthMask !== undefined ? functions.depthMask[ 0 ] : true;
1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492

						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 已提交
1493
					}
R
Rich Tibbett 已提交
1494 1495 1496

				}

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

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

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

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

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

M
Mr.doob 已提交
1507
				delete materialParams.diffuse;
R
Rich Tibbett 已提交
1508

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

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

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

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

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

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

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

1523 1524 1525 1526 1527 1528 1529 1530 1531
					if ( materialType === THREE.MeshBasicMaterial ) {

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

					} else {

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

					}
R
Rich Tibbett 已提交
1532

1533 1534
				} else if ( typeof( materialValues.emission ) === 'string' ) {

1535
					if ( materialType === THREE.MeshBasicMaterial ) {
1536

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

1539 1540 1541 1542 1543 1544 1545
					} else {

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

					}

				}
1546

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

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

1551 1552 1553 1554
				} else if ( typeof( materialValues.specular ) === 'string' ) {

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

1555
				}
1556

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

M
Mr.doob 已提交
1559
					materialParams.shininess = materialValues.shininess;
R
Rich Tibbett 已提交
1560

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

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

M
Mr.doob 已提交
1566
				return _material;
R
Rich Tibbett 已提交
1567

M
Mr.doob 已提交
1568
			} );
R
Rich Tibbett 已提交
1569

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

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

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

M
Mr.doob 已提交
1576 1577
		var json = this.json;

M
Mr.doob 已提交
1578
		return this._withDependencies( [
R
Rich Tibbett 已提交
1579

M
Mr.doob 已提交
1580 1581
			"accessors",
			"materials"
R
Rich Tibbett 已提交
1582

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

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

1587
				var group = new THREE.Group();
1588
				if ( mesh.name !== undefined ) group.name = mesh.name;
1589 1590

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

1592
				var primitives = mesh.primitives || [];
R
Rich Tibbett 已提交
1593

M
Mr.doob 已提交
1594 1595 1596
				for ( var name in primitives ) {

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

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

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

M
Mr.doob 已提交
1602
						var attributes = primitive.attributes;
R
Rich Tibbett 已提交
1603

M
Mr.doob 已提交
1604 1605 1606
						for ( var attributeId in attributes ) {

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

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

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

M
Mr.doob 已提交
1612
							switch ( attributeId ) {
R
Rich Tibbett 已提交
1613

M
Mr.doob 已提交
1614 1615 1616
								case 'POSITION':
									geometry.addAttribute( 'position', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1617

M
Mr.doob 已提交
1618 1619 1620
								case 'NORMAL':
									geometry.addAttribute( 'normal', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1621

M
Mr.doob 已提交
1622 1623 1624 1625 1626
								case 'TEXCOORD_0':
								case 'TEXCOORD0':
								case 'TEXCOORD':
									geometry.addAttribute( 'uv', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1627

1628 1629 1630 1631 1632
								case 'COLOR_0':
								case 'COLOR0':
								case 'COLOR':
									geometry.addAttribute( 'color', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1633

M
Mr.doob 已提交
1634 1635 1636
								case 'WEIGHT':
									geometry.addAttribute( 'skinWeight', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1637

M
Mr.doob 已提交
1638 1639 1640
								case 'JOINT':
									geometry.addAttribute( 'skinIndex', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1641

M
Mr.doob 已提交
1642
							}
R
Rich Tibbett 已提交
1643

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

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

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

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

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

M
Mr.doob 已提交
1654 1655
						var meshNode = new THREE.Mesh( geometry, material );
						meshNode.castShadow = true;
A
Al McElrath 已提交
1656
						meshNode.name = ( name === "0" ? group.name : group.name + name );
M
Mr.doob 已提交
1657

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

1660 1661
						group.add( meshNode );

M
Mr.doob 已提交
1662
					} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {
1663 1664 1665 1666 1667

						var geometry = new THREE.BufferGeometry();

						var attributes = primitive.attributes;

1668 1669 1670
						for ( var attributeId in attributes ) {

							var attributeEntry = attributes[ attributeId ];
1671

M
Mr.doob 已提交
1672
							if ( ! attributeEntry ) return;
1673 1674 1675 1676 1677 1678 1679 1680

							var bufferAttribute = dependencies.accessors[ attributeEntry ];

							switch ( attributeId ) {

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

1682 1683
								case 'COLOR_0':
								case 'COLOR0':
1684
								case 'COLOR':
M
Mr.doob 已提交
1685 1686 1687
									geometry.addAttribute( 'color', bufferAttribute );
									break;

1688
							}
M
Mr.doob 已提交
1689 1690

						}
M
Mr.doob 已提交
1691 1692 1693 1694

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

						var meshNode;
1695 1696 1697

						if ( primitive.indices ) {

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

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

M
Mr.doob 已提交
1702
						} else {
1703

M
Mr.doob 已提交
1704
							meshNode = new THREE.Line( geometry, material );
1705 1706 1707

						}

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

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

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

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

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

M
Mr.doob 已提交
1718
					}
R
Rich Tibbett 已提交
1719

M
Mr.doob 已提交
1720
				}
R
Rich Tibbett 已提交
1721

M
Mr.doob 已提交
1722
				return group;
R
Rich Tibbett 已提交
1723

M
Mr.doob 已提交
1724
			} );
R
Rich Tibbett 已提交
1725

M
Mr.doob 已提交
1726
		} );
R
Rich Tibbett 已提交
1727

M
Mr.doob 已提交
1728
	};
R
Rich Tibbett 已提交
1729

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

M
Mr.doob 已提交
1732 1733 1734
		var json = this.json;

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

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

M
Mr.doob 已提交
1738
				var yfov = camera.perspective.yfov;
1739
				var aspectRatio = camera.perspective.aspectRatio !== undefined ? camera.perspective.aspectRatio : 1;
R
Rich Tibbett 已提交
1740

M
Mr.doob 已提交
1741
				// According to COLLADA spec...
1742 1743
				// aspectRatio = xfov / yfov
				var xfov = yfov * aspectRatio;
R
Rich Tibbett 已提交
1744

1745
				var _camera = new THREE.PerspectiveCamera( THREE.Math.radToDeg( xfov ), aspectRatio, camera.perspective.znear || 1, camera.perspective.zfar || 2e6 );
1746
				if ( camera.name !== undefined ) _camera.name = camera.name;
1747 1748

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

M
Mr.doob 已提交
1750
				return _camera;
R
Rich Tibbett 已提交
1751

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

M
Mr.doob 已提交
1754
				var _camera = new THREE.OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, camera.orthographic.znear, camera.orthographic.zfar );
1755
				if ( camera.name !== undefined ) _camera.name = camera.name;
1756 1757

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

M
Mr.doob 已提交
1759
				return _camera;
R
Rich Tibbett 已提交
1760

M
Mr.doob 已提交
1761
			}
R
Rich Tibbett 已提交
1762

M
Mr.doob 已提交
1763
		} );
R
Rich Tibbett 已提交
1764

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

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

M
Mr.doob 已提交
1769
		var json = this.json;
R
Rich Tibbett 已提交
1770

M
Mr.doob 已提交
1771
		return this._withDependencies( [
R
Rich Tibbett 已提交
1772

M
Mr.doob 已提交
1773
			"accessors"
R
Rich Tibbett 已提交
1774

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

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

T
Takahiro 已提交
1779 1780 1781 1782
				var bindShapeMatrix = new THREE.Matrix4();

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

M
Mr.doob 已提交
1783
				var _skin = {
T
Takahiro 已提交
1784
					bindShapeMatrix: bindShapeMatrix,
M
Mr.doob 已提交
1785 1786 1787 1788 1789 1790 1791
					jointNames: skin.jointNames,
					inverseBindMatrices: dependencies.accessors[ skin.inverseBindMatrices ]
				};

				return _skin;

			} );
R
Rich Tibbett 已提交
1792

M
Mr.doob 已提交
1793
		} );
R
Rich Tibbett 已提交
1794

M
Mr.doob 已提交
1795 1796
	};

1797
	GLTFParser.prototype.loadAnimations = function () {
R
Rich Tibbett 已提交
1798

M
Mr.doob 已提交
1799
		var json = this.json;
R
Rich Tibbett 已提交
1800

M
Mr.doob 已提交
1801
		return this._withDependencies( [
R
Rich Tibbett 已提交
1802

M
Mr.doob 已提交
1803 1804
			"accessors",
			"nodes"
R
Rich Tibbett 已提交
1805

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

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

D
Don McCurdy 已提交
1810
				var tracks = [];
R
Rich Tibbett 已提交
1811

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

M
Mr.doob 已提交
1814
					var channel = animation.channels[ channelId ];
M
Mr.doob 已提交
1815 1816
					var sampler = animation.samplers[ channel.sampler ];

1817
					if ( sampler ) {
R
Rich Tibbett 已提交
1818 1819 1820

						var target = channel.target;
						var name = target.id;
1821 1822
						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 已提交
1823 1824 1825 1826 1827 1828 1829 1830

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

						var node = dependencies.nodes[ name ];

						if ( node ) {

D
Don McCurdy 已提交
1831 1832 1833 1834 1835 1836
							node.updateMatrix();
							node.matrixAutoUpdate = true;

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

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

D
Don McCurdy 已提交
1841 1842 1843 1844
							// 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(
1845
								targetName + '.' + PATH_PROPERTIES[ target.path ],
D
Don McCurdy 已提交
1846 1847
								THREE.AnimationUtils.arraySlice( inputAccessor.array, 0 ),
								THREE.AnimationUtils.arraySlice( outputAccessor.array, 0 ),
1848
								interpolation
D
Don McCurdy 已提交
1849
							) );
R
Rich Tibbett 已提交
1850 1851 1852

						}

M
Mr.doob 已提交
1853
					}
R
Rich Tibbett 已提交
1854

M
Mr.doob 已提交
1855
				}
R
Rich Tibbett 已提交
1856

T
Takahiro 已提交
1857 1858 1859
				var name = animation.name !== undefined ? animation.name : "animation_" + animationId;

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

M
Mr.doob 已提交
1861
			} );
R
Rich Tibbett 已提交
1862

M
Mr.doob 已提交
1863
		} );
R
Rich Tibbett 已提交
1864

M
Mr.doob 已提交
1865
	};
R
Rich Tibbett 已提交
1866

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

M
Mr.doob 已提交
1869
		var json = this.json;
1870
		var extensions = this.extensions;
M
Mr.doob 已提交
1871 1872 1873
		var scope = this;

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

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

M
Mr.doob 已提交
1877
			var _node;
R
Rich Tibbett 已提交
1878

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

M
Mr.doob 已提交
1881
				_node = new THREE.Bone();
1882
				_node.name = node.name !== undefined ? node.name : node.jointName;
M
Mr.doob 已提交
1883
				_node.jointName = node.jointName;
R
Rich Tibbett 已提交
1884

M
Mr.doob 已提交
1885
			} else {
R
Rich Tibbett 已提交
1886

M
Mr.doob 已提交
1887
				_node = new THREE.Object3D();
1888
				if ( node.name !== undefined ) _node.name = node.name;
R
Rich Tibbett 已提交
1889

M
Mr.doob 已提交
1890
			}
R
Rich Tibbett 已提交
1891

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

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

M
Mr.doob 已提交
1896 1897
				matrix.fromArray( node.matrix );
				_node.applyMatrix( matrix );
R
Rich Tibbett 已提交
1898

M
Mr.doob 已提交
1899
			} else {
R
Rich Tibbett 已提交
1900

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

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

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

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

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

M
Mr.doob 已提交
1911 1912 1913
				}

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

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

M
Mr.doob 已提交
1917
				}
R
Rich Tibbett 已提交
1918 1919 1920

			}

M
Mr.doob 已提交
1921
			return _node;
R
Rich Tibbett 已提交
1922

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

M
Mr.doob 已提交
1925
			return scope._withDependencies( [
R
Rich Tibbett 已提交
1926

M
Mr.doob 已提交
1927 1928
				"meshes",
				"skins",
1929
				"cameras"
R
Rich Tibbett 已提交
1930

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

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

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

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

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

M
Mr.doob 已提交
1941 1942
							var mesh = node.meshes[ meshId ];
							var group = dependencies.meshes[ mesh ];
R
Rich Tibbett 已提交
1943

1944 1945 1946 1947 1948 1949 1950
							if ( group === undefined ) {

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

							}

M
Mr.doob 已提交
1951 1952 1953
							for ( var childrenId in group.children ) {

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

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

M
Mr.doob 已提交
1957 1958
								var originalMaterial = child.material;
								var originalGeometry = child.geometry;
1959
								var originalUserData = child.userData;
A
Al McElrath 已提交
1960
								var originalName = child.name;
R
Rich Tibbett 已提交
1961

M
Mr.doob 已提交
1962
								var material;
R
Rich Tibbett 已提交
1963

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

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

M
Mr.doob 已提交
1968
								} else {
R
Rich Tibbett 已提交
1969

M
Mr.doob 已提交
1970
									material = originalMaterial;
R
Rich Tibbett 已提交
1971

M
Mr.doob 已提交
1972
								}
M
Mr.doob 已提交
1973 1974 1975 1976 1977 1978 1979

								switch ( child.type ) {

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

1980 1981 1982 1983
									case 'LineLoop':
										child = new THREE.LineLoop( originalGeometry, material );
										break;

M
Mr.doob 已提交
1984 1985 1986 1987 1988 1989 1990
									case 'Line':
										child = new THREE.Line( originalGeometry, material );
										break;

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

1991
								}
M
Mr.doob 已提交
1992

M
Mr.doob 已提交
1993
								child.castShadow = true;
1994
								child.userData = originalUserData;
A
Al McElrath 已提交
1995
								child.name = originalName;
R
Rich Tibbett 已提交
1996

M
Mr.doob 已提交
1997
								var skinEntry;
M
Mr.doob 已提交
1998

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

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

M
Mr.doob 已提交
2003
								}
R
Rich Tibbett 已提交
2004

M
Mr.doob 已提交
2005 2006
								// Replace Mesh with SkinnedMesh in library
								if ( skinEntry ) {
R
Rich Tibbett 已提交
2007

2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021
									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 已提交
2022
									};
2023

M
Mr.doob 已提交
2024 2025
									var geometry = originalGeometry;
									var material = originalMaterial;
2026
									material.skinning = true;
R
Rich Tibbett 已提交
2027

M
Mr.doob 已提交
2028 2029
									child = new THREE.SkinnedMesh( geometry, material, false );
									child.castShadow = true;
2030
									child.userData = originalUserData;
A
Al McElrath 已提交
2031
									child.name = originalName;
R
Rich Tibbett 已提交
2032

M
Mr.doob 已提交
2033 2034
									var bones = [];
									var boneInverses = [];
R
Rich Tibbett 已提交
2035

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

M
Mr.doob 已提交
2038
										var jointId = skinEntry.jointNames[ i ];
2039
										var jointNode = getJointNode( jointId );
R
Rich Tibbett 已提交
2040

M
Mr.doob 已提交
2041
										if ( jointNode ) {
R
Rich Tibbett 已提交
2042

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

M
Mr.doob 已提交
2045 2046 2047
											var m = skinEntry.inverseBindMatrices.array;
											var mat = new THREE.Matrix4().fromArray( m, i * 16 );
											boneInverses.push( mat );
R
Rich Tibbett 已提交
2048

M
Mr.doob 已提交
2049
										} else {
R
Rich Tibbett 已提交
2050

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

M
Mr.doob 已提交
2053
										}
R
Rich Tibbett 已提交
2054

M
Mr.doob 已提交
2055
									}
R
Rich Tibbett 已提交
2056

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

T
Takahiro 已提交
2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079
									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 已提交
2080
									};
T
Takahiro 已提交
2081 2082 2083

									buildBoneGraph( node, child, 'skeletons' );

M
Mr.doob 已提交
2084
								}
R
Rich Tibbett 已提交
2085

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

M
Mr.doob 已提交
2088
							}
R
Rich Tibbett 已提交
2089

M
Mr.doob 已提交
2090
						}
R
Rich Tibbett 已提交
2091

M
Mr.doob 已提交
2092
					}
R
Rich Tibbett 已提交
2093

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

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

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

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

2102 2103 2104
					if ( node.extensions
							 && node.extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ]
							 && node.extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ].light ) {
R
Rich Tibbett 已提交
2105

2106 2107
						var extensionLights = extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ].lights;
						var light = extensionLights[ node.extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ].light ];
R
Rich Tibbett 已提交
2108

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

M
Mr.doob 已提交
2111
					}
R
Rich Tibbett 已提交
2112

M
Mr.doob 已提交
2113
					return _node;
R
Rich Tibbett 已提交
2114

M
Mr.doob 已提交
2115
				} );
R
Rich Tibbett 已提交
2116

M
Mr.doob 已提交
2117
			} );
R
Rich Tibbett 已提交
2118

M
Mr.doob 已提交
2119
		} );
R
Rich Tibbett 已提交
2120

M
Mr.doob 已提交
2121
	};
R
Rich Tibbett 已提交
2122

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

M
Mr.doob 已提交
2125
		var json = this.json;
M
Mr.doob 已提交
2126 2127 2128 2129 2130 2131 2132 2133

		// scene node hierachy builder

		function buildNodeHierachy( nodeId, parentObject, allNodes ) {

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

M
Mr.doob 已提交
2134
			var node = json.nodes[ nodeId ];
M
Mr.doob 已提交
2135 2136 2137

			if ( node.children ) {

M
Mr.doob 已提交
2138 2139 2140
				var children = node.children;

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

M
Mr.doob 已提交
2142
					var child = children[ i ];
M
Mr.doob 已提交
2143 2144
					buildNodeHierachy( child, _node, allNodes );

M
Mr.doob 已提交
2145
				}
M
Mr.doob 已提交
2146 2147

			}
R
Rich Tibbett 已提交
2148 2149 2150

		}

M
Mr.doob 已提交
2151
		return this._withDependencies( [
R
Rich Tibbett 已提交
2152

M
Mr.doob 已提交
2153
			"nodes"
R
Rich Tibbett 已提交
2154

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

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

M
Mr.doob 已提交
2159
				var _scene = new THREE.Scene();
2160
				if ( scene.name !== undefined ) _scene.name = scene.name;
2161 2162

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

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

M
Mr.doob 已提交
2166 2167 2168
				for ( var i = 0, l = nodes.length; i < l; i ++ ) {

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

M
Mr.doob 已提交
2171
				}
R
Rich Tibbett 已提交
2172

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

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

2178 2179 2180 2181
						child.gltfShader = new GLTFShader( child, dependencies.nodes );
						child.onBeforeRender = function(renderer, scene, camera){
							this.gltfShader.update(scene, camera);
						};
R
Rich Tibbett 已提交
2182

M
Mr.doob 已提交
2183 2184 2185 2186 2187 2188 2189
					}

				} );

				return _scene;

			} );
R
Rich Tibbett 已提交
2190

M
Mr.doob 已提交
2191 2192 2193
		} );

	};
R
Rich Tibbett 已提交
2194

M
Mr.doob 已提交
2195
	return GLTFLoader;
R
Rich Tibbett 已提交
2196

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