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

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

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

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

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

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
32
		},
33

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

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

M
Mr.doob 已提交
38
		},
39

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

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

M
Mr.doob 已提交
44
		},
45

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

					var object = objects[ name ];
112

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

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

M
Mr.doob 已提交
117
					}
118

M
Mr.doob 已提交
119
				}
120

M
Mr.doob 已提交
121
			}
122

M
Mr.doob 已提交
123
		};
124

M
Mr.doob 已提交
125
	}
126

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

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

	/* GLTFSHADER */

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

M
Mr.doob 已提交
135 136 137 138 139
		var scope = this;

		this.boundUniforms = {};

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

		var uniforms = targetNode.material.uniforms;

		for ( var uniformId in uniforms ) {

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

M
Mr.doob 已提交
147
			if ( uniform.semantic ) {
148

M
Mr.doob 已提交
149
				var sourceNodeRef = uniform.node;
150

M
Mr.doob 已提交
151
				var sourceNode = targetNode;
152

M
Mr.doob 已提交
153
				if ( sourceNodeRef ) {
154

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

M
Mr.doob 已提交
157
				}
R
Rich Tibbett 已提交
158

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

			}
167

M
Mr.doob 已提交
168
		}
169

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

M
Mr.doob 已提交
172
	}
173

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

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

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

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

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

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

		for ( var name in boundUniforms ) {

			var boundUniform = boundUniforms[ name ];
191

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

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

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

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
228
					}
229

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

				default :
233

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

			}

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

	};
242 243


244
	/* ANIMATION */
245

246 247
	function createClip( name, interps ) {
		var tracks = [];
248

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

251
			validateInterpolator( interps[ i ] );
252

253 254
			interps[ i ].target.updateMatrix();
			interps[ i ].target.matrixAutoUpdate = true;
255

256 257 258 259 260 261
			tracks.push( new THREE.KeyframeTrack(
				interps[ i ].name,
				interps[ i ].times,
				interps[ i ].values,
				interps[ i ].type
			) );
M
Mr.doob 已提交
262
		}
263

264
		return new THREE.AnimationClip( name, undefined, tracks );
M
Mr.doob 已提交
265
	}
266

267 268 269 270 271 272
	/**
	 * Interp times are frequently non-sequential in the monster and cesium man
	 * models. That's probably a sign that the exporter is misbehaving, but to
	 * keep this backward-compatible we can swallow the errors.
	 */
	function validateInterpolator( interp ) {
R
Rich Tibbett 已提交
273

274 275 276 277
		var times = [];
		var values = [];
		var prevTime = null;
		var currTime = null;
278

279
		var stride = interp.values.length / interp.times.length;
R
Rich Tibbett 已提交
280

281
		for ( var i = 0; i < interp.times.length; i ++ ) {
282

283
			currTime = interp.times[ i ];
284

285
			if ( prevTime === null || prevTime <= currTime ) {
286

287
				times.push( currTime );
288

289
				for ( var j = 0; j < stride; j++ ) {
290

291
					values.push( interp.values[ i * stride + j ] );
R
Rich Tibbett 已提交
292 293

				}
294 295 296

			}

297
			prevTime = currTime;
R
Rich Tibbett 已提交
298 299
		}

300 301
		interp.times = new Float32Array( times );
		interp.values = new Float32Array( values );
R
Rich Tibbett 已提交
302

303
	}
304

M
Mr.doob 已提交
305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328
	/*********************************/
	/********** 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,
		UNSIGNED_BYTE: 5121,
		UNSIGNED_SHORT: 5123,

		VERTEX_SHADER: 35633,
		FRAGMENT_SHADER: 35632
	};
329

M
Mr.doob 已提交
330 331 332 333 334 335 336 337 338 339
	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
	};
340

M
Mr.doob 已提交
341 342 343 344 345 346 347 348
	var WEBGL_COMPONENT_TYPES = {
		5120: Int8Array,
		5121: Uint8Array,
		5122: Int16Array,
		5123: Uint16Array,
		5125: Uint32Array,
		5126: Float32Array
	};
349

M
Mr.doob 已提交
350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374
	var WEBGL_FILTERS = {
		9728: THREE.NearestFilter,
		9729: THREE.LinearFilter,
		9984: THREE.NearestMipMapNearestFilter,
		9985: THREE.LinearMipMapNearestFilter,
		9986: THREE.NearestMipMapLinearFilter,
		9987: THREE.LinearMipMapLinearFilter
	};

	var WEBGL_WRAPPINGS = {
		33071: THREE.ClampToEdgeWrapping,
		33648: THREE.MirroredRepeatWrapping,
		10497: THREE.RepeatWrapping
	};

	var WEBGL_TYPE_SIZES = {
		'SCALAR': 1,
		'VEC2': 2,
		'VEC3': 3,
		'VEC4': 4,
		'MAT2': 4,
		'MAT3': 9,
		'MAT4': 16
	};

375 376 377 378 379 380 381 382 383 384
	var PATH_PROPERTIES = {
		scale: 'scale',
		translation: 'position',
		rotation: 'quaternion'
	};

	var INTERPOLATION = {
		LINEAR: THREE.InterpolateLinear
	};

M
Mr.doob 已提交
385 386 387 388 389 390
	/* UTILITY FUNCTIONS */

	function _each( object, callback, thisObj ) {

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

M
Mr.doob 已提交
393 394 395 396
		var results;
		var fns = [];

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

M
Mr.doob 已提交
398
			results = [];
R
Rich Tibbett 已提交
399

M
Mr.doob 已提交
400 401 402
			var length = object.length;
			for ( var idx = 0; idx < length; idx ++ ) {
				var value = callback.call( thisObj || this, object[ idx ], idx );
R
Rich Tibbett 已提交
403 404 405 406
				if ( value ) {
					fns.push( value );
					if ( value instanceof Promise ) {
						value.then( function( key, value ) {
M
Mr.doob 已提交
407
							results[ idx ] = value;
R
Rich Tibbett 已提交
408 409
						}.bind( this, key ));
					} else {
M
Mr.doob 已提交
410
						results[ idx ] = value;
R
Rich Tibbett 已提交
411 412
					}
				}
413
			}
R
Rich Tibbett 已提交
414

M
Mr.doob 已提交
415
		} else {
R
Rich Tibbett 已提交
416

M
Mr.doob 已提交
417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433
			results = {};

			for ( var key in object ) {
				if ( object.hasOwnProperty( key ) ) {
					var value = callback.call( thisObj || this, object[ key ], key );
					if ( value ) {
						fns.push( value );
						if ( value instanceof Promise ) {
							value.then( function( key, value ) {
								results[ key ] = value;
							}.bind( this, key ));
						} else {
							results[ key ] = value;
						}
					}
				}
			}
R
Rich Tibbett 已提交
434

M
Mr.doob 已提交
435
		}
R
Rich Tibbett 已提交
436

M
Mr.doob 已提交
437 438 439
		return Promise.all( fns ).then( function() {
			return results;
		});
R
Rich Tibbett 已提交
440 441 442

	}

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

M
Mr.doob 已提交
445 446 447
		// Invalid URL
		if ( typeof url !== 'string' || url === '' )
			return '';
448

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

M
Mr.doob 已提交
452
			return url;
R
Rich Tibbett 已提交
453

M
Mr.doob 已提交
454
		}
R
Rich Tibbett 已提交
455

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

M
Mr.doob 已提交
459
			return url;
R
Rich Tibbett 已提交
460

M
Mr.doob 已提交
461
		}
R
Rich Tibbett 已提交
462

M
Mr.doob 已提交
463 464
		// Relative URL
		return ( path || '' ) + url;
R
Rich Tibbett 已提交
465

M
Mr.doob 已提交
466
	}
R
Rich Tibbett 已提交
467

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

M
Mr.doob 已提交
472 473
		// Expected technique attributes
		var attributes = {};
R
Rich Tibbett 已提交
474

M
Mr.doob 已提交
475 476 477
		for ( var attributeId in technique.attributes ) {

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

M
Mr.doob 已提交
479 480 481
			var param = technique.parameters[ pname ];
			var atype = param.type;
			var semantic = param.semantic;
R
Rich Tibbett 已提交
482

M
Mr.doob 已提交
483 484 485 486
			attributes[ attributeId ] = {
				type: atype,
				semantic: semantic
			};
487

M
Mr.doob 已提交
488
		}
489

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

M
Mr.doob 已提交
492 493 494
		var shaderParams = technique.parameters;
		var shaderAttributes = technique.attributes;
		var params = {};
495

M
Mr.doob 已提交
496
		for ( var attributeId in attributes ) {
497

M
Mr.doob 已提交
498 499 500 501
			var pname = shaderAttributes[ attributeId ];
			var shaderParam = shaderParams[ pname ];
			var semantic = shaderParam.semantic;
			if ( semantic ) {
502

M
Mr.doob 已提交
503
				params[ attributeId ] = shaderParam;
504

M
Mr.doob 已提交
505
			}
R
Rich Tibbett 已提交
506

M
Mr.doob 已提交
507
		}
R
Rich Tibbett 已提交
508

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

M
Mr.doob 已提交
511
			var param = params[ pname ];
M
Mr.doob 已提交
512
			var semantic = param.semantic;
R
Rich Tibbett 已提交
513

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

M
Mr.doob 已提交
516
			switch ( semantic ) {
R
Rich Tibbett 已提交
517

M
Mr.doob 已提交
518
				case "POSITION":
R
Rich Tibbett 已提交
519

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

M
Mr.doob 已提交
523
				case "NORMAL":
R
Rich Tibbett 已提交
524

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

M
Mr.doob 已提交
528 529 530
				case 'TEXCOORD_0':
				case 'TEXCOORD0':
				case 'TEXCOORD':
531

M
Mr.doob 已提交
532 533
					shaderText = shaderText.replace( regEx, 'uv' );
					break;
534

M
Mr.doob 已提交
535
				case "WEIGHT":
536

M
Mr.doob 已提交
537 538
					shaderText = shaderText.replace( regEx, 'skinWeight' );
					break;
539

M
Mr.doob 已提交
540
				case "JOINT":
541

M
Mr.doob 已提交
542 543
					shaderText = shaderText.replace( regEx, 'skinIndex' );
					break;
544

M
Mr.doob 已提交
545
			}
546

M
Mr.doob 已提交
547
		}
R
Rich Tibbett 已提交
548

M
Mr.doob 已提交
549
		return shaderText;
550

M
Mr.doob 已提交
551
	}
R
Rich Tibbett 已提交
552

M
Mr.doob 已提交
553 554
	// Deferred constructor for RawShaderMaterial types
	function DeferredShaderMaterial( params ) {
R
Rich Tibbett 已提交
555

M
Mr.doob 已提交
556
		this.isDeferredShaderMaterial = true;
R
Rich Tibbett 已提交
557

M
Mr.doob 已提交
558
		this.params = params;
559

M
Mr.doob 已提交
560
	}
561

M
Mr.doob 已提交
562
	DeferredShaderMaterial.prototype.create = function () {
563

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

M
Mr.doob 已提交
566 567 568
		for ( var uniformId in this.params.uniforms ) {

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

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

M
Mr.doob 已提交
572 573
				uniforms[ uniformId ].value = originalUniform.value;
				uniforms[ uniformId ].value.needsUpdate = true;
R
Rich Tibbett 已提交
574

M
Mr.doob 已提交
575
			}
R
Rich Tibbett 已提交
576

M
Mr.doob 已提交
577 578
			uniforms[ uniformId ].semantic = originalUniform.semantic;
			uniforms[ uniformId ].node = originalUniform.node;
R
Rich Tibbett 已提交
579

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

M
Mr.doob 已提交
582
		this.params.uniforms = uniforms;
R
Rich Tibbett 已提交
583

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

M
Mr.doob 已提交
586
	};
R
Rich Tibbett 已提交
587

M
Mr.doob 已提交
588
	/* GLTF PARSER */
R
Rich Tibbett 已提交
589

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

M
Mr.doob 已提交
592 593
		this.json = json || {};
		this.options = options || {};
R
Rich Tibbett 已提交
594

M
Mr.doob 已提交
595 596
		// loader object cache
		this.cache = new GLTFRegistry();
R
Rich Tibbett 已提交
597

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

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

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

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

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

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

M
Mr.doob 已提交
611
			if ( cached !== undefined ) {
612

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

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

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

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

M
Mr.doob 已提交
622
			}
R
Rich Tibbett 已提交
623

M
Mr.doob 已提交
624
		}
R
Rich Tibbett 已提交
625

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

M
Mr.doob 已提交
628
			return dependency;
R
Rich Tibbett 已提交
629

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

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

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

M
Mr.doob 已提交
636 637
		// Clear the loader cache
		this.cache.removeAll();
R
Rich Tibbett 已提交
638

M
Mr.doob 已提交
639 640
		// Fire the callback on complete
		this._withDependencies( [
R
Rich Tibbett 已提交
641

M
Mr.doob 已提交
642 643
			"scenes",
			"cameras",
644
			"clips"
R
Rich Tibbett 已提交
645

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

M
Mr.doob 已提交
648
			var scene = dependencies.scenes[ this.json.scene ];
R
Rich Tibbett 已提交
649

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

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

M
Mr.doob 已提交
654
				var camera = dependencies.cameras[ name ];
M
Mr.doob 已提交
655
				cameras.push( camera );
R
Rich Tibbett 已提交
656

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

659
			var clips = [];
R
Rich Tibbett 已提交
660

661
			for ( var name in dependencies.clips ) {
R
Rich Tibbett 已提交
662

663 664
				var clip = dependencies.clips[ name ];
				clips.push( clip );
R
Rich Tibbett 已提交
665

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

668
			callback( scene, cameras, clips);
R
Rich Tibbett 已提交
669

M
Mr.doob 已提交
670
		}.bind( this ) );
R
Rich Tibbett 已提交
671

M
Mr.doob 已提交
672
	};
R
Rich Tibbett 已提交
673

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

M
Mr.doob 已提交
676
		return _each( this.json.shaders, function ( shader ) {
R
Rich Tibbett 已提交
677

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

680
				var loader = new THREE.FileLoader();
M
Mr.doob 已提交
681 682
				loader.responseType = 'text';
				loader.load( resolveURL( shader.uri, this.options.path ), function ( shaderText ) {
R
Rich Tibbett 已提交
683

M
Mr.doob 已提交
684
					resolve( shaderText );
R
Rich Tibbett 已提交
685 686 687

				} );

M
Mr.doob 已提交
688
			}.bind( this ) );
R
Rich Tibbett 已提交
689

M
Mr.doob 已提交
690
		}.bind( this ) );
R
Rich Tibbett 已提交
691

M
Mr.doob 已提交
692
	};
R
Rich Tibbett 已提交
693

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

M
Mr.doob 已提交
696
		return _each( this.json.buffers, function ( buffer ) {
R
Rich Tibbett 已提交
697

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

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

M
Mr.doob 已提交
702 703 704
					var loader = new THREE.FileLoader();
					loader.responseType = 'arraybuffer';
					loader.load( resolveURL( buffer.uri, this.options.path ), function ( buffer ) {
R
Rich Tibbett 已提交
705

M
Mr.doob 已提交
706
						resolve( buffer );
R
Rich Tibbett 已提交
707

M
Mr.doob 已提交
708
					} );
R
Rich Tibbett 已提交
709

M
Mr.doob 已提交
710
				}.bind( this ) );
R
Rich Tibbett 已提交
711

M
Mr.doob 已提交
712
			}
R
Rich Tibbett 已提交
713

M
Mr.doob 已提交
714
		}.bind( this ) );
R
Rich Tibbett 已提交
715

M
Mr.doob 已提交
716
	};
R
Rich Tibbett 已提交
717

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

M
Mr.doob 已提交
720
		return this._withDependencies( [
R
Rich Tibbett 已提交
721

M
Mr.doob 已提交
722
			"buffers"
R
Rich Tibbett 已提交
723

M
Mr.doob 已提交
724
		] ).then( function ( dependencies ) {
725

M
Mr.doob 已提交
726
			return _each( this.json.bufferViews, function ( bufferView ) {
727

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

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

M
Mr.doob 已提交
732
			} );
733

M
Mr.doob 已提交
734
		}.bind( this ) );
735

M
Mr.doob 已提交
736
	};
737

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

M
Mr.doob 已提交
740 741 742 743 744
		return this._withDependencies( [

			"bufferViews"

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

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

M
Mr.doob 已提交
748 749 750
				var arraybuffer = dependencies.bufferViews[ accessor.bufferView ];
				var itemSize = WEBGL_TYPE_SIZES[ accessor.type ];
				var TypedArray = WEBGL_COMPONENT_TYPES[ accessor.componentType ];
R
Rich Tibbett 已提交
751

M
Mr.doob 已提交
752 753 754
				// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.
				var elementBytes = TypedArray.BYTES_PER_ELEMENT;
				var itemBytes = elementBytes * itemSize;
R
Rich Tibbett 已提交
755

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

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

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

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

M
Mr.doob 已提交
767 768 769
				} else {

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

M
Mr.doob 已提交
771
					return new THREE.BufferAttribute( array, itemSize );
R
Rich Tibbett 已提交
772 773 774

				}

M
Mr.doob 已提交
775
			} );
R
Rich Tibbett 已提交
776

M
Mr.doob 已提交
777
		}.bind( this ) );
R
Rich Tibbett 已提交
778

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

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

M
Mr.doob 已提交
783
		return _each( this.json.textures, function ( texture ) {
R
Rich Tibbett 已提交
784

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

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

M
Mr.doob 已提交
789
					var source = this.json.images[ texture.source ];
R
Rich Tibbett 已提交
790

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

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

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

M
Mr.doob 已提交
797
					}
R
Rich Tibbett 已提交
798

M
Mr.doob 已提交
799
					textureLoader.crossOrigin = this.options.crossOrigin || false;
R
Rich Tibbett 已提交
800

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

M
Mr.doob 已提交
803
						_texture.flipY = false;
R
Rich Tibbett 已提交
804

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

M
Mr.doob 已提交
807
							var sampler = this.json.samplers[ texture.sampler ];
R
Rich Tibbett 已提交
808

M
Mr.doob 已提交
809 810 811 812
							_texture.magFilter = WEBGL_FILTERS[ sampler.magFilter ];
							_texture.minFilter = WEBGL_FILTERS[ sampler.minFilter ];
							_texture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ];
							_texture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ];
R
Rich Tibbett 已提交
813

M
Mr.doob 已提交
814 815 816
						}

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

M
Mr.doob 已提交
818
					}.bind( this ) );
R
Rich Tibbett 已提交
819

M
Mr.doob 已提交
820
				}.bind( this ) );
R
Rich Tibbett 已提交
821 822 823

			}

M
Mr.doob 已提交
824
		}.bind( this ) );
R
Rich Tibbett 已提交
825

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

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

M
Mr.doob 已提交
830
		return this._withDependencies( [
R
Rich Tibbett 已提交
831

M
Mr.doob 已提交
832 833
			"shaders",
			"textures"
R
Rich Tibbett 已提交
834

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

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

M
Mr.doob 已提交
839 840 841
				var materialType;
				var materialValues = {};
				var materialParams = {};
R
Rich Tibbett 已提交
842

M
Mr.doob 已提交
843
				var khr_material;
R
Rich Tibbett 已提交
844

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

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

M
Mr.doob 已提交
849 850 851
				} else if ( this.json.extensions && this.json.extensions.KHR_materials_common ) {

					khr_material = this.json.extensions.KHR_materials_common;
R
Rich Tibbett 已提交
852 853 854

				}

M
Mr.doob 已提交
855
				if ( khr_material ) {
R
Rich Tibbett 已提交
856

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

M
Mr.doob 已提交
859 860 861 862
						case 'BLINN' :
						case 'PHONG' :
							materialType = THREE.MeshPhongMaterial;
							break;
R
Rich Tibbett 已提交
863

M
Mr.doob 已提交
864 865 866
						case 'LAMBERT' :
							materialType = THREE.MeshLambertMaterial;
							break;
R
Rich Tibbett 已提交
867

M
Mr.doob 已提交
868 869 870 871
						case 'CONSTANT' :
						default :
							materialType = THREE.MeshBasicMaterial;
							break;
R
Rich Tibbett 已提交
872

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

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

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

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

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

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

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

					}

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

M
Mr.doob 已提交
892
					materialType = THREE.MeshPhongMaterial;
R
Rich Tibbett 已提交
893

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

M
Mr.doob 已提交
896
				} else {
R
Rich Tibbett 已提交
897

M
Mr.doob 已提交
898
					materialType = DeferredShaderMaterial;
R
Rich Tibbett 已提交
899

M
Mr.doob 已提交
900
					var technique = this.json.techniques[ material.technique ];
R
Rich Tibbett 已提交
901

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

M
Mr.doob 已提交
904
					var program = this.json.programs[ technique.program ];
R
Rich Tibbett 已提交
905

M
Mr.doob 已提交
906
					if ( program ) {
R
Rich Tibbett 已提交
907

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

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

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

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

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

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

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

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

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

M
Mr.doob 已提交
929
						var uniforms = technique.uniforms;
R
Rich Tibbett 已提交
930

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

M
Mr.doob 已提交
933
							var pname = uniforms[ uniformId ];
M
Mr.doob 已提交
934
							var shaderParam = technique.parameters[ pname ];
R
Rich Tibbett 已提交
935

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

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

M
Mr.doob 已提交
940 941
								var pcount = shaderParam.count;
								var value = material.values[ pname ];
R
Rich Tibbett 已提交
942

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

M
Mr.doob 已提交
947
								switch ( ptype ) {
R
Rich Tibbett 已提交
948

M
Mr.doob 已提交
949
									case WEBGL_CONSTANTS.FLOAT:
R
Rich Tibbett 已提交
950

M
Mr.doob 已提交
951
										uvalue = shaderParam.value;
R
Rich Tibbett 已提交
952

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

M
Mr.doob 已提交
955
											materialParams.transparent = true;
R
Rich Tibbett 已提交
956

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

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

M
Mr.doob 已提交
961
											uvalue = value;
R
Rich Tibbett 已提交
962

M
Mr.doob 已提交
963
										}
R
Rich Tibbett 已提交
964

M
Mr.doob 已提交
965
										break;
R
Rich Tibbett 已提交
966

M
Mr.doob 已提交
967 968 969 970
									case WEBGL_CONSTANTS.FLOAT_VEC2:
									case WEBGL_CONSTANTS.FLOAT_VEC3:
									case WEBGL_CONSTANTS.FLOAT_VEC4:
									case WEBGL_CONSTANTS.FLOAT_MAT3:
R
Rich Tibbett 已提交
971 972 973

										if ( shaderParam && shaderParam.value ) {

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

										}

										if ( value ) {

											uvalue.fromArray( value );

										}

M
Mr.doob 已提交
984
										break;
R
Rich Tibbett 已提交
985

M
Mr.doob 已提交
986
									case WEBGL_CONSTANTS.FLOAT_MAT2:
R
Rich Tibbett 已提交
987

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

M
Mr.doob 已提交
992
									case WEBGL_CONSTANTS.FLOAT_MAT4:
R
Rich Tibbett 已提交
993

M
Mr.doob 已提交
994
										if ( pcount ) {
R
Rich Tibbett 已提交
995

M
Mr.doob 已提交
996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030
											uvalue = new Array( pcount );

											for ( var mi = 0; mi < pcount; mi ++ ) {

												uvalue[ mi ] = new WEBGL_TYPE[ ptype ]();

											}

											if ( shaderParam && shaderParam.value ) {

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

											}

											if ( value ) {

												uvalue.fromArray( value );

											}

										}	else {

											if ( shaderParam && shaderParam.value ) {

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

											}

											if ( value ) {

												uvalue.fromArray( value );

											}
R
Rich Tibbett 已提交
1031 1032 1033

										}

M
Mr.doob 已提交
1034
										break;
R
Rich Tibbett 已提交
1035

M
Mr.doob 已提交
1036
									case WEBGL_CONSTANTS.SAMPLER_2D:
R
Rich Tibbett 已提交
1037

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

M
Mr.doob 已提交
1040
										break;
R
Rich Tibbett 已提交
1041

M
Mr.doob 已提交
1042
								}
R
Rich Tibbett 已提交
1043

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

M
Mr.doob 已提交
1050
							} else {
R
Rich Tibbett 已提交
1051

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

M
Mr.doob 已提交
1054
							}
R
Rich Tibbett 已提交
1055

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

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

				}

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

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

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

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

M
Mr.doob 已提交
1070
				}
R
Rich Tibbett 已提交
1071

M
Mr.doob 已提交
1072
				delete materialParams.diffuse;
R
Rich Tibbett 已提交
1073

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

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

M
Mr.doob 已提交
1078
				}
R
Rich Tibbett 已提交
1079

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

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

M
Mr.doob 已提交
1084
				}
R
Rich Tibbett 已提交
1085

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

M
Mr.doob 已提交
1088
					materialParams.emissive = new THREE.Color().fromArray( materialValues.emission );
R
Rich Tibbett 已提交
1089

M
Mr.doob 已提交
1090
				}
R
Rich Tibbett 已提交
1091

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

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

M
Mr.doob 已提交
1096
				}
R
Rich Tibbett 已提交
1097

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

M
Mr.doob 已提交
1100
					materialParams.shininess = materialValues.shininess;
R
Rich Tibbett 已提交
1101

M
Mr.doob 已提交
1102
				}
R
Rich Tibbett 已提交
1103

M
Mr.doob 已提交
1104 1105
				var _material = new materialType( materialParams );
				_material.name = material.name;
R
Rich Tibbett 已提交
1106

M
Mr.doob 已提交
1107
				return _material;
R
Rich Tibbett 已提交
1108

M
Mr.doob 已提交
1109
			}.bind( this ) );
R
Rich Tibbett 已提交
1110

M
Mr.doob 已提交
1111
		}.bind( this ) );
R
Rich Tibbett 已提交
1112

M
Mr.doob 已提交
1113
	};
R
Rich Tibbett 已提交
1114

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

M
Mr.doob 已提交
1117
		return this._withDependencies( [
R
Rich Tibbett 已提交
1118

M
Mr.doob 已提交
1119 1120
			"accessors",
			"materials"
R
Rich Tibbett 已提交
1121

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

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

M
Mr.doob 已提交
1126 1127
				var group = new THREE.Object3D();
				group.name = mesh.name;
R
Rich Tibbett 已提交
1128

M
Mr.doob 已提交
1129
				var primitives = mesh.primitives;
R
Rich Tibbett 已提交
1130

M
Mr.doob 已提交
1131 1132 1133
				for ( var name in primitives ) {

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

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

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

M
Mr.doob 已提交
1139
						var attributes = primitive.attributes;
R
Rich Tibbett 已提交
1140

M
Mr.doob 已提交
1141 1142 1143
						for ( var attributeId in attributes ) {

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

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

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

M
Mr.doob 已提交
1149
							switch ( attributeId ) {
R
Rich Tibbett 已提交
1150

M
Mr.doob 已提交
1151 1152 1153
								case 'POSITION':
									geometry.addAttribute( 'position', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1154

M
Mr.doob 已提交
1155 1156 1157
								case 'NORMAL':
									geometry.addAttribute( 'normal', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1158

M
Mr.doob 已提交
1159 1160 1161 1162 1163
								case 'TEXCOORD_0':
								case 'TEXCOORD0':
								case 'TEXCOORD':
									geometry.addAttribute( 'uv', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1164

M
Mr.doob 已提交
1165 1166 1167
								case 'WEIGHT':
									geometry.addAttribute( 'skinWeight', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1168

M
Mr.doob 已提交
1169 1170 1171
								case 'JOINT':
									geometry.addAttribute( 'skinIndex', bufferAttribute );
									break;
R
Rich Tibbett 已提交
1172

M
Mr.doob 已提交
1173
							}
R
Rich Tibbett 已提交
1174

M
Mr.doob 已提交
1175
						}
R
Rich Tibbett 已提交
1176

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

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

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

M
Mr.doob 已提交
1183
							var offset = {
R
Rich Tibbett 已提交
1184 1185 1186 1187 1188
								start: 0,
								index: 0,
								count: indexArray.count
							};

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

M
Mr.doob 已提交
1191
							geometry.computeBoundingSphere();
R
Rich Tibbett 已提交
1192

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


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

M
Mr.doob 已提交
1198 1199
						var meshNode = new THREE.Mesh( geometry, material );
						meshNode.castShadow = true;
R
Rich Tibbett 已提交
1200

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

M
Mr.doob 已提交
1203
					} else {
R
Rich Tibbett 已提交
1204

M
Mr.doob 已提交
1205
						console.warn( "Non-triangular primitives are not supported" );
R
Rich Tibbett 已提交
1206

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

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

M
Mr.doob 已提交
1211
				return group;
R
Rich Tibbett 已提交
1212

M
Mr.doob 已提交
1213
			} );
R
Rich Tibbett 已提交
1214

M
Mr.doob 已提交
1215
		}.bind( this ) );
R
Rich Tibbett 已提交
1216

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

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

M
Mr.doob 已提交
1221
		return _each( this.json.cameras, function ( camera ) {
R
Rich Tibbett 已提交
1222

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

M
Mr.doob 已提交
1225 1226 1227
				var yfov = camera.perspective.yfov;
				var xfov = camera.perspective.xfov;
				var aspect_ratio = camera.perspective.aspect_ratio || 1;
R
Rich Tibbett 已提交
1228

M
Mr.doob 已提交
1229 1230 1231
				// According to COLLADA spec...
				// aspect_ratio = xfov / yfov
				xfov = ( xfov === undefined && yfov ) ? yfov * aspect_ratio : xfov;
R
Rich Tibbett 已提交
1232

M
Mr.doob 已提交
1233 1234 1235
				// According to COLLADA spec...
				// aspect_ratio = xfov / yfov
				// yfov = ( yfov === undefined && xfov ) ? xfov / aspect_ratio : yfov;
R
Rich Tibbett 已提交
1236

M
Mr.doob 已提交
1237 1238
				var _camera = new THREE.PerspectiveCamera( THREE.Math.radToDeg( xfov ), aspect_ratio, camera.perspective.znear || 1, camera.perspective.zfar || 2e6 );
				_camera.name = camera.name;
R
Rich Tibbett 已提交
1239

M
Mr.doob 已提交
1240
				return _camera;
R
Rich Tibbett 已提交
1241

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

M
Mr.doob 已提交
1244 1245
				var _camera = new THREE.OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, camera.orthographic.znear, camera.orthographic.zfar );
				_camera.name = camera.name;
R
Rich Tibbett 已提交
1246

M
Mr.doob 已提交
1247
				return _camera;
R
Rich Tibbett 已提交
1248

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

M
Mr.doob 已提交
1251
		}.bind( this ) );
R
Rich Tibbett 已提交
1252

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

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

M
Mr.doob 已提交
1257
		var scope = this;
R
Rich Tibbett 已提交
1258

M
Mr.doob 已提交
1259
		return this._withDependencies( [
R
Rich Tibbett 已提交
1260

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

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

M
Mr.doob 已提交
1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275
			return _each( scope.json.skins, function ( skin ) {

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

				return _skin;

			} );
R
Rich Tibbett 已提交
1276

M
Mr.doob 已提交
1277
		} );
R
Rich Tibbett 已提交
1278

M
Mr.doob 已提交
1279 1280
	};

1281 1282 1283


	GLTFParser.prototype.loadClips = function () {
R
Rich Tibbett 已提交
1284

M
Mr.doob 已提交
1285
		var scope = this;
R
Rich Tibbett 已提交
1286

M
Mr.doob 已提交
1287
		return this._withDependencies( [
R
Rich Tibbett 已提交
1288

M
Mr.doob 已提交
1289 1290
			"accessors",
			"nodes"
R
Rich Tibbett 已提交
1291

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

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

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

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

M
Mr.doob 已提交
1300
					var channel = animation.channels[ channelId ];
M
Mr.doob 已提交
1301 1302 1303
					var sampler = animation.samplers[ channel.sampler ];

					if ( sampler && animation.parameters ) {
R
Rich Tibbett 已提交
1304 1305 1306

						var target = channel.target;
						var name = target.id;
M
Mr.doob 已提交
1307 1308
						var input = animation.parameters[ sampler.input ];
						var output = animation.parameters[ sampler.output ];
R
Rich Tibbett 已提交
1309 1310 1311 1312 1313 1314 1315 1316 1317

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

						var node = dependencies.nodes[ name ];

						if ( node ) {

							var interp = {
1318
								times: inputAccessor.array,
M
Mr.doob 已提交
1319 1320
								values: outputAccessor.array,
								target: node,
1321 1322
								type: INTERPOLATION[ sampler.interpolation ],
								name: node.name + '.' + PATH_PROPERTIES[ target.path ]
R
Rich Tibbett 已提交
1323 1324 1325 1326 1327 1328
							};

							interps.push( interp );

						}

M
Mr.doob 已提交
1329
					}
R
Rich Tibbett 已提交
1330

M
Mr.doob 已提交
1331
				}
R
Rich Tibbett 已提交
1332

1333
				return createClip( "animation_" + animationId, interps );
R
Rich Tibbett 已提交
1334

M
Mr.doob 已提交
1335
			} );
R
Rich Tibbett 已提交
1336

M
Mr.doob 已提交
1337
		} );
R
Rich Tibbett 已提交
1338

M
Mr.doob 已提交
1339
	};
R
Rich Tibbett 已提交
1340

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

M
Mr.doob 已提交
1343
		return _each( this.json.nodes, function ( node ) {
R
Rich Tibbett 已提交
1344

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

M
Mr.doob 已提交
1347
			var _node;
R
Rich Tibbett 已提交
1348

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

M
Mr.doob 已提交
1351 1352
				_node = new THREE.Bone();
				_node.jointName = node.jointName;
R
Rich Tibbett 已提交
1353

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

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

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

M
Mr.doob 已提交
1360
			_node.name = node.name;
R
Rich Tibbett 已提交
1361

M
Mr.doob 已提交
1362
			_node.matrixAutoUpdate = false;
R
Rich Tibbett 已提交
1363

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

M
Mr.doob 已提交
1366 1367
				matrix.fromArray( node.matrix );
				_node.applyMatrix( matrix );
R
Rich Tibbett 已提交
1368

M
Mr.doob 已提交
1369
			} else {
R
Rich Tibbett 已提交
1370

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

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

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

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

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

M
Mr.doob 已提交
1381 1382 1383
				}

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

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

M
Mr.doob 已提交
1387
				}
R
Rich Tibbett 已提交
1388 1389 1390

			}

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

M
Mr.doob 已提交
1393
		}.bind( this ) ).then( function ( __nodes ) {
R
Rich Tibbett 已提交
1394

M
Mr.doob 已提交
1395
			return this._withDependencies( [
R
Rich Tibbett 已提交
1396

M
Mr.doob 已提交
1397 1398 1399 1400
				"meshes",
				"skins",
				"cameras",
				"extensions"
R
Rich Tibbett 已提交
1401

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

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

M
Mr.doob 已提交
1406
					var node = this.json.nodes[ nodeId ];
R
Rich Tibbett 已提交
1407

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

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

M
Mr.doob 已提交
1412 1413
							var mesh = node.meshes[ meshId ];
							var group = dependencies.meshes[ mesh ];
R
Rich Tibbett 已提交
1414

M
Mr.doob 已提交
1415 1416 1417
							for ( var childrenId in group.children ) {

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

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

M
Mr.doob 已提交
1421 1422
								var originalMaterial = child.material;
								var originalGeometry = child.geometry;
R
Rich Tibbett 已提交
1423

M
Mr.doob 已提交
1424
								var material;
R
Rich Tibbett 已提交
1425

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

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

M
Mr.doob 已提交
1430
								} else {
R
Rich Tibbett 已提交
1431

M
Mr.doob 已提交
1432
									material = originalMaterial;
R
Rich Tibbett 已提交
1433

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

M
Mr.doob 已提交
1436 1437
								child = new THREE.Mesh( originalGeometry, material );
								child.castShadow = true;
R
Rich Tibbett 已提交
1438

M
Mr.doob 已提交
1439
								var skinEntry;
M
Mr.doob 已提交
1440

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

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

M
Mr.doob 已提交
1445
								}
R
Rich Tibbett 已提交
1446

M
Mr.doob 已提交
1447 1448
								// Replace Mesh with SkinnedMesh in library
								if ( skinEntry ) {
R
Rich Tibbett 已提交
1449

M
Mr.doob 已提交
1450 1451 1452
									var geometry = originalGeometry;
									var material = originalMaterial;
									material.skinning = true;
R
Rich Tibbett 已提交
1453

M
Mr.doob 已提交
1454 1455
									child = new THREE.SkinnedMesh( geometry, material, false );
									child.castShadow = true;
R
Rich Tibbett 已提交
1456

M
Mr.doob 已提交
1457 1458
									var bones = [];
									var boneInverses = [];
R
Rich Tibbett 已提交
1459

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

M
Mr.doob 已提交
1462
										var jointId = skinEntry.jointNames[ i ];
M
Mr.doob 已提交
1463
										var jointNode = __nodes[ jointId ];
R
Rich Tibbett 已提交
1464

M
Mr.doob 已提交
1465
										if ( jointNode ) {
R
Rich Tibbett 已提交
1466

M
Mr.doob 已提交
1467
											jointNode.skin = child;
M
Mr.doob 已提交
1468
											bones.push( jointNode );
R
Rich Tibbett 已提交
1469

M
Mr.doob 已提交
1470 1471 1472
											var m = skinEntry.inverseBindMatrices.array;
											var mat = new THREE.Matrix4().fromArray( m, i * 16 );
											boneInverses.push( mat );
R
Rich Tibbett 已提交
1473

M
Mr.doob 已提交
1474
										} else {
R
Rich Tibbett 已提交
1475

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

M
Mr.doob 已提交
1478
										}
R
Rich Tibbett 已提交
1479

M
Mr.doob 已提交
1480
									}
R
Rich Tibbett 已提交
1481

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

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

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

M
Mr.doob 已提交
1488
							}
R
Rich Tibbett 已提交
1489

M
Mr.doob 已提交
1490
						}
R
Rich Tibbett 已提交
1491

M
Mr.doob 已提交
1492
					}
R
Rich Tibbett 已提交
1493

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

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

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

M
Mr.doob 已提交
1500
					}
R
Rich Tibbett 已提交
1501

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

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

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

M
Mr.doob 已提交
1508
					}
R
Rich Tibbett 已提交
1509

M
Mr.doob 已提交
1510
					return _node;
R
Rich Tibbett 已提交
1511

M
Mr.doob 已提交
1512
				}.bind( this ) );
R
Rich Tibbett 已提交
1513

M
Mr.doob 已提交
1514
			}.bind( this ) );
R
Rich Tibbett 已提交
1515

M
Mr.doob 已提交
1516
		}.bind( this ) );
R
Rich Tibbett 已提交
1517

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

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

M
Mr.doob 已提交
1522
		return _each( this.json.extensions, function ( extension, extensionId ) {
R
Rich Tibbett 已提交
1523

M
Mr.doob 已提交
1524
			switch ( extensionId ) {
R
Rich Tibbett 已提交
1525

M
Mr.doob 已提交
1526
				case "KHR_materials_common":
R
Rich Tibbett 已提交
1527

M
Mr.doob 已提交
1528 1529 1530
					var extensionNode = {
						lights: {}
					};
R
Rich Tibbett 已提交
1531

M
Mr.doob 已提交
1532
					var lights = extension.lights;
R
Rich Tibbett 已提交
1533

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

M
Mr.doob 已提交
1536
						var light = lights[ lightId ];
M
Mr.doob 已提交
1537
						var lightNode;
R
Rich Tibbett 已提交
1538

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

M
Mr.doob 已提交
1542 1543 1544 1545 1546 1547
						switch ( light.type ) {

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

M
Mr.doob 已提交
1549 1550 1551
							case "point":
								lightNode = new THREE.PointLight( color );
								break;
R
Rich Tibbett 已提交
1552

M
Mr.doob 已提交
1553 1554 1555 1556
							case "spot ":
								lightNode = new THREE.SpotLight( color );
								lightNode.position.set( 0, 0, 1 );
								break;
R
Rich Tibbett 已提交
1557

M
Mr.doob 已提交
1558 1559 1560
							case "ambient":
								lightNode = new THREE.AmbientLight( color );
								break;
R
Rich Tibbett 已提交
1561

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

M
Mr.doob 已提交
1564
						if ( lightNode ) {
R
Rich Tibbett 已提交
1565

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

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

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

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

M
Mr.doob 已提交
1574
					break;
R
Rich Tibbett 已提交
1575

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

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

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

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

M
Mr.doob 已提交
1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596
		var scope = this;

		// scene node hierachy builder

		function buildNodeHierachy( nodeId, parentObject, allNodes ) {

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

			var node = scope.json.nodes[ nodeId ];

			if ( node.children ) {

M
Mr.doob 已提交
1597 1598 1599
				var children = node.children;

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

M
Mr.doob 已提交
1601
					var child = children[ i ];
M
Mr.doob 已提交
1602 1603
					buildNodeHierachy( child, _node, allNodes );

M
Mr.doob 已提交
1604
				}
M
Mr.doob 已提交
1605 1606

			}
R
Rich Tibbett 已提交
1607 1608 1609

		}

M
Mr.doob 已提交
1610
		return this._withDependencies( [
R
Rich Tibbett 已提交
1611

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

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

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

M
Mr.doob 已提交
1618 1619
				var _scene = new THREE.Scene();
				_scene.name = scene.name;
R
Rich Tibbett 已提交
1620

M
Mr.doob 已提交
1621
				var nodes = scene.nodes;
R
Rich Tibbett 已提交
1622

M
Mr.doob 已提交
1623 1624 1625
				for ( var i = 0, l = nodes.length; i < l; i ++ ) {

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

M
Mr.doob 已提交
1628
				}
R
Rich Tibbett 已提交
1629

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

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

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

M
Mr.doob 已提交
1638 1639 1640 1641 1642 1643 1644
					}

				} );

				return _scene;

			} );
R
Rich Tibbett 已提交
1645

M
Mr.doob 已提交
1646 1647 1648
		} );

	};
R
Rich Tibbett 已提交
1649

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

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