提交 8926c8df 编写于 作者: K Kai Salmen

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

上级 37cfd7b4
......@@ -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 ] );
}
}
};
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册