Răsfoiți Sursa

BabylonLoader: Robustness.

Mr.doob 10 ani în urmă
părinte
comite
abab2483f5
1 a modificat fișierele cu 110 adăugiri și 62 ștergeri
  1. 110 62
      examples/js/loaders/BabylonLoader.js

+ 110 - 62
examples/js/loaders/BabylonLoader.js

@@ -34,7 +34,7 @@ THREE.BabylonLoader.prototype = {
 
 
 	parse: function ( json ) {
 	parse: function ( json ) {
 
 
-		var materials = this.parseMaterials( json.materials );
+		var materials = this.parseMaterials( json );
 		var scene = this.parseObjects( json, materials );
 		var scene = this.parseObjects( json, materials );
 
 
 		return scene;
 		return scene;
@@ -45,9 +45,9 @@ THREE.BabylonLoader.prototype = {
 
 
 		var materials = {};
 		var materials = {};
 
 
-		for ( var i = 0, l = json.length; i < l; i ++ ) {
+		for ( var i = 0, l = json.materials.length; i < l; i ++ ) {
 
 
-			var data = json[ i ];
+			var data = json.materials[ i ];
 
 
 			var material = new THREE.MeshPhongMaterial();
 			var material = new THREE.MeshPhongMaterial();
 			material.name = data.name;
 			material.name = data.name;
@@ -62,15 +62,117 @@ THREE.BabylonLoader.prototype = {
 
 
 		}
 		}
 
 
+		if ( json.multiMaterials ) {
+
+			for ( var i = 0, l = json.multiMaterials.length; i < l; i ++ ) {
+
+				var data = json.multiMaterials[ i ];
+
+				console.warn( 'THREE.BabylonLoader: Multi materials not yet supported.' );
+
+				materials[ data.id ] = new THREE.MeshPhongMaterial();
+
+			}
+
+		}
+
 		return materials;
 		return materials;
 
 
 	},
 	},
 
 
+	parseGeometry: function ( json ) {
+
+		var geometry = new THREE.BufferGeometry();
+
+		// indices
+
+		var indices = new Uint16Array( json.indices );
+
+		geometry.addAttribute( 'index', new THREE.BufferAttribute( indices, 1 ) );
+
+		// positions
+
+		var positions = new Float32Array( json.positions );
+
+		for ( var j = 2, jl = positions.length; j < jl; j += 3 ) {
+
+			positions[ j ] = - positions[ j ];
+
+		}
+
+		geometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );
+
+		// normals
+
+		if ( json.normals ) {
+
+			var normals = new Float32Array( json.normals );
+
+			for ( var j = 2, jl = normals.length; j < jl; j += 3 ) {
+
+				normals[ j ] = - normals[ j ];
+
+			}
+
+			geometry.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ) );
+
+		}
+
+		// uvs
+
+		if ( json.uvs ) {
+
+			var uvs = new Float32Array( json.uvs );
+
+			geometry.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ) );
+
+		}
+
+		// offsets
+
+		var subMeshes = json.subMeshes;
+
+		if ( subMeshes ) {
+
+			for ( var j = 0, jl = subMeshes.length; j < jl; j ++ ) {
+
+				var subMesh = subMeshes[ j ];
+
+				geometry.addDrawCall( subMesh.indexStart, subMesh.indexCount );
+
+			}
+
+		} else {
+
+			geometry.addDrawCall( 0, json.indices.length );
+
+		}
+
+		return geometry;
+
+	},
+
 	parseObjects: function ( json, materials ) {
 	parseObjects: function ( json, materials ) {
 
 
 		var objects = {};
 		var objects = {};
 		var scene = new THREE.Scene();
 		var scene = new THREE.Scene();
 
 
+		var cameras = json.cameras;
+
+		for ( var i = 0, l = cameras.length; i < l; i ++ ) {
+
+			var data = cameras[ i ];
+
+			var camera = new THREE.PerspectiveCamera( ( data.fov / Math.PI ) * 180, 1.33, data.minZ, data.maxZ );
+
+			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;
 		var lights = json.lights;
 
 
 		for ( var i = 0, l = lights.length; i < l; i ++ ) {
 		for ( var i = 0, l = lights.length; i < l; i ++ ) {
@@ -117,65 +219,9 @@ THREE.BabylonLoader.prototype = {
 
 
 			var object;
 			var object;
 
 
-			if ( data.indices !== null  ) {
-
-				var geometry = new THREE.BufferGeometry();
-
-				// indices
-
-				var indices = new Uint16Array( data.indices );
-
-				geometry.addAttribute( 'index', new THREE.BufferAttribute( indices, 1 ) );
-
-				// positions
-
-				var positions = new Float32Array( data.positions );
-
-				for ( var j = 2, jl = positions.length; j < jl; j += 3 ) {
-
-					positions[ j ] = - positions[ j ]; 
-
-				}
-
-				geometry.addAttribute( 'position', new THREE.BufferAttribute( positions, 3 ) );
-
-				// normals
-
-				var normals = new Float32Array( data.normals );
-
-				for ( var j = 2, jl = normals.length; j < jl; j += 3 ) {
-
-					normals[ j ] = - normals[ j ]; 
-
-				}
-
-				geometry.addAttribute( 'normal', new THREE.BufferAttribute( normals, 3 ) );
-
-				// uvs
-
-				var uvs = new Float32Array( data.uvs );
-
-				geometry.addAttribute( 'uv', new THREE.BufferAttribute( uvs, 2 ) );
-
-				// offsets
-
-				var subMeshes = data.subMeshes;
-
-				if ( subMeshes !== null ) {
-
-					for ( var j = 0, jl = subMeshes.length; j < jl; j ++ ) {
-
-						var subMesh = subMeshes[ j ];
-
-						geometry.addDrawCall( subMesh.indexStart, subMesh.indexCount );
-
-					}
-
-				} else {
-
-					geometry.addDrawCall( 0, data.indices.length );
+			if ( data.indices ) {
 
 
-				}
+				var geometry = this.parseGeometry( data );
 
 
 				object = new THREE.Mesh( geometry, materials[ data.materialId ] );
 				object = new THREE.Mesh( geometry, materials[ data.materialId ] );
 
 
@@ -188,9 +234,11 @@ THREE.BabylonLoader.prototype = {
 			object.name = data.name;
 			object.name = data.name;
 			object.position.set( data.position[ 0 ], data.position[ 1 ], - data.position[ 2 ] );
 			object.position.set( data.position[ 0 ], data.position[ 1 ], - data.position[ 2 ] );
 			object.rotation.fromArray( data.rotation );
 			object.rotation.fromArray( data.rotation );
+			if ( data.rotationQuaternion ) object.quaternion.fromArray( data.rotationQuaternion );
 			object.scale.fromArray( data.scaling );
 			object.scale.fromArray( data.scaling );
+			// object.visible = data.isVisible;
 
 
-			if ( data.parentId !== undefined && data.parentId !== '' ) {
+			if ( data.parentId ) {
 
 
 				objects[ data.parentId ].add( object );
 				objects[ data.parentId ].add( object );