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
parent
078dd0c08b
commit
b9a4e99607
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue