GLTFLoader.js 46.8 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
				case 'TEXCOORD_1':

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

753 754 755 756 757 758 759
				case 'COLOR_0':
				case 'COLOR0':
				case 'COLOR':

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

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

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

M
Mr.doob 已提交
765
				case "JOINT":
766

M
Mr.doob 已提交
767 768
					shaderText = shaderText.replace( regEx, 'skinIndex' );
					break;
769

M
Mr.doob 已提交
770
			}
771

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

M
Mr.doob 已提交
774
		return shaderText;
775

M
Mr.doob 已提交
776
	}
R
Rich Tibbett 已提交
777

T
Takahiro 已提交
778 779 780 781 782 783 784 785 786 787 788 789
	function createDefaultMaterial() {

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

M
Mr.doob 已提交
790
	}
T
Takahiro 已提交
791

M
Mr.doob 已提交
792 793
	// Deferred constructor for RawShaderMaterial types
	function DeferredShaderMaterial( params ) {
R
Rich Tibbett 已提交
794

M
Mr.doob 已提交
795
		this.isDeferredShaderMaterial = true;
R
Rich Tibbett 已提交
796

M
Mr.doob 已提交
797
		this.params = params;
798

M
Mr.doob 已提交
799
	}
800

M
Mr.doob 已提交
801
	DeferredShaderMaterial.prototype.create = function () {
802

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

M
Mr.doob 已提交
805 806 807
		for ( var uniformId in this.params.uniforms ) {

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

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

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

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

M
Mr.doob 已提交
816 817
			uniforms[ uniformId ].semantic = originalUniform.semantic;
			uniforms[ uniformId ].node = originalUniform.node;
R
Rich Tibbett 已提交
818

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

M
Mr.doob 已提交
821
		this.params.uniforms = uniforms;
R
Rich Tibbett 已提交
822

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

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

M
Mr.doob 已提交
827
	/* GLTF PARSER */
R
Rich Tibbett 已提交
828

829
	function GLTFParser( json, extensions, options ) {
R
Rich Tibbett 已提交
830

M
Mr.doob 已提交
831
		this.json = json || {};
832
		this.extensions = extensions || {};
M
Mr.doob 已提交
833
		this.options = options || {};
R
Rich Tibbett 已提交
834

M
Mr.doob 已提交
835 836
		// loader object cache
		this.cache = new GLTFRegistry();
R
Rich Tibbett 已提交
837

M
Mr.doob 已提交
838
	}
R
Rich Tibbett 已提交
839

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

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

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

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

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

M
Mr.doob 已提交
851
			if ( cached !== undefined ) {
852

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

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

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

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

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

M
Mr.doob 已提交
864
		}
R
Rich Tibbett 已提交
865

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

M
Mr.doob 已提交
868
			return dependency;
R
Rich Tibbett 已提交
869

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

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

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

M
Mr.doob 已提交
876 877
		var json = this.json;

M
Mr.doob 已提交
878 879
		// Clear the loader cache
		this.cache.removeAll();
R
Rich Tibbett 已提交
880

M
Mr.doob 已提交
881 882
		// Fire the callback on complete
		this._withDependencies( [
R
Rich Tibbett 已提交
883

M
Mr.doob 已提交
884 885
			"scenes",
			"cameras",
886
			"animations"
R
Rich Tibbett 已提交
887

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

T
Takahiro 已提交
890 891 892 893 894 895 896 897
			var scenes = [];

			for ( var name in dependencies.scenes ) {

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

			}

898 899
			var scene = json.scene !== undefined ? dependencies.scenes[ json.scene ] : scenes[ 0 ];

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

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

M
Mr.doob 已提交
904
				var camera = dependencies.cameras[ name ];
M
Mr.doob 已提交
905
				cameras.push( camera );
R
Rich Tibbett 已提交
906

M
Mr.doob 已提交
907
			}
R
Rich Tibbett 已提交
908

909
			var animations = [];
R
Rich Tibbett 已提交
910

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

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

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

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

M
Mr.doob 已提交
919
		} );
R
Rich Tibbett 已提交
920

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

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

M
Mr.doob 已提交
925
		var json = this.json;
926
		var extensions = this.extensions;
M
Mr.doob 已提交
927 928
		var options = this.options;

929 930 931 932 933 934 935 936 937 938 939 940 941 942 943
		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 已提交
944

945 946 947
					var loader = new THREE.FileLoader();
					loader.setResponseType( 'text' );
					loader.load( resolveURL( shader.uri, options.path ), function ( shaderText ) {
R
Rich Tibbett 已提交
948

949
						resolve( shaderText );
R
Rich Tibbett 已提交
950

951
					} );
R
Rich Tibbett 已提交
952 953 954

				} );

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

M
Mr.doob 已提交
957
		} );
R
Rich Tibbett 已提交
958

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

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

M
Mr.doob 已提交
963
		var json = this.json;
964
		var extensions = this.extensions;
M
Mr.doob 已提交
965 966
		var options = this.options;

967 968 969 970 971 972 973
		return _each( json.buffers, function ( buffer, name ) {

			if ( name === BINARY_EXTENSION_BUFFER_NAME ) {

				return extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body;

			}
R
Rich Tibbett 已提交
974

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

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

M
Mr.doob 已提交
979
					var loader = new THREE.FileLoader();
980
					loader.setResponseType( 'arraybuffer' );
M
Mr.doob 已提交
981
					loader.load( resolveURL( buffer.uri, options.path ), function ( buffer ) {
R
Rich Tibbett 已提交
982

M
Mr.doob 已提交
983
						resolve( buffer );
R
Rich Tibbett 已提交
984

M
Mr.doob 已提交
985
					} );
R
Rich Tibbett 已提交
986

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

T
Takahiro 已提交
989 990 991 992
			} else {

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

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

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

M
Mr.doob 已提交
997
	};
R
Rich Tibbett 已提交
998

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

M
Mr.doob 已提交
1001 1002
		var json = this.json;

M
Mr.doob 已提交
1003
		return this._withDependencies( [
R
Rich Tibbett 已提交
1004

M
Mr.doob 已提交
1005
			"buffers"
R
Rich Tibbett 已提交
1006

M
Mr.doob 已提交
1007
		] ).then( function ( dependencies ) {
1008

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

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

1013 1014 1015
				var byteLength = bufferView.byteLength !== undefined ? bufferView.byteLength : 0;

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

M
Mr.doob 已提交
1017
			} );
1018

M
Mr.doob 已提交
1019
		} );
1020

M
Mr.doob 已提交
1021
	};
1022

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

M
Mr.doob 已提交
1025 1026
		var json = this.json;

M
Mr.doob 已提交
1027 1028 1029 1030 1031
		return this._withDependencies( [

			"bufferViews"

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

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

M
Mr.doob 已提交
1035 1036 1037
				var arraybuffer = dependencies.bufferViews[ accessor.bufferView ];
				var itemSize = WEBGL_TYPE_SIZES[ accessor.type ];
				var TypedArray = WEBGL_COMPONENT_TYPES[ accessor.componentType ];
R
Rich Tibbett 已提交
1038

M
Mr.doob 已提交
1039 1040 1041
				// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.
				var elementBytes = TypedArray.BYTES_PER_ELEMENT;
				var itemBytes = elementBytes * itemSize;
R
Rich Tibbett 已提交
1042

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

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

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

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

M
Mr.doob 已提交
1054 1055 1056
				} else {

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

M
Mr.doob 已提交
1058
					return new THREE.BufferAttribute( array, itemSize );
R
Rich Tibbett 已提交
1059 1060 1061

				}

M
Mr.doob 已提交
1062
			} );
R
Rich Tibbett 已提交
1063

M
Mr.doob 已提交
1064
		} );
R
Rich Tibbett 已提交
1065

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

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

M
Mr.doob 已提交
1070
		var json = this.json;
1071
		var extensions = this.extensions;
M
Mr.doob 已提交
1072 1073
		var options = this.options;

1074
		return this._withDependencies( [
R
Rich Tibbett 已提交
1075

1076
			"bufferViews"
R
Rich Tibbett 已提交
1077

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

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

1082
				if ( texture.source ) {
R
Rich Tibbett 已提交
1083

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

1086 1087
						var source = json.images[ texture.source ];
						var sourceUri = source.uri;
R
Rich Tibbett 已提交
1088

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

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

1093
						}
R
Rich Tibbett 已提交
1094

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

1097
						if ( textureLoader === null ) {
R
Rich Tibbett 已提交
1098

1099
							textureLoader = new THREE.TextureLoader();
R
Rich Tibbett 已提交
1100

M
Mr.doob 已提交
1101 1102
						}

1103 1104 1105 1106 1107 1108
						textureLoader.setCrossOrigin( options.crossOrigin );

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

							_texture.flipY = false;

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

T
Takahiro 已提交
1111 1112 1113 1114 1115
							_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. ' +
1116
															'internalFormat will be forced to be the same value as format.' );
T
Takahiro 已提交
1117 1118 1119

							}

1120
							_texture.type = texture.type !== undefined ? WEBGL_TEXTURE_DATATYPES[ texture.type ] : THREE.UnsignedByteType;
1121

1122 1123 1124 1125
							if ( texture.sampler ) {

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

1126 1127 1128 1129
								_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;
1130 1131 1132 1133 1134 1135

							}

							resolve( _texture );

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

1137
							resolve();
1138

1139
						} );
1140 1141

					} );
R
Rich Tibbett 已提交
1142

1143
				}
R
Rich Tibbett 已提交
1144

1145
			} );
R
Rich Tibbett 已提交
1146

M
Mr.doob 已提交
1147
		} );
R
Rich Tibbett 已提交
1148

M
Mr.doob 已提交
1149
	};
R
Rich Tibbett 已提交
1150

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

M
Mr.doob 已提交
1153 1154
		var json = this.json;

M
Mr.doob 已提交
1155
		return this._withDependencies( [
R
Rich Tibbett 已提交
1156

M
Mr.doob 已提交
1157 1158
			"shaders",
			"textures"
R
Rich Tibbett 已提交
1159

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

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

M
Mr.doob 已提交
1164 1165 1166
				var materialType;
				var materialValues = {};
				var materialParams = {};
R
Rich Tibbett 已提交
1167

M
Mr.doob 已提交
1168
				var khr_material;
R
Rich Tibbett 已提交
1169

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

1172
					khr_material = material.extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ];
R
Rich Tibbett 已提交
1173 1174 1175

				}

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

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

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

M
Mr.doob 已提交
1183 1184 1185
						case 'BLINN' :
						case 'PHONG' :
							materialType = THREE.MeshPhongMaterial;
T
Takahiro 已提交
1186
							keys.push( 'diffuse', 'specular', 'shininess' );
M
Mr.doob 已提交
1187
							break;
R
Rich Tibbett 已提交
1188

M
Mr.doob 已提交
1189 1190
						case 'LAMBERT' :
							materialType = THREE.MeshLambertMaterial;
T
Takahiro 已提交
1191
							keys.push( 'diffuse' );
M
Mr.doob 已提交
1192
							break;
R
Rich Tibbett 已提交
1193

M
Mr.doob 已提交
1194 1195 1196 1197
						case 'CONSTANT' :
						default :
							materialType = THREE.MeshBasicMaterial;
							break;
R
Rich Tibbett 已提交
1198

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

T
Takahiro 已提交
1201 1202 1203 1204 1205
					keys.forEach( function( v ) {

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

					} );
R
Rich Tibbett 已提交
1206

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

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

M
Mr.doob 已提交
1211
					}
R
Rich Tibbett 已提交
1212

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

M
Mr.doob 已提交
1215 1216
						materialParams.transparent = true;
						materialParams.opacity = ( materialValues.transparency !== undefined ) ? materialValues.transparency : 1;
R
Rich Tibbett 已提交
1217 1218 1219

					}

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

M
Mr.doob 已提交
1222
					materialType = THREE.MeshPhongMaterial;
R
Rich Tibbett 已提交
1223

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

M
Mr.doob 已提交
1226
				} else {
R
Rich Tibbett 已提交
1227

M
Mr.doob 已提交
1228
					materialType = DeferredShaderMaterial;
R
Rich Tibbett 已提交
1229

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

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

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

M
Mr.doob 已提交
1236
					if ( program ) {
R
Rich Tibbett 已提交
1237

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

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

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

M
Mr.doob 已提交
1245
						}
R
Rich Tibbett 已提交
1246

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

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

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

M
Mr.doob 已提交
1254
						}
R
Rich Tibbett 已提交
1255

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

M
Mr.doob 已提交
1259
						var uniforms = technique.uniforms;
R
Rich Tibbett 已提交
1260

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

M
Mr.doob 已提交
1263
							var pname = uniforms[ uniformId ];
M
Mr.doob 已提交
1264
							var shaderParam = technique.parameters[ pname ];
R
Rich Tibbett 已提交
1265

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

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

M
Mr.doob 已提交
1270
								var pcount = shaderParam.count;
1271 1272 1273
								var value;

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

M
Mr.doob 已提交
1275 1276 1277
								var uvalue = new WEBGL_TYPE[ ptype ]();
								var usemantic = shaderParam.semantic;
								var unode = shaderParam.node;
R
Rich Tibbett 已提交
1278

M
Mr.doob 已提交
1279
								switch ( ptype ) {
R
Rich Tibbett 已提交
1280

M
Mr.doob 已提交
1281
									case WEBGL_CONSTANTS.FLOAT:
R
Rich Tibbett 已提交
1282

M
Mr.doob 已提交
1283
										uvalue = shaderParam.value;
R
Rich Tibbett 已提交
1284

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

M
Mr.doob 已提交
1287
											materialParams.transparent = true;
R
Rich Tibbett 已提交
1288

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

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

M
Mr.doob 已提交
1293
											uvalue = value;
R
Rich Tibbett 已提交
1294

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

M
Mr.doob 已提交
1297
										break;
R
Rich Tibbett 已提交
1298

M
Mr.doob 已提交
1299 1300 1301 1302
									case WEBGL_CONSTANTS.FLOAT_VEC2:
									case WEBGL_CONSTANTS.FLOAT_VEC3:
									case WEBGL_CONSTANTS.FLOAT_VEC4:
									case WEBGL_CONSTANTS.FLOAT_MAT3:
R
Rich Tibbett 已提交
1303 1304 1305

										if ( shaderParam && shaderParam.value ) {

M
Mr.doob 已提交
1306
											uvalue.fromArray( shaderParam.value );
R
Rich Tibbett 已提交
1307 1308 1309 1310 1311 1312 1313 1314 1315

										}

										if ( value ) {

											uvalue.fromArray( value );

										}

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

M
Mr.doob 已提交
1318
									case WEBGL_CONSTANTS.FLOAT_MAT2:
R
Rich Tibbett 已提交
1319

M
Mr.doob 已提交
1320 1321 1322
										// what to do?
										console.warn( "FLOAT_MAT2 is not a supported uniform type" );
										break;
R
Rich Tibbett 已提交
1323

M
Mr.doob 已提交
1324
									case WEBGL_CONSTANTS.FLOAT_MAT4:
R
Rich Tibbett 已提交
1325

M
Mr.doob 已提交
1326
										if ( pcount ) {
R
Rich Tibbett 已提交
1327

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

											if ( shaderParam && shaderParam.value ) {

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

											}

											if ( value ) {

												uvalue.fromArray( value );

											}
R
Rich Tibbett 已提交
1363 1364 1365

										}

M
Mr.doob 已提交
1366
										break;
R
Rich Tibbett 已提交
1367

M
Mr.doob 已提交
1368
									case WEBGL_CONSTANTS.SAMPLER_2D:
R
Rich Tibbett 已提交
1369

1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382
										if ( value !== undefined ) {

											uvalue = dependencies.textures[ value ];

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

											uvalue = dependencies.textures[ shaderParam.value ];

										} else {

											uvalue = null;

										}
R
Rich Tibbett 已提交
1383

M
Mr.doob 已提交
1384
										break;
R
Rich Tibbett 已提交
1385

M
Mr.doob 已提交
1386
								}
R
Rich Tibbett 已提交
1387

M
Mr.doob 已提交
1388 1389 1390 1391 1392
								materialParams.uniforms[ uniformId ] = {
									value: uvalue,
									semantic: usemantic,
									node: unode
								};
R
Rich Tibbett 已提交
1393

M
Mr.doob 已提交
1394
							} else {
R
Rich Tibbett 已提交
1395

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

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

M
Mr.doob 已提交
1400
						}
R
Rich Tibbett 已提交
1401

1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413
						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 已提交
1414
							switch ( STATES_ENABLES[ enable ] ) {
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 1456 1457 1458 1459 1460

								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;
1461
						materialParams.depthWrite = functions.depthMask !== undefined ? functions.depthMask[ 0 ] : true;
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 1493 1494 1495 1496 1497

						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 已提交
1498
					}
R
Rich Tibbett 已提交
1499 1500 1501

				}

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

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

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

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

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

M
Mr.doob 已提交
1512
				delete materialParams.diffuse;
R
Rich Tibbett 已提交
1513

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

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

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

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

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

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

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

1528 1529 1530 1531 1532 1533 1534 1535 1536
					if ( materialType === THREE.MeshBasicMaterial ) {

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

					} else {

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

					}
R
Rich Tibbett 已提交
1537

1538 1539
				} else if ( typeof( materialValues.emission ) === 'string' ) {

1540
					if ( materialType === THREE.MeshBasicMaterial ) {
1541

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

1544 1545 1546 1547 1548 1549 1550
					} else {

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

					}

				}
1551

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

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

1556 1557 1558 1559
				} else if ( typeof( materialValues.specular ) === 'string' ) {

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

1560
				}
1561

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

M
Mr.doob 已提交
1564
					materialParams.shininess = materialValues.shininess;
R
Rich Tibbett 已提交
1565

M
Mr.doob 已提交
1566
				}
R
Rich Tibbett 已提交
1567

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

M
Mr.doob 已提交
1571
				return _material;
R
Rich Tibbett 已提交
1572

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

M
Mr.doob 已提交
1575
		} );
R
Rich Tibbett 已提交
1576

M
Mr.doob 已提交
1577
	};
R
Rich Tibbett 已提交
1578

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

M
Mr.doob 已提交
1581 1582
		var json = this.json;

M
Mr.doob 已提交
1583
		return this._withDependencies( [
R
Rich Tibbett 已提交
1584

M
Mr.doob 已提交
1585 1586
			"accessors",
			"materials"
R
Rich Tibbett 已提交
1587

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

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

1592
				var group = new THREE.Group();
1593
				if ( mesh.name !== undefined ) group.name = mesh.name;
1594 1595

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

1597
				var primitives = mesh.primitives || [];
R
Rich Tibbett 已提交
1598

M
Mr.doob 已提交
1599 1600 1601
				for ( var name in primitives ) {

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

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

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

M
Mr.doob 已提交
1607
						var attributes = primitive.attributes;
R
Rich Tibbett 已提交
1608

M
Mr.doob 已提交
1609 1610 1611
						for ( var attributeId in attributes ) {

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

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

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

M
Mr.doob 已提交
1617
							switch ( attributeId ) {
R
Rich Tibbett 已提交
1618

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

M
Mr.doob 已提交
1623 1624 1625
								case 'NORMAL':
									geometry.addAttribute( 'normal', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1626

M
Mr.doob 已提交
1627 1628 1629 1630 1631
								case 'TEXCOORD_0':
								case 'TEXCOORD0':
								case 'TEXCOORD':
									geometry.addAttribute( 'uv', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1632

S
Steven Vergenz 已提交
1633 1634 1635 1636
								case 'TEXCOORD_1':
									geometry.addAttribute( 'uv2', bufferAttribute );
									break;

1637 1638 1639 1640 1641
								case 'COLOR_0':
								case 'COLOR0':
								case 'COLOR':
									geometry.addAttribute( 'color', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1642

M
Mr.doob 已提交
1643 1644 1645
								case 'WEIGHT':
									geometry.addAttribute( 'skinWeight', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1646

M
Mr.doob 已提交
1647 1648 1649
								case 'JOINT':
									geometry.addAttribute( 'skinIndex', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1650

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

M
Mr.doob 已提交
1653
						}
R
Rich Tibbett 已提交
1654

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

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

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

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

M
Mr.doob 已提交
1663 1664
						var meshNode = new THREE.Mesh( geometry, material );
						meshNode.castShadow = true;
A
Al McElrath 已提交
1665
						meshNode.name = ( name === "0" ? group.name : group.name + name );
M
Mr.doob 已提交
1666

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

1669 1670
						group.add( meshNode );

M
Mr.doob 已提交
1671
					} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {
1672 1673 1674 1675 1676

						var geometry = new THREE.BufferGeometry();

						var attributes = primitive.attributes;

1677 1678 1679
						for ( var attributeId in attributes ) {

							var attributeEntry = attributes[ attributeId ];
1680

M
Mr.doob 已提交
1681
							if ( ! attributeEntry ) return;
1682 1683 1684 1685 1686 1687 1688 1689

							var bufferAttribute = dependencies.accessors[ attributeEntry ];

							switch ( attributeId ) {

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

1691 1692
								case 'COLOR_0':
								case 'COLOR0':
1693
								case 'COLOR':
M
Mr.doob 已提交
1694 1695 1696
									geometry.addAttribute( 'color', bufferAttribute );
									break;

1697
							}
M
Mr.doob 已提交
1698 1699

						}
M
Mr.doob 已提交
1700 1701 1702 1703

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

						var meshNode;
1704 1705 1706

						if ( primitive.indices ) {

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

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

M
Mr.doob 已提交
1711
						} else {
1712

M
Mr.doob 已提交
1713
							meshNode = new THREE.Line( geometry, material );
1714 1715 1716

						}

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

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

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

M
Mr.doob 已提交
1723
					} else {
R
Rich Tibbett 已提交
1724

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

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

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

M
Mr.doob 已提交
1731
				return group;
R
Rich Tibbett 已提交
1732

M
Mr.doob 已提交
1733
			} );
R
Rich Tibbett 已提交
1734

M
Mr.doob 已提交
1735
		} );
R
Rich Tibbett 已提交
1736

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

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

M
Mr.doob 已提交
1741 1742 1743
		var json = this.json;

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

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

M
Mr.doob 已提交
1747
				var yfov = camera.perspective.yfov;
1748
				var aspectRatio = camera.perspective.aspectRatio !== undefined ? camera.perspective.aspectRatio : 1;
R
Rich Tibbett 已提交
1749

M
Mr.doob 已提交
1750
				// According to COLLADA spec...
1751 1752
				// aspectRatio = xfov / yfov
				var xfov = yfov * aspectRatio;
R
Rich Tibbett 已提交
1753

1754
				var _camera = new THREE.PerspectiveCamera( THREE.Math.radToDeg( xfov ), aspectRatio, camera.perspective.znear || 1, camera.perspective.zfar || 2e6 );
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
			} else if ( camera.type == "orthographic" && camera.orthographic ) {
R
Rich Tibbett 已提交
1762

M
Mr.doob 已提交
1763
				var _camera = new THREE.OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, camera.orthographic.znear, camera.orthographic.zfar );
1764
				if ( camera.name !== undefined ) _camera.name = camera.name;
1765 1766

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

M
Mr.doob 已提交
1768
				return _camera;
R
Rich Tibbett 已提交
1769

M
Mr.doob 已提交
1770
			}
R
Rich Tibbett 已提交
1771

M
Mr.doob 已提交
1772
		} );
R
Rich Tibbett 已提交
1773

M
Mr.doob 已提交
1774
	};
R
Rich Tibbett 已提交
1775

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

M
Mr.doob 已提交
1778
		var json = this.json;
R
Rich Tibbett 已提交
1779

M
Mr.doob 已提交
1780
		return this._withDependencies( [
R
Rich Tibbett 已提交
1781

M
Mr.doob 已提交
1782
			"accessors"
R
Rich Tibbett 已提交
1783

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

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

T
Takahiro 已提交
1788 1789 1790 1791
				var bindShapeMatrix = new THREE.Matrix4();

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

M
Mr.doob 已提交
1792
				var _skin = {
T
Takahiro 已提交
1793
					bindShapeMatrix: bindShapeMatrix,
M
Mr.doob 已提交
1794 1795 1796 1797 1798 1799 1800
					jointNames: skin.jointNames,
					inverseBindMatrices: dependencies.accessors[ skin.inverseBindMatrices ]
				};

				return _skin;

			} );
R
Rich Tibbett 已提交
1801

M
Mr.doob 已提交
1802
		} );
R
Rich Tibbett 已提交
1803

M
Mr.doob 已提交
1804 1805
	};

1806
	GLTFParser.prototype.loadAnimations = function () {
R
Rich Tibbett 已提交
1807

M
Mr.doob 已提交
1808
		var json = this.json;
R
Rich Tibbett 已提交
1809

M
Mr.doob 已提交
1810
		return this._withDependencies( [
R
Rich Tibbett 已提交
1811

M
Mr.doob 已提交
1812 1813
			"accessors",
			"nodes"
R
Rich Tibbett 已提交
1814

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

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

D
Don McCurdy 已提交
1819
				var tracks = [];
R
Rich Tibbett 已提交
1820

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

M
Mr.doob 已提交
1823
					var channel = animation.channels[ channelId ];
M
Mr.doob 已提交
1824 1825
					var sampler = animation.samplers[ channel.sampler ];

1826
					if ( sampler ) {
R
Rich Tibbett 已提交
1827 1828 1829

						var target = channel.target;
						var name = target.id;
1830 1831
						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 已提交
1832 1833 1834 1835 1836 1837 1838 1839

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

						var node = dependencies.nodes[ name ];

						if ( node ) {

D
Don McCurdy 已提交
1840 1841 1842 1843 1844 1845
							node.updateMatrix();
							node.matrixAutoUpdate = true;

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

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

D
Don McCurdy 已提交
1850 1851 1852 1853
							// 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(
1854
								targetName + '.' + PATH_PROPERTIES[ target.path ],
D
Don McCurdy 已提交
1855 1856
								THREE.AnimationUtils.arraySlice( inputAccessor.array, 0 ),
								THREE.AnimationUtils.arraySlice( outputAccessor.array, 0 ),
1857
								interpolation
D
Don McCurdy 已提交
1858
							) );
R
Rich Tibbett 已提交
1859 1860 1861

						}

M
Mr.doob 已提交
1862
					}
R
Rich Tibbett 已提交
1863

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

T
Takahiro 已提交
1866 1867 1868
				var name = animation.name !== undefined ? animation.name : "animation_" + animationId;

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

M
Mr.doob 已提交
1870
			} );
R
Rich Tibbett 已提交
1871

M
Mr.doob 已提交
1872
		} );
R
Rich Tibbett 已提交
1873

M
Mr.doob 已提交
1874
	};
R
Rich Tibbett 已提交
1875

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

M
Mr.doob 已提交
1878
		var json = this.json;
1879
		var extensions = this.extensions;
M
Mr.doob 已提交
1880 1881 1882
		var scope = this;

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

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

M
Mr.doob 已提交
1886
			var _node;
R
Rich Tibbett 已提交
1887

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

M
Mr.doob 已提交
1890
				_node = new THREE.Bone();
1891
				_node.name = node.name !== undefined ? node.name : node.jointName;
M
Mr.doob 已提交
1892
				_node.jointName = node.jointName;
R
Rich Tibbett 已提交
1893

M
Mr.doob 已提交
1894
			} else {
R
Rich Tibbett 已提交
1895

M
Mr.doob 已提交
1896
				_node = new THREE.Object3D();
1897
				if ( node.name !== undefined ) _node.name = node.name;
R
Rich Tibbett 已提交
1898

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

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

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

M
Mr.doob 已提交
1905 1906
				matrix.fromArray( node.matrix );
				_node.applyMatrix( matrix );
R
Rich Tibbett 已提交
1907

M
Mr.doob 已提交
1908
			} else {
R
Rich Tibbett 已提交
1909

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

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

M
Mr.doob 已提交
1914
				}
R
Rich Tibbett 已提交
1915

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

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

M
Mr.doob 已提交
1920 1921 1922
				}

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

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

M
Mr.doob 已提交
1926
				}
R
Rich Tibbett 已提交
1927 1928 1929

			}

M
Mr.doob 已提交
1930
			return _node;
R
Rich Tibbett 已提交
1931

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

M
Mr.doob 已提交
1934
			return scope._withDependencies( [
R
Rich Tibbett 已提交
1935

M
Mr.doob 已提交
1936 1937
				"meshes",
				"skins",
1938
				"cameras"
R
Rich Tibbett 已提交
1939

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

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

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

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

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

M
Mr.doob 已提交
1950 1951
							var mesh = node.meshes[ meshId ];
							var group = dependencies.meshes[ mesh ];
R
Rich Tibbett 已提交
1952

1953 1954 1955 1956 1957 1958 1959
							if ( group === undefined ) {

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

							}

M
Mr.doob 已提交
1960 1961 1962
							for ( var childrenId in group.children ) {

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

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

M
Mr.doob 已提交
1966 1967
								var originalMaterial = child.material;
								var originalGeometry = child.geometry;
1968
								var originalUserData = child.userData;
A
Al McElrath 已提交
1969
								var originalName = child.name;
R
Rich Tibbett 已提交
1970

M
Mr.doob 已提交
1971
								var material;
R
Rich Tibbett 已提交
1972

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

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

M
Mr.doob 已提交
1977
								} else {
R
Rich Tibbett 已提交
1978

M
Mr.doob 已提交
1979
									material = originalMaterial;
R
Rich Tibbett 已提交
1980

M
Mr.doob 已提交
1981
								}
M
Mr.doob 已提交
1982 1983 1984 1985 1986 1987 1988

								switch ( child.type ) {

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

1989 1990 1991 1992
									case 'LineLoop':
										child = new THREE.LineLoop( originalGeometry, material );
										break;

M
Mr.doob 已提交
1993 1994 1995 1996 1997 1998 1999
									case 'Line':
										child = new THREE.Line( originalGeometry, material );
										break;

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

2000
								}
M
Mr.doob 已提交
2001

M
Mr.doob 已提交
2002
								child.castShadow = true;
2003
								child.userData = originalUserData;
A
Al McElrath 已提交
2004
								child.name = originalName;
R
Rich Tibbett 已提交
2005

M
Mr.doob 已提交
2006
								var skinEntry;
M
Mr.doob 已提交
2007

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

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

M
Mr.doob 已提交
2012
								}
R
Rich Tibbett 已提交
2013

M
Mr.doob 已提交
2014 2015
								// Replace Mesh with SkinnedMesh in library
								if ( skinEntry ) {
R
Rich Tibbett 已提交
2016

2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030
									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 已提交
2031
									};
2032

M
Mr.doob 已提交
2033 2034
									var geometry = originalGeometry;
									var material = originalMaterial;
2035
									material.skinning = true;
R
Rich Tibbett 已提交
2036

M
Mr.doob 已提交
2037 2038
									child = new THREE.SkinnedMesh( geometry, material, false );
									child.castShadow = true;
2039
									child.userData = originalUserData;
A
Al McElrath 已提交
2040
									child.name = originalName;
R
Rich Tibbett 已提交
2041

M
Mr.doob 已提交
2042 2043
									var bones = [];
									var boneInverses = [];
R
Rich Tibbett 已提交
2044

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

M
Mr.doob 已提交
2047
										var jointId = skinEntry.jointNames[ i ];
2048
										var jointNode = getJointNode( jointId );
R
Rich Tibbett 已提交
2049

M
Mr.doob 已提交
2050
										if ( jointNode ) {
R
Rich Tibbett 已提交
2051

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

M
Mr.doob 已提交
2054 2055 2056
											var m = skinEntry.inverseBindMatrices.array;
											var mat = new THREE.Matrix4().fromArray( m, i * 16 );
											boneInverses.push( mat );
R
Rich Tibbett 已提交
2057

M
Mr.doob 已提交
2058
										} else {
R
Rich Tibbett 已提交
2059

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

M
Mr.doob 已提交
2062
										}
R
Rich Tibbett 已提交
2063

M
Mr.doob 已提交
2064
									}
R
Rich Tibbett 已提交
2065

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

T
Takahiro 已提交
2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088
									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 已提交
2089
									};
T
Takahiro 已提交
2090 2091 2092

									buildBoneGraph( node, child, 'skeletons' );

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

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

M
Mr.doob 已提交
2097
							}
R
Rich Tibbett 已提交
2098

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

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

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

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

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

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

2111 2112 2113
					if ( node.extensions
							 && node.extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ]
							 && node.extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ].light ) {
R
Rich Tibbett 已提交
2114

2115 2116
						var extensionLights = extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ].lights;
						var light = extensionLights[ node.extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ].light ];
R
Rich Tibbett 已提交
2117

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

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

M
Mr.doob 已提交
2122
					return _node;
R
Rich Tibbett 已提交
2123

M
Mr.doob 已提交
2124
				} );
R
Rich Tibbett 已提交
2125

M
Mr.doob 已提交
2126
			} );
R
Rich Tibbett 已提交
2127

M
Mr.doob 已提交
2128
		} );
R
Rich Tibbett 已提交
2129

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

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

M
Mr.doob 已提交
2134
		var json = this.json;
M
Mr.doob 已提交
2135 2136 2137 2138 2139 2140 2141 2142

		// scene node hierachy builder

		function buildNodeHierachy( nodeId, parentObject, allNodes ) {

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

M
Mr.doob 已提交
2143
			var node = json.nodes[ nodeId ];
M
Mr.doob 已提交
2144 2145 2146

			if ( node.children ) {

M
Mr.doob 已提交
2147 2148 2149
				var children = node.children;

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

M
Mr.doob 已提交
2151
					var child = children[ i ];
M
Mr.doob 已提交
2152 2153
					buildNodeHierachy( child, _node, allNodes );

M
Mr.doob 已提交
2154
				}
M
Mr.doob 已提交
2155 2156

			}
R
Rich Tibbett 已提交
2157 2158 2159

		}

M
Mr.doob 已提交
2160
		return this._withDependencies( [
R
Rich Tibbett 已提交
2161

M
Mr.doob 已提交
2162
			"nodes"
R
Rich Tibbett 已提交
2163

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

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

M
Mr.doob 已提交
2168
				var _scene = new THREE.Scene();
2169
				if ( scene.name !== undefined ) _scene.name = scene.name;
2170 2171

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

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

M
Mr.doob 已提交
2175 2176 2177
				for ( var i = 0, l = nodes.length; i < l; i ++ ) {

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

M
Mr.doob 已提交
2180
				}
R
Rich Tibbett 已提交
2181

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

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

2187 2188 2189 2190
						child.gltfShader = new GLTFShader( child, dependencies.nodes );
						child.onBeforeRender = function(renderer, scene, camera){
							this.gltfShader.update(scene, camera);
						};
R
Rich Tibbett 已提交
2191

M
Mr.doob 已提交
2192 2193 2194 2195 2196 2197 2198
					}

				} );

				return _scene;

			} );
R
Rich Tibbett 已提交
2199

M
Mr.doob 已提交
2200 2201 2202
		} );

	};
R
Rich Tibbett 已提交
2203

M
Mr.doob 已提交
2204
	return GLTFLoader;
R
Rich Tibbett 已提交
2205

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