瀏覽代碼

Merge pull request #11687 from Mugen87/dev3

BabylonLoader: Refactoring
Mr.doob 8 年之前
父節點
當前提交
5dfc1defc0
共有 1 個文件被更改,包括 118 次插入117 次删除
  1. 118 117
      examples/js/loaders/BabylonLoader.js

+ 118 - 117
examples/js/loaders/BabylonLoader.js

@@ -1,5 +1,6 @@
 /**
  * @author mrdoob / http://mrdoob.com/
+ * @author Mugen87 / https://github.com/Mugen87
  */
 
 THREE.BabylonLoader = function ( manager ) {
@@ -27,217 +28,217 @@ THREE.BabylonLoader.prototype = {
 
 	parse: function ( json ) {
 
-		var materials = this.parseMaterials( json );
-		var scene = this.parseObjects( json, materials );
+		function parseMaterials( json ) {
 
-		return scene;
-
-	},
+			var materials = {};
 
-	parseMaterials: function ( json ) {
+			for ( var i = 0, l = json.materials.length; i < l; i ++ ) {
 
-		var materials = {};
+				var data = json.materials[ i ];
 
-		for ( var i = 0, l = json.materials.length; i < l; i ++ ) {
+				var material = new THREE.MeshPhongMaterial();
+				material.name = data.name;
+				material.color.fromArray( data.diffuse );
+				material.emissive.fromArray( data.emissive );
+				material.specular.fromArray( data.specular );
+				material.shininess = data.specularPower;
+				material.opacity = data.alpha;
 
-			var data = json.materials[ i ];
+				materials[ data.id ] = material;
 
-			var material = new THREE.MeshPhongMaterial();
-			material.name = data.name;
-			material.color.fromArray( data.diffuse );
-			material.emissive.fromArray( data.emissive );
-			material.specular.fromArray( data.specular );
-			material.shininess = data.specularPower;
-			material.opacity = data.alpha;
-
-			materials[ data.id ] = material;
+			}
 
-		}
+			if ( json.multiMaterials ) {
 
-		if ( json.multiMaterials ) {
+				for ( var i = 0, l = json.multiMaterials.length; i < l; i ++ ) {
 
-			for ( var i = 0, l = json.multiMaterials.length; i < l; i ++ ) {
+					var data = json.multiMaterials[ i ];
 
-				var data = json.multiMaterials[ i ];
+					console.warn( 'THREE.BabylonLoader: Multi materials not yet supported.' );
 
-				console.warn( 'THREE.BabylonLoader: Multi materials not yet supported.' );
+					materials[ data.id ] = new THREE.MeshPhongMaterial();
 
-				materials[ data.id ] = new THREE.MeshPhongMaterial();
+				}
 
 			}
 
+			return materials;
+
 		}
 
-		return materials;
+		function parseGeometry( json ) {
 
-	},
+			var geometry = new THREE.BufferGeometry();
 
-	parseGeometry: function ( json ) {
+			var indices = json.indices;
+			var positions = json.positions;
+			var normals = json.normals;
+			var uvs = json.uvs;
 
-		var geometry = new THREE.BufferGeometry();
+			// indices
 
-		var indices = json.indices;
-		var positions = json.positions;
-		var normals = json.normals;
-		var uvs = json.uvs;
+			geometry.setIndex( indices );
 
-		// indices
+			// positions
 
-		geometry.setIndex( indices );
+			for ( var j = 2, jl = positions.length; j < jl; j += 3 ) {
 
-		// positions
+				positions[ j ] = - positions[ j ];
 
-		for ( var j = 2, jl = positions.length; j < jl; j += 3 ) {
+			}
 
-			positions[ j ] = - positions[ j ];
+			geometry.addAttribute( 'position', new THREE.Float32BufferAttribute( positions, 3 ) );
 
-		}
+			// normals
 
-		geometry.addAttribute( 'position', new THREE.Float32BufferAttribute( positions, 3 ) );
+			if ( normals ) {
 
-		// normals
+				for ( var j = 2, jl = normals.length; j < jl; j += 3 ) {
 
-		if ( normals ) {
+					normals[ j ] = - normals[ j ];
 
-			for ( var j = 2, jl = normals.length; j < jl; j += 3 ) {
+				}
 
-				normals[ j ] = - normals[ j ];
+				geometry.addAttribute( 'normal', new THREE.Float32BufferAttribute( normals, 3 ) );
 
 			}
 
-			geometry.addAttribute( 'normal', new THREE.Float32BufferAttribute( normals, 3 ) );
-
-		}
+			// uvs
 
-		// uvs
+			if ( uvs ) {
 
-		if ( uvs ) {
+				geometry.addAttribute( 'uv', new THREE.Float32BufferAttribute( uvs, 2 ) );
 
-			geometry.addAttribute( 'uv', new THREE.Float32BufferAttribute( uvs, 2 ) );
+			}
 
-		}
+			// offsets
 
-		// offsets
+			var subMeshes = json.subMeshes;
 
-		var subMeshes = json.subMeshes;
+			if ( subMeshes ) {
 
-		if ( subMeshes ) {
+				for ( var j = 0, jl = subMeshes.length; j < jl; j ++ ) {
 
-			for ( var j = 0, jl = subMeshes.length; j < jl; j ++ ) {
+					var subMesh = subMeshes[ j ];
 
-				var subMesh = subMeshes[ j ];
+					geometry.addGroup( subMesh.indexStart, subMesh.indexCount );
 
-				geometry.addGroup( subMesh.indexStart, subMesh.indexCount );
+				}
 
 			}
 
+			return geometry;
+
 		}
 
-		return geometry;
+		function parseObjects( json, materials ) {
 
-	},
+			var objects = {};
+			var scene = new THREE.Scene();
 
-	parseObjects: function ( json, materials ) {
+			var cameras = json.cameras;
 
-		var objects = {};
-		var scene = new THREE.Scene();
+			for ( var i = 0, l = cameras.length; i < l; i ++ ) {
 
-		var cameras = json.cameras;
+				var data = cameras[ i ];
 
-		for ( var i = 0, l = cameras.length; i < l; i ++ ) {
+				var camera = new THREE.PerspectiveCamera( ( data.fov / Math.PI ) * 180, 1.33, data.minZ, data.maxZ );
 
-			var data = cameras[ i ];
+				camera.name = data.name;
+				camera.position.fromArray( data.position );
+				if ( data.rotation ) camera.rotation.fromArray( data.rotation );
 
-			var camera = new THREE.PerspectiveCamera( ( data.fov / Math.PI ) * 180, 1.33, data.minZ, data.maxZ );
+				objects[ data.id ] = camera;
 
-			camera.name = data.name;
-			camera.position.fromArray( data.position );
-			if ( data.rotation ) camera.rotation.fromArray( data.rotation );
+			}
 
-			objects[ data.id ] = camera;
+			var lights = json.lights;
 
-		}
+			for ( var i = 0, l = lights.length; i < l; i ++ ) {
 
-		var lights = json.lights;
+				var data = lights[ i ];
 
-		for ( var i = 0, l = lights.length; i < l; i ++ ) {
+				var light;
 
-			var data = lights[ i ];
+				switch ( data.type ) {
 
-			var light;
+					case 0:
+						light = new THREE.PointLight();
+						break;
 
-			switch ( data.type ) {
+					case 1:
+						light = new THREE.DirectionalLight();
+						break;
 
-				case 0:
-					light = new THREE.PointLight();
-					break;
+					case 2:
+						light = new THREE.SpotLight();
+						break;
 
-				case 1:
-					light = new THREE.DirectionalLight();
-					break;
+					case 3:
+						light = new THREE.HemisphereLight();
+						break;
+				}
 
-				case 2:
-					light = new THREE.SpotLight();
-					break;
+				light.name = data.name;
+				if ( data.position ) light.position.set( data.position[ 0 ], data.position[ 1 ], - data.position[ 2 ] );
+				light.color.fromArray( data.diffuse );
+				if ( data.groundColor ) light.groundColor.fromArray( data.groundColor );
+				if ( data.intensity ) light.intensity = data.intensity;
 
-				case 3:
-					light = new THREE.HemisphereLight();
-					break;
-			}
+				objects[ data.id ] = light;
 
-			light.name = data.name;
-			if ( data.position ) light.position.set( data.position[ 0 ], data.position[ 1 ], - data.position[ 2 ] );
-			light.color.fromArray( data.diffuse );
-			if ( data.groundColor ) light.groundColor.fromArray( data.groundColor );
-			if ( data.intensity ) light.intensity = data.intensity;
+				scene.add( light );
 
-			objects[ data.id ] = light;
+			}
 
-			scene.add( light );
+			var meshes = json.meshes;
 
-		}
+			for ( var i = 0, l = meshes.length; i < l; i ++ ) {
 
-		var meshes = json.meshes;
+				var data = meshes[ i ];
 
-		for ( var i = 0, l = meshes.length; i < l; i ++ ) {
+				var object;
 
-			var data = meshes[ i ];
+				if ( data.indices ) {
 
-			var object;
+					var geometry = parseGeometry( data );
 
-			if ( data.indices ) {
+					object = new THREE.Mesh( geometry, materials[ data.materialId ] );
 
-				var geometry = this.parseGeometry( data );
+				} else {
 
-				object = new THREE.Mesh( geometry, materials[ data.materialId ] );
+					object = new THREE.Group();
 
-			} else {
+				}
 
-				object = new THREE.Group();
+				object.name = data.name;
+				object.position.set( data.position[ 0 ], data.position[ 1 ], - data.position[ 2 ] );
+				object.rotation.fromArray( data.rotation );
+				if ( data.rotationQuaternion ) object.quaternion.fromArray( data.rotationQuaternion );
+				object.scale.fromArray( data.scaling );
+				// object.visible = data.isVisible;
 
-			}
+				if ( data.parentId ) {
 
-			object.name = data.name;
-			object.position.set( data.position[ 0 ], data.position[ 1 ], - data.position[ 2 ] );
-			object.rotation.fromArray( data.rotation );
-			if ( data.rotationQuaternion ) object.quaternion.fromArray( data.rotationQuaternion );
-			object.scale.fromArray( data.scaling );
-			// object.visible = data.isVisible;
+					objects[ data.parentId ].add( object );
 
-			if ( data.parentId ) {
+				} else {
 
-				objects[ data.parentId ].add( object );
+					scene.add( object );
 
-			} else {
+				}
 
-				scene.add( object );
+				objects[ data.id ] = object;
 
 			}
 
-			objects[ data.id ] = object;
+			return scene;
 
 		}
 
+		var materials = parseMaterials( json );
+		var scene = parseObjects( json, materials );
+
 		return scene;
 
 	}