git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@903 67173fc5-114c-0410-ac8e-9d2fd5bffc1f
This commit is contained in:
aramis_acg
2011-02-20 00:01:52 +00:00
parent 79eca6196d
commit 94767ecf8c
9 changed files with 80 additions and 41 deletions

View File

@@ -66,6 +66,8 @@ ObjFileParser::ObjFileParser(std::vector<char> &Data,const std::string &strModel
m_uiLine(0),
m_pIO( io )
{
memset(m_buffer, BUFFERSIZE, 0);
// Create the model instance to store all the data
m_pModel = new ObjFile::Model();
m_pModel->m_ModelName = strModelName;
@@ -188,7 +190,7 @@ void ObjFileParser::copyNextWord(char *pBuffer, size_t length)
{
size_t index = 0;
m_DataIt = getNextWord<DataArrayIt>(m_DataIt, m_DataItEnd);
while ( !isSeparator(*m_DataIt) && m_DataIt != m_DataItEnd )
while ( m_DataIt != m_DataItEnd && !isSeparator(*m_DataIt) )
{
pBuffer[index] = *m_DataIt;
index++;
@@ -262,7 +264,7 @@ void ObjFileParser::getFace()
char *pPtr = m_buffer;
char *pEnd = &pPtr[BUFFERSIZE];
pPtr = getNextToken<char*>(pPtr, pEnd);
if (pPtr == '\0')
if (pPtr == pEnd || *pPtr == '\0')
return;
std::vector<unsigned int> *pIndices = new std::vector<unsigned int>;
@@ -279,7 +281,7 @@ void ObjFileParser::getFace()
if (*pPtr == '\0')
break;
if (*pPtr=='\r')
if (*pPtr=='\r' || *pPtr=='\n')
break;
if (*pPtr=='/' )
@@ -372,7 +374,7 @@ void ObjFileParser::getMaterialDesc()
return;
char *pStart = &(*m_DataIt);
while ( !isSeparator(*m_DataIt) && m_DataIt != m_DataItEnd )
while ( m_DataIt != m_DataItEnd && !isSeparator(*m_DataIt) )
++m_DataIt;
// Get name
@@ -406,10 +408,9 @@ void ObjFileParser::getMaterialDesc()
// Get a comment, values will be skipped
void ObjFileParser::getComment()
{
bool running = true;
while (running)
while (m_DataIt != m_DataItEnd)
{
if ( '\n' == (*m_DataIt) || m_DataIt == m_DataItEnd )
if ( '\n' == (*m_DataIt))
{
++m_DataIt;
break;
@@ -431,7 +432,7 @@ void ObjFileParser::getMaterialLib()
return;
char *pStart = &(*m_DataIt);
while (!isNewLine(*m_DataIt))
while (m_DataIt != m_DataItEnd && !isNewLine(*m_DataIt))
m_DataIt++;
// Check for existence
@@ -465,7 +466,7 @@ void ObjFileParser::getNewMaterial()
char *pStart = &(*m_DataIt);
std::string strMat( pStart, *m_DataIt );
while ( isSeparator( *m_DataIt ) )
while ( m_DataIt != m_DataItEnd && isSeparator( *m_DataIt ) )
m_DataIt++;
std::map<std::string, ObjFile::Material*>::iterator it = m_pModel->m_MaterialMap.find( strMat );
if ( it == m_pModel->m_MaterialMap.end() )
@@ -516,7 +517,7 @@ void ObjFileParser::getGroupName()
// Store groupname in group library
char *pStart = &(*m_DataIt);
while ( !isSeparator(*m_DataIt) )
while ( m_DataIt != m_DataItEnd && !isSeparator(*m_DataIt) )
m_DataIt++;
std::string strGroupName(pStart, &(*m_DataIt));
@@ -524,7 +525,7 @@ void ObjFileParser::getGroupName()
if ( m_pModel->m_strActiveGroup != strGroupName )
{
// Search for already existing entry
ObjFile::Model::ConstGroupMapIt it = m_pModel->m_Groups.find(&strGroupName);
ObjFile::Model::ConstGroupMapIt it = m_pModel->m_Groups.find(strGroupName);
// We are mapping groups into the object structure
createObject( strGroupName );
@@ -533,7 +534,7 @@ void ObjFileParser::getGroupName()
if (it == m_pModel->m_Groups.end())
{
std::vector<unsigned int> *pFaceIDArray = new std::vector<unsigned int>;
m_pModel->m_Groups[ &strGroupName ] = pFaceIDArray;
m_pModel->m_Groups[ strGroupName ] = pFaceIDArray;
m_pModel->m_pGroupFaceIDs = (pFaceIDArray);
}
else
@@ -563,7 +564,7 @@ void ObjFileParser::getObjectName()
if (m_DataIt == m_DataItEnd)
return;
char *pStart = &(*m_DataIt);
while ( !isSeparator( *m_DataIt ) )
while ( m_DataIt != m_DataItEnd && !isSeparator( *m_DataIt ) )
++m_DataIt;
std::string strObjectName(pStart, &(*m_DataIt));