Pārlūkot izejas kodu

Face and line detection only depends on slash and buffer length.

Kai Salmen 8 gadi atpakaļ
vecāks
revīzija
8926c8dfb6
1 mainītis faili ar 38 papildinājumiem un 78 dzēšanām
  1. 38 78
      examples/js/loaders/OBJLoader2.js

+ 38 - 78
examples/js/loaders/OBJLoader2.js

@@ -251,10 +251,7 @@ THREE.OBJLoader2 = (function () {
 			var length = arrayBufferView.byteLength;
 			var buffer = new Array( 128 );
 			var bufferPointer = 0;
-			var slashesLast = 0;
-			var slashesDistance = 0;
 			var slashesCount = 0;
-			var faceDescType = -1;
 			var reachedFaces = false;
 			var code;
 			var word = '';
@@ -264,23 +261,11 @@ THREE.OBJLoader2 = (function () {
 				switch ( code ) {
 					case Consts.CODE_SPACE:
 						if ( word.length > 0 ) buffer[ bufferPointer++ ] = word;
-
-						//Whenever space is reached after first block (f v/vn" ") and no face type has been calculated, it will be performed once
-						if ( faceDescType === -1 && bufferPointer > 1 ) {
-							faceDescType = ( slashesCount === 0 ) ? 3 : ( slashesCount === 1 ) ? 1 : ( slashesCount === 2 && slashesDistance === 1 ) ? 2 : 0;
-						}
 						word = '';
 						break;
 
 					case Consts.CODE_SLASH:
-						if ( faceDescType === -1 ) {
-
-							slashesCount++;
-							slashesDistance = i - slashesLast;
-							slashesLast = i;
-
-						}
-
+						slashesCount++;
 						if ( word.length > 0 ) buffer[ bufferPointer++ ] = word;
 						word = '';
 						break;
@@ -288,13 +273,9 @@ THREE.OBJLoader2 = (function () {
 					case Consts.CODE_LF:
 						if ( word.length > 0 ) buffer[ bufferPointer++ ] = word;
 						word = '';
-
-						reachedFaces = this.processLine( buffer, bufferPointer, faceDescType, reachedFaces );
+						reachedFaces = this.processLine( buffer, bufferPointer, slashesCount, reachedFaces );
 						bufferPointer = 0;
-						slashesLast = 0;
-						slashesDistance = 0;
 						slashesCount = 0;
-						faceDescType = -1;
 						break;
 
 					case Consts.CODE_CR:
@@ -317,10 +298,7 @@ THREE.OBJLoader2 = (function () {
 			var length = text.length;
 			var buffer = new Array( 128 );
 			var bufferPointer = 0;
-			var slashesLast = 0;
-			var slashesDistance = 0;
 			var slashesCount = 0;
-			var faceDescType = -1;
 			var reachedFaces = false;
 			var char;
 			var word = '';
@@ -330,22 +308,11 @@ THREE.OBJLoader2 = (function () {
 				switch ( char ) {
 					case Consts.STRING_SPACE:
 						if ( word.length > 0 ) buffer[ bufferPointer++ ] = word;
-
-						//Whenever space is reached after first block (f v/vn" ") and no face type has been calculated, it will be performed once
-						if ( faceDescType === -1 && bufferPointer > 1 ) {
-							faceDescType = ( slashesCount === 0 ) ? 3 : ( slashesCount === 1 ) ? 1 : ( slashesCount === 2 && slashesDistance === 1 ) ? 2 : 0;
-						}
 						word = '';
 						break;
 
 					case Consts.STRING_SLASH:
-						if ( faceDescType === -1 ) {
-
-							slashesCount++;
-							slashesDistance = i - slashesLast;
-							slashesLast = i;
-
-						}
+						slashesCount++;
 						if ( word.length > 0 ) buffer[ bufferPointer++ ] = word;
 						word = '';
 						break;
@@ -353,12 +320,9 @@ THREE.OBJLoader2 = (function () {
 					case Consts.STRING_LF:
 						if ( word.length > 0 ) buffer[ bufferPointer++ ] = word;
 						word = '';
-						reachedFaces = this.processLine( buffer, bufferPointer, faceDescType, reachedFaces );
+						reachedFaces = this.processLine( buffer, bufferPointer, slashesCount, reachedFaces );
 						bufferPointer = 0;
-						slashesLast = 0;
-						slashesDistance = 0;
 						slashesCount = 0;
-						faceDescType = -1;
 						break;
 
 					case Consts.STRING_CR:
@@ -370,7 +334,7 @@ THREE.OBJLoader2 = (function () {
 			}
 		};
 
-		Parser.prototype.processLine = function ( buffer, bufferPointer, faceDescType, reachedFaces ) {
+		Parser.prototype.processLine = function ( buffer, bufferPointer, slashesCount, reachedFaces ) {
 			if ( bufferPointer < 1 ) return reachedFaces;
 
 			var bufferLength = bufferPointer - 1;
@@ -411,11 +375,11 @@ THREE.OBJLoader2 = (function () {
 
 				case Consts.LINE_F:
 					reachedFaces = true;
-					this.rawObject.processFaces( buffer, bufferPointer, faceDescType );
+					this.rawObject.processFaces( buffer, bufferPointer, slashesCount );
 					break;
 
 				case Consts.LINE_L:
-					if ( faceDescType === 1 ) {
+					if ( bufferLength === slashesCount * 2 ) {
 
 						this.rawObject.buildLineVvt( buffer );
 
@@ -639,57 +603,53 @@ THREE.OBJLoader2 = (function () {
 			}
 		};
 
-		RawObject.prototype.processFaces = function ( buffer, bufferPointer, faceDescType ) {
+		RawObject.prototype.processFaces = function ( buffer, bufferPointer, slashesCount ) {
 			var bufferLength = bufferPointer - 1;
 			var i;
 
-			switch ( faceDescType ) {
-				// "f vertex/uv/normal ..."
-				case 0:
-					for ( i = 4; i < bufferLength - 3; i += 3 ) {
+			// "f vertex ..."
+			if ( slashesCount === 0 ) {
 
-						this.attachFace( buffer[ 1     ], buffer[ 2     ], buffer[ 3     ] );
-						this.attachFace( buffer[ i     ], buffer[ i + 1 ], buffer[ i + 2 ] );
-						this.attachFace( buffer[ i + 3 ], buffer[ i + 4 ], buffer[ i + 5 ] );
+				for ( i = 2; i < bufferLength - 1; i ++ ) {
 
-					}
-					break;
+					this.attachFace( buffer[ 1     ] );
+					this.attachFace( buffer[ i     ] );
+					this.attachFace( buffer[ i + 1 ] );
+
+				}
 
 				// "f vertex/uv ..."
-				case 1:
-					for ( i = 3; i < bufferLength - 2; i += 2 ) {
+			} else if  ( bufferLength === slashesCount * 2 ) {
 
-						this.attachFace( buffer[ 1     ], buffer[ 2     ] );
-						this.attachFace( buffer[ i     ], buffer[ i + 1 ] );
-						this.attachFace( buffer[ i + 2 ], buffer[ i + 3 ] );
+				for ( i = 3; i < bufferLength - 2; i += 2 ) {
 
-					}
-					break;
+					this.attachFace( buffer[ 1     ], buffer[ 2     ] );
+					this.attachFace( buffer[ i     ], buffer[ i + 1 ] );
+					this.attachFace( buffer[ i + 2 ], buffer[ i + 3 ] );
 
-				// "f vertex//normal ..."
-				case 2:
-					for ( i = 3; i < bufferLength - 2; i += 2 ) {
+				}
 
-						this.attachFace( buffer[ 1     ], undefined, buffer[ 2     ] );
-						this.attachFace( buffer[ i     ], undefined, buffer[ i + 1 ] );
-						this.attachFace( buffer[ i + 2 ], undefined, buffer[ i + 3 ] );
+				// "f vertex/uv/normal ..."
+			} else if  ( bufferLength * 2 === slashesCount * 3 ) {
 
-					}
-					break;
+				for ( i = 4; i < bufferLength - 3; i += 3 ) {
 
-				// "f vertex ..."
-				case 3:
-					for ( i = 2; i < bufferLength - 1; i ++ ) {
+					this.attachFace( buffer[ 1     ], buffer[ 2     ], buffer[ 3     ] );
+					this.attachFace( buffer[ i     ], buffer[ i + 1 ], buffer[ i + 2 ] );
+					this.attachFace( buffer[ i + 3 ], buffer[ i + 4 ], buffer[ i + 5 ] );
 
-						this.attachFace( buffer[ 1     ] );
-						this.attachFace( buffer[ i     ] );
-						this.attachFace( buffer[ i + 1 ] );
+				}
 
-					}
-					break;
+				// "f vertex//normal ..."
+			} else {
 
-				default:
-					break;
+				for ( i = 3; i < bufferLength - 2; i += 2 ) {
+
+					this.attachFace( buffer[ 1     ], undefined, buffer[ 2     ] );
+					this.attachFace( buffer[ i     ], undefined, buffer[ i + 1 ] );
+					this.attachFace( buffer[ i + 2 ], undefined, buffer[ i + 3 ] );
+
+				}
 
 			}
 		};