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

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

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

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

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

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

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

20 21
		crossOrigin: 'Anonymous',

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

M
Mr.doob 已提交
24
			var scope = this;
25

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

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

30 31 32 33
			loader.setResponseType( 'arraybuffer' );

			loader.load( url, function ( data ) {

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

M
Mr.doob 已提交
36
			}, onProgress, onError );
37

M
Mr.doob 已提交
38
		},
39

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

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

M
Mr.doob 已提交
44
		},
45

M
Mr.doob 已提交
46
		setPath: function ( value ) {
47

M
Mr.doob 已提交
48
			this.path = value;
49

M
Mr.doob 已提交
50
		},
51

52 53
		parse: function ( data, callback, path ) {

M
Mr.doob 已提交
54
			var content;
55 56 57 58 59 60 61
			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 已提交
62
				content = extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content;
63 64 65

			} else {

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

			}

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

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

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

			}
77

M
Mr.doob 已提交
78
			console.time( 'GLTFLoader' );
79

80
			var parser = new GLTFParser( json, extensions, {
81

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

M
Mr.doob 已提交
85
			} );
86

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

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

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

M
Mr.doob 已提交
98
				callback( glTF );
R
Rich Tibbett 已提交
99

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

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

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

M
Mr.doob 已提交
106
	/* GLTFREGISTRY */
R
Rich Tibbett 已提交
107

M
Mr.doob 已提交
108
	function GLTFRegistry() {
109

M
Mr.doob 已提交
110
		var objects = {};
111

M
Mr.doob 已提交
112
		return	{
R
Rich Tibbett 已提交
113

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

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

M
Mr.doob 已提交
118
			},
R
Rich Tibbett 已提交
119

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

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

M
Mr.doob 已提交
124
			},
R
Rich Tibbett 已提交
125

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

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

M
Mr.doob 已提交
130
			},
R
Rich Tibbett 已提交
131

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

M
Mr.doob 已提交
134
				objects = {};
R
Rich Tibbett 已提交
135

M
Mr.doob 已提交
136
			},
R
Rich Tibbett 已提交
137

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

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

					var object = objects[ name ];
143

M
Mr.doob 已提交
144
					if ( object.update ) {
145

M
Mr.doob 已提交
146
						object.update( scene, camera );
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
	}
157

M
Mr.doob 已提交
158
	/* GLTFSHADERS */
159

160 161 162 163 164 165 166 167 168
	GLTFLoader.Shaders = {

		update: function () {

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

		}

	};
M
Mr.doob 已提交
169 170 171 172

	/* GLTFSHADER */

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

M
Mr.doob 已提交
174
		var boundUniforms = {};
M
Mr.doob 已提交
175 176

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

		var uniforms = targetNode.material.uniforms;

		for ( var uniformId in uniforms ) {

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

M
Mr.doob 已提交
184
			if ( uniform.semantic ) {
185

M
Mr.doob 已提交
186
				var sourceNodeRef = uniform.node;
187

M
Mr.doob 已提交
188
				var sourceNode = targetNode;
189

M
Mr.doob 已提交
190
				if ( sourceNodeRef ) {
191

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

M
Mr.doob 已提交
194
				}
R
Rich Tibbett 已提交
195

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

			}
204

M
Mr.doob 已提交
205
		}
206

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

M
Mr.doob 已提交
210
	}
211

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

M
Mr.doob 已提交
215 216 217 218 219
		var boundUniforms = this.boundUniforms;

		for ( var name in boundUniforms ) {

			var boundUniform = boundUniforms[ name ];
220

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

M
Mr.doob 已提交
223
				case "MODELVIEW":
R
Rich Tibbett 已提交
224

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

M
Mr.doob 已提交
229
				case "MODELVIEWINVERSETRANSPOSE":
R
Rich Tibbett 已提交
230

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

M
Mr.doob 已提交
236
				case "PROJECTION":
237

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

M
Mr.doob 已提交
242
				case "JOINTMATRIX":
R
Rich Tibbett 已提交
243

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

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

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

M
Mr.doob 已提交
258
					}
259

M
Mr.doob 已提交
260 261 262
					break;

				default :
263

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

			}

M
Mr.doob 已提交
269
		}
M
Mr.doob 已提交
270 271

	};
272 273


274
	/* ANIMATION */
275

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

		update: function () {

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

		}

	};

286 287 288 289 290 291 292 293 294 295 296
	/*********************************/
	/********** EXTENSIONS ***********/
	/*********************************/

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

	/* MATERIALS COMMON EXTENSION */

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

		this.name = EXTENSIONS.KHR_MATERIALS_COMMON;

		this.lights = {};

A
Al McElrath 已提交
303 304
		var extension = ( json.extensions && json.extensions[ EXTENSIONS.KHR_MATERIALS_COMMON ] ) || {};
		var lights = extension.lights || {};
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 352 353

		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 已提交
354
	function GLTFBinaryExtension( data ) {
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 405 406

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

		VERTEX_SHADER: 35633,
		FRAGMENT_SHADER: 35632
	};
432

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

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

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

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

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

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 523 524
	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 已提交
525 526 527 528 529 530 531 532 533 534
	var WEBGL_TYPE_SIZES = {
		'SCALAR': 1,
		'VEC2': 2,
		'VEC3': 3,
		'VEC4': 4,
		'MAT2': 4,
		'MAT3': 9,
		'MAT4': 16
	};

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

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

546 547 548 549 550 551 552 553 554
	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 已提交
555 556 557 558 559 560
	/* UTILITY FUNCTIONS */

	function _each( object, callback, thisObj ) {

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

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

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

M
Mr.doob 已提交
568
			results = [];
R
Rich Tibbett 已提交
569

M
Mr.doob 已提交
570
			var length = object.length;
T
Takahiro 已提交
571

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

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

R
Rich Tibbett 已提交
576
				if ( value ) {
T
Takahiro 已提交
577

R
Rich Tibbett 已提交
578
					fns.push( value );
T
Takahiro 已提交
579

R
Rich Tibbett 已提交
580
					if ( value instanceof Promise ) {
T
Takahiro 已提交
581

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

584
							results[ key ] = value;
T
Takahiro 已提交
585

586
						}.bind( this, idx ));
T
Takahiro 已提交
587

R
Rich Tibbett 已提交
588
					} else {
T
Takahiro 已提交
589

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

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

R
Rich Tibbett 已提交
594
				}
T
Takahiro 已提交
595

596
			}
R
Rich Tibbett 已提交
597

M
Mr.doob 已提交
598
		} else {
R
Rich Tibbett 已提交
599

M
Mr.doob 已提交
600 601 602
			results = {};

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

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

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

M
Mr.doob 已提交
608
					if ( value ) {
T
Takahiro 已提交
609

M
Mr.doob 已提交
610
						fns.push( value );
T
Takahiro 已提交
611

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

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

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

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

M
Mr.doob 已提交
620
						} else {
T
Takahiro 已提交
621

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

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

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

M
Mr.doob 已提交
628
				}
T
Takahiro 已提交
629

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

M
Mr.doob 已提交
632
		}
R
Rich Tibbett 已提交
633

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

M
Mr.doob 已提交
636
			return results;
T
Takahiro 已提交
637

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

	}

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

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

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

M
Mr.doob 已提交
651
			return url;
R
Rich Tibbett 已提交
652

M
Mr.doob 已提交
653
		}
R
Rich Tibbett 已提交
654

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

M
Mr.doob 已提交
658
			return url;
R
Rich Tibbett 已提交
659

M
Mr.doob 已提交
660
		}
R
Rich Tibbett 已提交
661

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

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

M
Mr.doob 已提交
667 668
	function convertUint8ArrayToString( array ) {

669 670
		if ( window.TextDecoder !== undefined ) {

671
			return new TextDecoder().decode( array );
672 673 674 675 676 677

		}

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

678 679
		var s = '';

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

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

		}

		return s;
M
Mr.doob 已提交
687

688 689
	}

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

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

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

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

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

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

M
Mr.doob 已提交
710
		}
711

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

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

M
Mr.doob 已提交
718
		for ( var attributeId in attributes ) {
719

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

M
Mr.doob 已提交
725
				params[ attributeId ] = shaderParam;
726

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

M
Mr.doob 已提交
729
		}
R
Rich Tibbett 已提交
730

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

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

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

M
Mr.doob 已提交
738
			switch ( semantic ) {
R
Rich Tibbett 已提交
739

M
Mr.doob 已提交
740
				case "POSITION":
R
Rich Tibbett 已提交
741

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

M
Mr.doob 已提交
745
				case "NORMAL":
R
Rich Tibbett 已提交
746

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

M
Mr.doob 已提交
750 751 752
				case 'TEXCOORD_0':
				case 'TEXCOORD0':
				case 'TEXCOORD':
753

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

757 758 759 760 761
				case 'TEXCOORD_1':

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

762 763 764 765 766 767 768
				case 'COLOR_0':
				case 'COLOR0':
				case 'COLOR':

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

M
Mr.doob 已提交
769
				case "WEIGHT":
770

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

M
Mr.doob 已提交
774
				case "JOINT":
775

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

M
Mr.doob 已提交
779
			}
780

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

M
Mr.doob 已提交
783
		return shaderText;
784

M
Mr.doob 已提交
785
	}
R
Rich Tibbett 已提交
786

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

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

M
Mr.doob 已提交
799
	}
T
Takahiro 已提交
800

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

M
Mr.doob 已提交
804
		this.isDeferredShaderMaterial = true;
R
Rich Tibbett 已提交
805

M
Mr.doob 已提交
806
		this.params = params;
807

M
Mr.doob 已提交
808
	}
809

M
Mr.doob 已提交
810
	DeferredShaderMaterial.prototype.create = function () {
811

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

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

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

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

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

M
Mr.doob 已提交
823
			}
R
Rich Tibbett 已提交
824

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

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

M
Mr.doob 已提交
830
		this.params.uniforms = uniforms;
R
Rich Tibbett 已提交
831

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

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

M
Mr.doob 已提交
836
	/* GLTF PARSER */
R
Rich Tibbett 已提交
837

838
	function GLTFParser( json, extensions, options ) {
R
Rich Tibbett 已提交
839

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

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

M
Mr.doob 已提交
847
	}
R
Rich Tibbett 已提交
848

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

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

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

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

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

M
Mr.doob 已提交
860
			if ( cached !== undefined ) {
861

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

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

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

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

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

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

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

M
Mr.doob 已提交
877
			return dependency;
R
Rich Tibbett 已提交
878

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

M
Mr.doob 已提交
881
	};
R
Rich Tibbett 已提交
882

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

M
Mr.doob 已提交
885 886
		var json = this.json;

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

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

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

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

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

			for ( var name in dependencies.scenes ) {

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

			}

907 908
			var scene = json.scene !== undefined ? dependencies.scenes[ json.scene ] : scenes[ 0 ];

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

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

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

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

918
			var animations = [];
R
Rich Tibbett 已提交
919

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

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

M
Mr.doob 已提交
924
			}
R
Rich Tibbett 已提交
925

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

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

M
Mr.doob 已提交
930
	};
R
Rich Tibbett 已提交
931

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

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

938 939 940 941 942 943 944 945 946 947 948 949 950 951 952
		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 已提交
953

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

958
						resolve( shaderText );
R
Rich Tibbett 已提交
959

960
					} );
R
Rich Tibbett 已提交
961 962 963

				} );

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

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

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

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

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

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

			if ( name === BINARY_EXTENSION_BUFFER_NAME ) {

				return extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body;

			}
R
Rich Tibbett 已提交
983

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

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

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

M
Mr.doob 已提交
992
						resolve( buffer );
R
Rich Tibbett 已提交
993

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

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

T
Takahiro 已提交
998 999 1000 1001
			} else {

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

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

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

M
Mr.doob 已提交
1006
	};
R
Rich Tibbett 已提交
1007

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

M
Mr.doob 已提交
1010 1011
		var json = this.json;

M
Mr.doob 已提交
1012
		return this._withDependencies( [
R
Rich Tibbett 已提交
1013

M
Mr.doob 已提交
1014
			"buffers"
R
Rich Tibbett 已提交
1015

M
Mr.doob 已提交
1016
		] ).then( function ( dependencies ) {
1017

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

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

1022 1023 1024
				var byteLength = bufferView.byteLength !== undefined ? bufferView.byteLength : 0;

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

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

M
Mr.doob 已提交
1028
		} );
1029

M
Mr.doob 已提交
1030
	};
1031

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

M
Mr.doob 已提交
1034 1035
		var json = this.json;

M
Mr.doob 已提交
1036 1037 1038 1039 1040
		return this._withDependencies( [

			"bufferViews"

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
1063 1064 1065
				} else {

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

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

				}

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

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

M
Mr.doob 已提交
1075
	};
R
Rich Tibbett 已提交
1076

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

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

1083
		return this._withDependencies( [
R
Rich Tibbett 已提交
1084

1085
			"bufferViews"
R
Rich Tibbett 已提交
1086

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

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

1091
				if ( texture.source ) {
R
Rich Tibbett 已提交
1092

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

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

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

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

1102
						}
R
Rich Tibbett 已提交
1103

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

1106
						if ( textureLoader === null ) {
R
Rich Tibbett 已提交
1107

1108
							textureLoader = new THREE.TextureLoader();
R
Rich Tibbett 已提交
1109

M
Mr.doob 已提交
1110 1111
						}

1112 1113 1114 1115 1116 1117
						textureLoader.setCrossOrigin( options.crossOrigin );

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

							_texture.flipY = false;

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

T
Takahiro 已提交
1120 1121 1122 1123 1124
							_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. ' +
1125
															'internalFormat will be forced to be the same value as format.' );
T
Takahiro 已提交
1126 1127 1128

							}

1129
							_texture.type = texture.type !== undefined ? WEBGL_TEXTURE_DATATYPES[ texture.type ] : THREE.UnsignedByteType;
1130

1131 1132 1133 1134
							if ( texture.sampler ) {

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

1135 1136 1137 1138
								_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;
1139 1140 1141 1142 1143 1144

							}

							resolve( _texture );

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

1146
							resolve();
1147

1148
						} );
1149 1150

					} );
R
Rich Tibbett 已提交
1151

1152
				}
R
Rich Tibbett 已提交
1153

1154
			} );
R
Rich Tibbett 已提交
1155

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

M
Mr.doob 已提交
1158
	};
R
Rich Tibbett 已提交
1159

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

M
Mr.doob 已提交
1162 1163
		var json = this.json;

M
Mr.doob 已提交
1164
		return this._withDependencies( [
R
Rich Tibbett 已提交
1165

M
Mr.doob 已提交
1166 1167
			"shaders",
			"textures"
R
Rich Tibbett 已提交
1168

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

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

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

M
Mr.doob 已提交
1177
				var khr_material;
R
Rich Tibbett 已提交
1178

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

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

				}

M
Mr.doob 已提交
1185
				if ( khr_material ) {
R
Rich Tibbett 已提交
1186

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

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

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

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

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

M
Mr.doob 已提交
1208
					}
R
Rich Tibbett 已提交
1209

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

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

					} );
R
Rich Tibbett 已提交
1215

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

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

M
Mr.doob 已提交
1220
					}
R
Rich Tibbett 已提交
1221

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

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

					}

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

M
Mr.doob 已提交
1231
					materialType = THREE.MeshPhongMaterial;
R
Rich Tibbett 已提交
1232

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

M
Mr.doob 已提交
1235
				} else {
R
Rich Tibbett 已提交
1236

M
Mr.doob 已提交
1237
					materialType = DeferredShaderMaterial;
R
Rich Tibbett 已提交
1238

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

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

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

M
Mr.doob 已提交
1245
					if ( program ) {
R
Rich Tibbett 已提交
1246

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

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
1268
						var uniforms = technique.uniforms;
R
Rich Tibbett 已提交
1269

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

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

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

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

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

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

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

M
Mr.doob 已提交
1288
								switch ( ptype ) {
R
Rich Tibbett 已提交
1289

M
Mr.doob 已提交
1290
									case WEBGL_CONSTANTS.FLOAT:
R
Rich Tibbett 已提交
1291

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

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

M
Mr.doob 已提交
1296
											materialParams.transparent = true;
R
Rich Tibbett 已提交
1297

M
Mr.doob 已提交
1298
										}
R
Rich Tibbett 已提交
1299

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

M
Mr.doob 已提交
1302
											uvalue = value;
R
Rich Tibbett 已提交
1303

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

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

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

										if ( shaderParam && shaderParam.value ) {

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

										}

										if ( value ) {

											uvalue.fromArray( value );

										}

M
Mr.doob 已提交
1325
										break;
R
Rich Tibbett 已提交
1326

M
Mr.doob 已提交
1327
									case WEBGL_CONSTANTS.FLOAT_MAT2:
R
Rich Tibbett 已提交
1328

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

M
Mr.doob 已提交
1333
									case WEBGL_CONSTANTS.FLOAT_MAT4:
R
Rich Tibbett 已提交
1334

M
Mr.doob 已提交
1335
										if ( pcount ) {
R
Rich Tibbett 已提交
1336

M
Mr.doob 已提交
1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357
											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 已提交
1358
										} else {
M
Mr.doob 已提交
1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371

											if ( shaderParam && shaderParam.value ) {

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

											}

											if ( value ) {

												uvalue.fromArray( value );

											}
R
Rich Tibbett 已提交
1372 1373 1374

										}

M
Mr.doob 已提交
1375
										break;
R
Rich Tibbett 已提交
1376

M
Mr.doob 已提交
1377
									case WEBGL_CONSTANTS.SAMPLER_2D:
R
Rich Tibbett 已提交
1378

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

											uvalue = dependencies.textures[ value ];

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

											uvalue = dependencies.textures[ shaderParam.value ];

										} else {

											uvalue = null;

										}
R
Rich Tibbett 已提交
1392

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

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

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

M
Mr.doob 已提交
1403
							} else {
R
Rich Tibbett 已提交
1404

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

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

M
Mr.doob 已提交
1409
						}
R
Rich Tibbett 已提交
1410

1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422
						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 已提交
1423
							switch ( STATES_ENABLES[ enable ] ) {
1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469

								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;
1470
						materialParams.depthWrite = functions.depthMask !== undefined ? functions.depthMask[ 0 ] : true;
1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506

						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 已提交
1507
					}
R
Rich Tibbett 已提交
1508 1509 1510

				}

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

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

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

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

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

M
Mr.doob 已提交
1521
				delete materialParams.diffuse;
R
Rich Tibbett 已提交
1522

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

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

M
Mr.doob 已提交
1527
				}
R
Rich Tibbett 已提交
1528

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

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

M
Mr.doob 已提交
1533
				}
R
Rich Tibbett 已提交
1534

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

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

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

					} else {

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

					}
R
Rich Tibbett 已提交
1546

1547 1548
				} else if ( typeof( materialValues.emission ) === 'string' ) {

1549
					if ( materialType === THREE.MeshBasicMaterial ) {
1550

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

1553 1554 1555 1556 1557 1558 1559
					} else {

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

					}

				}
1560

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

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

1565 1566 1567 1568
				} else if ( typeof( materialValues.specular ) === 'string' ) {

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

1569
				}
1570

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

M
Mr.doob 已提交
1573
					materialParams.shininess = materialValues.shininess;
R
Rich Tibbett 已提交
1574

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

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

M
Mr.doob 已提交
1580
				return _material;
R
Rich Tibbett 已提交
1581

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

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

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

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

M
Mr.doob 已提交
1590 1591
		var json = this.json;

M
Mr.doob 已提交
1592
		return this._withDependencies( [
R
Rich Tibbett 已提交
1593

M
Mr.doob 已提交
1594 1595
			"accessors",
			"materials"
R
Rich Tibbett 已提交
1596

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

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

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

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

1606
				var primitives = mesh.primitives || [];
R
Rich Tibbett 已提交
1607

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

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

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

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

M
Mr.doob 已提交
1616
						var attributes = primitive.attributes;
R
Rich Tibbett 已提交
1617

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

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

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

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

M
Mr.doob 已提交
1626
							switch ( attributeId ) {
R
Rich Tibbett 已提交
1627

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
1662
						}
R
Rich Tibbett 已提交
1663

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

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

M
Mr.doob 已提交
1668
						}
R
Rich Tibbett 已提交
1669

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

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

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

1678 1679
						group.add( meshNode );

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

						var geometry = new THREE.BufferGeometry();

						var attributes = primitive.attributes;

1686 1687 1688
						for ( var attributeId in attributes ) {

							var attributeEntry = attributes[ attributeId ];
1689

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

							var bufferAttribute = dependencies.accessors[ attributeEntry ];

							switch ( attributeId ) {

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

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

1706
							}
M
Mr.doob 已提交
1707 1708

						}
M
Mr.doob 已提交
1709 1710 1711 1712

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

						var meshNode;
1713 1714 1715

						if ( primitive.indices ) {

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

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

M
Mr.doob 已提交
1720
						} else {
1721

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

						}

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

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

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

M
Mr.doob 已提交
1732
					} else {
R
Rich Tibbett 已提交
1733

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

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

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

M
Mr.doob 已提交
1740
				return group;
R
Rich Tibbett 已提交
1741

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

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

M
Mr.doob 已提交
1746
	};
R
Rich Tibbett 已提交
1747

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

M
Mr.doob 已提交
1750 1751 1752
		var json = this.json;

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

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

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

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

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

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

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

M
Mr.doob 已提交
1777
				return _camera;
R
Rich Tibbett 已提交
1778

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

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

M
Mr.doob 已提交
1783
	};
R
Rich Tibbett 已提交
1784

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

M
Mr.doob 已提交
1787
		var json = this.json;
R
Rich Tibbett 已提交
1788

M
Mr.doob 已提交
1789
		return this._withDependencies( [
R
Rich Tibbett 已提交
1790

M
Mr.doob 已提交
1791
			"accessors"
R
Rich Tibbett 已提交
1792

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

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

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

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

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

				return _skin;

			} );
R
Rich Tibbett 已提交
1810

M
Mr.doob 已提交
1811
		} );
R
Rich Tibbett 已提交
1812

M
Mr.doob 已提交
1813 1814
	};

1815
	GLTFParser.prototype.loadAnimations = function () {
R
Rich Tibbett 已提交
1816

M
Mr.doob 已提交
1817
		var json = this.json;
R
Rich Tibbett 已提交
1818

M
Mr.doob 已提交
1819
		return this._withDependencies( [
R
Rich Tibbett 已提交
1820

M
Mr.doob 已提交
1821 1822
			"accessors",
			"nodes"
R
Rich Tibbett 已提交
1823

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

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

D
Don McCurdy 已提交
1828
				var tracks = [];
R
Rich Tibbett 已提交
1829

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

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

1835
					if ( sampler ) {
R
Rich Tibbett 已提交
1836 1837 1838

						var target = channel.target;
						var name = target.id;
1839 1840
						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 已提交
1841 1842 1843 1844 1845 1846 1847 1848

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

						var node = dependencies.nodes[ name ];

						if ( node ) {

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

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

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

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

						}

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

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

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

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

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

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

M
Mr.doob 已提交
1883
	};
R
Rich Tibbett 已提交
1884

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

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

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

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

M
Mr.doob 已提交
1895
			var _node;
R
Rich Tibbett 已提交
1896

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

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

M
Mr.doob 已提交
1903
			} else {
R
Rich Tibbett 已提交
1904

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

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

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

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

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

M
Mr.doob 已提交
1917
			} else {
R
Rich Tibbett 已提交
1918

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

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

M
Mr.doob 已提交
1923
				}
R
Rich Tibbett 已提交
1924

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

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

M
Mr.doob 已提交
1929 1930 1931
				}

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

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

M
Mr.doob 已提交
1935
				}
R
Rich Tibbett 已提交
1936 1937 1938

			}

M
Mr.doob 已提交
1939
			return _node;
R
Rich Tibbett 已提交
1940

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

M
Mr.doob 已提交
1943
			return scope._withDependencies( [
R
Rich Tibbett 已提交
1944

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

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

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

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

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

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

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

1962 1963 1964 1965 1966 1967 1968
							if ( group === undefined ) {

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

							}

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

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

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

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

M
Mr.doob 已提交
1980
								var material;
R
Rich Tibbett 已提交
1981

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

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

M
Mr.doob 已提交
1986
								} else {
R
Rich Tibbett 已提交
1987

M
Mr.doob 已提交
1988
									material = originalMaterial;
R
Rich Tibbett 已提交
1989

M
Mr.doob 已提交
1990
								}
M
Mr.doob 已提交
1991 1992 1993 1994 1995 1996 1997

								switch ( child.type ) {

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

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

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

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

2009
								}
M
Mr.doob 已提交
2010

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

M
Mr.doob 已提交
2015
								var skinEntry;
M
Mr.doob 已提交
2016

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

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

M
Mr.doob 已提交
2021
								}
R
Rich Tibbett 已提交
2022

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

2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039
									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 已提交
2040
									};
2041

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

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

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

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

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

M
Mr.doob 已提交
2059
										if ( jointNode ) {
R
Rich Tibbett 已提交
2060

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

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

M
Mr.doob 已提交
2067
										} else {
R
Rich Tibbett 已提交
2068

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

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

M
Mr.doob 已提交
2073
									}
R
Rich Tibbett 已提交
2074

2075
									child.bind( new THREE.Skeleton( bones, boneInverses ), skinEntry.bindShapeMatrix );
R
Rich Tibbett 已提交
2076

T
Takahiro 已提交
2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097
									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 已提交
2098
									};
T
Takahiro 已提交
2099 2100 2101

									buildBoneGraph( node, child, 'skeletons' );

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
2118
					}
R
Rich Tibbett 已提交
2119

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

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

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

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

M
Mr.doob 已提交
2131
					return _node;
R
Rich Tibbett 已提交
2132

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

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

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

M
Mr.doob 已提交
2139
	};
R
Rich Tibbett 已提交
2140

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

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

		// scene node hierachy builder

		function buildNodeHierachy( nodeId, parentObject, allNodes ) {

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

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

			if ( node.children ) {

M
Mr.doob 已提交
2156 2157 2158
				var children = node.children;

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

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

M
Mr.doob 已提交
2163
				}
M
Mr.doob 已提交
2164 2165

			}
R
Rich Tibbett 已提交
2166 2167 2168

		}

M
Mr.doob 已提交
2169
		return this._withDependencies( [
R
Rich Tibbett 已提交
2170

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
2189
				}
R
Rich Tibbett 已提交
2190

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

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

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

M
Mr.doob 已提交
2201 2202 2203 2204 2205 2206 2207
					}

				} );

				return _scene;

			} );
R
Rich Tibbett 已提交
2208

M
Mr.doob 已提交
2209 2210 2211
		} );

	};
R
Rich Tibbett 已提交
2212

M
Mr.doob 已提交
2213
	return GLTFLoader;
R
Rich Tibbett 已提交
2214

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