浏览代码

fixed previous "fix" :P

Pascal Häusler 8 年之前
父节点
当前提交
cd7cd0c9e7
共有 1 个文件被更改,包括 41 次插入7 次删除
  1. 41 7
      examples/js/loaders/STLLoader.js

+ 41 - 7
examples/js/loaders/STLLoader.js

@@ -200,10 +200,29 @@ THREE.STLLoader.prototype = {
 
 	parseASCII: function ( data ) {
 
-		var geometry, length, patternFace, patternNormal, patternVertex, result, text;
+		var geometry, patternFace, patternNormal, patternVertex, result, text, vertexCountPerFace, normalCountPerFace, faceCounter;
+
+		faceCounter = vertexCountPerFace = normalCountPerFace = 0;
 		geometry = new THREE.BufferGeometry();
 		patternFace = /facet([\s\S]*?)endfacet/g;
 
+		var patternFloat = /[\s]+([+-]?(?:\d+.\d+|\d+.|\d+|.\d+)(?:[eE][+-]?\d+)?)/.source;
+		patternNormal = new RegExp( ''
+			+ 'normal'
+			+ patternFloat
+			+ patternFloat
+			+ patternFloat
+			, 'g'
+		);
+
+		patternVertex = new RegExp( ''
+			+ 'vertex'
+			+ patternFloat
+			+ patternFloat
+			+ patternFloat
+			, 'g'
+		);
+
 		var vertices = [];
 		var normals = [];
 
@@ -211,25 +230,40 @@ THREE.STLLoader.prototype = {
 
 		while ( ( result = patternFace.exec( data ) ) !== null ) {
 
+			vertexCountPerFace = normalCountPerFace = 0;
+
 			text = result[ 0 ];
-			patternNormal = /normal[\s]+([\-+]?[0-9]+\.?[0-9]*([eE][\-+]?[0-9]+)?)+[\s]+([\-+]?[0-9]*\.?[0-9]+([eE][\-+]?[0-9]+)?)+[\s]+([\-+]?[0-9]*\.?[0-9]+([eE][\-+]?[0-9]+)?)+/g;
 
 			while ( ( result = patternNormal.exec( text ) ) !== null ) {
 
 				normal.x = parseFloat( result[ 1 ] );
-				normal.y = parseFloat( result[ 3 ] );
-				normal.z = parseFloat( result[ 5 ] );
+				normal.y = parseFloat( result[ 2 ] );
+				normal.z = parseFloat( result[ 3 ] );
+				normalCountPerFace ++;
 
 			}
 
-			patternVertex = /vertex[\s]+([\-+]?[0-9]+\.?[0-9]*([eE][\-+]?[0-9]+)?)+[\s]+([\-+]?[0-9]*\.?[0-9]+([eE][\-+]?[0-9]+)?)+[\s]+([\-+]?[0-9]*\.?[0-9]+([eE][\-+]?[0-9]+)?)+/g;
-
 			while ( ( result = patternVertex.exec( text ) ) !== null ) {
 
-				vertices.push( parseFloat( result[ 1 ] ), parseFloat( result[ 3 ] ), parseFloat( result[ 5 ] ) );
+				vertices.push( parseFloat( result[ 1 ] ), parseFloat( result[ 2 ] ), parseFloat( result[ 3 ] ) );
 				normals.push( normal.x, normal.y, normal.z );
+				vertexCountPerFace ++;
+
+			}
+
+			// Every face have to own ONE valid normal
+			if ( normalCountPerFace !== 1 ) {
+
+				throw new Error( 'Something isn\'t right with the normal of face number ' + faceCounter );
+
+			}
+			// Each face have to own THREE valid vertices
+			if ( vertexCountPerFace !== 3 ) {
+
+				throw new Error( 'Something isn\'t right with the vertices of face number ' + faceCounter );
 
 			}
+			faceCounter ++;
 
 		}