mirror of
				https://github.com/jiawanlong/Cesium-Examples.git
				synced 2025-11-04 09:14:17 +00:00 
			
		
		
		
	
		
			
	
	
		
			822 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			822 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @author mrdoob / http://mrdoob.com/
							 | 
						||
| 
								 | 
							
								 * @author alteredq / http://alteredqualia.com/
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								THREE.LegacyJSONLoader = ( function () {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									function LegacyJSONLoader( manager ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if ( typeof manager === 'boolean' ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											console.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );
							 | 
						||
| 
								 | 
							
											manager = undefined;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										THREE.Loader.call( this, manager );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										this.withCredentials = false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									LegacyJSONLoader.prototype = Object.assign( Object.create( THREE.Loader.prototype ), {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										constructor: LegacyJSONLoader,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										load: function ( url, onLoad, onProgress, onError ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											var scope = this;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											var path = ( this.path === '' ) ? THREE.LoaderUtils.extractUrlBase( url ) : this.path;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											var loader = new THREE.FileLoader( this.manager );
							 | 
						||
| 
								 | 
							
											loader.setPath( this.path );
							 | 
						||
| 
								 | 
							
											loader.setWithCredentials( this.withCredentials );
							 | 
						||
| 
								 | 
							
											loader.load( url, function ( text ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												var json = JSON.parse( text );
							 | 
						||
| 
								 | 
							
												var metadata = json.metadata;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if ( metadata !== undefined ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													var type = metadata.type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													if ( type !== undefined ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														if ( type.toLowerCase() === 'object' ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															console.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );
							 | 
						||
| 
								 | 
							
															return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												var object = scope.parse( json, path );
							 | 
						||
| 
								 | 
							
												onLoad( object.geometry, object.materials );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											}, onProgress, onError );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										parse: ( function () {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											var _BlendingMode = {
							 | 
						||
| 
								 | 
							
												NoBlending: THREE.NoBlending,
							 | 
						||
| 
								 | 
							
												NormalBlending: THREE.NormalBlending,
							 | 
						||
| 
								 | 
							
												AdditiveBlending: THREE.AdditiveBlending,
							 | 
						||
| 
								 | 
							
												SubtractiveBlending: THREE.SubtractiveBlending,
							 | 
						||
| 
								 | 
							
												MultiplyBlending: THREE.MultiplyBlending,
							 | 
						||
| 
								 | 
							
												CustomBlending: THREE.CustomBlending
							 | 
						||
| 
								 | 
							
											};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											var _color = new THREE.Color();
							 | 
						||
| 
								 | 
							
											var _textureLoader = new THREE.TextureLoader();
							 | 
						||
| 
								 | 
							
											var _materialLoader = new THREE.MaterialLoader();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											function initMaterials( materials, texturePath, crossOrigin, manager ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												var array = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												for ( var i = 0; i < materials.length; ++ i ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													array[ i ] = createMaterial( materials[ i ], texturePath, crossOrigin, manager );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												return array;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											function createMaterial( m, texturePath, crossOrigin, manager ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												// convert from old material format
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												var textures = {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												var json = {
							 | 
						||
| 
								 | 
							
													uuid: THREE.Math.generateUUID(),
							 | 
						||
| 
								 | 
							
													type: 'MeshLambertMaterial'
							 | 
						||
| 
								 | 
							
												};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												for ( var name in m ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													var value = m[ name ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													switch ( name ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														case 'DbgColor':
							 | 
						||
| 
								 | 
							
														case 'DbgIndex':
							 | 
						||
| 
								 | 
							
														case 'opticalDensity':
							 | 
						||
| 
								 | 
							
														case 'illumination':
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'DbgName':
							 | 
						||
| 
								 | 
							
															json.name = value;
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'blending':
							 | 
						||
| 
								 | 
							
															json.blending = _BlendingMode[ value ];
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'colorAmbient':
							 | 
						||
| 
								 | 
							
														case 'mapAmbient':
							 | 
						||
| 
								 | 
							
															console.warn( 'THREE.LegacyJSONLoader.createMaterial:', name, 'is no longer supported.' );
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'colorDiffuse':
							 | 
						||
| 
								 | 
							
															json.color = _color.fromArray( value ).getHex();
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'colorSpecular':
							 | 
						||
| 
								 | 
							
															json.specular = _color.fromArray( value ).getHex();
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'colorEmissive':
							 | 
						||
| 
								 | 
							
															json.emissive = _color.fromArray( value ).getHex();
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'specularCoef':
							 | 
						||
| 
								 | 
							
															json.shininess = value;
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'shading':
							 | 
						||
| 
								 | 
							
															if ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';
							 | 
						||
| 
								 | 
							
															if ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';
							 | 
						||
| 
								 | 
							
															if ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'mapDiffuse':
							 | 
						||
| 
								 | 
							
															json.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy, textures, texturePath, crossOrigin, manager );
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'mapDiffuseRepeat':
							 | 
						||
| 
								 | 
							
														case 'mapDiffuseOffset':
							 | 
						||
| 
								 | 
							
														case 'mapDiffuseWrap':
							 | 
						||
| 
								 | 
							
														case 'mapDiffuseAnisotropy':
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'mapEmissive':
							 | 
						||
| 
								 | 
							
															json.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy, textures, texturePath, crossOrigin, manager );
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'mapEmissiveRepeat':
							 | 
						||
| 
								 | 
							
														case 'mapEmissiveOffset':
							 | 
						||
| 
								 | 
							
														case 'mapEmissiveWrap':
							 | 
						||
| 
								 | 
							
														case 'mapEmissiveAnisotropy':
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'mapLight':
							 | 
						||
| 
								 | 
							
															json.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy, textures, texturePath, crossOrigin, manager );
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'mapLightRepeat':
							 | 
						||
| 
								 | 
							
														case 'mapLightOffset':
							 | 
						||
| 
								 | 
							
														case 'mapLightWrap':
							 | 
						||
| 
								 | 
							
														case 'mapLightAnisotropy':
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'mapAO':
							 | 
						||
| 
								 | 
							
															json.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy, textures, texturePath, crossOrigin, manager );
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'mapAORepeat':
							 | 
						||
| 
								 | 
							
														case 'mapAOOffset':
							 | 
						||
| 
								 | 
							
														case 'mapAOWrap':
							 | 
						||
| 
								 | 
							
														case 'mapAOAnisotropy':
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'mapBump':
							 | 
						||
| 
								 | 
							
															json.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy, textures, texturePath, crossOrigin, manager );
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'mapBumpScale':
							 | 
						||
| 
								 | 
							
															json.bumpScale = value;
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'mapBumpRepeat':
							 | 
						||
| 
								 | 
							
														case 'mapBumpOffset':
							 | 
						||
| 
								 | 
							
														case 'mapBumpWrap':
							 | 
						||
| 
								 | 
							
														case 'mapBumpAnisotropy':
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'mapNormal':
							 | 
						||
| 
								 | 
							
															json.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy, textures, texturePath, crossOrigin, manager );
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'mapNormalFactor':
							 | 
						||
| 
								 | 
							
															json.normalScale = value;
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'mapNormalRepeat':
							 | 
						||
| 
								 | 
							
														case 'mapNormalOffset':
							 | 
						||
| 
								 | 
							
														case 'mapNormalWrap':
							 | 
						||
| 
								 | 
							
														case 'mapNormalAnisotropy':
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'mapSpecular':
							 | 
						||
| 
								 | 
							
															json.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy, textures, texturePath, crossOrigin, manager );
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'mapSpecularRepeat':
							 | 
						||
| 
								 | 
							
														case 'mapSpecularOffset':
							 | 
						||
| 
								 | 
							
														case 'mapSpecularWrap':
							 | 
						||
| 
								 | 
							
														case 'mapSpecularAnisotropy':
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'mapMetalness':
							 | 
						||
| 
								 | 
							
															json.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy, textures, texturePath, crossOrigin, manager );
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'mapMetalnessRepeat':
							 | 
						||
| 
								 | 
							
														case 'mapMetalnessOffset':
							 | 
						||
| 
								 | 
							
														case 'mapMetalnessWrap':
							 | 
						||
| 
								 | 
							
														case 'mapMetalnessAnisotropy':
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'mapRoughness':
							 | 
						||
| 
								 | 
							
															json.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy, textures, texturePath, crossOrigin, manager );
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'mapRoughnessRepeat':
							 | 
						||
| 
								 | 
							
														case 'mapRoughnessOffset':
							 | 
						||
| 
								 | 
							
														case 'mapRoughnessWrap':
							 | 
						||
| 
								 | 
							
														case 'mapRoughnessAnisotropy':
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'mapAlpha':
							 | 
						||
| 
								 | 
							
															json.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy, textures, texturePath, crossOrigin, manager );
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'mapAlphaRepeat':
							 | 
						||
| 
								 | 
							
														case 'mapAlphaOffset':
							 | 
						||
| 
								 | 
							
														case 'mapAlphaWrap':
							 | 
						||
| 
								 | 
							
														case 'mapAlphaAnisotropy':
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'flipSided':
							 | 
						||
| 
								 | 
							
															json.side = THREE.BackSide;
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'doubleSided':
							 | 
						||
| 
								 | 
							
															json.side = THREE.DoubleSide;
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'transparency':
							 | 
						||
| 
								 | 
							
															console.warn( 'THREE.LegacyJSONLoader.createMaterial: transparency has been renamed to opacity' );
							 | 
						||
| 
								 | 
							
															json.opacity = value;
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'depthTest':
							 | 
						||
| 
								 | 
							
														case 'depthWrite':
							 | 
						||
| 
								 | 
							
														case 'colorWrite':
							 | 
						||
| 
								 | 
							
														case 'opacity':
							 | 
						||
| 
								 | 
							
														case 'reflectivity':
							 | 
						||
| 
								 | 
							
														case 'transparent':
							 | 
						||
| 
								 | 
							
														case 'visible':
							 | 
						||
| 
								 | 
							
														case 'wireframe':
							 | 
						||
| 
								 | 
							
															json[ name ] = value;
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														case 'vertexColors':
							 | 
						||
| 
								 | 
							
															if ( value === true ) json.vertexColors = THREE.VertexColors;
							 | 
						||
| 
								 | 
							
															if ( value === 'face' ) json.vertexColors = THREE.FaceColors;
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
														default:
							 | 
						||
| 
								 | 
							
															console.error( 'THREE.LegacyJSONLoader.createMaterial: Unsupported', name, value );
							 | 
						||
| 
								 | 
							
															break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if ( json.type === 'MeshBasicMaterial' ) delete json.emissive;
							 | 
						||
| 
								 | 
							
												if ( json.type !== 'MeshPhongMaterial' ) delete json.specular;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if ( json.opacity < 1 ) json.transparent = true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												_materialLoader.setTextures( textures );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												return _materialLoader.parse( json );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											function loadTexture( path, repeat, offset, wrap, anisotropy, textures, texturePath, crossOrigin, manager ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												var fullPath = texturePath + path;
							 | 
						||
| 
								 | 
							
												var loader = manager.getHandler( fullPath );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												var texture;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if ( loader !== null ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													texture = loader.load( fullPath );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												} else {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													_textureLoader.setCrossOrigin( crossOrigin );
							 | 
						||
| 
								 | 
							
													texture = _textureLoader.load( fullPath );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if ( repeat !== undefined ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													texture.repeat.fromArray( repeat );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													if ( repeat[ 0 ] !== 1 ) texture.wrapS = THREE.RepeatWrapping;
							 | 
						||
| 
								 | 
							
													if ( repeat[ 1 ] !== 1 ) texture.wrapT = THREE.RepeatWrapping;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if ( offset !== undefined ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													texture.offset.fromArray( offset );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if ( wrap !== undefined ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													if ( wrap[ 0 ] === 'repeat' ) texture.wrapS = THREE.RepeatWrapping;
							 | 
						||
| 
								 | 
							
													if ( wrap[ 0 ] === 'mirror' ) texture.wrapS = THREE.MirroredRepeatWrapping;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													if ( wrap[ 1 ] === 'repeat' ) texture.wrapT = THREE.RepeatWrapping;
							 | 
						||
| 
								 | 
							
													if ( wrap[ 1 ] === 'mirror' ) texture.wrapT = THREE.MirroredRepeatWrapping;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if ( anisotropy !== undefined ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													texture.anisotropy = anisotropy;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												var uuid = THREE.Math.generateUUID();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												textures[ uuid ] = texture;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												return uuid;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											function parseModel( json, geometry ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												function isBitSet( value, position ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													return value & ( 1 << position );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												var i, j, fi,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													offset, zLength,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													colorIndex, normalIndex, uvIndex, materialIndex,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													type,
							 | 
						||
| 
								 | 
							
													isQuad,
							 | 
						||
| 
								 | 
							
													hasMaterial,
							 | 
						||
| 
								 | 
							
													hasFaceVertexUv,
							 | 
						||
| 
								 | 
							
													hasFaceNormal, hasFaceVertexNormal,
							 | 
						||
| 
								 | 
							
													hasFaceColor, hasFaceVertexColor,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													vertex, face, faceA, faceB, hex, normal,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													uvLayer, uv, u, v,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													faces = json.faces,
							 | 
						||
| 
								 | 
							
													vertices = json.vertices,
							 | 
						||
| 
								 | 
							
													normals = json.normals,
							 | 
						||
| 
								 | 
							
													colors = json.colors,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													scale = json.scale,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													nUvLayers = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if ( json.uvs !== undefined ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													// disregard empty arrays
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													for ( i = 0; i < json.uvs.length; i ++ ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														if ( json.uvs[ i ].length ) nUvLayers ++;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													for ( i = 0; i < nUvLayers; i ++ ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														geometry.faceVertexUvs[ i ] = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												offset = 0;
							 | 
						||
| 
								 | 
							
												zLength = vertices.length;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												while ( offset < zLength ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													vertex = new THREE.Vector3();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													vertex.x = vertices[ offset ++ ] * scale;
							 | 
						||
| 
								 | 
							
													vertex.y = vertices[ offset ++ ] * scale;
							 | 
						||
| 
								 | 
							
													vertex.z = vertices[ offset ++ ] * scale;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													geometry.vertices.push( vertex );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												offset = 0;
							 | 
						||
| 
								 | 
							
												zLength = faces.length;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												while ( offset < zLength ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													type = faces[ offset ++ ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													isQuad = isBitSet( type, 0 );
							 | 
						||
| 
								 | 
							
													hasMaterial = isBitSet( type, 1 );
							 | 
						||
| 
								 | 
							
													hasFaceVertexUv = isBitSet( type, 3 );
							 | 
						||
| 
								 | 
							
													hasFaceNormal = isBitSet( type, 4 );
							 | 
						||
| 
								 | 
							
													hasFaceVertexNormal = isBitSet( type, 5 );
							 | 
						||
| 
								 | 
							
													hasFaceColor = isBitSet( type, 6 );
							 | 
						||
| 
								 | 
							
													hasFaceVertexColor = isBitSet( type, 7 );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													// console.log("type", type, "bits", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													if ( isQuad ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														faceA = new THREE.Face3();
							 | 
						||
| 
								 | 
							
														faceA.a = faces[ offset ];
							 | 
						||
| 
								 | 
							
														faceA.b = faces[ offset + 1 ];
							 | 
						||
| 
								 | 
							
														faceA.c = faces[ offset + 3 ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														faceB = new THREE.Face3();
							 | 
						||
| 
								 | 
							
														faceB.a = faces[ offset + 1 ];
							 | 
						||
| 
								 | 
							
														faceB.b = faces[ offset + 2 ];
							 | 
						||
| 
								 | 
							
														faceB.c = faces[ offset + 3 ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														offset += 4;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														if ( hasMaterial ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															materialIndex = faces[ offset ++ ];
							 | 
						||
| 
								 | 
							
															faceA.materialIndex = materialIndex;
							 | 
						||
| 
								 | 
							
															faceB.materialIndex = materialIndex;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														// to get face <=> uv index correspondence
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														fi = geometry.faces.length;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														if ( hasFaceVertexUv ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															for ( i = 0; i < nUvLayers; i ++ ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																uvLayer = json.uvs[ i ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																geometry.faceVertexUvs[ i ][ fi ] = [];
							 | 
						||
| 
								 | 
							
																geometry.faceVertexUvs[ i ][ fi + 1 ] = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																for ( j = 0; j < 4; j ++ ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																	uvIndex = faces[ offset ++ ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																	u = uvLayer[ uvIndex * 2 ];
							 | 
						||
| 
								 | 
							
																	v = uvLayer[ uvIndex * 2 + 1 ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																	uv = new THREE.Vector2( u, v );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																	if ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );
							 | 
						||
| 
								 | 
							
																	if ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														if ( hasFaceNormal ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															normalIndex = faces[ offset ++ ] * 3;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															faceA.normal.set(
							 | 
						||
| 
								 | 
							
																normals[ normalIndex ++ ],
							 | 
						||
| 
								 | 
							
																normals[ normalIndex ++ ],
							 | 
						||
| 
								 | 
							
																normals[ normalIndex ]
							 | 
						||
| 
								 | 
							
															);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															faceB.normal.copy( faceA.normal );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														if ( hasFaceVertexNormal ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															for ( i = 0; i < 4; i ++ ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																normalIndex = faces[ offset ++ ] * 3;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																normal = new THREE.Vector3(
							 | 
						||
| 
								 | 
							
																	normals[ normalIndex ++ ],
							 | 
						||
| 
								 | 
							
																	normals[ normalIndex ++ ],
							 | 
						||
| 
								 | 
							
																	normals[ normalIndex ]
							 | 
						||
| 
								 | 
							
																);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																if ( i !== 2 ) faceA.vertexNormals.push( normal );
							 | 
						||
| 
								 | 
							
																if ( i !== 0 ) faceB.vertexNormals.push( normal );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														if ( hasFaceColor ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															colorIndex = faces[ offset ++ ];
							 | 
						||
| 
								 | 
							
															hex = colors[ colorIndex ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															faceA.color.setHex( hex );
							 | 
						||
| 
								 | 
							
															faceB.color.setHex( hex );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														if ( hasFaceVertexColor ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															for ( i = 0; i < 4; i ++ ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																colorIndex = faces[ offset ++ ];
							 | 
						||
| 
								 | 
							
																hex = colors[ colorIndex ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																if ( i !== 2 ) faceA.vertexColors.push( new THREE.Color( hex ) );
							 | 
						||
| 
								 | 
							
																if ( i !== 0 ) faceB.vertexColors.push( new THREE.Color( hex ) );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														geometry.faces.push( faceA );
							 | 
						||
| 
								 | 
							
														geometry.faces.push( faceB );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													} else {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														face = new THREE.Face3();
							 | 
						||
| 
								 | 
							
														face.a = faces[ offset ++ ];
							 | 
						||
| 
								 | 
							
														face.b = faces[ offset ++ ];
							 | 
						||
| 
								 | 
							
														face.c = faces[ offset ++ ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														if ( hasMaterial ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															materialIndex = faces[ offset ++ ];
							 | 
						||
| 
								 | 
							
															face.materialIndex = materialIndex;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														// to get face <=> uv index correspondence
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														fi = geometry.faces.length;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														if ( hasFaceVertexUv ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															for ( i = 0; i < nUvLayers; i ++ ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																uvLayer = json.uvs[ i ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																geometry.faceVertexUvs[ i ][ fi ] = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																for ( j = 0; j < 3; j ++ ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																	uvIndex = faces[ offset ++ ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																	u = uvLayer[ uvIndex * 2 ];
							 | 
						||
| 
								 | 
							
																	v = uvLayer[ uvIndex * 2 + 1 ];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																	uv = new THREE.Vector2( u, v );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																	geometry.faceVertexUvs[ i ][ fi ].push( uv );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														if ( hasFaceNormal ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															normalIndex = faces[ offset ++ ] * 3;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															face.normal.set(
							 | 
						||
| 
								 | 
							
																normals[ normalIndex ++ ],
							 | 
						||
| 
								 | 
							
																normals[ normalIndex ++ ],
							 | 
						||
| 
								 | 
							
																normals[ normalIndex ]
							 | 
						||
| 
								 | 
							
															);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														if ( hasFaceVertexNormal ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															for ( i = 0; i < 3; i ++ ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																normalIndex = faces[ offset ++ ] * 3;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																normal = new THREE.Vector3(
							 | 
						||
| 
								 | 
							
																	normals[ normalIndex ++ ],
							 | 
						||
| 
								 | 
							
																	normals[ normalIndex ++ ],
							 | 
						||
| 
								 | 
							
																	normals[ normalIndex ]
							 | 
						||
| 
								 | 
							
																);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																face.vertexNormals.push( normal );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														if ( hasFaceColor ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															colorIndex = faces[ offset ++ ];
							 | 
						||
| 
								 | 
							
															face.color.setHex( colors[ colorIndex ] );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														if ( hasFaceVertexColor ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															for ( i = 0; i < 3; i ++ ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
																colorIndex = faces[ offset ++ ];
							 | 
						||
| 
								 | 
							
																face.vertexColors.push( new THREE.Color( colors[ colorIndex ] ) );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														geometry.faces.push( face );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											function parseSkin( json, geometry ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												var influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if ( json.skinWeights ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													for ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														var x = json.skinWeights[ i ];
							 | 
						||
| 
								 | 
							
														var y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;
							 | 
						||
| 
								 | 
							
														var z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;
							 | 
						||
| 
								 | 
							
														var w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														geometry.skinWeights.push( new THREE.Vector4( x, y, z, w ) );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if ( json.skinIndices ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													for ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														var a = json.skinIndices[ i ];
							 | 
						||
| 
								 | 
							
														var b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;
							 | 
						||
| 
								 | 
							
														var c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;
							 | 
						||
| 
								 | 
							
														var d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														geometry.skinIndices.push( new THREE.Vector4( a, b, c, d ) );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												geometry.bones = json.bones;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													console.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +
							 | 
						||
| 
								 | 
							
														geometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											function parseMorphing( json, geometry ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												var scale = json.scale;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if ( json.morphTargets !== undefined ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													for ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														geometry.morphTargets[ i ] = {};
							 | 
						||
| 
								 | 
							
														geometry.morphTargets[ i ].name = json.morphTargets[ i ].name;
							 | 
						||
| 
								 | 
							
														geometry.morphTargets[ i ].vertices = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														var dstVertices = geometry.morphTargets[ i ].vertices;
							 | 
						||
| 
								 | 
							
														var srcVertices = json.morphTargets[ i ].vertices;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														for ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															var vertex = new THREE.Vector3();
							 | 
						||
| 
								 | 
							
															vertex.x = srcVertices[ v ] * scale;
							 | 
						||
| 
								 | 
							
															vertex.y = srcVertices[ v + 1 ] * scale;
							 | 
						||
| 
								 | 
							
															vertex.z = srcVertices[ v + 2 ] * scale;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
															dstVertices.push( vertex );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if ( json.morphColors !== undefined && json.morphColors.length > 0 ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													console.warn( 'THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.' );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													var faces = geometry.faces;
							 | 
						||
| 
								 | 
							
													var morphColors = json.morphColors[ 0 ].colors;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													for ( var i = 0, l = faces.length; i < l; i ++ ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														faces[ i ].color.fromArray( morphColors, i * 3 );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											function parseAnimations( json, geometry ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												var outputAnimations = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												// parse old style Bone/Hierarchy animations
							 | 
						||
| 
								 | 
							
												var animations = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if ( json.animation !== undefined ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													animations.push( json.animation );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if ( json.animations !== undefined ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													if ( json.animations.length ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														animations = animations.concat( json.animations );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													} else {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
														animations.push( json.animations );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												for ( var i = 0; i < animations.length; i ++ ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													var clip = THREE.AnimationClip.parseAnimation( animations[ i ], geometry.bones );
							 | 
						||
| 
								 | 
							
													if ( clip ) outputAnimations.push( clip );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												// parse implicit morph animations
							 | 
						||
| 
								 | 
							
												if ( geometry.morphTargets ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													// TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary.
							 | 
						||
| 
								 | 
							
													var morphAnimationClips = THREE.AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );
							 | 
						||
| 
								 | 
							
													outputAnimations = outputAnimations.concat( morphAnimationClips );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											return function parse( json, path ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if ( json.data !== undefined ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													// Geometry 4.0 spec
							 | 
						||
| 
								 | 
							
													json = json.data;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if ( json.scale !== undefined ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													json.scale = 1.0 / json.scale;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												} else {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													json.scale = 1.0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												var geometry = new THREE.Geometry();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												parseModel( json, geometry );
							 | 
						||
| 
								 | 
							
												parseSkin( json, geometry );
							 | 
						||
| 
								 | 
							
												parseMorphing( json, geometry );
							 | 
						||
| 
								 | 
							
												parseAnimations( json, geometry );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												geometry.computeFaceNormals();
							 | 
						||
| 
								 | 
							
												geometry.computeBoundingSphere();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												if ( json.materials === undefined || json.materials.length === 0 ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													return { geometry: geometry };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												} else {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													var materials = initMaterials( json.materials, this.resourcePath || path, this.crossOrigin, this.manager );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
													return { geometry: geometry, materials: materials };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										} )()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									} );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return LegacyJSONLoader;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								} )();
							 |