|
@@ -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 ] );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
};
|