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
parent
7a578aae46
commit
cf7059f074
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue