Added support for empty .MTL files.

Some programs such as Silo export an empty .MTL file if you export a
.OBJ that doesn't use any materials. This patch allows the loading of
such files.
pull/716/head
rmitton 2015-12-13 22:13:25 -08:00
parent 078dd0c08b
commit b9a4e99607
3 changed files with 23 additions and 11 deletions

View File

@ -435,22 +435,27 @@ void BaseImporter::ConvertUTF8toISO8859_1(std::string& data)
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
void BaseImporter::TextFileToBuffer(IOStream* stream, void BaseImporter::TextFileToBuffer(IOStream* stream,
std::vector<char>& data) std::vector<char>& data,
TextFileMode mode)
{ {
ai_assert(NULL != stream); ai_assert(NULL != stream);
const size_t fileSize = stream->FileSize(); const size_t fileSize = stream->FileSize();
if(!fileSize) { if (mode == FORBID_EMPTY) {
throw DeadlyImportError("File is empty"); if(!fileSize) {
throw DeadlyImportError("File is empty");
}
} }
data.reserve(fileSize+1); data.reserve(fileSize+1);
data.resize(fileSize); data.resize(fileSize);
if(fileSize != stream->Read( &data[0], 1, fileSize)) { if(fileSize > 0) {
throw DeadlyImportError("File read error"); if(fileSize != stream->Read( &data[0], 1, fileSize)) {
} throw DeadlyImportError("File read error");
}
ConvertToUTF8(data); ConvertToUTF8(data);
}
// append a binary zero to simplify string parsing // append a binary zero to simplify string parsing
data.push_back(0); data.push_back(0);

View File

@ -347,6 +347,8 @@ public: // static utilities
static void ConvertUTF8toISO8859_1( static void ConvertUTF8toISO8859_1(
std::string& data); std::string& data);
enum TextFileMode { ALLOW_EMPTY, FORBID_EMPTY };
// ------------------------------------------------------------------- // -------------------------------------------------------------------
/** Utility for text file loaders which copies the contents of the /** Utility for text file loaders which copies the contents of the
* file into a memory buffer and converts it to our UTF8 * file into a memory buffer and converts it to our UTF8
@ -354,10 +356,12 @@ public: // static utilities
* @param stream Stream to read from. * @param stream Stream to read from.
* @param data Output buffer to be resized and filled with the * @param data Output buffer to be resized and filled with the
* converted text file data. The buffer is terminated with * converted text file data. The buffer is terminated with
* a binary 0. */ * a binary 0.
* @param mode Whether it is OK to load empty text files. */
static void TextFileToBuffer( static void TextFileToBuffer(
IOStream* stream, IOStream* stream,
std::vector<char>& data); std::vector<char>& data,
TextFileMode mode = FORBID_EMPTY);
// ------------------------------------------------------------------- // -------------------------------------------------------------------
/** Utility function to move a std::vector into a aiScene array /** Utility function to move a std::vector into a aiScene array

View File

@ -555,9 +555,12 @@ void ObjFileParser::getMaterialLib()
return; return;
} }
// Import material library data from file // Import material library data from file.
// Some exporters (e.g. Silo) will happily write out empty
// material files if the model doesn't use any materials, so we
// allow that.
std::vector<char> buffer; std::vector<char> buffer;
BaseImporter::TextFileToBuffer( pFile, buffer ); BaseImporter::TextFileToBuffer( pFile, buffer, BaseImporter::ALLOW_EMPTY );
m_pIO->Close( pFile ); m_pIO->Close( pFile );
// Importing the material library // Importing the material library