Fix obj .mtl file loading

Fix the obj file loader by adding a new method which allows
a name to be read considering the space in the middle between two
words and use that for parsing the "mtlib" line in the .obj file
parsing method.

Before, the method used in the obj parsing function would have
returned the string "mtlib NAME_OF_MTL" instead of "mtlib" only,
which resulted in the .mtl file being never parsed.
pull/1064/head
Alberto Taiuti 2016-11-10 23:12:36 +00:00
parent 7a578aae46
commit cf7059f074
2 changed files with 42 additions and 1 deletions

View File

@ -178,7 +178,7 @@ void ObjFileParser::parseFile( IOStreamBuffer<char> &streamBuffer ) {
{
std::string name;
getName(m_DataIt, m_DataItEnd, name);
getNameNoSpace(m_DataIt, m_DataItEnd, name);
size_t nextSpace = name.find(" ");
if (nextSpace != std::string::npos)

View File

@ -165,6 +165,47 @@ inline char_t getName( char_t it, char_t end, std::string &name )
return it;
}
/** @brief Get a name from the current line. Do not preserve space
* in the middle, but trim it at the end.
* @param it set to current position
* @param end set to end of scratch buffer for readout
* @param name Separated name
* @return Current-iterator with new position
*/
template<class char_t>
inline char_t getNameNoSpace( char_t it, char_t end, std::string &name )
{
name = "";
if( isEndOfBuffer( it, end ) ) {
return end;
}
char *pStart = &( *it );
while( !isEndOfBuffer( it, end ) && !IsLineEnd( *it )
&& !IsSpaceOrNewLine( *it ) ) {
++it;
}
while( isEndOfBuffer( it, end ) || IsLineEnd( *it )
|| IsSpaceOrNewLine( *it ) ) {
--it;
}
++it;
// Get name
// if there is no name, and the previous char is a separator, come back to start
while (&(*it) < pStart) {
++it;
}
std::string strName( pStart, &(*it) );
if ( strName.empty() )
return it;
else
name = strName;
return it;
}
/** @brief Get next word from given line
* @param it set to current position
* @param end set to end of scratch buffer for readout