Browse Source

ColladaLoader2: Better error reporting in parseGeometry.

Mr.doob 9 years ago
parent
commit
80e3bc99f0
1 changed files with 37 additions and 18 deletions
  1. 37 18
      examples/js/loaders/ColladaLoader2.js

+ 37 - 18
examples/js/loaders/ColladaLoader2.js

@@ -121,9 +121,9 @@ THREE.ColladaLoader.prototype = {
 			for ( var i = 0; i < elements.length; i ++ ) {
 			for ( var i = 0; i < elements.length; i ++ ) {
 
 
 				var element = elements[ i ];
 				var element = elements[ i ];
-				var mesh = parseMesh( element.getElementsByTagName( 'mesh' )[ 0 ] );
+				var geometry = parseGeometry( element );
 
 
-				library[ element.getAttribute( 'id' ) ] = createGeometry( mesh );
+				library[ element.getAttribute( 'id' ) ] = createGeometry( geometry );
 
 
 			}
 			}
 
 
@@ -131,31 +131,38 @@ THREE.ColladaLoader.prototype = {
 
 
 		}
 		}
 
 
-		function parseMesh( xml ) {
+		function parseGeometry( xml ) {
 
 
-			var mesh = {
+			var data = {
+				id: xml.getAttribute( 'id' ),
 				sources: {}
 				sources: {}
 			};
 			};
 
 
-			for ( var i = 0; i < xml.childNodes.length; i ++ ) {
+			var mesh = xml.getElementsByTagName( 'mesh' )[ 0 ];
 
 
-				var child = xml.childNodes[ i ];
+			for ( var i = 0; i < mesh.childNodes.length; i ++ ) {
+
+				var child = mesh.childNodes[ i ];
 
 
 				if ( child.nodeType !== 1 ) continue;
 				if ( child.nodeType !== 1 ) continue;
 
 
 				switch ( child.nodeName ) {
 				switch ( child.nodeName ) {
 
 
 					case 'source':
 					case 'source':
-						mesh.sources[ child.getAttribute( 'id' ) ] = parseFloats( child.getElementsByTagName( 'float_array' )[ 0 ].textContent );
+						data.sources[ child.getAttribute( 'id' ) ] = parseFloats( child.getElementsByTagName( 'float_array' )[ 0 ].textContent );
 						break;
 						break;
 
 
 					case 'vertices':
 					case 'vertices':
-						mesh.sources[ child.getAttribute( 'id' ) ] = mesh.sources[ parseId( child.getElementsByTagName( 'input' )[ 0 ].getAttribute( 'source' ) ) ];
+						data.sources[ child.getAttribute( 'id' ) ] = data.sources[ parseId( child.getElementsByTagName( 'input' )[ 0 ].getAttribute( 'source' ) ) ];
+						break;
+
+					case 'polygons':
+						console.log( 'ColladaLoader: Unsupported primitive type: ', child.nodeName );
 						break;
 						break;
 
 
 					case 'polylist':
 					case 'polylist':
 					case 'triangles':
 					case 'triangles':
-						mesh.primitive = parsePrimitive( child );
+						data.primitive = parsePrimitive( child );
 						break;
 						break;
 
 
 					default:
 					default:
@@ -165,7 +172,7 @@ THREE.ColladaLoader.prototype = {
 
 
 			}
 			}
 
 
-			return mesh;
+			return data;
 
 
 		}
 		}
 
 
@@ -208,19 +215,21 @@ THREE.ColladaLoader.prototype = {
 
 
 		}
 		}
 
 
-		function createGeometry( mesh ) {
+		function createGeometry( data ) {
 
 
-			if ( mesh.primitive === undefined ) return;
+			if ( data.primitive === undefined ) return;
 
 
-			var sources = mesh.sources;
-			var primitive = mesh.primitive;
+			var sources = data.sources;
+			var primitive = data.primitive;
 
 
 			var inputs = primitive.inputs;
 			var inputs = primitive.inputs;
 			var stride = primitive.stride;
 			var stride = primitive.stride;
 			var vcount = primitive.vcount;
 			var vcount = primitive.vcount;
 
 
-			var vcount = primitive.vcount;
 			var indices = primitive.p;
 			var indices = primitive.p;
+			var vcount = primitive.vcount;
+
+			var maxcount = 0;
 
 
 			var geometry = new THREE.BufferGeometry();
 			var geometry = new THREE.BufferGeometry();
 
 
@@ -275,7 +284,7 @@ THREE.ColladaLoader.prototype = {
 
 
 						} else {
 						} else {
 
 
-							console.log( 'ColladaLoader.createGeometry:', count, 'not supported.' );
+							maxcount = Math.max( maxcount, count );
 
 
 						}
 						}
 
 
@@ -307,6 +316,12 @@ THREE.ColladaLoader.prototype = {
 
 
 			}
 			}
 
 
+			if ( maxcount > 0 ) {
+
+				console.log( 'ColladaLoader: Geometry', data.id, 'has faces with more than 4 vertices.' );
+
+			}
+
 			return geometry;
 			return geometry;
 
 
 		}
 		}
@@ -464,17 +479,21 @@ THREE.ColladaLoader.prototype = {
 
 
 		}
 		}
 
 
-		console.time( 'ColladaLoader2' );
+		console.time( 'ColladaLoader' );
+
+		console.time( 'ColladaLoader: DOMParser' );
 
 
 		var xml = new DOMParser().parseFromString( text, 'text/xml' );
 		var xml = new DOMParser().parseFromString( text, 'text/xml' );
 
 
+		console.timeEnd( 'ColladaLoader: DOMParser' );
+
 		var camerasLibrary = parseCamerasLibrary( xml );
 		var camerasLibrary = parseCamerasLibrary( xml );
 		var geometriesLibrary = parseGeometriesLibrary( xml );
 		var geometriesLibrary = parseGeometriesLibrary( xml );
 		var nodesLibrary = parseNodesLibrary( xml );
 		var nodesLibrary = parseNodesLibrary( xml );
 		var visualScenesLibrary = parseVisualScenesLibrary( xml );
 		var visualScenesLibrary = parseVisualScenesLibrary( xml );
 		var scene = parseScene( xml );
 		var scene = parseScene( xml );
 
 
-		console.timeEnd( 'ColladaLoader2' );
+		console.timeEnd( 'ColladaLoader' );
 
 
 		// console.log( scene );
 		// console.log( scene );