diff --git a/code/STLLoader.cpp b/code/STLLoader.cpp index fb05be760..01a01c79e 100644 --- a/code/STLLoader.cpp +++ b/code/STLLoader.cpp @@ -75,8 +75,9 @@ static const aiImporterDesc desc = { // 2) 4 byte face count // 3) 50 bytes per face bool IsBinarySTL(const char* buffer, unsigned int fileSize) { - if (fileSize < 84) + if( fileSize < 84 ) { return false; + } const uint32_t faceCount = *reinterpret_cast(buffer + 80); const uint32_t expectedBinaryFileSize = faceCount * 50 + 84; @@ -99,7 +100,20 @@ bool IsAsciiSTL(const char* buffer, unsigned int fileSize) { if (buffer + 5 >= bufferEnd) return false; - return strncmp(buffer, "solid", 5) == 0; + bool isASCII( strncmp( buffer, "solid", 5 ) == 0 ); + if( isASCII ) { + // A lot of importers are write solit even if the file is binary. So we have to check for ascii characters. + if( fileSize >= 500 ) { + isASCII = true; + for( unsigned int i = 0; i < 500; i++ ) { + if( buffer[ i ] > 127 ) { + isASCII = false; + break; + } + } + } + } + return isASCII; } } // namespace @@ -122,20 +136,21 @@ bool STLImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool { const std::string extension = GetExtension(pFile); - if (extension == "stl") + if( extension == "stl" ) { return true; - else if (!extension.length() || checkSig) { - if (!pIOHandler) + } else if (!extension.length() || checkSig) { + if( !pIOHandler ) { return true; + } const char* tokens[] = {"STL","solid"}; return SearchFileHeaderForToken(pIOHandler,pFile,tokens,2); } + return false; } // ------------------------------------------------------------------------------------------------ -const aiImporterDesc* STLImporter::GetInfo () const -{ +const aiImporterDesc* STLImporter::GetInfo () const { return &desc; }